From faaebaddbea8f07ba32260060c21f1c0b7c45042 Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Wed, 31 Aug 2022 20:25:16 +0200 Subject: [PATCH] BAEL-5709 code for the Finding the roots of a quadratic equation article --- .../math/quadraticequationroot/Complex.java | 25 ++++++++++++ .../ComplexRootsCalculator.java | 23 +++++++++++ .../math/quadraticequationroot/Polynom.java | 34 +++++++++++++++++ .../RealRootsCalculator.java | 20 ++++++++++ .../ComplexRootsCalculatorUnitTest.java | 38 +++++++++++++++++++ .../PolynomUnitTest.java | 14 +++++++ .../RealRootsCalculatorUnitTest.java | 36 ++++++++++++++++++ 7 files changed, 190 insertions(+) create mode 100644 core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/Complex.java create mode 100644 core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/ComplexRootsCalculator.java create mode 100644 core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/Polynom.java create mode 100644 core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/RealRootsCalculator.java create mode 100644 core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/ComplexRootsCalculatorUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/PolynomUnitTest.java create mode 100644 core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/RealRootsCalculatorUnitTest.java diff --git a/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/Complex.java b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/Complex.java new file mode 100644 index 0000000000..77516960b3 --- /dev/null +++ b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/Complex.java @@ -0,0 +1,25 @@ +package com.baeldung.math.quadraticequationroot; + +public class Complex { + + private double realPart; + private double imaginaryPart; + + public Complex(double realPart, double imaginaryPart) { + this.realPart = realPart; + this.imaginaryPart = imaginaryPart; + } + + public static Complex ofReal(double realPart) { + return new Complex(realPart, 0); + } + + public double getRealPart() { + return realPart; + } + + public double getImaginaryPart() { + return imaginaryPart; + } + +} diff --git a/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/ComplexRootsCalculator.java b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/ComplexRootsCalculator.java new file mode 100644 index 0000000000..a1a72ac84b --- /dev/null +++ b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/ComplexRootsCalculator.java @@ -0,0 +1,23 @@ +package com.baeldung.math.quadraticequationroot; + +import java.util.ArrayList; +import java.util.List; + +public class ComplexRootsCalculator { + + public static List getPolynomRoots(Polynom polynom) { + List roots = new ArrayList<>(); + double discriminant = polynom.getDiscriminant(); + if (discriminant > 0) { + roots.add(Complex.ofReal((-polynom.getB() - Math.sqrt(discriminant)) / (2 * polynom.getA()))); + roots.add(Complex.ofReal((-polynom.getB() + Math.sqrt(discriminant)) / (2 * polynom.getA()))); + } else if (discriminant == 0) { + roots.add(Complex.ofReal(-polynom.getB() / (2 * polynom.getA()))); + } else { + roots.add(new Complex(-polynom.getB() / (2* polynom.getA()), -Math.sqrt(-discriminant) / 2* polynom.getA())); + roots.add(new Complex(-polynom.getB() / (2* polynom.getA()), Math.sqrt(-discriminant) / 2* polynom.getA())); + } + return roots; + } + +} diff --git a/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/Polynom.java b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/Polynom.java new file mode 100644 index 0000000000..a7d6948c6d --- /dev/null +++ b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/Polynom.java @@ -0,0 +1,34 @@ +package com.baeldung.math.quadraticequationroot; + +public class Polynom { + + private double a; + private double b; + private double c; + + public Polynom(double a, double b, double c) { + if (a == 0) { + throw new IllegalArgumentException("a can not be equal to 0"); + } + this.a = a; + this.b = b; + this.c = c; + } + + public double getA() { + return a; + } + + public double getB() { + return b; + } + + public double getC() { + return c; + } + + public double getDiscriminant() { + return b * b - 4 * a * c; + } + +} diff --git a/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/RealRootsCalculator.java b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/RealRootsCalculator.java new file mode 100644 index 0000000000..d753f6bf1e --- /dev/null +++ b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/quadraticequationroot/RealRootsCalculator.java @@ -0,0 +1,20 @@ +package com.baeldung.math.quadraticequationroot; + +import java.util.ArrayList; +import java.util.List; + +public class RealRootsCalculator { + + public static List getPolynomRoots(Polynom polynom) { + List roots = new ArrayList<>(); + double discriminant = polynom.getDiscriminant(); + if (discriminant > 0) { + roots.add((-polynom.getB() - Math.sqrt(discriminant)) / (2 * polynom.getA())); + roots.add((-polynom.getB() + Math.sqrt(discriminant)) / (2 * polynom.getA())); + } else if (discriminant == 0) { + roots.add(-polynom.getB() / (2 * polynom.getA())); + } + return roots; + } + +} diff --git a/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/ComplexRootsCalculatorUnitTest.java b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/ComplexRootsCalculatorUnitTest.java new file mode 100644 index 0000000000..4c5ac21e3d --- /dev/null +++ b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/ComplexRootsCalculatorUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.math.quadraticequationroot; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ComplexRootsCalculatorUnitTest { + + @Test + void givenPolynomWithStrictlyPositiveDiscriminant_whenGetPolynomRoots_ThenReturnBothRealRoots() { + Polynom polynom = new Polynom(1d, 1d, -6d); + List roots = ComplexRootsCalculator.getPolynomRoots(polynom); + assertEquals(2, roots.size()); + assertTrue(roots.stream().anyMatch(c -> c.getRealPart() == 2d && c.getImaginaryPart() == 0)); + assertTrue(roots.stream().anyMatch(c -> c.getRealPart() == -3d && c.getImaginaryPart() == 0)); + } + + @Test + void givenPolynomWithDiscriminantEqualsZero_whenGetPolynomRoots_ThenReturnRoot() { + Polynom polynom = new Polynom(1d, 4d, 4d); + List roots = ComplexRootsCalculator.getPolynomRoots(polynom); + assertEquals(1, roots.size()); + assertTrue(roots.get(0).getRealPart() == -2d && roots.get(0).getImaginaryPart() == 0d); + } + + @Test + void givenPolynomWithStrictlyNegativeDiscriminant_whenGetPolynomRoots_ThenReturnBothComplexRoot() { + Polynom polynom = new Polynom(1d, -4d, 8d); + List roots = ComplexRootsCalculator.getPolynomRoots(polynom); + assertEquals(2, roots.size()); + assertTrue(roots.stream().anyMatch(c -> c.getRealPart() == 2d && c.getImaginaryPart() == 2d)); + assertTrue(roots.stream().anyMatch(c -> c.getRealPart() == 2d && c.getImaginaryPart() == -2d)); + } + +} diff --git a/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/PolynomUnitTest.java b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/PolynomUnitTest.java new file mode 100644 index 0000000000..e9aee6e505 --- /dev/null +++ b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/PolynomUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.math.quadraticequationroot; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class PolynomUnitTest { + + @Test + void givenaEqualTo0_WhenNewPolynom_ThenThrows() { + assertThrows(IllegalArgumentException.class, () -> new Polynom(0, 1, 1)); + } + +} diff --git a/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/RealRootsCalculatorUnitTest.java b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/RealRootsCalculatorUnitTest.java new file mode 100644 index 0000000000..fd1f165f9b --- /dev/null +++ b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/math/quadraticequationroot/RealRootsCalculatorUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.math.quadraticequationroot; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class RealRootsCalculatorUnitTest { + + @Test + void givenPolynomWithStrictlyPositiveDiscriminant_whenGetPolynomRoots_ThenReturnBothRoots() { + Polynom polynom = new Polynom(1d, 1d, -6d); + List roots = RealRootsCalculator.getPolynomRoots(polynom); + assertEquals(2, roots.size()); + assertTrue(roots.containsAll(Arrays.asList(2d, -3d))); + } + + @Test + void givenPolynomWithDiscriminantEqualsZero_whenGetPolynomRoots_ThenReturnRoot() { + Polynom polynom = new Polynom(1d, 4d, 4d); + List roots = RealRootsCalculator.getPolynomRoots(polynom); + assertEquals(1, roots.size()); + assertTrue(roots.get(0).equals(-2d)); + } + + @Test + void givenPolynomWithStrictlyNegativeDiscriminant_whenGetPolynomRoots_ThenReturnNoRoot() { + Polynom polynom = new Polynom(3d, 2d, 5d); + List roots = RealRootsCalculator.getPolynomRoots(polynom); + assertEquals(0, roots.size()); + } + +}