@ljt12138
2018-05-19T19:49:36.000000Z
字数 1201
阅读 1271
数论
Pollard-rho算法是质因数分解的一种有效的蒙特卡洛算法,可以在期望的复杂度内找到合数的一个因数。其核心思想就是随机的选取,试图找到一个。但直接利用反复随机的方法是行不通的,为了提高效率,Pollard-rho算法依靠“生日悖论”来找到一个因数。
生日悖论是指个人两两生日不同的概率,随着的增长下降的非常快。如果在个数中随机选取个,其两两之差全不为一个常数的概率为,因而如果通过两两之差去“碰”一个数,只需要期望次。考虑如果一个数的最小质因子是,其小于的倍数有个,如果我们随机选取个数,两两作差寻找,碰到的概率为,这样只需要期望次就可以找到一个因数。
考虑如何在的附加空间内沿着环走一周,考虑用两个指针,一个每次移动一步,一个每次移动两步,其位置差每次增加,直到位置差为环长即两个指针相遇,则他们刚好绕环一周,且他们取遍了每一种可能的位置差。
Pollard-rho算法的核心是构造一个“随机的”函数:
我们要用这个函数生成随机数去“碰”一个质因数的倍数,设这个集合为。
注意到在模意义下必然会形成一个环。考虑,有一个因子。因而如果,就有。而根据欧几里得算法说明了如果一个数与有公因子,那么模后也有。因为形成环,立刻可以得到对于任意的,如果满足,即他们在环上的位置差相等,那么。
换言之,环上的二元组被其之间的距离划分为了若干个个等价类,为环长。那么这显然可以用弗洛伊德判环快速的完成,事实上,弗洛伊德判环每一次移动,都相当于进行了次两两比较。因而最终复杂度就是。
算法流程就是,每次随机一个初始解,通过进行弗洛伊德判环,直到找到一个约数,或者算法失败。如果找到一个约数,递归的分解两边。为了防止大素数导致时间退化,需要先用素数测试判断是否是素数。