簡體   English   中英

計算素數列表中位置的最佳方法是什么?

[英]the best way to calculate the position of a number in prime list?

例如

f(2)->1
f(3)->2
f(4)->-1 //4 is not a prime
f(5)->3
...

通常,做一個素數生成器並在達到x之前計數

def f(x):
    p = primeGenerator()
    count=1
    while True:
        y = next(p)
        if y>x:
            return -1
        elif y==x:
            return count
        else:
            count+=1

這不是太慢嗎?盡管我可以緩存下一個調用的列表,但是如果我保證輸入必須為素數,那么不必測試輸入數字是否為素數,是否有更快的公式可以得出回答?

最好的方法取決於您獲得什么輸入,以及該函數將被調用多次還是僅被調用一次或幾次。

如果經常調用它,並且您將要收到的所有輸入都很小,例如不大於10 7 ,那么最好的方法是預先創建一個查找表,然后查找輸入。

如果不經常調用它,並且所有輸入量都很小,僅生成不超過輸入數的質數並對其進行計數就足夠了。 記住下一個調用的內容可能會有所增強,因此當第一個參數是19394489,下一個是20889937時,您無需再次從0開始,而只需要查找之間的質數他們。 但是,是否值得擁有額外的存儲空間取決於傳遞的參數。

如果要經常調用,參數是不是太大,不超過10月13日說,最好的方法是預先計算的值π(n)的一些選擇值n ,並為每個參數查找的價值下一個較小的預先計算的點,然后生成並計算該點與目標值之間的質數(或者,如果目標距離下一個較大的預先計算的點較近,則計算目標與該目標值之間的質數)。

如果您為10 7的所有倍數計算不超過10 13的 π(n) ,您將獲得一個具有一百萬個條目的查找表,這對當今的內存來說不是很費力,並且永遠不必篩選大於500萬的范圍,不需要很長時間。

您還可以將查找表作為文件或數據庫存儲在磁盤上,這樣可以縮短預計算點之間的間隔。 這也將減少啟動時讀取預計算表中的時間,但是現在查找將涉及對文件系統的訪問,這比讀取內存需要更長的時間。 最佳策略將取決於預期的投入及其運行的系統。

但是,如果上限不小的話,計算查找表將花費相當長的時間,但這是一次性的成本。

如果期望的輸入較大,最多可以說10 16個 ,並且您不願意花費時間為該范圍的查找表進行預計算,那么最好的選擇是為質數計算功能實現更好的算法之一, 由Lehmer改進的Meissel方法相對容易實現(雖然不那么容易,我在這里給出示例實現,但是這里有一個Haskell實現可能會有所幫助)。 Miller等人改進的方法更好,但更復雜。

除此之外,您還需要研究當前的最新技術,並且可能應該使用比Python更底層的語言。

您必須檢查所有先前的候選對象的素數。 沒有捷徑。 如您所說,您可以緩存先前計算的結果並從那里開始,但這確實是您可以做的最好的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM