【发布时间】:2023-03-25 22:09:01
【问题描述】:
我一直在尝试在python中实现Dixon的因式分解方法,我有点困惑。我知道你需要给出一些界限B 和一些数字N 并搜索sqrtN 和N 之间的数字,其平方为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