Java 素数判断的 3 种高效方法382
素数,也称为质数,是仅被 1 和自身整除的自然数。在计算机科学中,素数判断是一个常见的任务,本文将介绍 Java 中判断素数的三种高效方法。
1. 试除法
试除法是最简单的素数判断方法。其思想是逐个尝试从 2 到 sqrt(n) 的数,如果 n 能被其中任何一个数整除,则 n 不是素数;否则,n 是素数。```java
public static boolean isPrimeTrialDivision(int n) {
if (n 1;
x = (x * x) % mod;
}
return res;
}
```
3. 米勒-拉宾素性检验
米勒-拉宾素性检验是一种比费马小定理更有效的素数判断算法。它基于以下定理:如果 n 是一个合成数,那么存在一个整数 a(称为见证者),使得 a^(n-1) ≡ 1 (mod n) 不成立。我们可以随机选择多个见证者来判断一个数是否为素数。```java
public static boolean isPrimeMillerRabin(int n) {
if (n >= 1;
}
for (int a : new int[]{2, 7, 61}) {
if (witness(a, d, s, n)) return false;
}
return true;
}
private static boolean witness(int a, int d, int s, int n) {
long x = power(a, d, n);
if (x == 1 || x == n - 1) return false;
for (int r = 1; r < s; r++) {
x = (x * x) % n;
if (x == n - 1) return false;
}
return true;
}
```
性能比较
这三种方法的性能差异很大。试除法是最慢的,因为它需要遍历所有小于 sqrt(n) 的数。费马小定理比试除法快,但仍然比米勒-拉宾素性检验慢。米勒-拉宾素性检验是最快的,但它可能会产生错误的负面结果(即错误地认为一个合成数是素数)。
选择建议
在实践中,使用米勒-拉宾素性检验通常是判断大数素数的最佳选择。对于较小的数,费马小定理可能是一个更简单的选择。试除法一般不建议使用,只有在需要判断非常小的数时才使用。
2024-11-14
Java方法栈日志的艺术:从错误定位到性能优化的深度指南
https://www.shuihudhg.cn/133725.html
PHP 获取本机端口的全面指南:实践与技巧
https://www.shuihudhg.cn/133724.html
Python内置函数:从核心原理到高级应用,精通Python编程的基石
https://www.shuihudhg.cn/133723.html
Java Stream转数组:从基础到高级,掌握高性能数据转换的艺术
https://www.shuihudhg.cn/133722.html
深入解析:基于Java数组构建简易ATM机系统,从原理到代码实践
https://www.shuihudhg.cn/133721.html
热门文章
Java中数组赋值的全面指南
https://www.shuihudhg.cn/207.html
JavaScript 与 Java:二者有何异同?
https://www.shuihudhg.cn/6764.html
判断 Java 字符串中是否包含特定子字符串
https://www.shuihudhg.cn/3551.html
Java 字符串的切割:分而治之
https://www.shuihudhg.cn/6220.html
Java 输入代码:全面指南
https://www.shuihudhg.cn/1064.html