【问题标题】:Can someone explain to me this part of Dixon's factorization algorithm?有人可以向我解释 Dixon 分解算法的这一部分吗?
【发布时间】:2023-03-25 22:09:01
【问题描述】:

我一直在尝试在python中实现Dixon的因式分解方法,我有点困惑。我知道你需要给出一些界限B 和一些数字N 并搜索sqrtNN 之间的数字,其平方为B-smooth,这意味着它们的所有因子都在小于或的素数集合中等于B。我的问题是,给定一定大小的N,是什么决定了B,以便算法将产生N 的非平凡因素? Here 是一篇关于算法的维基百科文章,如果有帮助,这里是我的实现代码:

def factor(N, B):
    def isBsmooth(n, b):
        factors = []
        for i in b:
            while n % i == 0:
                n = int(n / i)
                if not i in factors:
                    factors.append(i)
        if n == 1 and factors == b:
            return True
        return False

    factor1 = 1
    while factor1 == 1 or factor1 == N:
        Bsmooth = []
        BsmoothMod = []
        for i in range(int(N ** 0.5), N):
            if len(Bsmooth) < 2 and isBsmooth(i ** 2 % N, B):
                Bsmooth.append(i)
                BsmoothMod.append(i ** 2 % N)
        gcd1 = (Bsmooth[0] * Bsmooth[1]) % N
        gcd2 = int((BsmoothMod[0] * BsmoothMod[1]) ** 0.5)
        factor1 = gcd(gcd1 - gcd2, N)
        factor2 = int(N / factor1)
    return (factor1, factor2)

也许有人也可以帮我清理一下我的代码?看起来效率很低。

【问题讨论】:

  • 嘿朋友,很高兴今天学到了一个新东西,但我想这里没有人知道那是什么! (我是说狄克逊算法)
  • 自从我参加了涵盖此的加密课程(然后进入各种课程)以来已经有很多个月了,这真的太早了,但只是为了检查一下:你的算法和算法@JuanRocamonde 都发布了仔细检查空间;我认为关键是从空间中随机选择数字,希望比进行详尽搜索更快地获得答案(非确定性)
  • 平滑界的选择是一个复杂的话题,我认为密码学家最好谈论。 In this book,Steven Galbraith 概述了一种选择方法来实现次指数分解时间。我想二次筛的选择策略也适用于 Dixon 的随机正方形。 免责声明:我不是密码学家。

标签: python algorithm factorization factoring smooth-numbers


【解决方案1】:

本文讨论了 B 的最佳大小:https://web.archive.org/web/20160205002504/https://vmonaco.com/dixons-algorithm-and-the-quadratic-sieve/。简而言之,最优值被认为是 exp((logN loglogN)^(1/2))。

【讨论】:

  • logN loglogN,你的意思是log(N) * log(log(N))吗?
  • @vrume21:没错,但在实践中,边界通常被认为比这小一些(比如,小 10% 到 20%),因为它使线性代数更简单、更快。跨度>
  • 这很有趣,你能告诉我更多关于为什么吗?或者也许指向我的来源?
  • 我将讨论使用 NFS 分解大数,其中 big 是 512 位左右。通常的情况是您有很多小型个人计算机来进行筛选,而一台大型计算机(通常是超级计算机)来进行线性代数。您通过向后工作来确定您需要什么:找出您可以处理的最大矩阵,它给出了所需的关系数量以及因子基的大小,然后找出在分配的时间内完成任务需要多少筛子.有关更多信息,请参见 www.mersennewiki.org、mersenneforum.org 或 Crandall 和 Pomerance 的书。
【解决方案2】:

[我写这个是为了不同的目的,但你可能会觉得它很有趣。 ]

给定 x2y2 (mod n) 和 x ≠ ± y,大约是 gcd(xy, n 的一半) 是 n 的因数。 Maurice Kraitchik 在 1920 年代观察到的这种平方同余是几种因式分解方法的基础。其中一种方法(由 John Dixon 提出)在理论上很重要,因为可以证明其次指数的运行时间,尽管它太慢而无法在实践中使用。

Dixon 方法首先选择一个界限 b &approx; e√(log n log log n) 并确定因子基数所有小于 b 的素数都是 n 的二次余数(它们的雅可比符号为 1)。

function factorBase(n, b)
  fb := [2]
  for p in tail(primes(b))
    if jacobi(n, p) == 1
      append p to fb
  return fb

然后在范围1上反复选择一个整数r r n,计算它的平方模n,如果正方形在因子基础上是平滑的,则将其添加到 关系 列表中,当关系多于因子基础中的因子时停止,并为那些失败的情况加上一小部分储备。这个想法是使用线性代数来识别一组关系,其中因子基素数组合形成一个正方形。然后取关系中所有因子基素数的乘积的平方根,取相关r的乘积,计算gcd来识别因子。

struct rel(x, ys)

function dixon(n, fb, count)
  r, rels := floor(sqrt(n)), []
  while count > 0
    fs := smooth((r * r) % n, fb)
    if fs is not null
      append rel(r, fs) to rels
      count := count - 1
    r := r + 1
  return rels

一个数n是光滑的,如果它的所有因子都在因子基中,这是由试除法确定的; smooth 函数返回一个因子列表,如果 n 没有完全覆盖因子基数,则该列表为空。

function smooth(n, fb)
  fs := []
  for f in fb
    while n % f == 0
      append f to fs
      n := n / f
    if n == 1 return fs
  return []

通过将累积关系提交给平方同余求解器的线性代数来确定一个因子。

例如,考虑 143 的因式分解。选择 r = 17,因此 r2 ≡ 3 (mod 143)。然后选择 r = 19,所以 r2 ≡ 75 ≡ 3 · 52。这两个关系可以组合为 (17 · 19)2 ≡ 32 · 52 ≡ 152 (mod 143),这两个因子是 gcd(17·19 − 15, 143) = 11 和 gcd(17·19 + 15, 143) = 13。这有时会失败;例如,关系 212 ≡ 22 (mod 143) 可以与关系 19 结合,但产生的两个因素 1 和 143 是微不足道的。

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多