Dixon の因数分解法を Python で実装しようとしてきましたが、少し混乱しています。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)
たぶん、誰かが私のコードを少しきれいにするのを手伝ってくれるでしょうか? 非常に効率が悪いようです。