簡體   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