Algorithm 另一个Pollard Rho实现

Algorithm 另一个Pollard Rho实现,algorithm,primes,factorization,Algorithm,Primes,Factorization,为了解决ProjectEuler()上的第三个问题,我决定实现Pollard的Rho算法(至少是其中的一部分,我计划稍后包括循环)。奇怪的是,它适用于82123(因子=41)和16843009(因子257)等数字。然而,当我尝试项目Euler编号600851475143时,当最大的素因子为6857时,我得到了71。下面是我的实现(很抱歉代码墙和缺少类型转换): #包括 #包括 #包括 使用名称空间std; 长整型gcd(长整型a,长整型b); 长整型f(长整型x); int main() { 长

为了解决ProjectEuler()上的第三个问题,我决定实现Pollard的Rho算法(至少是其中的一部分,我计划稍后包括循环)。奇怪的是,它适用于82123(因子=41)和16843009(因子257)等数字。然而,当我尝试项目Euler编号600851475143时,当最大的素因子为6857时,我得到了71。下面是我的实现(很抱歉代码墙和缺少类型转换):

#包括
#包括
#包括
使用名称空间std;
长整型gcd(长整型a,长整型b);
长整型f(长整型x);
int main()
{
长整数i,x,y,N,因子,迭代次数=0,计数器=0;
矢量因子;
系数=1;
x=631;
N=600851475143;
因子。推回(x);
而(系数==1)
{
y=f(x);
y=y%N;
因素。推回(y);

Pollard的rho算法不保证任何东西。它不保证找到最大的因子。它不保证找到的任何因子都是素数。它甚至不保证找到因子。rho算法是概率的;它可能会找到因子,但不一定。因为你的函数返回一个因子,所以它是有效的

也就是说,您的实现不是很好。不必存储函数的所有以前的值,也不必每次通过循环计算gcd。下面是函数更好版本的伪代码:

function rho(n)
    for c from 1 to infinity
        h, t := 1, 1
        repeat
            h := (h*h+c) % n # the hare runs ...
            h := (h*h+c) % n # ... twice as fast
            t := (t*t+c) % n # as the tortoise
            g := gcd(t-h, n)
        while g == 1
        if g < n then return g
函数rho(n) 对于c,从1到无穷大 h、 t:=1,1 重复 h:=(h*h+c)%n#兔子跑。。。 h:=(h*h+c)%n#…速度快一倍 t:=(t*t+c)%n#作为乌龟 g:=gcd(t-h,n) 而g==1 如果g
此函数返回一个n的单因子,可以是素数或复合因子。它只存储随机序列的两个值,并在找到一个循环时停止(当g==n),使用不同的随机序列重新启动(通过增加c)。否则,它会一直运行,直到找到一个因子,只要将输入限制为64位整数,就不会花费太长时间。通过对剩余的余因子应用rho来查找更多因子,或者如果找到的因子是复合因子,则在找到所有素因子后停止

顺便说一句,您不需要Pollard的rho算法来求解Project Euler#3;简单的试除法就足够了。该算法可以找到一个数的所有素数因子,从中可以提取最大值:

function factors(n)
    f := 2
    while f * f <= n
        while n % f == 0
            print f
            n := n / f
        f := f + 1
    if n > 1 then print n
功能因子(n)
f:=2
而f*f1则打印n

Well 71是一个因素,那么问题出在哪里呢?Pollards Rho从来没有承诺过给你最大的因素。感谢你的帮助!我必须阅读更多关于算法的内容,并尝试你的实现。