【模板】Pollard-Rho算法

本文介绍了Pollard-Rho算法,通过生日悖论解释其寻找因数的概率原理,并详细阐述了算法的随机函数、基于Floyd算法的优化、路径倍增与常数优化。同时,提到了在实现中需要注意的细节,如使用__int128类型以避免溢出,以及Miller-Robin素性测试在判质因子中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目

电磁看题

二、解法

作者讲的解法只是一个缩略版,要想获得更好的理解请参照大佬的博客

0x01 生日悖论
如果你不是很了解,点此观看
生日悖论告诉了我们一个道理,也就是我们用组合计算的方式会比单个确切值更有概率得到答案。什么意思呢?举个例子,我们要找到 x x x,用 r − l r-l rl的方式比直接 r a n d rand rand概率有更大概率得到 x x x,这里作者就不给详细证明了,感性理解。
所以与其直接 r a n d rand rand,我们尝试用组合计算的方式生成我们的因数。

0x02 p o l l a r d _ r h o pollard\_rho pollard_rho的随机函数
我们考虑生成一个伪随机数列,考虑用组合的方式生成因数计算 g c d gcd gcd p o l l a r d pollard pollard给出了他的函数:
f ( x ) = x ∗ x + c ( m o d N ) f(x)=x*x+c (mod N) f(x)=xx+c(modN)
其中 c c c是我们用 r a n d rand rand生成的一个函数,这个函数大概长这样。

可以看出,虽然它生成的数较为随机,但还是存在循环节,所以才叫伪随机数,生成数列的轨迹很像希腊字母 ρ \rho ρ,所以这个算法也叫 p o l l a r d _ r h o pollard\_rho pollard_rho算法。

0x03 基于 f l o y d floyd floyd算法优化的 p o l l a r d _ r h o pollard\_rho pollard_rho
因为 p o l l a r d pollard pollard的数列存在循环节,为了判环,我们类比 f l o y d floyd floyd算法。用龟兔赛跑的思想,假设兔子速度是乌龟速度的一倍,过了时间 i i i后, t = i , r = 2 i t=i,r=2i t

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值