所谓素数,是指恰好有两个约数的正整数。
- 埃氏筛法
- 区间筛法
- Miller-Rabin素性测试
判定单一的一个数是不是素数,素性测试:
Code
1bool is_prime(int n){ /* 判定一个数是不是素数 ,假设输入的数都是正整数 */
2 for (int i = 2; i * i <= n; i++) {
3 if (!(n % i)) return false;
4 }
5 return n != 1; /* 1是例外 */
6}
如果只对一个数进行素数测试,通常 $_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_$
。
除另有声明外,本博客文章均采用 知识共享 (Creative Commons) 署名 4.0 国际许可协议 进行许可。转载请注明原作者与文章出处。