簡體   English   中英

Python 列表(帶質數)

[英]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

請注意,將pP作為變量非常令人困惑。

雖然其他答案在邏輯上是正確的,但他們將評估 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

在其他觀察方面:

  1. 嘗試使用更好的名稱。 X、List、P、p 等使代碼難以調試和修改。 事實上,您將 List 發送到函數中,但不對其進行任何操作 - 我猜 P 和 List 應該是同一件事。 使用upper_boundprime_listprime類的名稱,可以更輕松地減輕/發現變量混淆。 還要檢查PEP8以了解 Python 中的一般命名約定,這將使您的代碼對其他 Python 程序員更具可讀性和一致性。
  2. 與其在函數外創建一個空列表,然后將其作為參數發送進來,不如在函數內創建列表,附加找到的所有素數,然后讓函數返回列表——它往往會提高可讀性和減少錯誤的范圍。

我認為您正在尋找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.

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