您的位置:首页 > 其它

Pollard's Rho 快速质因数分解 复习小记

2018-01-05 17:19 190 查看

Description

为什么又是复习小记?因为又忘了个精光QAQ

Pollard’s Rho

分治思想

我们实现过程find(n)表示对n进行质因数分解。

如果能找到任意一个d|n,d≠1,d≠n,那么就可以转化成两个子问题find(d)与find(n/d)。当然如果n本身就是质数那么肯定是找不到的,所以先用miller rabin质数测试判定一次

随机算法的改进

如果每次随机x并判定(x,n)是否等于1,效率太低

基于生日悖论的概率原理

从1到n中选k个数,其中至少一对数之差为n的因数的概率随着k增大而迅速增大。

这启示我们判定(abs(x−y),n)是否为1,这样成功概率会更高

步骤

定义函数f(x)=x2+c,c随机给出

注意到因为是模n意义下,所以x的取值会成环,类似ρ

x每次走一步,y每到2j的时间点走一次(最玄学的部分)

每次判定(abs(x−y),n)是否为1

若x=y则退出,重新随机c

板子

ll pollard_rho(ll n,ll c)
{
int i=1,k=2;
ll x=rand()%n;ll y=x;
for(;;)
{
i++;
x=(qmul(x,x,n)+c)%n;
ll d=gcd(abs(x-y),n);
if(d!=1 && d!=n) return d;
if(y==x) return n;
if(i==k) y=x,k<<=1;
}
}
void find(ll n)
{
if(n==1) return;
if(miller_rabin(n))
{
a[++num]=n;
return;
}
ll d=n;
while(d>=n) d=pollard_rho(n,rand()%(n-1)+1);
find(d);
while(n%d==0) n/=d;
find(n);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: