これに似た質問が既にあることは知っていますが、GMPY2 (または GMP に類似したもの) を使用して高速化したいと考えています。これが私の現在のコードです。それはまともですが、もっと良くなるでしょうか?
編集: 新しいコード、除数 2 と 3 をチェック
def factors(n):
result = set()
result |= {mpz(1), mpz(n)}
def all_multiples(result, n, factor):
z = mpz(n)
while gmpy2.f_mod(mpz(z), factor) == 0:
z = gmpy2.divexact(z, factor)
result |= {mpz(factor), z}
return result
result = all_multiples(result, n, 2)
result = all_multiples(result, n, 3)
for i in range(1, gmpy2.isqrt(n) + 1, 6):
i1 = mpz(i) + 1
i2 = mpz(i) + 5
div1, mod1 = gmpy2.f_divmod(n, i1)
div2, mod2 = gmpy2.f_divmod(n, i2)
if mod1 == 0:
result |= {i1, div1}
if mod2 == 0:
result |= {i2, div2}
return result
可能であれば、除数のみを使用した実装にも興味がありますn^(1/3) and 2^(2/3)*n(1/3)
例として、mathematicafactor()
は python コードよりもはるかに高速です。10 進数で 20 ~ 50 桁の数値を因数分解したいと考えています。私は、ggnfs がこれらを 5 秒以内に因数分解できることを知っています。
Pythonにも高速因数分解を実装するモジュールが存在するかどうかに興味があります。