From f2bb247b534ac642562803024520ed4a36c06dac Mon Sep 17 00:00:00 2001 From: Dimitrios Efthymiou Date: Thu, 13 Jul 2023 16:32:12 +0100 Subject: [PATCH] [NUMBERS]: implemented method that determines if 2 integers are relatively prime or coprime --- commons-numbers-primes/pom.xml | 6 ++ .../apache/commons/numbers/primes/Primes.java | 41 +++++++++++ .../commons/numbers/primes/SmallPrimes.java | 41 +++++++++++ .../commons/numbers/primes/PrimesTest.java | 73 +++++++++++++++++++ .../numbers/primes/SmallPrimesTest.java | 72 ++++++++++++++++++ 5 files changed, 233 insertions(+) diff --git a/commons-numbers-primes/pom.xml b/commons-numbers-primes/pom.xml index 76e2de4b9..3e2e586ef 100644 --- a/commons-numbers-primes/pom.xml +++ b/commons-numbers-primes/pom.xml @@ -40,5 +40,11 @@ ${basedir}/.. primes + + + org.apache.commons + commons-numbers-core + + diff --git a/commons-numbers-primes/src/main/java/org/apache/commons/numbers/primes/Primes.java b/commons-numbers-primes/src/main/java/org/apache/commons/numbers/primes/Primes.java index 860678d15..1e6a4de67 100644 --- a/commons-numbers-primes/src/main/java/org/apache/commons/numbers/primes/Primes.java +++ b/commons-numbers-primes/src/main/java/org/apache/commons/numbers/primes/Primes.java @@ -18,6 +18,7 @@ import java.text.MessageFormat; import java.util.List; +import org.apache.commons.numbers.core.ArithmeticUtils; /** * Methods related to prime numbers in the range of int. @@ -112,4 +113,44 @@ public static List primeFactors(int n) { } return SmallPrimes.trialDivision(n); } + + /** + * Checks if the absolute value of the 2 given integers are relative primes. + * @param x first integer to check. + * @param y second integer to check. + * @return true/false i.e. if the arguments are relative primes. + */ + public static boolean areRelativePrimes(final int x, final int y) { + return SmallPrimes.areRelativePrimes(x, y); + } + + /** + * Checks if the absolute value of the 2 given integers are relative primes. + * @param x first integer to check. + * @param y second integer to check. + * @return true/false i.e. if the arguments are relative primes. + */ + public static boolean areRelativePrimes(final int x, final long y) { + return SmallPrimes.areRelativePrimes(x, y); + } + + /** + * Checks if the absolute value of the 2 given integers are relative primes. + * @param x first integer to check. + * @param y second integer to check. + * @return true/false i.e. if the arguments are relative primes. + */ + public static boolean areRelativePrimes(final long x, final int y) { + return SmallPrimes.areRelativePrimes(x, y); + } + + /** + * Checks if the absolute value of the 2 given integers are relative primes. + * @param x first integer to check. + * @param y second integer to check. + * @return true/false i.e. if the arguments are relative primes. + */ + public static boolean areRelativePrimes(final long x, final long y) { + return SmallPrimes.areRelativePrimes(x, y); + } } diff --git a/commons-numbers-primes/src/main/java/org/apache/commons/numbers/primes/SmallPrimes.java b/commons-numbers-primes/src/main/java/org/apache/commons/numbers/primes/SmallPrimes.java index 5cac3c666..cd448ed78 100644 --- a/commons-numbers-primes/src/main/java/org/apache/commons/numbers/primes/SmallPrimes.java +++ b/commons-numbers-primes/src/main/java/org/apache/commons/numbers/primes/SmallPrimes.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map.Entry; import java.util.Set; +import org.apache.commons.numbers.core.ArithmeticUtils; /** * Utility methods to work on primes within the int range. @@ -286,4 +287,44 @@ static boolean millerRabinPrimeTest(final int n) { } return true; // definitely prime } + + /** + * Checks if the absolute value of the 2 given integers are relative primes. + * @param x first integer to check. + * @param y second integer to check. + * @return true/false i.e. if the arguments are relative primes. + */ + static boolean areRelativePrimes(final int x, final int y) { + return ArithmeticUtils.gcd(x, y) == 1; + } + + /** + * Checks if the absolute value of the 2 given integers are relative primes. + * @param x first integer to check. + * @param y second integer to check. + * @return true/false i.e. if the arguments are relative primes. + */ + static boolean areRelativePrimes(final int x, final long y) { + return ArithmeticUtils.gcd(x, y) == 1; + } + + /** + * Checks if the absolute value of the 2 given integers are relative primes. + * @param x first integer to check. + * @param y second integer to check. + * @return true/false i.e. if the arguments are relative primes. + */ + static boolean areRelativePrimes(final long x, final int y) { + return ArithmeticUtils.gcd(x, y) == 1; + } + + /** + * Checks if the absolute value of the 2 given integers are relative primes. + * @param x first integer to check. + * @param y second integer to check. + * @return true/false i.e. if the arguments are relative primes. + */ + static boolean areRelativePrimes(final long x, final long y) { + return ArithmeticUtils.gcd(x, y) == 1; + } } diff --git a/commons-numbers-primes/src/test/java/org/apache/commons/numbers/primes/PrimesTest.java b/commons-numbers-primes/src/test/java/org/apache/commons/numbers/primes/PrimesTest.java index d1140faf1..c075e59b1 100644 --- a/commons-numbers-primes/src/test/java/org/apache/commons/numbers/primes/PrimesTest.java +++ b/commons-numbers-primes/src/test/java/org/apache/commons/numbers/primes/PrimesTest.java @@ -167,4 +167,77 @@ void testPrimeFactors() { Assertions.assertEquals(1, factors.size()); } } + + + @Test + void areRelativePrimes_int_int() { + Assertions.assertTrue(Primes.areRelativePrimes(-10, -17)); + Assertions.assertTrue(Primes.areRelativePrimes(10, 17)); + Assertions.assertFalse(Primes.areRelativePrimes(10, 20)); + Assertions.assertFalse(Primes.areRelativePrimes(-10, -20)); + Assertions.assertFalse(Primes.areRelativePrimes(0, -20)); + Assertions.assertFalse(Primes.areRelativePrimes(0, 20)); + Assertions.assertTrue(Primes.areRelativePrimes(0, 1)); + Assertions.assertFalse(Primes.areRelativePrimes(0, 100)); + Assertions.assertTrue(Primes.areRelativePrimes(1, 1)); + Assertions.assertTrue(Primes.areRelativePrimes(1, 2)); + Assertions.assertTrue(Primes.areRelativePrimes(1, 26)); + Assertions.assertFalse(Primes.areRelativePrimes(2, 2)); + Assertions.assertTrue(Primes.areRelativePrimes(2, 3)); + Assertions.assertFalse(Primes.areRelativePrimes(2, 4)); + Assertions.assertTrue(Primes.areRelativePrimes(2, 17)); + Assertions.assertFalse(Primes.areRelativePrimes(200, 64000)); + Assertions.assertTrue(Primes.areRelativePrimes(200, 64001)); + } + + @Test + void areRelativePrimes_int_long() { + Assertions.assertTrue(Primes.areRelativePrimes(-10, -17L)); + Assertions.assertTrue(Primes.areRelativePrimes(10, 17L)); + Assertions.assertFalse(Primes.areRelativePrimes(0, -20L)); + Assertions.assertFalse(Primes.areRelativePrimes(0, 20L)); + Assertions.assertTrue(Primes.areRelativePrimes(0, 1L)); + Assertions.assertTrue(Primes.areRelativePrimes(1, 1L)); + Assertions.assertTrue(Primes.areRelativePrimes(1, 26L)); + Assertions.assertTrue(Primes.areRelativePrimes(2, 3L)); + Assertions.assertFalse(Primes.areRelativePrimes(2, 4L)); + Assertions.assertFalse(Primes.areRelativePrimes(200, 64000L)); + Assertions.assertFalse(Primes.areRelativePrimes(200, 64000000000L)); + Assertions.assertTrue(Primes.areRelativePrimes(200, 64000000001L)); + } + + @Test + void areRelativePrimes_long_int() { + Assertions.assertTrue(Primes.areRelativePrimes(-10L, -17)); + Assertions.assertTrue(Primes.areRelativePrimes(10L, 17)); + Assertions.assertFalse(Primes.areRelativePrimes(0L, -20)); + Assertions.assertFalse(Primes.areRelativePrimes(0L, 20)); + Assertions.assertTrue(Primes.areRelativePrimes(0L, 1)); + Assertions.assertTrue(Primes.areRelativePrimes(1L, 1)); + Assertions.assertTrue(Primes.areRelativePrimes(1L, 26)); + Assertions.assertTrue(Primes.areRelativePrimes(2L, 3)); + Assertions.assertFalse(Primes.areRelativePrimes(2L, 4)); + Assertions.assertFalse(Primes.areRelativePrimes(200L, 64000)); + Assertions.assertFalse(Primes.areRelativePrimes(64000000000L, 200)); + Assertions.assertTrue(Primes.areRelativePrimes(64000000001L, 200)); + } + + @Test + void areRelativePrimes_long_long() { + Assertions.assertTrue(Primes.areRelativePrimes(-10L, -17L)); + Assertions.assertTrue(Primes.areRelativePrimes(10L, 17L)); + Assertions.assertFalse(Primes.areRelativePrimes(0L, -20L)); + Assertions.assertFalse(Primes.areRelativePrimes(0L, 20L)); + Assertions.assertTrue(Primes.areRelativePrimes(0L, 1L)); + Assertions.assertTrue(Primes.areRelativePrimes(1L, 1L)); + Assertions.assertTrue(Primes.areRelativePrimes(1L, 26L)); + Assertions.assertTrue(Primes.areRelativePrimes(2L, 3L)); + Assertions.assertFalse(Primes.areRelativePrimes(2L, 4L)); + Assertions.assertFalse(Primes.areRelativePrimes(200L, 64000L)); + Assertions.assertFalse(Primes.areRelativePrimes(64000000000L, 200L)); + Assertions.assertTrue(Primes.areRelativePrimes(64000000001L, 200L)); + Assertions.assertFalse(Primes.areRelativePrimes(64000000000L, 32000000000L)); + Assertions.assertTrue(Primes.areRelativePrimes(64000000000L, 32000000001L)); + Assertions.assertTrue(Primes.areRelativePrimes(64000000001L, 32000000000L)); + } } diff --git a/commons-numbers-primes/src/test/java/org/apache/commons/numbers/primes/SmallPrimesTest.java b/commons-numbers-primes/src/test/java/org/apache/commons/numbers/primes/SmallPrimesTest.java index 7bf1af302..95fd0521c 100644 --- a/commons-numbers-primes/src/test/java/org/apache/commons/numbers/primes/SmallPrimesTest.java +++ b/commons-numbers-primes/src/test/java/org/apache/commons/numbers/primes/SmallPrimesTest.java @@ -143,4 +143,76 @@ void millerRabinPrimeTest_composites() { } } } + + @Test + void areRelativePrimes_int_int() { + Assertions.assertTrue(SmallPrimes.areRelativePrimes(-10, -17)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(10, 17)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(10, 20)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(-10, -20)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(0, -20)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(0, 20)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(0, 1)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(0, 100)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(1, 1)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(1, 2)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(1, 26)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(2, 2)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(2, 3)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(2, 4)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(2, 17)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(200, 64000)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(200, 64001)); + } + + @Test + void areRelativePrimes_int_long() { + Assertions.assertTrue(SmallPrimes.areRelativePrimes(-10, -17L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(10, 17L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(0, -20L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(0, 20L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(0, 1L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(1, 1L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(1, 26L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(2, 3L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(2, 4L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(200, 64000L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(200, 64000000000L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(200, 64000000001L)); + } + + @Test + void areRelativePrimes_long_int() { + Assertions.assertTrue(SmallPrimes.areRelativePrimes(-10L, -17)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(10L, 17)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(0L, -20)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(0L, 20)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(0L, 1)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(1L, 1)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(1L, 26)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(2L, 3)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(2L, 4)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(200L, 64000)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(64000000000L, 200)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(64000000001L, 200)); + } + + @Test + void areRelativePrimes_long_long() { + Assertions.assertTrue(SmallPrimes.areRelativePrimes(-10L, -17L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(10L, 17L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(0L, -20L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(0L, 20L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(0L, 1L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(1L, 1L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(1L, 26L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(2L, 3L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(2L, 4L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(200L, 64000L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(64000000000L, 200L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(64000000001L, 200L)); + Assertions.assertFalse(SmallPrimes.areRelativePrimes(64000000000L, 32000000000L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(64000000000L, 32000000001L)); + Assertions.assertTrue(SmallPrimes.areRelativePrimes(64000000001L, 32000000000L)); + } }