所谓素数,是指恰好有两个约数的正整数。
- 埃氏筛法
- 区间筛法
- Miller-Rabin素性测试
判定单一的一个数是不是素数,素性测试:
Code
bool is_prime(int n){ /* 判定一个数是不是素数 ,假设输入的数都是正整数 */
for (int i = 2; i * i <= n; i++) {
if (!(n % i)) return false;
}
return n != 1; /* 1是例外 */
}
如果只对一个数进行素数测试,通常 $math_inline$O(\sqrt{n})$math_inline$ 的算法就足够了。但……..
Miller-Rabin素性测试
引理1(费马定理) 设p是素数,a为整数,且(a,p)=1,则 $math_inline$a^{p-1} \equiv 1(\text{mod}p)$math_inline$ 。
引理2(二次探测定理) 如果p是一个素数,且
$math_inline$0 证明:易知
$math_inline$x^2-1 \equiv 0(\text{mod}p)$math_inline$
因为p是质数
$math_inline$x=1或x=p-1$math_inline$
虽然Wilson定理(对于给定的正整数n,n是素数的充要条件为
$math_inline$(n-1)!\equiv -1(\text{mod}n)$math_inline$
)给出了一个数是素数的充要条件,但是根据它来素性测试所需的计算量太大,无法实现对比较大整数的测试。目前,尽管高效的确定性素性算法尚未找到,但已有一些随机算法可用于素性测试及大整数的因式分解。 首先我们要知道费马定理只是n是素数的必要条件。即费马定理不成立,n一定是合数;费马定理成立,n可能是素数。 假设n是奇素数,则n-1必为偶数。令
$math_inline$n-1=2^q\cdot m$math_inline$
。