2016-04-14 88 views
0

我工作的項目歐拉,問題3. 的問題是:尋找素數的<n

「的13195的首要因素是5,7,13和29什麼是最大的 600851475143的素數?「

在回答這個問題時,我打算先找到所有素數< x(反過來)。爲什麼下面的代碼看起來不起作用,我不確定它是邏輯運算符還是不正確的運算符。

#A function to find prime numbers under n 
def find_prime(n): 
    for i in reversed(xrange(2, n)): 
     if (n % i) != 0: 
      print i 

find_prime(n) 

在測試中,我還建立了一個有趣的素數檢查器,所以我測試了一些。

def prime_checker(n): 
    if n > 2: 
    for i in range (2,n): 
     if (n % i) == 0: 
     print "%s is not a prime number" % (n) 
     break 
     else: 
     print "%s is a prime number" % (n) 

誰能幫我明白我在做什麼毛病find_prime()函數之前我移動到,我將用它來解決問題的下一步是什麼?

+2

你只是報告一個數字是素數,因爲它不能被一個數字整除。但它必須不能被任何**號碼整除。 – Barmar

+0

糟糕 - 我在說「如果n不能被i分割,我打印」 – mutantChickenHer0

+0

你不想找到所有小於N的素數。大多數th不會是N的因數。你想要找到'the最後一個檢查後的「下一個」主要因素(以2,3,5,7 ...開頭)。當你找到一個是N的因子(比如說P)時,你可以使用N1 = N/P來找到更多的因子,從而減少搜索的範圍。你的樣本數量有71,839,1471,6857因素。有超過5000萬的素數比1E9小,所以你的數字會有更多的因素比它小。但是找到僅僅8857的素數就足夠了。 –

回答

2

在沒有找到任何除數的情況下,通過循環完成所有操作之前,您無法判斷數字是否爲素數。只要您找到一個不會將其分開的數字,您就可以報告一個數字是主數字,但它仍可以被更高的數字整除。你的代碼會說所有的奇數都是素數,因爲它們不是2的倍數。

此外,沒有必要一路去n在您的範圍內。數字的任何因素都不能大於數字的平方根。

def prime_checker(n): 
    if n > 2: 
    for i in range (2, int(n ** .5)+1): 
     if (n % i) == 0: 
     print "%s is not a prime number" % (n) 
     return false 
    print "%s is a prime number" % (n) 
    return true 
+0

「數字的所有因子都必須小於數字的平方根。」不可以。例如,49有適當的因子7,這也是平方根。如果被測試的數字是素數的平方,您總是需要測試*並且包括*平方根。 – rossum

+0

感謝您的更正。我已經更新了代碼,將1加到平方根,所以範圍將停留在根部。 – Barmar

3

在你開始編碼之前,也許你應該閱讀一下你正在處理的內容。素材已被充分研究。首先,你不需要所有素數< x。其次,每當你找到一個除數時,你可以用這個數除以這個數,並且在你手上有一個小問題。最後,剩下的數字將成爲你正在尋找的東西。現在除了2,其他偶數都不是素數,所以xrange(3, n, 2)。再搜索一下,你會發現一個不需要宇宙完成時間的解決方案。

+0

Ack。我的目的是在將它解決爲最佳解決方案之前,先解決問題。你的觀點對我有意義。 – mutantChickenHer0

+0

好吧,你會如何找到一個連續的素數大序列?不要單獨檢查每一個。實施Aritosthene的Seeve。關於維基百科有一個很好的解釋。 – kameranis

+0

@ mutantChickenHer0在分而治之中,不僅分而治之,而且征服也很重要。在這裏,當這些單獨的功能結合在一起時,有很多協同作用,導致許多機會去除重複的計算(例如,不需要通過建築來證明什麼是真實的等)。例如看到[這個答案](http://stackoverflow.com/a/24169277/849891),或通過[這些](https://stackoverflow.com/search?q=%5Bpython%5D+600851475143+is%3Aa )。 –