判断一个数是否为素数,可以通过以下几种方法:
试除法
最简单直观的方法,检查数n是否能被2至n-1之间的任何数整除。
时间复杂度为O(n)。
试除法优化
只检查2至√n之间的数是否能整除n,因为如果n不是素数,它必有一个小于等于√n的因子。
时间复杂度为O(√n)。
素数筛法
从2开始,将每个素数的倍数标记为合数,直到筛选完所有小于等于n的素数。
时间复杂度为O(nloglogn),是目前最优解。
费马小定理
对于素数p和任意整数a,有a^(p-1) ≡ 1 (mod p)。
随机选择整数a,计算a^(p-1) mod p,若结果不为1,则p不是素数。
AKS素数测试算法
2002年提出的确定性算法,可以在多项式时间内检验一个数是否为素数。
随机(或蒙特卡洛)算法
如费马素数判定法、贝利-PSW素数测试、米勒-拉宾素数判定法、Solovay-Strassen素数测试等。
这些方法依赖于随机性,通常比确定性算法快,但无法完全保证结果的正确性。
确定性算法
如椭圆曲线素数证明,提供了一种理论上可以在多项式时间内证明素数的方法。
选择哪种方法取决于所需的准确性和效率。对于大多数实际应用,随机算法足够快,而确定性算法在需要绝对确定性的场合更为适用。