主頁 > 軟體工程 > 獲取比為質數的數的除數

獲取比為質數的數的除數

2021-12-14 18:16:10 軟體工程

我需要得到比為質數的任何數(最多 10e9)的所有除數。

考慮某個整數 n 的所有除數。選擇這些除數中的一些,然后將它們排列成一個圓圈,使任意兩個相鄰數的比為質數。找出你可以選擇的 n 的最大除數,并找到合適的排列。

例如:

input: 10
output: 1 2 10 5

2 = 1 * 2 ; 10 = 2 * 5 ; 5 = 1 * 5

另外一個輸出陣列必須是一個回圈(circle)。因此第一個和最后一個數字的比率必須是質數。

我試圖找到給定數字的所有除數并生成它們的所有可能排列并檢查每個排列:

from itertools import permutations

n = int(input())
d = list(filter(lambda x: not n % x, range(1, n   1)))
for i in range(1, len(d)):
    print(list(permutations(d, i)))
    # check the permutation

但這是一個糟糕的解決方案,因為它的作業時間很長。誰能建議一種演算法來更有效地解決我的問題?

uj5u.com熱心網友回復:

您可以通過將其轉換為在圖中查找最長路徑來解決此問題(盡管這是 NP-Hard 并且可能不會更快)。

該圖將由與因子對應的節點和以因子之間的質數比連接節點的邊組成。

您首先需要一個函式來給出一個數的所有質因數(包括重復質數):

def primeFactors(N):
    d = 2
    while d*d<=N:
        while N%d==0:
            yield d
            N //= d
        d  = 1
    if N>1: yield N

然后,您可以將所有這些質因子組合到一個因子字典中,其中值是一組其他因子,這些因子與每個因子 {factor:{factor with prime ratio}..} 處于質數比。這將是您的圖表。

def factorGraph(N):
    primes  = list(primeFactors(N))
    factors = {1:set(primes)}
    for p in primes:
        factors.update({p*f:set() for f in factors})
    for p in set(primes):
        for f in factors:
            if f%p==0:
                factors[f].add(f//p)
                factors[f//p].add(f)
    return factors

然后使用遞回函式找到從起始因子到給定目標節點(從目標節點本身的相關節點開始)的最長圓形路徑。該函式不得多次使用相同的因子,因此它會向下推一組訪問過的節點(已看到)以將它們從更深層次的搜索中排除。

def longestCircle(graph,target,fromFactor=0,seen=set()):
    longest = []
    remaining = graph[fromFactor or target] - seen  # eligible next factors
    for factor in remaining:                        # Try each factor
        path = [factor]                             # form a path
        if factor != target:                        # must reach target
            path  = longestCircle(graph,target,factor,seen|{factor})
        if path[-1]==target and len(path)>=len(longest): 
            longest = path                          # keep longest path
            if len(path)==len(graph): return path   # all factors used
    return longest

最后,最長的回圈因子路徑將是具有最多元素的路徑。

def factorCircle(N):
    graph = factorGraph(N)
    return max((longestCircle(graph,first) for first in graph),key=len)

請注意,這是從每個可能的起始因素進行檢查,以防較長的路徑跳過其中一個因素,但很可能 1 總是在回圈中,因此可能會矯枉過正回傳longestCircle(graph,1) 可能就足夠了,但我不這樣做沒有時間證明它是(或不是)。

輸出:

print(factorCircle(10))  # [5, 10, 2, 1]               # 4 of 4 factors
print(factorCircle(30))  # [5, 15, 30, 10, 2, 6, 3, 1] # 8 of 8
print(factorCircle(512)) # [2, 1]                      # 2 of 10
print(factorCircle(660)) 
# [5, 15, 30, 6, 66, 22, 110, 220, 44, 4, 2, 10, 20, 60, 12,
   132, 660, 330, 165, 55, 11, 33, 3, 1]               # 24 of 24

uj5u.com熱心網友回復:

我正在添加一個新答案,因為我想到了一個非常不同的程序來獲取除數串列。

我沒有關注因子,而是創建了一系列質數比(乘法和除法)。鑒于我們需要回圈回到初始值,每個乘法比率最終都必須跟隨相同比率的相應除法。所以我們只需要找到質數乘法和除法的正確順序(使用數字的質因數)。

例如,6 的質因數是 2 和 3,因數是 1、2、3 和 6。因數之間的比率將是 2 或 3。從 1 開始,我們可以有一個比率序列:x2、x3 , /2, /3 這將產生因子序列:1, 2, 6, 3, 1。(最后一個是環回到 1)。這將每個 xPrime 與相應的 /Prime 平衡,確保回圈完成。

如果我們加上一個質因數 (5) 并轉到 30,質因數是 2、3 和 5,現在的因數是 1、2、3、6、5、10、15 和 30。

當有兩個以上的素數因子時,比率序列可以遞回地“堆疊”在每個素數的頂部(用作基線)。這意味著一系列因子(例如 3,5 --> x3, x5, /3, /5)可以獨立并回傳到原始值 (1) 但它也可以從不同的基線開始(例如2) 并且會回到它而不產生它從 1 基線具有的任何因素:

from 1:   (x3, x5, /3, /5) --> 3, 15, 5,  1
from 2:   (x3, x5, /3, /5) --> 6, 30, 10, 2
  • 2 的基本序列是 x2, /2
  • 在 x2 基線上堆疊 3 和 5,我們將有:
    • x2, <stack 3 and 5> , /2
  • 3 和 5 的順序是 x3, x5, /3, /5
  • 給予: x2, x3, x5, /3, /5 , /2
  • 但是堆疊序列的最后一個除法 (/5) 會產生一個重復因子,因為該序列會回圈回到基線。
  • 因此,我們將最后一個磁區 (/5) 與下一個磁區 (/2) 交換:
  • 給予: x2, x3, x5, /3, /2, /5
  • 導致的因素: 2, 6, 30, 10, 5, 1

當有 4 個或更多質因子時,這也按順序適用,方法是回圈回到每個質數并將其余因子堆疊在其上(作為新的唯一基線)。

對于重復的質因數,只要 xP 和 /P 不連續,xP 和 /P 就可以重復。因此,對于 20 (2,2,5) 初始序列 (x2, x5, /2, /5) 可以擴展為 (x2, x2, x5, /2, /2, /5) 給出因子 (2, 4、20、10、5、1)。然而,對于 8 (2,2,2),序列是 (x2, /2) 所以我們不能重復這些比率。

這類似于通過從每個值(在這種情況下為主要因素)開始并從剩余值中添加組合模式來遞回構建組合的方式

這仍然需要一個素數分解函式:

def primeFactors(N):
    d = 2
    while d*d<=N:
        while N%d==0:
            yield d
            N //= d
        d  = 1
    if N>1: yield N

比率序列函式是遞回的,使用正數表示乘法,使用負數表示除法(例如 x2, x3, /2, /x --> [2, 3, -2, -3])

def getRatios(factors):
    rFactors = list(factors)       # repeatable prime factors
    uFactors = set(rFactors)       # unique prime factors
    ratios   = []                  # resulting sequence of ratios
    while uFactors:                # new baseline for each prime
        if not ratios:             # first multiplication            
            f = min(uFactors)
            ratios = [f,-f]        # positive = multiply, negative = divide
        else:                              # extend recursively
            fr = getRatios(rFactors)       # pattern over baseline
            if not fr: break
            fr.insert(-1,ratios.pop(-1))   # swap last divisions
            ratios.extend(fr)              # extend ratio sequence
            f = abs(ratios[-1])            # last used prime factor
        rFactors = [r for r in rFactors if r!=f] # remove last used prime
        uFactors.discard(f)                      #
    for i,f in enumerate(reversed(ratios),1-len(ratios)): # repeat primes
        i = -i
        if f<0 and ratios[i-1:i 1 or None] == [-f,f]: continue
        if f>0 and ratios[i:i 2 or None]   == [f,-f]: continue
        count = factors.count(abs(f))        
        if count > 1: ratios[i:i] = [f]*(count-1) # expand repeated prime
    return ratios

最終結果是通過從基線 1 開始按順序應用比率獲得的(不包括最后一個磁區,因為我們只需要看到 1 一次:

def factorCircle2(N):
    ratios = getRatios([*primeFactors(N)])  # get ratio sequence
    result = [1]                         # startfactors at 1
    for r in ratios[:-1]:                # apply ratios to get factors
        result.append(result[-1]*r if r>0 else result[-1]//-r)
    return result

輸出:

print(factorCircle2(10))    # [1, 2, 10, 5]                # 4 of 4 factors
print(factorCircle2(30))    # [1, 2, 6, 30, 10, 5, 15, 3]  # 8 of 8
print(factorCircle2(512))   # [1, 2]                       # 2 of 10 
print(factorCircle2(660))   
# [1, 2, 4, 12, 60, 660, 132, 44, 220, 20, 10, 30, 330, 110, 22, 
   66, 6, 3, 15, 165, 33, 11, 55, 5]                       # 24 of 24
print(factorCircle2(60060)) 
# [1, 2, 4, 12, 60, 420, 4620, 60060, 5460, 780, 8580, 660, 132, 924, 
   12012, 1716, 156, 1092, 84, 28, 140, 1540, 20020, 1820, 364, 4004,
   308, 44, 220, 2860, 572, 52, 260, 20, 10, 30, 210, 2310, 30030, 
   2730, 390, 4290, 330, 110, 770, 10010, 1430, 130, 910, 70, 14, 42, 
   462, 6006, 546, 182, 2002, 154, 22, 66, 858, 286, 26, 78, 6, 3, 15,
   105, 1155, 15015, 1365, 195, 2145, 165, 33, 231, 3003, 429, 39, 273, 
   21, 7, 35, 385, 5005, 455, 91, 1001, 77, 11, 55, 715, 143, 13, 65, 
   5]   # 96 of 96 factors

經過一些測驗,我相信這涵蓋了所有情況,并且性能比基于圖形的解決方案要好得多。

注意:我發現調整后的代碼存在另一個問題,當存在重復素數時,有時會阻止它達到最大回圈長度

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/380285.html

標籤:Python 算法

上一篇:Bloxorza-Star搜索

下一篇:團隊生成器的演算法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more