Pollard Rho 大整数分解

介绍了Pollardrho因数分解方法的基本原理及其算法流程,包括如何通过构造特定的数列来寻找大整数的因子。

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

http://www.cnblogs.com/jackiesteed/articles/2019910.html

1975年,John M. Pollard提出了第二种因数分解的方法。Pollard rho因数分解方法基于下列几点:

(1) 假定有两个整数 和 使得p可以整除-,但是n不能整除 。

(2) 可以证明 。因为p可以整除,可以写成 。但是,因为n不能整除-,很明显q不能整除n。这就表明 既可以是1也可以是n的一个因数。

下列算法重复选择,直到求出一个合适的对。

(1) 选择,一个小的随机整数称为种子。

(2) 运用函数算出,使得n不能整除 。这里所用的一个函数也许就是 =  (a通常选作1)。

(3) 计算 。如果它不是1,结果是n的一个因数;如果它是1,返回到步骤1并用重复这个过程。现在我们计算 。注意,在下一轮中,我们以开始,如此这般。如果我们运用Pollard rho算法列出x的值,就会发现最终要重复的这个值,创建一个和希腊字母rho ( )一样的形状,如图9-3所示。

图9-3 Pollard rho连续数

为了减少反复的次数,算法做了一些改进。该算法用数对( , )开始,并且用 ,迭代计算 。在每一次迭代中,我们都应用上述函数式运算(从第二步)第一次计算数对中的第一个元素,第二次计算数对中的第二个元素(参看算法9.6)。

算法 9.6 Pollard rho方法的伪代码

复杂度 这种方法需要算术运算 。不过,因为我们希望p小于或等于 ,我们希望做 算术运算。这就是说比特操作复杂度是 ,它是指数增长的。

http://blog.sina.com.cn/s/blog_86a9d97201015cj7.html

大整数分解现在任然是个世界级的难题,但却依旧是个非常重要的研究方向,大整数在公共密钥的研究上有着重要的作用。

    而对于大整数的分解有很多种算法,性能上各有优异,比如大整数分解的Fermat方法,Pollard rho方法,试除法,以及椭圆曲线法,连分数法,二次筛选法,数域分析法等等。这里,我主要讲解其中两种算法的原理和操作。
    首先,对于任意的一个偶数,我们都可以提取出一个2的质因子,如果结果仍为偶数,则可继续该操作,直至将其化为一个奇数和2的多少次幂的乘积,那么我们可以假定这个奇数可以被表示成2*N+1,如果这个数是合数,那么一定可以写成N=c*d的形式,不难发现,式中的c和d都是奇数,不妨设c>d,我们可以令a=(c+d)/2,b=(c-d)/2,那么的可以得到N=a*a-b*b,而这正是Fermat整数分解的基础;由不等式的关系,我们又可以得到a>=sqrt(c*d)=sqrt(N),那么,我们就可以枚举大于N的完全平方数a*a,计算a*a-N的值,判断计算的结果是否为一个完全平方数,如果是,那么a,b都是N的因子,我们就可以将算法递归的进行下去,知道求出N的所有质因子。
    容易看出,Fermat分解大数的效率其实并不高,但是比起试除法要好了很多;而且每次的计算都是计算出N的一个因子,更加降低了其效率。这就让我们想着去尝试新的算法,那就是Pollard rho算法。
    Pollard rho算法的原理就是通过某种方法得到两个整数a和b,而待分解的大整数为n,计算p=gcd(a-b,n),直到p不为1,或者a,b出现循环为止。然后再判断p是否为n,如果p=n成立,那么返回n是一个质数,否则返回p是n的一个因子,那么我们又可以递归的计算Pollard(p)和Pollard(n/p),这样,我们就可以求出n的所有质因子。
    具体操作中,我们通常使用函数x2=x1*x1+c来计算逐步迭代计算a和b的值,实践中,通常取c为1,即b=a*a+1,在下一次计算中,将b的值赋给a,再次使用上式来计算新的b的值,当a,b出现循环时,即可退出进行判断。
    在实际计算中,a和b的值最终肯定一出现一个循环,而将这些值用光滑的曲线连接起来的话,可以近似的看成是一个ρ型的。
    对于Pollard rho,它可以在O(sqrt(p))的时间复杂度内找到n的一个小因子p,可见效率还是可以的,但是对于一个因子很少、因子值很大的大整数n来说,Pollard rho算法的效率仍然不是很好,那么,我们还得寻找更加的方法了。






Pollard Rho快速因数分解法是一种用于分解大整数法。它基于随机函数和Floyd判环法的思想。法的核心是通过随机函数f(x) = (x^2 + d) % n来生成一系列的数,并计这些数与上一次生成的数的差值与n的最大公因数。如果找到了一个非平凡的因子,即不等于1和n的因子,那么就可以将n分解为这个因子和n除以这个因子的商。如果在法的执行过程中出现了循环,即a和b相等,那么可以利用Floyd判环法来检测到这个循环并退出循环。通过不断重复这个过程,可以逐步分解出n的所有因子。该法的时间复杂度为O(n^(1/4))。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [【快速因数分解Pollard's Rho 法](https://blog.youkuaiyun.com/doyouseeman/article/details/51204612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [因数分解 Pollard rho](https://blog.youkuaiyun.com/lijf2001/article/details/119053616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值