我一直在尝试在python中实现Dixon的分解方法,我有点困惑。我知道你需要给出一些界限B
和一些数字N
,并搜索它们之间的数字sqrtN
,N
其平方是B-smooth
,这意味着它们的所有因子都在小于或等于 的素数集中B
。我的问题是,给定N
一定的大小,是什么决定B
了算法会产生 的重要因素N
?这是有关该算法的维基百科文章,如果有帮助,这是我的实现代码:
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)
也许有人也可以帮我清理一下我的代码?这似乎非常低效。