Merge pull request #12678 from thibaultfaure/article/BAEL-5709-find-roots-of-a-quadratic-equation
BAEL-5709 code for the Finding the roots of a quadratic equation article
This commit is contained in:
		
						commit
						c1a759900e
					
				| @ -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; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,23 @@ | |||||||
|  | package com.baeldung.math.quadraticequationroot; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | public class ComplexRootsCalculator { | ||||||
|  | 
 | ||||||
|  |     public static List<Complex> getPolynomRoots(Polynom polynom) { | ||||||
|  |         List<Complex> 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; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -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; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,20 @@ | |||||||
|  | package com.baeldung.math.quadraticequationroot; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | public class RealRootsCalculator { | ||||||
|  | 
 | ||||||
|  |     public static List<Double> getPolynomRoots(Polynom polynom) { | ||||||
|  |         List<Double> 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; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -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<Complex> 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<Complex> 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<Complex> 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)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -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)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -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<Double> 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<Double> 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<Double> roots = RealRootsCalculator.getPolynomRoots(polynom); | ||||||
|  |         assertEquals(0, roots.size()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user