亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找數字的最大素數因子的算法

查找數字的最大素數因子的算法

查找數字的最大素數因子的算法計算數字中最大素因子的最佳方法是什么?我認為最有效的將是以下內容:找到干凈分配的最低素數檢查除法結果是否為素數如果沒有,找到下一個最低點轉到2。我基于這個假設,因為它更容易計算小的素因子。這是對的嗎?我應該研究哪些其他方法?編輯:我現在已經意識到,如果有超過2個素因子,我的方法是徒勞的,因為當結果是兩個其他素數的乘積時,步驟2失敗,因此需要遞歸算法。再次編輯:現在我已經意識到這仍然有效,因為最后找到的素數必須是最高的,因此對步驟2的非素數結果的任何進一步測試都會導致較小的素數。
查看完整描述

3 回答

?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

實際上,有幾種更有效的方法可以找到大數字的因子(對于較小的因子,試驗分工合理地工作得很好)。

如果輸入數字具有非常接近其平方根的兩個因子,則一種非??斓姆椒ǚQ為費馬因子分解。它利用身份N =(a + b)(a - b)= a ^ 2 - b ^ 2,易于理解和實現。不幸的是,它一般不是很快。

最常見的分解數字長達100位的方法是Quadratic篩。作為獎勵,部分算法可以通過并行處理輕松完成。

我聽說的另一種算法是Pollard的Rho算法。它一般不如Quadratic Sieve效率高,但似乎更容易實現。


一旦你決定如何將一個數字分成兩個因子,這里是我能想到的最快的算法,找到一個數字的最大素數因子:

創建一個最初存儲號碼本身的優先級隊列。每次迭代,您從隊列中刪除最高的數字,并嘗試將其分成兩個因子(當然,不允許1成為這些因素之一)。如果此步驟失敗,則數字為素數,您就有了答案!否則,將兩個因子添加到隊列中并重復。


查看完整回答
反對 回復 2019-07-25
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

這是我所知道的最好的算法(在Python中)

def prime_factors(n):
    """Returns all the prime factors of a positive integer"""
    factors = []
    d = 2
    while n > 1:
        while n % d == 0:
            factors.append(d)
            n /= d
        d = d + 1

    return factors


pfs = prime_factors(1000)largest_prime_factor = max(pfs) # The largest element in the prime factor list

上述方法在O(n)最壞的情況下運行(當輸入是素數時)。

編輯:
以下是O(sqrt(n))評論中建議的版本。這是代碼,再一次。

def prime_factors(n):
    """Returns all the prime factors of a positive integer"""
    factors = []
    d = 2
    while n > 1:
        while n % d == 0:
            factors.append(d)
            n /= d
        d = d + 1
        if d*d > n:
            if n > 1: factors.append(n)
            break
    return factors


pfs = prime_factors(1000)largest_prime_factor = max(pfs) # The largest element in the prime factor list


查看完整回答
反對 回復 2019-07-25
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

我的答案是基于Triptych的,但在其上有很大的改進。它基于超過2和3的事實,所有素數都是6n-1或6n + 1的形式。

var largestPrimeFactor;if(n mod 2 == 0){
    largestPrimeFactor = 2;
    n = n / 2 while(n mod 2 == 0);}if(n mod 3 == 0){
    largestPrimeFactor = 3;
    n = n / 3 while(n mod 3 == 0);}multOfSix = 6;while(multOfSix - 1 <= n){
    if(n mod (multOfSix - 1) == 0)
    {
        largestPrimeFactor = multOfSix - 1;
        n = n / largestPrimeFactor while(n mod largestPrimeFactor == 0);
    }
    if(n mod (multOfSix + 1) == 0)
    {
        largestPrimeFactor = multOfSix + 1;
        n = n / largestPrimeFactor while(n mod largestPrimeFactor == 0);
    }
    multOfSix += 6;}

我最近寫了一篇博客文章,解釋了這個算法的工作原理

我敢說,一種不需要進行素數測試(并且沒有篩子構造)的方法比使用那些方法的方法運行得更快。如果是這種情況,這可能是這里最快的算法。


查看完整回答
反對 回復 2019-07-25
  • 3 回答
  • 0 關注
  • 1305 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號