【问题标题】:Pollard’s p−1 algorithm: understanding of Berkeley paperPollard 的 p−1 算法:伯克利论文的理解
【发布时间】:2016-02-09 07:38:15
【问题描述】:

This paper 解释了 Pollard 的 p-1 分解算法。当找到的因子等于我们返回并更改“a”的输入时,我无法理解这种情况(基本上是上述论文中的第 2 页第 2 点)。

  1. 为什么我们要返回并增加“a”?
  2. 为什么我们不继续增加阶乘?是因为我们不断进入我们已经看到的同一个周期吗?
  3. 我可以使用相同的算法获得所有因子吗?如 49000 = 2^3 * 5^3 * 7^2。目前我只得到 7 和 7000。也许我可以递归地使用这个 get_factor() 函数,但我想知道基本情况。

    def gcd(a, b):
    if not b:
        return a
    return gcd(b, a%b)
    
    def get_factor(input):
        a = 2
        for factorial in range(2, input-1):
         '''we are not calculating factorial as anyway we need to find
            out the gcd with n so we do mod n and we also use previously
            calculate factorial'''
            a = a**factorial % input
            factor = gcd(a - 1, input)
            if factor == 1:
                continue
            elif factor == input:
                a += 1
            elif factor > 1:
                return factor
    
    n = 10001077
    p = get_factor(n)
    q = n/p
    print("factors of", n, "are", p, "and", q)
    

【问题讨论】:

    标签: prime-factoring factorization


    【解决方案1】:

    链接的论文不是对 Pollard 的 p - 1 算法的特别好的描述;大多数描述都讨论了使算法更加实用的平滑界限。您可能想在 Prime Wiki 上阅读 this page。要回答您的具体问题:

    1. 为什么要增加 a?因为原来的 a 不起作用。在实践中,大多数实现都不会打扰。而是尝试了另一种分解方法,例如椭圆曲线法。

    2. 为什么不增加阶乘?这就是平滑界限发挥作用的地方。阅读 Mersenne Wiki 页面了解更多详情。

    3. 我可以得到所有因子吗?这个问题不适用于您链接的论文,该论文假设被分解的数字是具有两个因子的半素数。更普遍的答案是“也许”。这就是链接论文的第 3a 步发生的情况,选择一个新的 a 可能有效(也可能无效)。或者您可能想改用不同的因式分解算法。

    这是我的 p - 1 算法的简单版本,使用 x 而不是 awhile 循环计算链接论文的神奇 L(它是小于平滑界限 b 的整数的最小公倍数),其计算方式与链接论文的阶乘,但以不同的方式完成。

    def pminus1(n, b, x=2):
        q = 0; pgen = primegen(); p = next(pgen)
        while p < b:
            x = pow(x, p**ilog(p,b), n)
            q, p = p, next(pgen)
        g = gcd(x-1, n)
        if 1 < g < n: return g
        return False
    

    您可以在http://ideone.com/eMPHtQ 看到它的实际效果,它在链接论文中的因子为 10001,并找到了一个相当壮观的 36 位因子 fibonacci(522)。一旦您掌握了该算法,您可能希望继续使用该算法的两阶段版本。

    【讨论】:

    • 您在答案中链接的链接没有谈到平滑度。您能否添加一些关于您的“L”计算方法的描述,并添加一些关于平滑界限的链接。看完这些我会标记这个答案。
    • "Less than a bound B1" 是平滑度的概念。我将 L 计算为小于界限的数字的最小公倍数。您的链接首先将 L 作为 p - 1 的倍数,这是未指定的。稍后,您的链接将 L 作为小于 R 的所有数字的乘积,这是过度指定的。
    • B1 没有正确选择会导​​致这个算法失败吗?在这种情况下,应使用第 2 步。我认为您正在计算质数并将其提高到某种程度(根据您的链接网址),使其小于界限,并查看该数字与输入数字的 gcd 是否大于 1。
    • 从您的链接网址中提到 a 不应该是 2 但您使用了 2。我不明白为什么 a 不应该是 2 以及 url 中的推理:当考虑到一些形式 2^p-1(如在 GIMPS 中)它的素因数的形式为 2kp+1,因此值 p 必须始终是 E 的因数。在这种情况下,a 的值不能为 2,因为 2^E= 1 mod(N),所以 gcd(2^E - 1, N) = N,是 N 的一个微不足道的因数。
    • 大多数实现使用 a = 2;只有在分解容易识别的梅森数时才有问题。即使“正确”选择了 B1,该算法也可能会失败。如果算法因任何原因失败,大多数因式分解程序不会选择不同的 a,而是转向不同的算法,通常是椭圆曲线法,因为它与 p相似> - 1 种方法。
    猜你喜欢
    • 2013-05-01
    • 2014-12-05
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多