Python 对包含素数因子的数进行迭代

Python 对包含素数因子的数进行迭代,python,recursion,prime-factoring,Python,Recursion,Prime Factoring,我想迭代从1到n的所有数字,我需要知道每个数字的素数因子。一个简单的实现是简单地迭代从1到n的所有数字,并计算每个数字的素数因子,时间为O(n^(3/2)) 我已经提出了这个解决方案,每个数只生成一次,每个素数额外生成一个数(没有生成),时间复杂度为O(n+p) #primes包含足够的primes,因此访问它永远不会失败。 #生成数字1以限制(包括)素数因子。 def gen(限值,i=0): #超过极限的素数使用0次,p**0=1 如果素数[i]>限制: 产率1,{} 返回 #仅使用更高的素

我想迭代从1到n的所有数字,我需要知道每个数字的素数因子。一个简单的实现是简单地迭代从1到n的所有数字,并计算每个数字的素数因子,时间为O(n^(3/2))

我已经提出了这个解决方案,每个数只生成一次,每个素数额外生成一个数(没有生成),时间复杂度为O(n+p)

#primes包含足够的primes,因此访问它永远不会失败。
#生成数字1以限制(包括)素数因子。
def gen(限值,i=0):
#超过极限的素数使用0次,p**0=1
如果素数[i]>限制:
产率1,{}
返回
#仅使用更高的素数生成所有数字。。。
对于发电机中的n,f(极限,i+1):
#…然后每次尽可能频繁地添加当前素数。

而n则有一种更简单的记忆法。例如:

from functools import cache

@cache
def prime_factors(num):
    '''
    Example: 24 -> defaultdict({2: 3, 3: 1})
    '''
    assert isinstance(num, int) and num > 0

    # handle edge cases like 1
    if num == 1:
        return defaultdict(int)

    # find smallest divisor up to sqrt(num)
    # if no divisor found, num is prime
    # this can be optimized to only try prime divisors
    divisor, prime = 2, True
    while divisor**2 <= num:
        if num % divisor == 0:
            prime = False
            break
        divisor += 1

    if prime:
        factors = defaultdict(int)
        factors[num] += 1
    else:
        quotient = num // divisor
        # be sure to copy as dicts are mutable
        factors = prime_factors(quotient).copy()
        factors[divisor] += 1
    return factors

for i in range(10000):
    print(prime_factors(i))
从functools导入缓存
@缓存
def基本参数(数值):
'''
示例:24->defaultdict({2:3,3:1})
'''
断言isinstance(num,int)和num>0
#处理边缘情况,如1
如果num==1:
返回defaultdict(int)
#查找最大为sqrt(num)的最小除数
#如果未找到除数,num为素数
#这可以优化为只尝试素数因子
除数,素数=2,真

除数**2除了这个实现之外,我还需要研究一下使用@cache的记忆。非常感谢。
from functools import cache

@cache
def prime_factors(num):
    '''
    Example: 24 -> defaultdict({2: 3, 3: 1})
    '''
    assert isinstance(num, int) and num > 0

    # handle edge cases like 1
    if num == 1:
        return defaultdict(int)

    # find smallest divisor up to sqrt(num)
    # if no divisor found, num is prime
    # this can be optimized to only try prime divisors
    divisor, prime = 2, True
    while divisor**2 <= num:
        if num % divisor == 0:
            prime = False
            break
        divisor += 1

    if prime:
        factors = defaultdict(int)
        factors[num] += 1
    else:
        quotient = num // divisor
        # be sure to copy as dicts are mutable
        factors = prime_factors(quotient).copy()
        factors[divisor] += 1
    return factors

for i in range(10000):
    print(prime_factors(i))