找到Python的多个素数因子

时间:2016-11-23 12:49:31

标签: python

我必须编写能找到素数因子的代码。另外,我必须记住多次出现的因素。对于12,我知道如何编写返回3和2的代码。

def prime_factors(n):
for possible_prime in range(2,int(math.sqrt(n)+1)):
    redundant=n%possible_prime
    if redundant==0:
        for last_check in range(2,int(math.sqrt(possible_prime)+1)):
            redundant2=possible_prime%last_check
            if redundant2!=0:
                print(possible_prime)

但我需要得到的是2,2,3。任何人都可以帮忙吗?我应该使用循环和列表。

提前致谢。

4 个答案:

答案 0 :(得分:1)

保持简单和愚蠢通常更好(KISS原则)。 虽然有更有效的算法来进行素数分解,但这个算法很简单:

import math

def prime_factors(n):
    res = []
    # handle factors 2 first
    while n%2 == 0: 
        res.append(2)
        n = n//2
    fac = 3
    # handle all odd factors until limit reached
    while fac < int(math.sqrt(n))+1:
        while n%fac == 0:
            res.append(fac)
            n = n//fac
        fac += 2
    # append remaining prime factor
    if n > 2:
        res.append(n)
    return res

print (prime_factors(2222222222))

注意在Python 3中使用//进行整数除法。

答案 1 :(得分:0)

首先,您应该从range()中删除所有偶数以优化循环,我还建议在sqrt的整数形式中添加一个以保持类型一致。 第二个循环也没有优化,因为每当第一个循环导致redundant == 0时,可能的素数就是素数或已经找到的引物因子的组合,从而减少了你需要检查的数量

def prime_factors(n):
    factors = []
    for possible_prime in [2] + range(3, int(math.sqrt(n))+1, 2):
        if not (n % possible_prime):
            limit = int(math.sqrt(possible_prime)
            is_prime = True
            for factor in factors:
                if factor > limit:
                    break
                if not (possible_prime % factor):
                    is_prime = False
                    break
            if is_prime:
                factors.append(possible_prime)
    return factors

正如你所说,这给了你所有的主要因素,现在我们只想复制(或进一步)如果适用:

def prime_factors(n):
    factors = []
    for possible_prime in [2] + range(3, int(math.sqrt(n))+1, 2):
        if not (n % possible_prime):
            limit = int(math.sqrt(possible_prime)
            is_prime = True
            for factor in factors:
                if factor > limit:
                    break
                if not (possible_prime % factor):
                    is_prime = False
                    break
            if is_prime:
                factors.append(possible_prime)
    factors_copy = factors[:]
    for factor in factors_copy:
        i = 0
        j = n
        while not(j % factor):
            i += 1
            j /= factor
        for k in range(i-1):
            factors.append(factor)
    return sorted(factors)

答案 2 :(得分:0)

我是Python的新手,但会尝试一下(如果synthax不完美,请纠正我)

def prime_factors(n):
    prime_list = []
    job_done = False
    first_prime = 2
    while not job_done:
        for possible_prime in range(first_prime,n+1):
            if n%possible_prime == 0:
                prime_list.append(possible_prime)
                first_prime = possible_prime
                n = int(n/possible_prime)
                if n == 1:
                    job_done = True
                break
    return prime_list

答案 3 :(得分:0)

这是一个如何使用递归和海象算子求素因数的例子

def prime_factors(n):
    for i in range(2, int(n ** 0.5) + 1):
        if (q_r := divmod(n, i))[1] == 0:
            return [i] + factor_list(q_r[0])
    return [n]
>>> prime_factors(12)
[2, 2, 3]