Python 优化半素因子分解算法

Python 优化半素因子分解算法,python,optimization,sieve-of-eratosthenes,factorization,Python,Optimization,Sieve Of Eratosthenes,Factorization,我下面的方法是超粗超慢。关于优化建议的任何提示。我知道,对于两个不同素数的半素数,其数字小于或等于半素数的一半。但是我不知道如何更有效地检查大数的素数列表。对于n 13位或更大的数字,当我的崩溃时 import math def eratosthenes(n): multiples = set() primes = set() for i in range(2, n+1): if i not in multiples: if i &

我下面的方法是超粗超慢。关于优化建议的任何提示。我知道,对于两个不同素数的半素数,其数字小于或等于半素数的一半。但是我不知道如何更有效地检查大数的素数列表。对于n 13位或更大的数字,当我的崩溃时

import math
def eratosthenes(n):
    multiples = set()
    primes = set()
    for i in range(2, n+1):
        if i not in multiples:
            if i <= math.ceil(math.sqrt(n)+10):
                primes.add(i)
                    for j in range(i*i, n+1, i):
                        multiples.add(j)
    result = []
    for p in primes:
        while n % p == 0:  # while p divide n...
            result.append(p)
            n = n // p
        if n <= 1:
            break
导入数学
def埃拉托斯坦(n):
倍数=集合()
素数=集合()
对于范围(2,n+1)内的i:
如果我不是倍数:

如果i对于较大的素数,您可以尝试使用易于实现的

从分数导入gcd
def pollardfactor(n):
a=2
b=2
d=1
对于[1,-1,2,3,5,7,-3,-5,-7]中的c:
尽管如此:
a=(a*a+c)%n
b=(b*b+c)%n
b=(b*b+c)%n
d=gcd(abs(a-b),n)
如果1

这应该在合理的时间内适用于20位数字

除了缩进错误和缺少
返回结果
行之外,函数还提供了预期的结果。你可以要求进行彻底的审查。作为一项即时改进,您应该将
sqrt(n)
从循环中取出,只执行一次。如果你想多次使用这个函数,你可以缓存埃拉托斯坦筛。n有多大?不同大小的n需要不同的算法。n是5983391455009或更大。你应该查看@primo on的帖子。所以这个返回两个素数中最小的一个,如何得到第二个?尝试除法
from fractions import gcd

def pollardfactor(n):
    a=2
    b=2
    d=1
    for c in  [1,-1,2,3,5,7,-3,-5,-7]:
        while True:
            a=(a*a+c)%n
            b=(b*b+c)%n
            b=(b*b+c)%n
            d=gcd(abs(a-b),n)
            if 1 < d < n:
                return(d)
            elif d==n :
                break
    return -1

print(pollardfactor(5983391455009))