素数筛选算法
埃拉托斯特尼算法:将质数的倍数删除;合数n至少有一个小于 n‾‾√ 的质数
算法
输出:一个集合和1~n内的素数
流程:- 将S初始化{2,…,n}
- 对于2到
n‾‾√
的每一个
i
2.1 如果当前i∈S , 对于j<- i2 且 j<=n
2.1.1 将j移除S
2.1.2 j<-j+i
算法复杂度:O(nlglgn)
最大公约数算法Euclid
- a=bq+r 则gcd(a,b)=gcd(b,r)
- gcd(287,91)=gcd(91,14)=gcd(14,7)=7
287=91*3+14; 91=14*6+7; 14=7*2
算法gcd(a,b)
- 如果a=0,返回b
- 否则,返回gcd (b,a%b)
质因数分解
http://wenku.baidu.com/view/3db5c7a6ad51f01dc381f156.html?re=view
http://www.ituring.com.cn/article/192557
http://book.51cto.com/art/200812/102577.htm
- 普通质因数分解: O(n‾‾√)
- Pollard ryho: O (n0.25) —期望
原理
- 生日技巧:如果一年中有 N 天(在我们的星球上N=365), 那么每 k= n‾‾√ 个人中有50%的可能性产生生日冲突。
- 如果q是n的一个大于1的约数且q|(y-x),那么1
策略
- 在区间[2, N-1] 中随机的选择k个数, x1,x2,...xk
- 判断是否存在 gcd(xi−xy,N)>1 ,若存在, gcd(xi−yj,N) 是N的一个因子(p或q)
- 选择 N0.25 个数
- 生成随机数: f(x)=(x2+a) mod N
是否出现环
- Floyd:B以A速度的2倍,追赶A,若追上,则存在环
算法
欧几里得算法的扩展
- d=gcd(a,b)=ax+by——-(d, x, y)
原理
如果a=0, (a, b)=b=a*0+1*b
如果 b=aq+r
- 则 (a,b)=(r,a)=x′r+y′a=x′(b−aq)+y′a=(−x′q+y′)a+(x′)b
策略
x=-x’q+y’
y=x’
同余方程
- 设m ≠ 0, 若 m|a−b , 称 a 同余b模m,记: a≡b(mod m)
- 若m=>1, gcd(a,m)=1; 则存在c 使得 ca≡1(mod m) . c成为a对模m的逆,记 a−1
miller-rabin素数测试
- 欧拉定理:设gcd(a, m)=1, 则 aφ(m)≡1(mod m)
- 费小马定理:对任意 a 和任意质数 p 有 ap≡a(mod p) 当p不可整除a时, 进一步 ap−1≡1(mod p)