簡體   English   中英

Python:帶平方根的素數算法實現

[英]Python: Prime number algortihm implementation with square root

我正在嘗試解決這個問題,盡管我頭昏腦脹,但我一遍又一遍地陷入困境。

我有一個由一個元素 [2] 組成的列表,並且知道為了得到質數 $N$ 我必須檢查它沒有任何小於或等於 $\\sqrt{N}$ 的質因數, 生成 3 到 100 之間的所有質數

我的代碼如下,我將嘗試解釋我是如何想出它的:

prime_numbers = [2]

for k in range(3,100):  # k runs on all numbers to check them
    for i in range (0,len(prime_numbers)): # i is the index of the elements in my list
        if prime_numbers[i] <= sqrt(k):    # first I need to check the sqrt condition
            if k % prime_numbers[i] ==0:     # check that element in list divides k
                k+=1                         # if so k++ and break the cicle
                break
            else:
                i +=1                        # otherwise go to the next elem of the list
        else:                              #if the sqrt condition is not met I have found a prime number    
            value = k
        prime_numbers.append(value)

當我運行此代碼時,它會進入一個沒有退出的循環,我無法確定問題出在哪里。 我最好的猜測是糾正最縮進的 else 條件,但我所做的所有嘗試都以失敗告終。 感謝所有願意參與的人。

到達那里的一種方法是:

from math import sqrt

prime_numbers=[2]

for k in range(3,101):
    prime=True
    for i in range(2, int(sqrt(k))+2):
        if k%i == 0:
            prime=False
            break
    if prime:
            prime_numbers.append(k)

print(prime_numbers)

#Output:
#[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

筆記:

  • 如果假設您要檢查包括100在內的所有數字,則它是range(3,101)而不是range(3,100) ,否則您檢查的最后一個數字將是 99。
  • 有一個布爾變量prime 首先假設數字是素數( prime=True
  • sqrt(k)返回一個浮點數,而您的范圍需要整數; 因此 - int(sqrt(k)) +2 以確保您的范圍“to”值永遠不會小於您的“from”值 2。
  • if k%i == 0 (如果你有一個除數)這個數字不是素數( prime=False )並break for循環移動到下一個 k
  • 通過進行列表理解,這可能是我的“pythonic”,但在當前格式中您可能更容易理解

這有效:

prime_numbers = [2]

for prime_candidate in range(3, 100):
    for known_prime in prime_numbers:
        if known_prime <= sqrt(prime_candidate):
            if prime_candidate % known_prime == 0:
                break
    else:
       prime_numbers.append(prime_candidate)

您的問題主要是, i += 1不會阻止 prime_numbers.append 再次追加。

for/else 可以用一個單獨的標志代替來觸發所有情況,而不會更早發生中斷

感謝所有提出解決方案的人。 與此同時,我自己想出了一個。

prime_numbers = [2]


for k in range(3,100):
    for i in range (0,len(prime_numbers)):
        if prime_numbers[i] <= sqrt(k):
            if k % prime_numbers[i] ==0:
                k+=1
                break
            else:
                i +=1
        else:
            value = k
    if(value > max(prime_numbers)):
        prime_numbers.append(value)

暫無
暫無

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

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