今天学习pollard-rho和miller-rabin。
前置:
不管怎么说大力筛一遍2,3,5,7,11,13,17都是错不了的!
Miller-rabin
%%% Doggu太神啦!
前置技能:费马小定理
a
p
−
1
≡
1
(
M
o
d
p
)
p
为
素
数
a^{p-1}{\equiv} 1(Mod\ p)p为素数
ap−1≡1(Mod p)p为素数
证明:
若
g
c
d
(
i
,
j
)
=
=
1
gcd(i,j)==1
gcd(i,j)==1&&
i
∗
a
≡
j
∗
a
(
M
o
d
p
)
i*a{\equiv}j*a(Mod\ p)
i∗a≡j∗a(Mod p)则
i
≡
j
(
M
o
d
p
)
i{\equiv}j(Mod\ p)
i≡j(Mod p)
1
,
2
,
3
,
4
,
5......
p
−
1
{1,2,3,4,5......p-1}
1,2,3,4,5......p−1构成一个完全剩余系
则
1
∗
a
,
2
∗
a
,
3
∗
a
.
.
.
.
.
.
(
p
−
1
)
∗
a
{1*a,2*a,3*a......(p-1)*a}
1∗a,2∗a,3∗a......(p−1)∗a亦构成
则
1
∗
2
∗
3....
∗
p
−
1
≡
1
∗
a
∗
2
∗
a
.
.
.
.
(
p
−
1
)
∗
a
(
M
o
d
p
)
1*2*3....*p-1{\equiv}1*a*2*a....(p-1)*a(Mod\ p)
1∗2∗3....∗p−1≡1∗a∗2∗a....(p−1)∗a(Mod p)
所以
a
p
−
1
≡
1
(
M
o
d
p
)
a^{p-1}{\equiv}1(Mod\ p)
ap−1≡1(Mod p)
那么要是我们发现
a
p
−
1
!
≡
1
(
M
o
d
p
)
a^{p-1}{!\equiv}1(Mod\ p)
ap−1!≡1(Mod p)呢?
p就不是素数了!
然后再拿欧拉定理,
a
2
≡
1
(
M
o
d
p
)
a^{2}{\equiv}1(Mod\ p)
a2≡1(Mod p)时,
a
=
+
−
1
a=+-1
a=+−1
显然,
a
p
−
1
≡
1
(
M
o
d
p
)
a^{p-1}{\equiv}1(Mod\ p)
ap−1≡1(Mod p)
设
p
−
1
=
2
k
∗
b
p-1=2^k*b
p−1=2k∗b,那么对于任何一个
2
<
=
i
<
=
k
2<=i<=k
2<=i<=k,若
a
2
i
∗
b
≡
1
(
M
o
d
p
)
a^{2^i*b}{\equiv}1(Mod p)
a2i∗b≡1(Modp)且
a
2
i
−
1
∗
b
!
≡
+
−
1
(
M
o
d
p
)
a^{2^{i-1}*b}{!\equiv}+-1(Mod\ p)
a2i−1∗b!≡+−1(Mod p)
p也就不是质数了!
当然需要注意的是这是一个证不是质数的算法,如果说“证不出它不是质数”并不能证明“它就是质数”,而是“我觉得它是个质数”,当然a取得够多也差不多。
pollard-rho
要干嘛
我们想分解一个数为质因数
怎么干
首先不妨令
a
=
p
1
∗
p
2
∗
c
a=p_1*p_2*c
a=p1∗p2∗c(p是质数),那么显然
p
1
<
n
p_1<{\sqrt{n}}
p1<n,那么[1,n-1]中是p的倍数的数至少有
n
{\sqrt{n}}
n个,期望下我们随机取
n
4
{\sqrt[4]{n}}
4n也就是
n
1
4
n^{\frac{1}{4}}
n41的数,就会有一个是p的倍数
也就是说如果我们每次随机取一个数,它有
上面是假的。
一个自习室口胡了40min可算是大概搞懂了为啥。
如果用真随机数随的话是肯定要完蛋的。
我们考虑分别在两个膜意义下考虑:膜p(N的最小质因子),膜N
那么在两个膜意义下,
f
(
x
)
=
x
2
(
M
o
d
p
)
f(x)=x^2(Mod\ p)
f(x)=x2(Mod p)分别存在
p
\sqrt{p}
p和
N
\sqrt{N}
N的循环节。
我们希望获得p的倍数,那么考虑两个值,如果它们在膜p意义下相同,但是在膜N意义下不同,那么它们的差值一定是p的倍数。
那么每次我们让一个点走两步,另一个点走一步,在
p
\sqrt{p}
p的步数下它们膜p意义下相同,但是这两个数在膜N意义下是不同的。那么在膜p意义下相同了的话,它们的差值就是p的某个倍数,获得因子,完成。
难以理解?
左边那个是膜p意义下用f的取值,右边是膜N意义下的取值。
事实上左边那个膜p意义下的取值循环只是用于证明复杂度的,我们并不显性地知道这两个快点和慢点膜p意义下是多少(废话,你又不知道p),但是你知道这两个的差值——差值与N的gcd为0意味着膜p意义下没有重合。
p
\sqrt{p}
p步后你的快点和慢点膜p意义下就相同了——再次注意!这两个点膜N意义下不相同!——那么两者的差值就是p的倍数了。分解成功。
直接用随机数是
N
\sqrt{N}
N的复杂度,大点小点作差用上面的循环论证可以得到复杂度是
p
\sqrt{p}
p.