Pollard Rho 在输入不太大时崩溃

Posted

技术标签:

【中文标题】Pollard Rho 在输入不太大时崩溃【英文标题】:Pollard Rho crashes on inputs that are not too big 【发布时间】:2019-04-21 04:03:02 【问题描述】:

我实现了wikipedia 上给出的 Pollard Rho 算法

x ← 2; y ← 2; d ← 1
while d = 1:
    x ← g(x)
    y ← g(g(y))
    d ← gcd(|x - y|, n)
if d = n: 
    return failure
else:
    return d

大输入给出错误:

GNU MP:无法分配内存(大小=4294950944)

这是我的实现

mpz_class factor(mpz_class num)

    mpz_class x(2), y(2), d(1);
    while(d == 1)
    
        x = polynomial(x);
        y = polynomial(polynomial(y));
        mpz_class diff = x - y;
        if(diff < 0)
        
            diff *= -1;
        
        mpz_gcd(d.get_mpz_t(), diff.get_mpz_t(), num.get_mpz_t());
    
    if(d == num)
    
        return -1;//failure
    
    else
    
        return d;//found factor
    


mpz_class polynomial (mpz_class x)

    return ((x * x) + 1);

它适用于像 121 这样的输入,但在 5540987 上崩溃。我做错了什么吗?有没有办法可以改善这种情况,以便将这些数字考虑在内?我见过some implementations 似乎使用多项式((x*x)%N+c)%N(注意额外的mod n)。这是否可行,因为可以使用任何多项式?

【问题讨论】:

【参考方案1】:

两个 模运算存在冗余,但其中一个精确地解决了数字爆炸的问题,除非算法很早就终止(它对 121 终止)。

这是否可行,因为可以使用任何多项式?

这有点微妙,将模运算加入混合并不是“任何多项式”的情况。关键是该算法要查找的是某个序列中的两个值x[i]x[j]i != j,这样abs(x[i] - x[j])p 的倍数(其中N = pq 既不是p 也不是@ 987654328@ 是 1),或者换句话说,abs(x[i] - x[j]) mod p = 0x[i] ≡ x[j] mod p。那时,当以 p 为模查看时,在序列中发现了一个循环,重要的是,如果 x[i] != x[j] 则它们的差异是 p 的非零倍数,这使得有机会从 N 中提取一个因子。 . 至少如果它们的差异不是 N 的倍数(在这种情况下,GCD 的结果将是 N 本身并且没有因子出现)。

因此,纯粹从数学角度来看,模 N 步骤在理论上是不必要的,循环模 p 在没有这种“帮助”的情况下发生。但这是可能N = pq,所以如果我们减少序列模N,那么它的属性模p 不会受到干扰,算法仍然有效。不仅如此,减少模 N 实际上非常重要,因为它可以防止所涉及的数字变得不切实际地大,否则不仅会减慢算法速度,而且最终会在实际(有限大小)硬件上失败。

那是一大堆理论依据,实现起来真的很简单,

mpz_class polynomial (mpz_class x, mpz_class num)

    return ((x * x) + 1) % num;

【讨论】:

谢谢!既然您似乎知道这一点,为什么有些实现使用随机值而不是从 x=2 和 c=1 开始? @northerner 当找到一个循环但它产生的“因素”是N 本身时,算法可能会“失败”。通过多项式中的随机起点或偏移量,您可以重试它并获得另一个找到因子的机会

以上是关于Pollard Rho 在输入不太大时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

大小太大时 VBO + glBufferData 崩溃

Pollard Rho算法浅谈

Android MediaCodec 配置错误,崩溃

POJ-1811-Prime Test(pollard_rho模板,快速找最小素因子)

[科技]$Miller\_Rabin$ 和 $Pollard\_Rho$ 及各种玄学优化

poj1811(pollard_rho模板)