繁体   English   中英

查找多个质因数 Python

[英]Find multiple prime factors 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。有人可以帮忙吗? 我应该使用循环和列表。

提前致谢。

沙伊

保持简单和愚蠢通常更好(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 中使用//进行整数除法。

首先,您应该从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

正如您所说,这为您提供了所有主要因素,现在我们只想复制(或进一步)如果 apropiate:

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)

我是 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

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

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM