diff --git a/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java index 9d5152290..90cdf7c84 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java @@ -805,9 +805,16 @@ public class NumberUtil { * @param n 数字 * @return 是否是质数 */ - public static boolean isPrimes(final int n) { + public static boolean isPrime(final int n) { Assert.isTrue(n > 1, "The number must be > 1"); - for (int i = 2; i <= Math.sqrt(n); i++) { + if (n <= 3) { + return true; + } else if ((n & 1) == 0) { + // 快速排除偶数 + return false; + } + final int end = (int) Math.sqrt(n); + for (int i = 3; i <= end; i += 2) { if (n % i == 0) { return false; } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index 0089c0481..69e67d368 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -459,4 +459,18 @@ public class NumberUtilTest { //noinspection ResultOfMethodCallIgnored NumberUtil.range(0, Integer.MIN_VALUE); } + + @Test + public void isPrimeTest(){ + Assert.assertTrue(NumberUtil.isPrime(2)); + Assert.assertTrue(NumberUtil.isPrime(3)); + Assert.assertTrue(NumberUtil.isPrime(7)); + Assert.assertTrue(NumberUtil.isPrime(17)); + Assert.assertTrue(NumberUtil.isPrime(296731)); + Assert.assertTrue(NumberUtil.isPrime(99999989)); + + Assert.assertFalse(NumberUtil.isPrime(4)); + Assert.assertFalse(NumberUtil.isPrime(296733)); + Assert.assertFalse(NumberUtil.isPrime(20_4123_2399)); + } }