diff --git a/src/main/java/com/thealgorithms/others/EulersFunction.java b/src/main/java/com/thealgorithms/others/EulersFunction.java index b8ab2acf..27c9aed8 100644 --- a/src/main/java/com/thealgorithms/others/EulersFunction.java +++ b/src/main/java/com/thealgorithms/others/EulersFunction.java @@ -1,17 +1,27 @@ package com.thealgorithms.others; /** - * You can read more about Euler's totient function - * - *

- * See https://en.wikipedia.org/wiki/Euler%27s_totient_function + * @brief utility class for Euler's totient function */ -public class EulersFunction { +final public class EulersFunction { + private EulersFunction() { + } - // This method returns us number of x that (x < n) and gcd(x, n) == 1 in O(sqrt(n)) time - // complexity; + private static void checkInput(int n) { + if (n <= 0) { + throw new IllegalArgumentException("n must be positive."); + } + } + /** + * @brief computes the value of Euler's totient function for given input + * @details has time complexity of O(sqrt(n)) + * @param n the input + * @exception IllegalArgumentException n is non-positive + * @return the value of Euler's totient function for the input + */ public static int getEuler(int n) { + checkInput(n); int result = n; for (int i = 2; i * i <= n; i++) { if (n % i == 0) { @@ -26,10 +36,4 @@ public class EulersFunction { } return result; } - - public static void main(String[] args) { - for (int i = 1; i < 100; i++) { - System.out.println(getEuler(i)); - } - } } diff --git a/src/test/java/com/thealgorithms/others/EulersFunctionTest.java b/src/test/java/com/thealgorithms/others/EulersFunctionTest.java new file mode 100644 index 00000000..b80926b8 --- /dev/null +++ b/src/test/java/com/thealgorithms/others/EulersFunctionTest.java @@ -0,0 +1,39 @@ +package com.thealgorithms.others; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.HashMap; +import org.junit.jupiter.api.Test; + +class EulersFunctionTest { + @Test + public void testGetEuler() { + HashMap testCases = new HashMap<>(); + testCases.put(1, 1); + testCases.put(2, 1); + testCases.put(3, 2); + testCases.put(4, 2); + testCases.put(5, 4); + testCases.put(6, 2); + testCases.put(10, 4); + testCases.put(21, 12); + testCases.put(69, 44); + testCases.put(47, 46); + testCases.put(46, 22); + testCases.put(55, 40); + testCases.put(34, 16); + testCases.put(20, 8); + testCases.put(20, 8); + testCases.put(1024, 512); + + for (final var tc : testCases.entrySet()) { + assertEquals(tc.getValue(), EulersFunction.getEuler(tc.getKey())); + } + } + + @Test + public void testGetEulerThrowsExceptionForNonPositiveInput() { + assertThrows(IllegalArgumentException.class, () -> EulersFunction.getEuler(0)); + } +}