diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 85ca7293fc..90af1928ec 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -1342,10 +1342,11 @@ public class NumberUtil { */ public static boolean isPrimes(int n) { Assert.isTrue(n > 1, "The number must be > 1"); - for (int i = 2; i <= Math.sqrt(n); i++) { - if (n % i == 0) { - return false; - } + if (n <= 3) return true; + if ((n & 1) == 0) return false; + if (n % 3 == 0) return false; + for (int i = 5; i <= n / i; i += 6) { + if (n % i == 0 || n % (i + 2) == 0) return false; } return true; } 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 528da7adf7..b25c6d6060 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 @@ -605,6 +605,23 @@ public class NumberUtilTest { assertFalse(NumberUtil.isDouble(" ")); } + @Test + public void isPrimesTest() { + assertTrue(NumberUtil.isPrimes(2)); + assertTrue(NumberUtil.isPrimes(3)); + assertFalse(NumberUtil.isPrimes(4)); + assertTrue(NumberUtil.isPrimes(5)); + assertTrue(NumberUtil.isPrimes(7)); + assertFalse(NumberUtil.isPrimes(9)); + assertTrue(NumberUtil.isPrimes(13)); + assertFalse(NumberUtil.isPrimes(25)); + assertFalse(NumberUtil.isPrimes(49)); + assertTrue(NumberUtil.isPrimes(113)); + assertFalse(NumberUtil.isPrimes(121)); + assertTrue(NumberUtil.isPrimes(2147483647)); + assertFalse(NumberUtil.isPrimes(2147483646)); + } + @Test public void range(){ assertFalse(NumberUtil.isIn(new BigDecimal("1"),new BigDecimal("2"),new BigDecimal("12")));