From 106bd45b176bfc70d799286ef378a9f6309923b6 Mon Sep 17 00:00:00 2001 From: rozi26 Date: Mon, 29 Apr 2024 17:11:33 +0000 Subject: [PATCH 01/18] Update directory --- DIRECTORY.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index a48e01f4ac04..2b89695d3872 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -282,6 +282,7 @@ * [CircularConvolutionFFT](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/CircularConvolutionFFT.java) * [CollatzConjecture](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/CollatzConjecture.java) * [Combinations](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/Combinations.java) + * [ComplexNumberUtil](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java) * [Convolution](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/Convolution.java) * [ConvolutionFFT](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/ConvolutionFFT.java) * [CrossCorrelation](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/CrossCorrelation.java) @@ -726,10 +727,12 @@ * [CeilTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CeilTest.java) * [CollatzConjectureTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java) * [CombinationsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CombinationsTest.java) + * [ComplexNumberUtilTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java) * [CrossCorrelationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CrossCorrelationTest.java) * [DigitalRootTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/DigitalRootTest.java) * [DistanceFormulaTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/DistanceFormulaTest.java) * [DudeneyNumberTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/DudeneyNumberTest.java) + * [FactorialRecursionTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/FactorialRecursionTest.java) * [FactorialTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/FactorialTest.java) * [FastInverseSqrtTests](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/FastInverseSqrtTests.java) * [FFTTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/FFTTest.java) @@ -762,7 +765,9 @@ * [MillerRabinPrimalityCheckTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/MillerRabinPrimalityCheckTest.java) * [MinValueTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/MinValueTest.java) * [MobiusFunctionTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/MobiusFunctionTest.java) + * [ModeTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/ModeTest.java) * [NthUglyNumberTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/NthUglyNumberTest.java) + * [NumberOfDigitsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/NumberOfDigitsTest.java) * [PalindromeNumberTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/PalindromeNumberTest.java) * [ParseIntegerTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/ParseIntegerTest.java) * [PascalTriangleTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/PascalTriangleTest.java) From 191697c0a3de116a0859bb4e8a8bb55412ec28c4 Mon Sep 17 00:00:00 2001 From: rozi26 Date: Mon, 29 Apr 2024 18:07:28 +0000 Subject: [PATCH 02/18] Update directory --- DIRECTORY.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index a48e01f4ac04..2b89695d3872 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -282,6 +282,7 @@ * [CircularConvolutionFFT](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/CircularConvolutionFFT.java) * [CollatzConjecture](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/CollatzConjecture.java) * [Combinations](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/Combinations.java) + * [ComplexNumberUtil](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java) * [Convolution](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/Convolution.java) * [ConvolutionFFT](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/ConvolutionFFT.java) * [CrossCorrelation](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/CrossCorrelation.java) @@ -726,10 +727,12 @@ * [CeilTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CeilTest.java) * [CollatzConjectureTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java) * [CombinationsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CombinationsTest.java) + * [ComplexNumberUtilTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java) * [CrossCorrelationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CrossCorrelationTest.java) * [DigitalRootTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/DigitalRootTest.java) * [DistanceFormulaTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/DistanceFormulaTest.java) * [DudeneyNumberTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/DudeneyNumberTest.java) + * [FactorialRecursionTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/FactorialRecursionTest.java) * [FactorialTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/FactorialTest.java) * [FastInverseSqrtTests](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/FastInverseSqrtTests.java) * [FFTTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/FFTTest.java) @@ -762,7 +765,9 @@ * [MillerRabinPrimalityCheckTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/MillerRabinPrimalityCheckTest.java) * [MinValueTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/MinValueTest.java) * [MobiusFunctionTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/MobiusFunctionTest.java) + * [ModeTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/ModeTest.java) * [NthUglyNumberTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/NthUglyNumberTest.java) + * [NumberOfDigitsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/NumberOfDigitsTest.java) * [PalindromeNumberTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/PalindromeNumberTest.java) * [ParseIntegerTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/ParseIntegerTest.java) * [PascalTriangleTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/PascalTriangleTest.java) From de68d67a9f6a00a86c217379cff00169d5e46a8b Mon Sep 17 00:00:00 2001 From: rozi26 Date: Mon, 29 Apr 2024 18:59:37 -0700 Subject: [PATCH 03/18] add basic complex numbers methods and unit tests --- .../maths/ComplexNumberUtil.java | 163 ++++++++++++++++++ .../maths/ComplexNumberUtilTest.java | 121 +++++++++++++ 2 files changed, 284 insertions(+) create mode 100644 src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java create mode 100644 src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java new file mode 100644 index 000000000000..6d104573dbfe --- /dev/null +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -0,0 +1,163 @@ +package com.thealgorithms.maths; + + +public class ComplexNumberUtil { + + public static class ComplexNumber + { + public final double REAL; + public final double IMAGINARY; + + public ComplexNumber(double real, double imaginary) + { + REAL = real; + IMAGINARY = imaginary; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ComplexNumber num) + { + return this.REAL == num.REAL && this.IMAGINARY == num.IMAGINARY; + } + + return super.equals(obj); + } + + @Override + public String toString() { + return REAL + ((IMAGINARY < 0) ? (" - " + Math.abs(IMAGINARY)) : (" + " + IMAGINARY)) + "i"; + } + } + + public final static ComplexNumber ZERO = new ComplexNumber(0,0); + public final static ComplexNumber ONE = new ComplexNumber(1,0); + + /** + * add two complex numbers + * @param num1 the first complex number + * @param num2 the second complex number + * @return the sum of num1 and num2 + */ + public static ComplexNumber add(ComplexNumber num1, ComplexNumber num2) + { + return new ComplexNumber(num1.REAL + num2.REAL, num1.IMAGINARY + num2.IMAGINARY); + } + + /** + * Subtracts the second complex number from the first complex number. + * + * @param num1 the first complex number + * @param num2 the second complex number + * @return the result of subtracting num2 from num1 + */ + public static ComplexNumber subtract(ComplexNumber num1, ComplexNumber num2) + { + return new ComplexNumber(num1.REAL - num2.REAL, num1.IMAGINARY - num2.IMAGINARY); + } + + /** + * Multiplies two complex numbers. + * + * @param num1 the first complex number + * @param num2 the second complex number + * @return the product of num1 and num2 + */ + public static ComplexNumber multiply(ComplexNumber num1, ComplexNumber num2) + { + return new ComplexNumber( + num1.REAL*num2.REAL - num1.IMAGINARY*num2.IMAGINARY, + num1.REAL*num2.IMAGINARY + num1.IMAGINARY*num2.REAL + ); + } + + /** + * Divides the first complex number by the second complex number. + * + * @param num1 the numerator complex number + * @param num2 the denominator complex number + * @return the result of dividing num1 by num2 + * @throws RuntimeException if the divisor (num2) is zero + */ + public static ComplexNumber divide(ComplexNumber num1, ComplexNumber num2) + { + final double divisor = num2.REAL*num2.REAL + num2.IMAGINARY*num2.IMAGINARY; + if (divisor == 0) + { + throw new RuntimeException("can't divide by zero"); + } + + return new ComplexNumber( + (num1.REAL*num2.REAL + num1.IMAGINARY*num2.IMAGINARY) / divisor, + (num1.IMAGINARY*num2.REAL - num1.REAL*num2.IMAGINARY) / divisor + ); + } + + /** + * Computes the absolute value (magnitude) of a complex number. + * + * @param num the complex number + * @return the absolute value of num + */ + public static double abs(ComplexNumber num) + { + return Math.sqrt(num.REAL*num.REAL + num.IMAGINARY*num.IMAGINARY); + } + + /** + * Computes the exponential function of a complex number. + * + * @param num the complex number + * @return e raised to the power of num + */ + public static ComplexNumber exp(ComplexNumber num) + { + final double coefficient = Math.exp(num.REAL); + return new ComplexNumber( + coefficient * Math.cos(num.IMAGINARY), + coefficient * Math.sin(num.IMAGINARY) + ); + } + + /** + * Computes the natural logarithm of a complex number. + * + * @param num the complex number + * @return the natural logarithm of num + * @throws RuntimeException if num is zero + */ + public static ComplexNumber ln(ComplexNumber num) + { + if (num.equals(ZERO)) + { + throw new RuntimeException("can't take the logarithm of zero"); + } + + return new ComplexNumber( + Math.log(abs(num)), + Math.atan2(num.IMAGINARY,num.REAL) + ); + } + + /** + * Computes the power of a complex number raised to another complex number. + * + * @param num1 the base complex number + * @param num2 the exponent complex number + * @return num1 raised to the power of num2 + */ + public static ComplexNumber pow(ComplexNumber num1, ComplexNumber num2) + { + if (num1.equals(ZERO)) + { + return num2.equals(ZERO) ? ONE : ZERO; + } + + return exp(multiply(ln(num1),num2)); + } + + public static void main(final String[] args) { + ComplexNumber num1 = new ComplexNumber(-2,0); + System.out.println(ln(num1)); + } +} diff --git a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java new file mode 100644 index 000000000000..c688f95115df --- /dev/null +++ b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java @@ -0,0 +1,121 @@ +package com.thealgorithms.maths; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; +import com.thealgorithms.maths.ComplexNumberUtil.ComplexNumber; + +public class ComplexNumberUtilTest { + + private boolean checkIfEqual(ComplexNumber actual, ComplexNumber expected) + { + final double LIM = 0.0001; + if (Math.abs(actual.REAL-expected.REAL) > LIM || Math.abs(actual.IMAGINARY-expected.IMAGINARY) > LIM) + { + fail("Expected " + expected + " but got " + actual); + } + + return true; + } + + @Test + public void testComplexNumberConstructor() { + ComplexNumber c = new ComplexNumber(3.0, 4.0); + assertEquals(3.0, c.REAL); + assertEquals(4.0, c.IMAGINARY); + } + + @Test + public void testEquals() { + ComplexNumber c1 = new ComplexNumber(1, 2); + ComplexNumber c2 = new ComplexNumber(1, 2); + ComplexNumber c3 = new ComplexNumber(2, 1); + + assertTrue(checkIfEqual(c1, c2)); + assertNotEquals(c1, c3); + } + + @Test + public void testToString() { + ComplexNumber c = new ComplexNumber(3, -2); + assertEquals("3.0 - 2.0i", c.toString()); + } + + @Test + public void testAdd() { + ComplexNumber c1 = new ComplexNumber(1, 1); + ComplexNumber c2 = new ComplexNumber(2, 3); + ComplexNumber result = ComplexNumberUtil.add(c1, c2); + checkIfEqual(new ComplexNumber(3, 4), result); + } + + @Test + public void testSubtract() { + ComplexNumber c1 = new ComplexNumber(5, 5); + ComplexNumber c2 = new ComplexNumber(3, 2); + ComplexNumber result = ComplexNumberUtil.subtract(c1, c2); + checkIfEqual(new ComplexNumber(2, 3), result); + } + + @Test + public void testMultiply() { + ComplexNumber c1 = new ComplexNumber(1, 1); + ComplexNumber c2 = new ComplexNumber(2, 3); + ComplexNumber result = ComplexNumberUtil.multiply(c1, c2); + checkIfEqual(new ComplexNumber(-1, 5), result); + } + + @Test + public void testDivide() { + ComplexNumber c1 = new ComplexNumber(1, 1); + ComplexNumber c2 = new ComplexNumber(2, 3); + ComplexNumber result = ComplexNumberUtil.divide(c1, c2); + checkIfEqual(new ComplexNumber(0.38461538, -0.07692307), result); + } + + @Test + public void testDivideByZero() { + ComplexNumber c1 = new ComplexNumber(1, 1); + ComplexNumber c2 = new ComplexNumber(0, 0); + assertThrows(RuntimeException.class, () -> { + ComplexNumberUtil.divide(c1, c2); + }); + } + + @Test + public void testAbs() { + ComplexNumber c = new ComplexNumber(3, 4); + double result = ComplexNumberUtil.abs(c); + assertEquals(5.0, result, 0.001); + } + + @Test + public void testExp() { + ComplexNumber c = new ComplexNumber(1, Math.PI); + ComplexNumber result = ComplexNumberUtil.exp(c); + checkIfEqual(new ComplexNumber(-2.718281828459045, 0), result); + } + + @Test + public void testLn() { + ComplexNumber c = new ComplexNumber(5, 5); + ComplexNumber result = ComplexNumberUtil.ln(c); + checkIfEqual(new ComplexNumber(Math.log(5 * Math.sqrt(2)), Math.PI / 4), result); + } + + @Test + public void testPow1() { + ComplexNumber c1 = new ComplexNumber(0, 0); + ComplexNumber c2 = new ComplexNumber(0, 0); + ComplexNumber result = ComplexNumberUtil.pow(c1, c2); + checkIfEqual(ComplexNumberUtil.ONE, result); + } + + @Test + public void testPow2() { + ComplexNumber c1 = new ComplexNumber(-3, 4); + ComplexNumber c2 = new ComplexNumber(2, -5); + ComplexNumber result = ComplexNumberUtil.pow(c1,c2); + ComplexNumber expected = new ComplexNumber(-1428309.3755404,738159.21728509); + checkIfEqual(result,expected); + } +} From fcfeea7e2acd54d0f371b4caec18ea724bd7b649 Mon Sep 17 00:00:00 2001 From: rozi26 Date: Mon, 29 Apr 2024 19:27:56 -0700 Subject: [PATCH 04/18] add trigs --- .../maths/ComplexNumberUtil.java | 110 +++++++++++++++++- .../com/thealgorithms/maths/FFTBluestein.java | 2 +- .../maths/ComplexNumberUtilTest.java | 76 +++++++++++- 3 files changed, 183 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index 6d104573dbfe..b3a93e0a73ea 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -32,6 +32,9 @@ public String toString() { public final static ComplexNumber ZERO = new ComplexNumber(0,0); public final static ComplexNumber ONE = new ComplexNumber(1,0); + public final static ComplexNumber TWO = new ComplexNumber(2,0); + public final static ComplexNumber PLUS_I = new ComplexNumber(0,1); + public final static ComplexNumber MINUS_I = new ComplexNumber(0,-1); /** * add two complex numbers @@ -156,8 +159,111 @@ public static ComplexNumber pow(ComplexNumber num1, ComplexNumber num2) return exp(multiply(ln(num1),num2)); } + /** + * Computes the square root of a complex number. + * + * @param num the complex number + * @return the square root of num + */ + public static ComplexNumber sqrt(ComplexNumber num) + { + return pow(num,new ComplexNumber(0.5,0)); + } + + /** + * Computes the sine of a complex number. + * + * @param num the complex number + * @return the sine of num + */ + public static ComplexNumber sin(ComplexNumber num) + { + ComplexNumber exp1 = exp(multiply(num,PLUS_I)); + ComplexNumber exp2 = exp(multiply(num,MINUS_I)); + return divide(subtract(exp1,exp2),multiply(new ComplexNumber(2,0),PLUS_I)); + } + + /** + * Computes the cosine of a complex number. + * + * @param num the complex number + * @return the cosine of num + */ + public static ComplexNumber cos(ComplexNumber num) + { + ComplexNumber exp1 = exp(multiply(num,PLUS_I)); + ComplexNumber exp2 = exp(multiply(num,MINUS_I)); + return divide(add(exp1,exp2),TWO); + } + + /** + * Computes the tangent of a complex number. + * + * @param num the complex number + * @return the tangent of num + */ + public static ComplexNumber tan(ComplexNumber num) + { + return divide(sin(num),cos(num)); + } + + /** + * Computes the cotangent of a complex number. + * + * @param num the complex number + * @return the cotangent of num + */ + public static ComplexNumber cot(ComplexNumber num) + { + return divide(cos(num),sin(num)); + } + + /** + * Computes the arcsine of a complex number. + * + * @param num the complex number + * @return the arcsine of num + */ + public static ComplexNumber arcsin(ComplexNumber num) + { + ComplexNumber temp = sqrt(subtract(ONE,multiply(num,num))); + return multiply(MINUS_I,ln(add(multiply(PLUS_I,num),temp))); + } + + /** + * Computes the arccosine of a complex number. + * + * @param num the complex number + * @return the arccosine of num + */ + public static ComplexNumber arccos(ComplexNumber num) + { + ComplexNumber temp = sqrt(subtract(ONE,multiply(num,num))); + return multiply(MINUS_I,ln(add(num,multiply(temp,PLUS_I)))); + } + + /** + * Computes the arctangent of a complex number. + * + * @param num the complex number + * @return the arctangent of num + */ + public static ComplexNumber arctan(ComplexNumber num) + { + return multiply(divide(MINUS_I,TWO),ln(divide(subtract(PLUS_I,num),add(PLUS_I,num)))); + } + + /** + * Computes the arccotangent of a complex number. + * + * @param num the complex number + * @return the arccotangent of num + */ + public static ComplexNumber arccot(ComplexNumber num) + { + return multiply(divide(MINUS_I,TWO),ln(divide(add(num,PLUS_I),subtract(num,PLUS_I)))); + } + public static void main(final String[] args) { - ComplexNumber num1 = new ComplexNumber(-2,0); - System.out.println(ln(num1)); } } diff --git a/src/main/java/com/thealgorithms/maths/FFTBluestein.java b/src/main/java/com/thealgorithms/maths/FFTBluestein.java index cd698b62570a..2fd4346bf363 100644 --- a/src/main/java/com/thealgorithms/maths/FFTBluestein.java +++ b/src/main/java/com/thealgorithms/maths/FFTBluestein.java @@ -9,7 +9,7 @@ * @author Ioannis Karavitsis * @version 1.0 */ -public class FFTBluestein { +public class FFTBluestein { /** * Bluestein's FFT Algorithm. diff --git a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java index c688f95115df..56e5ea0d13ad 100644 --- a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java +++ b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java @@ -6,7 +6,7 @@ public class ComplexNumberUtilTest { - private boolean checkIfEqual(ComplexNumber actual, ComplexNumber expected) + private boolean checkIfEqual(ComplexNumber expected, ComplexNumber actual) { final double LIM = 0.0001; if (Math.abs(actual.REAL-expected.REAL) > LIM || Math.abs(actual.IMAGINARY-expected.IMAGINARY) > LIM) @@ -116,6 +116,78 @@ public void testPow2() { ComplexNumber c2 = new ComplexNumber(2, -5); ComplexNumber result = ComplexNumberUtil.pow(c1,c2); ComplexNumber expected = new ComplexNumber(-1428309.3755404,738159.21728509); - checkIfEqual(result,expected); + checkIfEqual(expected,result); + } + + @Test + public void testSqrt() + { + ComplexNumber c = new ComplexNumber(-2,3); + ComplexNumber result = ComplexNumberUtil.sqrt(c); + checkIfEqual(new ComplexNumber(0.8959774,1.6741492),result); + } + + @Test + public void testSin() { + ComplexNumber c = new ComplexNumber(1, 1); + ComplexNumber result = ComplexNumberUtil.sin(c); + ComplexNumber expected = new ComplexNumber(1.2984575814159773, 0.6349639147847361); + checkIfEqual(expected, result); + } + + @Test + public void testCos() { + ComplexNumber c = new ComplexNumber(1, 1); + ComplexNumber result = ComplexNumberUtil.cos(c); + ComplexNumber expected = new ComplexNumber(0.8337300251311491, -0.9888977057628651); + checkIfEqual(expected, result); + } + + @Test + public void testTan() { + ComplexNumber c = new ComplexNumber(1, 1); + ComplexNumber result = ComplexNumberUtil.tan(c); + ComplexNumber expected = new ComplexNumber(0.2717525853195117, 1.0839233273386948); + checkIfEqual(expected, result); + } + + @Test + public void testCot() { + ComplexNumber c = new ComplexNumber(1, 1); + ComplexNumber result = ComplexNumberUtil.cot(c); + ComplexNumber expected = new ComplexNumber(0.21762156185440268, -0.8680141428959249); + checkIfEqual(expected, result); + } + + @Test + public void testArcsin() { + ComplexNumber c = new ComplexNumber(0.5, 0); + ComplexNumber result = ComplexNumberUtil.arcsin(c); + ComplexNumber expected = new ComplexNumber(0.5235987755982989, 0); + checkIfEqual(expected, result); + } + + @Test + public void testArccos() { + ComplexNumber c = new ComplexNumber(0.5, 0); + ComplexNumber result = ComplexNumberUtil.arccos(c); + ComplexNumber expected = new ComplexNumber(1.0471975511965979, 0); + checkIfEqual(expected, result); + } + + @Test + public void testArctan() { + ComplexNumber c = new ComplexNumber(1, 1); + ComplexNumber result = ComplexNumberUtil.arctan(c); + ComplexNumber expected = new ComplexNumber(1.0172219678978514, 0.40235947810852507); + checkIfEqual(expected, result); + } + + @Test + public void testArccot() { + ComplexNumber c = new ComplexNumber(1, 1); + ComplexNumber result = ComplexNumberUtil.arccot(c); + ComplexNumber expected = new ComplexNumber(0.5535743588970452, -0.40235947810852507); + checkIfEqual(expected, result); } } From 175e125d9dc01babde7fce73a189f794ffaa073a Mon Sep 17 00:00:00 2001 From: rozi26 Date: Mon, 29 Apr 2024 19:41:31 -0700 Subject: [PATCH 05/18] add links to sources --- .../com/thealgorithms/maths/ComplexNumberUtil.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index b3a93e0a73ea..7d851bfbee69 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -65,6 +65,7 @@ public static ComplexNumber subtract(ComplexNumber num1, ComplexNumber num2) * @param num1 the first complex number * @param num2 the second complex number * @return the product of num1 and num2 + * @link ... */ public static ComplexNumber multiply(ComplexNumber num1, ComplexNumber num2) { @@ -81,6 +82,7 @@ public static ComplexNumber multiply(ComplexNumber num1, ComplexNumber num2) * @param num2 the denominator complex number * @return the result of dividing num1 by num2 * @throws RuntimeException if the divisor (num2) is zero + * @link ... */ public static ComplexNumber divide(ComplexNumber num1, ComplexNumber num2) { @@ -101,6 +103,7 @@ public static ComplexNumber divide(ComplexNumber num1, ComplexNumber num2) * * @param num the complex number * @return the absolute value of num + * @link ... */ public static double abs(ComplexNumber num) { @@ -112,6 +115,7 @@ public static double abs(ComplexNumber num) * * @param num the complex number * @return e raised to the power of num + * @link ... */ public static ComplexNumber exp(ComplexNumber num) { @@ -128,6 +132,7 @@ public static ComplexNumber exp(ComplexNumber num) * @param num the complex number * @return the natural logarithm of num * @throws RuntimeException if num is zero + * @link ... */ public static ComplexNumber ln(ComplexNumber num) { @@ -148,6 +153,7 @@ public static ComplexNumber ln(ComplexNumber num) * @param num1 the base complex number * @param num2 the exponent complex number * @return num1 raised to the power of num2 + * link ... */ public static ComplexNumber pow(ComplexNumber num1, ComplexNumber num2) { @@ -175,6 +181,7 @@ public static ComplexNumber sqrt(ComplexNumber num) * * @param num the complex number * @return the sine of num + * @link ...(Euler's_formula) */ public static ComplexNumber sin(ComplexNumber num) { @@ -188,6 +195,7 @@ public static ComplexNumber sin(ComplexNumber num) * * @param num the complex number * @return the cosine of num + * @link ...(Euler's_formula) */ public static ComplexNumber cos(ComplexNumber num) { @@ -201,6 +209,7 @@ public static ComplexNumber cos(ComplexNumber num) * * @param num the complex number * @return the tangent of num + * @link ... */ public static ComplexNumber tan(ComplexNumber num) { @@ -212,6 +221,7 @@ public static ComplexNumber tan(ComplexNumber num) * * @param num the complex number * @return the cotangent of num + * @link ... */ public static ComplexNumber cot(ComplexNumber num) { @@ -223,6 +233,7 @@ public static ComplexNumber cot(ComplexNumber num) * * @param num the complex number * @return the arcsine of num + * @link ... */ public static ComplexNumber arcsin(ComplexNumber num) { @@ -235,6 +246,7 @@ public static ComplexNumber arcsin(ComplexNumber num) * * @param num the complex number * @return the arccosine of num + * @link ... */ public static ComplexNumber arccos(ComplexNumber num) { @@ -247,6 +259,7 @@ public static ComplexNumber arccos(ComplexNumber num) * * @param num the complex number * @return the arctangent of num + * @link ... */ public static ComplexNumber arctan(ComplexNumber num) { @@ -258,6 +271,7 @@ public static ComplexNumber arctan(ComplexNumber num) * * @param num the complex number * @return the arccotangent of num + * @link ... */ public static ComplexNumber arccot(ComplexNumber num) { From 6ce45cad4ac19ffef658fa12e035cb767a909ba0 Mon Sep 17 00:00:00 2001 From: rozi26 Date: Mon, 29 Apr 2024 20:12:01 -0700 Subject: [PATCH 06/18] add exceptions for the trigonometric functions --- .../maths/ComplexNumberUtil.java | 28 +++++++++++++++++-- .../com/thealgorithms/maths/FFTBluestein.java | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index 7d851bfbee69..a9bfa8e9dcde 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -89,7 +89,7 @@ public static ComplexNumber divide(ComplexNumber num1, ComplexNumber num2) final double divisor = num2.REAL*num2.REAL + num2.IMAGINARY*num2.IMAGINARY; if (divisor == 0) { - throw new RuntimeException("can't divide by zero"); + throw new RuntimeException("Cannot divide by zero"); } return new ComplexNumber( @@ -138,7 +138,7 @@ public static ComplexNumber ln(ComplexNumber num) { if (num.equals(ZERO)) { - throw new RuntimeException("can't take the logarithm of zero"); + throw new RuntimeException("Cannot take the logarithm of zero"); } return new ComplexNumber( @@ -209,10 +209,16 @@ public static ComplexNumber cos(ComplexNumber num) * * @param num the complex number * @return the tangent of num + * @throws RuntimeException if num.real = pi*(n+0.5) * @link ... */ public static ComplexNumber tan(ComplexNumber num) { + if (num.REAL % Math.PI == Math.PI / 2) + { + throw new RuntimeException("Cannot take the tan of a number where the real part can be expressed as pi*(n+0.5)"); + } + return divide(sin(num),cos(num)); } @@ -221,10 +227,16 @@ public static ComplexNumber tan(ComplexNumber num) * * @param num the complex number * @return the cotangent of num + * @throws RuntimeException if num.real = pi*n * @link ... */ public static ComplexNumber cot(ComplexNumber num) { + if (num.REAL % Math.PI == 0) + { + throw new RuntimeException("Cannot take the cot of number with real part dividable by pi"); + } + return divide(cos(num),sin(num)); } @@ -259,10 +271,16 @@ public static ComplexNumber arccos(ComplexNumber num) * * @param num the complex number * @return the arctangent of num + * @throws RuntimeException if num=i or num=-i * @link ... */ public static ComplexNumber arctan(ComplexNumber num) { + if (num.equals(PLUS_I) || num.equals(MINUS_I)) + { + throw new RuntimeException("Cannot take the arctan of " + num); + } + return multiply(divide(MINUS_I,TWO),ln(divide(subtract(PLUS_I,num),add(PLUS_I,num)))); } @@ -271,10 +289,16 @@ public static ComplexNumber arctan(ComplexNumber num) * * @param num the complex number * @return the arccotangent of num + * @throws RuntimeException if num=i or num=-i * @link ... */ public static ComplexNumber arccot(ComplexNumber num) { + if (num.equals(PLUS_I) || num.equals(MINUS_I)) + { + throw new RuntimeException("Cannot take the arccot of " + num); + } + return multiply(divide(MINUS_I,TWO),ln(divide(add(num,PLUS_I),subtract(num,PLUS_I)))); } diff --git a/src/main/java/com/thealgorithms/maths/FFTBluestein.java b/src/main/java/com/thealgorithms/maths/FFTBluestein.java index 2fd4346bf363..cd698b62570a 100644 --- a/src/main/java/com/thealgorithms/maths/FFTBluestein.java +++ b/src/main/java/com/thealgorithms/maths/FFTBluestein.java @@ -9,7 +9,7 @@ * @author Ioannis Karavitsis * @version 1.0 */ -public class FFTBluestein { +public class FFTBluestein { /** * Bluestein's FFT Algorithm. From 61b3cc59b5efbad555b5b6f42e97289adea3e0b8 Mon Sep 17 00:00:00 2001 From: rozi26 Date: Mon, 29 Apr 2024 21:07:50 -0700 Subject: [PATCH 07/18] format the code using clang --- .../maths/ComplexNumberUtil.java | 148 +++++++----------- .../maths/ComplexNumberUtilTest.java | 26 ++- 2 files changed, 65 insertions(+), 109 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index a9bfa8e9dcde..d64ded6141c2 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -1,23 +1,19 @@ package com.thealgorithms.maths; - public class ComplexNumberUtil { - public static class ComplexNumber - { + public static class ComplexNumber { public final double REAL; public final double IMAGINARY; - public ComplexNumber(double real, double imaginary) - { + public ComplexNumber(double real, double imaginary) { REAL = real; IMAGINARY = imaginary; } @Override public boolean equals(Object obj) { - if (obj instanceof ComplexNumber num) - { + if (obj instanceof ComplexNumber num) { return this.REAL == num.REAL && this.IMAGINARY == num.IMAGINARY; } @@ -30,11 +26,11 @@ public String toString() { } } - public final static ComplexNumber ZERO = new ComplexNumber(0,0); - public final static ComplexNumber ONE = new ComplexNumber(1,0); - public final static ComplexNumber TWO = new ComplexNumber(2,0); - public final static ComplexNumber PLUS_I = new ComplexNumber(0,1); - public final static ComplexNumber MINUS_I = new ComplexNumber(0,-1); + public final static ComplexNumber ZERO = new ComplexNumber(0, 0); + public final static ComplexNumber ONE = new ComplexNumber(1, 0); + public final static ComplexNumber TWO = new ComplexNumber(2, 0); + public final static ComplexNumber PLUS_I = new ComplexNumber(0, 1); + public final static ComplexNumber MINUS_I = new ComplexNumber(0, -1); /** * add two complex numbers @@ -42,8 +38,7 @@ public String toString() { * @param num2 the second complex number * @return the sum of num1 and num2 */ - public static ComplexNumber add(ComplexNumber num1, ComplexNumber num2) - { + public static ComplexNumber add(ComplexNumber num1, ComplexNumber num2) { return new ComplexNumber(num1.REAL + num2.REAL, num1.IMAGINARY + num2.IMAGINARY); } @@ -54,8 +49,7 @@ public static ComplexNumber add(ComplexNumber num1, ComplexNumber num2) * @param num2 the second complex number * @return the result of subtracting num2 from num1 */ - public static ComplexNumber subtract(ComplexNumber num1, ComplexNumber num2) - { + public static ComplexNumber subtract(ComplexNumber num1, ComplexNumber num2) { return new ComplexNumber(num1.REAL - num2.REAL, num1.IMAGINARY - num2.IMAGINARY); } @@ -67,12 +61,8 @@ public static ComplexNumber subtract(ComplexNumber num1, ComplexNumber num2) * @return the product of num1 and num2 * @link ... */ - public static ComplexNumber multiply(ComplexNumber num1, ComplexNumber num2) - { - return new ComplexNumber( - num1.REAL*num2.REAL - num1.IMAGINARY*num2.IMAGINARY, - num1.REAL*num2.IMAGINARY + num1.IMAGINARY*num2.REAL - ); + public static ComplexNumber multiply(ComplexNumber num1, ComplexNumber num2) { + return new ComplexNumber(num1.REAL * num2.REAL - num1.IMAGINARY * num2.IMAGINARY, num1.REAL * num2.IMAGINARY + num1.IMAGINARY * num2.REAL); } /** @@ -84,18 +74,13 @@ public static ComplexNumber multiply(ComplexNumber num1, ComplexNumber num2) * @throws RuntimeException if the divisor (num2) is zero * @link ... */ - public static ComplexNumber divide(ComplexNumber num1, ComplexNumber num2) - { - final double divisor = num2.REAL*num2.REAL + num2.IMAGINARY*num2.IMAGINARY; - if (divisor == 0) - { + public static ComplexNumber divide(ComplexNumber num1, ComplexNumber num2) { + final double divisor = num2.REAL * num2.REAL + num2.IMAGINARY * num2.IMAGINARY; + if (divisor == 0) { throw new RuntimeException("Cannot divide by zero"); } - return new ComplexNumber( - (num1.REAL*num2.REAL + num1.IMAGINARY*num2.IMAGINARY) / divisor, - (num1.IMAGINARY*num2.REAL - num1.REAL*num2.IMAGINARY) / divisor - ); + return new ComplexNumber((num1.REAL * num2.REAL + num1.IMAGINARY * num2.IMAGINARY) / divisor, (num1.IMAGINARY * num2.REAL - num1.REAL * num2.IMAGINARY) / divisor); } /** @@ -105,9 +90,8 @@ public static ComplexNumber divide(ComplexNumber num1, ComplexNumber num2) * @return the absolute value of num * @link ... */ - public static double abs(ComplexNumber num) - { - return Math.sqrt(num.REAL*num.REAL + num.IMAGINARY*num.IMAGINARY); + public static double abs(ComplexNumber num) { + return Math.sqrt(num.REAL * num.REAL + num.IMAGINARY * num.IMAGINARY); } /** @@ -117,13 +101,9 @@ public static double abs(ComplexNumber num) * @return e raised to the power of num * @link ... */ - public static ComplexNumber exp(ComplexNumber num) - { + public static ComplexNumber exp(ComplexNumber num) { final double coefficient = Math.exp(num.REAL); - return new ComplexNumber( - coefficient * Math.cos(num.IMAGINARY), - coefficient * Math.sin(num.IMAGINARY) - ); + return new ComplexNumber(coefficient * Math.cos(num.IMAGINARY), coefficient * Math.sin(num.IMAGINARY)); } /** @@ -134,17 +114,12 @@ public static ComplexNumber exp(ComplexNumber num) * @throws RuntimeException if num is zero * @link ... */ - public static ComplexNumber ln(ComplexNumber num) - { - if (num.equals(ZERO)) - { + public static ComplexNumber ln(ComplexNumber num) { + if (num.equals(ZERO)) { throw new RuntimeException("Cannot take the logarithm of zero"); } - return new ComplexNumber( - Math.log(abs(num)), - Math.atan2(num.IMAGINARY,num.REAL) - ); + return new ComplexNumber(Math.log(abs(num)), Math.atan2(num.IMAGINARY, num.REAL)); } /** @@ -155,14 +130,12 @@ public static ComplexNumber ln(ComplexNumber num) * @return num1 raised to the power of num2 * link ... */ - public static ComplexNumber pow(ComplexNumber num1, ComplexNumber num2) - { - if (num1.equals(ZERO)) - { + public static ComplexNumber pow(ComplexNumber num1, ComplexNumber num2) { + if (num1.equals(ZERO)) { return num2.equals(ZERO) ? ONE : ZERO; } - return exp(multiply(ln(num1),num2)); + return exp(multiply(ln(num1), num2)); } /** @@ -171,9 +144,8 @@ public static ComplexNumber pow(ComplexNumber num1, ComplexNumber num2) * @param num the complex number * @return the square root of num */ - public static ComplexNumber sqrt(ComplexNumber num) - { - return pow(num,new ComplexNumber(0.5,0)); + public static ComplexNumber sqrt(ComplexNumber num) { + return pow(num, new ComplexNumber(0.5, 0)); } /** @@ -183,11 +155,10 @@ public static ComplexNumber sqrt(ComplexNumber num) * @return the sine of num * @link ...(Euler's_formula) */ - public static ComplexNumber sin(ComplexNumber num) - { - ComplexNumber exp1 = exp(multiply(num,PLUS_I)); - ComplexNumber exp2 = exp(multiply(num,MINUS_I)); - return divide(subtract(exp1,exp2),multiply(new ComplexNumber(2,0),PLUS_I)); + public static ComplexNumber sin(ComplexNumber num) { + ComplexNumber exp1 = exp(multiply(num, PLUS_I)); + ComplexNumber exp2 = exp(multiply(num, MINUS_I)); + return divide(subtract(exp1, exp2), multiply(new ComplexNumber(2, 0), PLUS_I)); } /** @@ -197,11 +168,10 @@ public static ComplexNumber sin(ComplexNumber num) * @return the cosine of num * @link ...(Euler's_formula) */ - public static ComplexNumber cos(ComplexNumber num) - { - ComplexNumber exp1 = exp(multiply(num,PLUS_I)); - ComplexNumber exp2 = exp(multiply(num,MINUS_I)); - return divide(add(exp1,exp2),TWO); + public static ComplexNumber cos(ComplexNumber num) { + ComplexNumber exp1 = exp(multiply(num, PLUS_I)); + ComplexNumber exp2 = exp(multiply(num, MINUS_I)); + return divide(add(exp1, exp2), TWO); } /** @@ -212,14 +182,12 @@ public static ComplexNumber cos(ComplexNumber num) * @throws RuntimeException if num.real = pi*(n+0.5) * @link ... */ - public static ComplexNumber tan(ComplexNumber num) - { - if (num.REAL % Math.PI == Math.PI / 2) - { + public static ComplexNumber tan(ComplexNumber num) { + if (num.REAL % Math.PI == Math.PI / 2) { throw new RuntimeException("Cannot take the tan of a number where the real part can be expressed as pi*(n+0.5)"); } - return divide(sin(num),cos(num)); + return divide(sin(num), cos(num)); } /** @@ -230,14 +198,12 @@ public static ComplexNumber tan(ComplexNumber num) * @throws RuntimeException if num.real = pi*n * @link ... */ - public static ComplexNumber cot(ComplexNumber num) - { - if (num.REAL % Math.PI == 0) - { + public static ComplexNumber cot(ComplexNumber num) { + if (num.REAL % Math.PI == 0) { throw new RuntimeException("Cannot take the cot of number with real part dividable by pi"); } - return divide(cos(num),sin(num)); + return divide(cos(num), sin(num)); } /** @@ -247,10 +213,9 @@ public static ComplexNumber cot(ComplexNumber num) * @return the arcsine of num * @link ... */ - public static ComplexNumber arcsin(ComplexNumber num) - { - ComplexNumber temp = sqrt(subtract(ONE,multiply(num,num))); - return multiply(MINUS_I,ln(add(multiply(PLUS_I,num),temp))); + public static ComplexNumber arcsin(ComplexNumber num) { + ComplexNumber temp = sqrt(subtract(ONE, multiply(num, num))); + return multiply(MINUS_I, ln(add(multiply(PLUS_I, num), temp))); } /** @@ -260,10 +225,9 @@ public static ComplexNumber arcsin(ComplexNumber num) * @return the arccosine of num * @link ... */ - public static ComplexNumber arccos(ComplexNumber num) - { - ComplexNumber temp = sqrt(subtract(ONE,multiply(num,num))); - return multiply(MINUS_I,ln(add(num,multiply(temp,PLUS_I)))); + public static ComplexNumber arccos(ComplexNumber num) { + ComplexNumber temp = sqrt(subtract(ONE, multiply(num, num))); + return multiply(MINUS_I, ln(add(num, multiply(temp, PLUS_I)))); } /** @@ -274,14 +238,12 @@ public static ComplexNumber arccos(ComplexNumber num) * @throws RuntimeException if num=i or num=-i * @link ... */ - public static ComplexNumber arctan(ComplexNumber num) - { - if (num.equals(PLUS_I) || num.equals(MINUS_I)) - { + public static ComplexNumber arctan(ComplexNumber num) { + if (num.equals(PLUS_I) || num.equals(MINUS_I)) { throw new RuntimeException("Cannot take the arctan of " + num); } - return multiply(divide(MINUS_I,TWO),ln(divide(subtract(PLUS_I,num),add(PLUS_I,num)))); + return multiply(divide(MINUS_I, TWO), ln(divide(subtract(PLUS_I, num), add(PLUS_I, num)))); } /** @@ -292,14 +254,12 @@ public static ComplexNumber arctan(ComplexNumber num) * @throws RuntimeException if num=i or num=-i * @link ... */ - public static ComplexNumber arccot(ComplexNumber num) - { - if (num.equals(PLUS_I) || num.equals(MINUS_I)) - { + public static ComplexNumber arccot(ComplexNumber num) { + if (num.equals(PLUS_I) || num.equals(MINUS_I)) { throw new RuntimeException("Cannot take the arccot of " + num); } - return multiply(divide(MINUS_I,TWO),ln(divide(add(num,PLUS_I),subtract(num,PLUS_I)))); + return multiply(divide(MINUS_I, TWO), ln(divide(add(num, PLUS_I), subtract(num, PLUS_I)))); } public static void main(final String[] args) { diff --git a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java index 56e5ea0d13ad..5b37db937d09 100644 --- a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java +++ b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java @@ -1,16 +1,15 @@ package com.thealgorithms.maths; import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.Test; + import com.thealgorithms.maths.ComplexNumberUtil.ComplexNumber; +import org.junit.jupiter.api.Test; public class ComplexNumberUtilTest { - private boolean checkIfEqual(ComplexNumber expected, ComplexNumber actual) - { + private boolean checkIfEqual(ComplexNumber expected, ComplexNumber actual) { final double LIM = 0.0001; - if (Math.abs(actual.REAL-expected.REAL) > LIM || Math.abs(actual.IMAGINARY-expected.IMAGINARY) > LIM) - { + if (Math.abs(actual.REAL - expected.REAL) > LIM || Math.abs(actual.IMAGINARY - expected.IMAGINARY) > LIM) { fail("Expected " + expected + " but got " + actual); } @@ -76,9 +75,7 @@ public void testDivide() { public void testDivideByZero() { ComplexNumber c1 = new ComplexNumber(1, 1); ComplexNumber c2 = new ComplexNumber(0, 0); - assertThrows(RuntimeException.class, () -> { - ComplexNumberUtil.divide(c1, c2); - }); + assertThrows(RuntimeException.class, () -> { ComplexNumberUtil.divide(c1, c2); }); } @Test @@ -114,17 +111,16 @@ public void testPow1() { public void testPow2() { ComplexNumber c1 = new ComplexNumber(-3, 4); ComplexNumber c2 = new ComplexNumber(2, -5); - ComplexNumber result = ComplexNumberUtil.pow(c1,c2); - ComplexNumber expected = new ComplexNumber(-1428309.3755404,738159.21728509); - checkIfEqual(expected,result); + ComplexNumber result = ComplexNumberUtil.pow(c1, c2); + ComplexNumber expected = new ComplexNumber(-1428309.3755404, 738159.21728509); + checkIfEqual(expected, result); } @Test - public void testSqrt() - { - ComplexNumber c = new ComplexNumber(-2,3); + public void testSqrt() { + ComplexNumber c = new ComplexNumber(-2, 3); ComplexNumber result = ComplexNumberUtil.sqrt(c); - checkIfEqual(new ComplexNumber(0.8959774,1.6741492),result); + checkIfEqual(new ComplexNumber(0.8959774, 1.6741492), result); } @Test From f6fe7c26a1b40caea2afd190393447f2b062585a Mon Sep 17 00:00:00 2001 From: rozi26 Date: Mon, 29 Apr 2024 21:51:46 -0700 Subject: [PATCH 08/18] add unit tests --- .../maths/ComplexNumberUtil.java | 3 -- .../maths/ComplexNumberUtilTest.java | 36 +++++++++++++++++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index d64ded6141c2..d3f25efc8786 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -261,7 +261,4 @@ public static ComplexNumber arccot(ComplexNumber num) { return multiply(divide(MINUS_I, TWO), ln(divide(add(num, PLUS_I), subtract(num, PLUS_I)))); } - - public static void main(final String[] args) { - } } diff --git a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java index 5b37db937d09..fc8b0692c429 100644 --- a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java +++ b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java @@ -24,7 +24,7 @@ public void testComplexNumberConstructor() { } @Test - public void testEquals() { + public void testEquals1() { ComplexNumber c1 = new ComplexNumber(1, 2); ComplexNumber c2 = new ComplexNumber(1, 2); ComplexNumber c3 = new ComplexNumber(2, 1); @@ -33,6 +33,12 @@ public void testEquals() { assertNotEquals(c1, c3); } + @Test + public void testEquals2() { + ComplexNumber c1 = new ComplexNumber(1, 2); + assertNotEquals(c1, 2); + } + @Test public void testToString() { ComplexNumber c = new ComplexNumber(3, -2); @@ -75,7 +81,7 @@ public void testDivide() { public void testDivideByZero() { ComplexNumber c1 = new ComplexNumber(1, 1); ComplexNumber c2 = new ComplexNumber(0, 0); - assertThrows(RuntimeException.class, () -> { ComplexNumberUtil.divide(c1, c2); }); + assertThrows(RuntimeException.class, () -> ComplexNumberUtil.divide(c1, c2)); } @Test @@ -99,6 +105,11 @@ public void testLn() { checkIfEqual(new ComplexNumber(Math.log(5 * Math.sqrt(2)), Math.PI / 4), result); } + @Test + public void testLnOfZero() { + assertThrows(RuntimeException.class, () -> ComplexNumberUtil.ln(ComplexNumberUtil.ZERO)); + } + @Test public void testPow1() { ComplexNumber c1 = new ComplexNumber(0, 0); @@ -147,6 +158,11 @@ public void testTan() { checkIfEqual(expected, result); } + @Test + public void testTanOutOfRange() { + assertThrows(RuntimeException.class, () -> ComplexNumberUtil.tan(new ComplexNumber(Math.PI * 2.5,0))); + } + @Test public void testCot() { ComplexNumber c = new ComplexNumber(1, 1); @@ -155,6 +171,11 @@ public void testCot() { checkIfEqual(expected, result); } + @Test + public void testCotOutOfRange() { + assertThrows(RuntimeException.class, () -> ComplexNumberUtil.cot(new ComplexNumber(Math.PI * 3,0))); + } + @Test public void testArcsin() { ComplexNumber c = new ComplexNumber(0.5, 0); @@ -179,6 +200,11 @@ public void testArctan() { checkIfEqual(expected, result); } + @Test + public void testArctanOfI() { + assertThrows(RuntimeException.class, () -> ComplexNumberUtil.arctan(ComplexNumberUtil.PLUS_I)); + } + @Test public void testArccot() { ComplexNumber c = new ComplexNumber(1, 1); @@ -186,4 +212,10 @@ public void testArccot() { ComplexNumber expected = new ComplexNumber(0.5535743588970452, -0.40235947810852507); checkIfEqual(expected, result); } + + @Test + public void testArccotOfI() + { + assertThrows(RuntimeException.class, () -> ComplexNumberUtil.arccot(ComplexNumberUtil.PLUS_I)); + } } From 27644540afe67a9e3106c73f3eb282176c2dc7cb Mon Sep 17 00:00:00 2001 From: rozi26 Date: Mon, 29 Apr 2024 21:56:31 -0700 Subject: [PATCH 09/18] run clang format on the test file --- .../com/thealgorithms/maths/ComplexNumberUtilTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java index fc8b0692c429..dd19b647589e 100644 --- a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java +++ b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java @@ -160,7 +160,7 @@ public void testTan() { @Test public void testTanOutOfRange() { - assertThrows(RuntimeException.class, () -> ComplexNumberUtil.tan(new ComplexNumber(Math.PI * 2.5,0))); + assertThrows(RuntimeException.class, () -> ComplexNumberUtil.tan(new ComplexNumber(Math.PI * 2.5, 0))); } @Test @@ -173,7 +173,7 @@ public void testCot() { @Test public void testCotOutOfRange() { - assertThrows(RuntimeException.class, () -> ComplexNumberUtil.cot(new ComplexNumber(Math.PI * 3,0))); + assertThrows(RuntimeException.class, () -> ComplexNumberUtil.cot(new ComplexNumber(Math.PI * 3, 0))); } @Test @@ -214,8 +214,7 @@ public void testArccot() { } @Test - public void testArccotOfI() - { + public void testArccotOfI() { assertThrows(RuntimeException.class, () -> ComplexNumberUtil.arccot(ComplexNumberUtil.PLUS_I)); } } From b30eaab351217aac57e497438c0068b1a0462a1e Mon Sep 17 00:00:00 2001 From: rozi26 <76447029+rozi26@users.noreply.github.com> Date: Thu, 2 May 2024 15:54:29 +0300 Subject: [PATCH 10/18] temp changes --- .../com/thealgorithms/maths/ComplexNumberUtil.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index d3f25efc8786..5ba05455a202 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -1,5 +1,7 @@ package com.thealgorithms.maths; +import java.math.BigDecimal; + public class ComplexNumberUtil { public static class ComplexNumber { @@ -261,4 +263,15 @@ public static ComplexNumber arccot(ComplexNumber num) { return multiply(divide(MINUS_I, TWO), ln(divide(add(num, PLUS_I), subtract(num, PLUS_I)))); } + + public ComplexNumber add(ComplexNumber added) + { + return new ComplexNumber(1,1); + } + + public static void main(String[] args) + { + ComplexNumber num1 = new ComplexNumber(1,1); + ComplexNumber num2 = new ComplexNumber(2,3); + } } From 0bf5319c5e7aed54389e21867b8b3103a980f290 Mon Sep 17 00:00:00 2001 From: rozi26 <76447029+rozi26@users.noreply.github.com> Date: Thu, 2 May 2024 15:56:57 +0300 Subject: [PATCH 11/18] make the code ready for pull request --- .../com/thealgorithms/maths/ComplexNumberUtil.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index 5ba05455a202..4cfe1606a206 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -263,15 +263,4 @@ public static ComplexNumber arccot(ComplexNumber num) { return multiply(divide(MINUS_I, TWO), ln(divide(add(num, PLUS_I), subtract(num, PLUS_I)))); } - - public ComplexNumber add(ComplexNumber added) - { - return new ComplexNumber(1,1); - } - - public static void main(String[] args) - { - ComplexNumber num1 = new ComplexNumber(1,1); - ComplexNumber num2 = new ComplexNumber(2,3); - } } From 799ba6186f53dcda106ac8ffc01f4511ad550ab1 Mon Sep 17 00:00:00 2001 From: rozi26 <76447029+rozi26@users.noreply.github.com> Date: Thu, 2 May 2024 15:57:32 +0300 Subject: [PATCH 12/18] make the code ready for pull request --- src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index 4cfe1606a206..d3f25efc8786 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -1,7 +1,5 @@ package com.thealgorithms.maths; -import java.math.BigDecimal; - public class ComplexNumberUtil { public static class ComplexNumber { From d5d6ee0ac850dd97e41455674d64e7ee15932008 Mon Sep 17 00:00:00 2001 From: rozi26 <76447029+rozi26@users.noreply.github.com> Date: Thu, 2 May 2024 16:23:01 +0300 Subject: [PATCH 13/18] change the order or final static --- .../com/thealgorithms/maths/ComplexNumberUtil.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index d3f25efc8786..eb0e0e5816b7 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -26,11 +26,11 @@ public String toString() { } } - public final static ComplexNumber ZERO = new ComplexNumber(0, 0); - public final static ComplexNumber ONE = new ComplexNumber(1, 0); - public final static ComplexNumber TWO = new ComplexNumber(2, 0); - public final static ComplexNumber PLUS_I = new ComplexNumber(0, 1); - public final static ComplexNumber MINUS_I = new ComplexNumber(0, -1); + public static final ComplexNumber ZERO = new ComplexNumber(0, 0); + public static final ComplexNumber ONE = new ComplexNumber(1, 0); + public static final ComplexNumber TWO = new ComplexNumber(2, 0); + public static final ComplexNumber PLUS_I = new ComplexNumber(0, 1); + public static final ComplexNumber MINUS_I = new ComplexNumber(0, -1); /** * add two complex numbers From 3495410a21ce127b9fa95d269deb7bd6076d1ba9 Mon Sep 17 00:00:00 2001 From: rozi26 <76447029+rozi26@users.noreply.github.com> Date: Tue, 7 May 2024 11:04:01 +0300 Subject: [PATCH 14/18] Update src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com> --- .../java/com/thealgorithms/maths/ComplexNumberUtilTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java index dd19b647589e..7f58ce61b807 100644 --- a/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java +++ b/src/test/java/com/thealgorithms/maths/ComplexNumberUtilTest.java @@ -1,6 +1,10 @@ package com.thealgorithms.maths; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; import com.thealgorithms.maths.ComplexNumberUtil.ComplexNumber; import org.junit.jupiter.api.Test; From 95cae760b480b467bf36d20c294b62141b85000b Mon Sep 17 00:00:00 2001 From: rozi26 <76447029+rozi26@users.noreply.github.com> Date: Tue, 7 May 2024 11:04:11 +0300 Subject: [PATCH 15/18] Update src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com> --- src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index eb0e0e5816b7..897ccc7a46fb 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -139,7 +139,7 @@ public static ComplexNumber pow(ComplexNumber num1, ComplexNumber num2) { } /** - * Computes the square root of a complex number. + * Computes the principal square root of a complex number. * * @param num the complex number * @return the square root of num From 592f443430755496e9d44f9b7e1ec441fe063898 Mon Sep 17 00:00:00 2001 From: rozi26 <76447029+rozi26@users.noreply.github.com> Date: Tue, 7 May 2024 11:04:47 +0300 Subject: [PATCH 16/18] Update src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com> --- src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index 897ccc7a46fb..112cb6b91a38 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -107,7 +107,7 @@ public static ComplexNumber exp(ComplexNumber num) { } /** - * Computes the natural logarithm of a complex number. + * Computes the principal value of natural logarithm of a complex number. * * @param num the complex number * @return the natural logarithm of num From 6f12753f4bf3c5b17ab53850e6af04c9f8848144 Mon Sep 17 00:00:00 2001 From: rozi26 <76447029+rozi26@users.noreply.github.com> Date: Tue, 7 May 2024 11:04:59 +0300 Subject: [PATCH 17/18] Update src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com> --- src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java index 112cb6b91a38..e16fd37451f3 100644 --- a/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java +++ b/src/main/java/com/thealgorithms/maths/ComplexNumberUtil.java @@ -114,7 +114,7 @@ public static ComplexNumber exp(ComplexNumber num) { * @throws RuntimeException if num is zero * @link ... */ - public static ComplexNumber ln(ComplexNumber num) { + public static ComplexNumber log(ComplexNumber num) { if (num.equals(ZERO)) { throw new RuntimeException("Cannot take the logarithm of zero"); } From d629eec448ea032afbc04a9d4508edb77b92ca4d Mon Sep 17 00:00:00 2001 From: rozi26 Date: Tue, 7 May 2024 08:23:36 +0000 Subject: [PATCH 18/18] Update directory --- DIRECTORY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 2b89695d3872..da264de19438 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -858,6 +858,7 @@ * [BogoSortTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/sorts/BogoSortTest.java) * [BubbleSortTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/sorts/BubbleSortTest.java) * [BucketSortTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/sorts/BucketSortTest.java) + * [CircleSortTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/sorts/CircleSortTest.java) * [CocktailShakerSortTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/sorts/CocktailShakerSortTest.java) * [CombSortTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/sorts/CombSortTest.java) * [DualPivotQuickSortTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/sorts/DualPivotQuickSortTest.java)