[英]Python List (with prime numbers)
我是 Python 的初學者,我需要幫助修復我創建的這段代碼。 基本上,我在下面有我的代碼。
import math
def generate_p(p, Count, X, List):
while Count <= X:
isprime = True
for x in range(2, int(math.sqrt(p)) + 1):
if p % x == 0:
isprime = False
if isprime:
Count += 1
print p
P.append(p)
p += 1
if __name__ == "__main__":
p = 2
count = 1
X = int(raw_input('number: '))
List = []
generate_p(p, count, X, List)
基本上,該功能確實有效,但是,它無法按照我希望的方式發揮作用。 首先,我會說函數的邏輯是如何工作的,因為代碼的第二部分只是變量和聲明函數。
雖然變量計數小於或等於 X,但 is prime 為真,只要 p(被測試的數字)可以進入每個 x 而沒有余數(x 在 2 到 p 的平方根的范圍內)。 如果是素數,則將計數加 1,打印素數,將其也添加到列表中,然后將 1 加到被測試的數字 p。 如果它不是素數,則只需將 1 添加到 p。 這一直持續到 Count 大於 X,然后代碼停止。
正如您現在可能已經注意到的那樣,有一個收集素數的列表,但是,這主要是未使用的。 我想做,但我不知道該怎么做,就是修復這部分代碼,
for x in range(2, int(math.sqrt(p)) + 1):
if p % x == 0:
isprime = False
所以 x 在 2 的范圍內和 p+1 的平方根,但是,我只希望 x 是 P 列表中該范圍內的數字。誰能幫我做到這一點,也許指出任何此代碼中的其他內容?
您可以使用List Comprehension ,如下所示:
for x in [prime in P if prime<=math.sqrt(p)]:
...
如果您只想迭代P
中小於或等於p
平方根的數字:
for x in (i for i in P if i <= math.sqrt(p)):
if p % x == 0:
isprime = False
break # can stop here
請注意,將p
和P
作為變量非常令人困惑。
雖然其他答案在邏輯上是正確的,但他們將評估 P 中的每個項目的大小。 如果 P 按大小的升序排序,並且 P 足夠大,那么循環遍歷 P 並在循環頂部包含一個 break 子句可能更有效。
編輯實際上要做到這一點,您需要將此部分拆分為自己的函數,以便您不會終止頂級while
循環。 然后你只需在每個點返回 True/False
def is_prime(x, P):
sqrt_p = int(math.sqrt(p)) + 1
for x in P:
if x > sqrt_p:
return True
if p % x == 0:
return False
return True
在其他觀察方面:
upper_bound
、 prime_list
、 prime
類的名稱,可以更輕松地減輕/發現變量混淆。 還要檢查PEP8以了解 Python 中的一般命名約定,這將使您的代碼對其他 Python 程序員更具可讀性和一致性。我認為您正在尋找Eratosthenes算法的篩子。 python 實現可能如下所示:
def erato(n):
"Compute all prime numbers less than or equal to n"
# utility functions in order to work only with numbers starting at 2
def prime(i):
return isprime[i - 2]
def setprime(i, val):
isprime[i - 2] = val
# suppose all numbers may be primes until we find divisors
isprime = [ True for i in range(2, n+1) ]
for i in range(2, int(math.sqrt(n)) + 1):
# do not process non prime numbers
if prime(i):
# if i is prime, all its multiples are not
j = 2 * i
while j <= n :
setprime(j, False)
j += i
# return the list of prime numbers
return [ i for i in range(2, n + 1) if prime(i) ]
看看你能不能把你的面條裹在這個發電機上……迄今為止最快的一個。
def isprime(value):
stack = [0 for i in xrange(value*2)]
for jump in xrange(2,value,1):
for i in xrange(jump,value*2,jump):
stack[i] += 1
if stack[value] > 1:
return False
else:
return True
至少我最快的方法。 比檢查每個數字快得多
如果您想在 p 很大時根據時間復雜度優化函數,我建議您查看 Fermats 素性檢驗或 Soloway strausse 素性檢驗。 此外,公約數列表可能會派上用場!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.