Pollard-Rho学习笔记

前置知识:生日悖论

不考虑出生年份(假设每年都是 365 天),问:一个房间中至少多少人,才能使其中两个人生日相同的概率达到50%?

答案是23

考虑一个问题,设置一个数据n,在[1,1000]里随机选取i个数(i=1时就是它自己),使它们之间有两个数的差值为ki=1$时成功的概率是 11000,当i=2时成功的概率是 1500(考虑绝对值,k2可以取$k_1-k k_1+ki$的增大,这个概率也会增大最后趋向于1

1.利用最大公约数求出一个约数

n和某个数的公约数一定是n的约数,即kN+,gcd(k,n)n,只要选取适当的k使得1<gcd(k,n)<n,,就能够求得n的一个约数

满足这个条件的k很多,n的因数的大部分倍数都可行

我们通过f(x)=(x2+c)modn来生成一个序列{xi}:随机取一个x1,令x2=f(x1),x3=f(x2),,xi=f(xi1),其中c是一个随机选取的常数

举个例子:

n=50,c=6,x_1=1,f(x) 生成的数据为:1,7,5,31,17,45,31,17,45,31,

可以发现在x以后,生成的数就在31,17,45之间循环了

如果将这些数如下图一样排列起来,会发现这个图像酷似一个ρ,算法也因此得名 rho

该式子满足xy(modp),f(x)f(y)(modp),其中p|n

证明:
xy(modp),则可以将它们表示为x=k1p+ay=k2p+a,满足k1,k2,aZ,a[0,p)
f(x)=(x2+c)modn,因此f(x)=x2+ckn,其中kZ

f(x)=x2+ckn=(k1p+a)2+ckn=k12p2+2k1pa+a2+ckna2+c(modp)

同理,f(y)a2+c(modp),因此f(x)f(y)(modp)

根据生日悖论,序列中的不同值约为n个,设mn的最小非平凡因子,显然有mn

{xi}的每一项对m取模,得到序列{yi},根据生日悖论,不同值的个数约为O(n14)

实现上可以使用floyd判环或倍增优化

posted @   wangsiqi2010916  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示