簡體   English   中英

Python質數生成器

[英]Python Prime Number Generator

該代碼將每個非質數打印兩次,但質數只打印一次。 但是,我只想打印出質數。 我知道質數生成器有更好的解決方案,但我真的很想知道這段代碼中的錯誤在哪里。

prime_numbers = []

def prime_gen(upper_limit):
    for i in range(2, upper_limit):
        for j in range(2, upper_limit):
            if i % j == 0 and i % j != 1 and i % j != j and i:
                prime_numbers.append(i)
prime_gen(20)
print(prime_numbers)

您應該將j停在i ,而不是上限。 尋找比i大的i除數沒有意義——沒有任何除數。 而且i本身不應該受到測試,因為它總是會自我分裂。

一個數不是質數,因為它可以被另一個整除,而是因為它不能。 所以測試所有可能的除數,只有在最后,如果沒有找到,才將i添加到質數列表中。

prime_numbers = []

def prime_gen(upper_limit):
    for i in range(2, upper_limit):
        for j in range(2, i):             # <== only look for divisors less than i
            if i % j == 0:                # <== STOP if you found a divisor
                break
        else:                             # <== Add only if no divisor was found
            prime_numbers.append(i)
prime_gen(20)
print(prime_numbers)
 prime_numbers = [2] # we know two is prime
 def prime_gen(upper_limit):
    # start at 3 and use a step of 2
    for i in range(3, upper_limit, 2):
        # loop from 2 to i
        for j in range(2, i):
            # if i was divisible by any j we will break the loop
            # as i is not prime
            if i % j == 0:
                break
        else:
            # if we get here we completed our inner loop
            # which means no i % j was equal to 0
            prime_numbers.append(i)

您需要內部循環從 2 到 i,您不想要滿足if i % j == 0數字,因為它們不是素數。 您的 last and i也將始終為 True,任何不為0都將為 True,因此測試是多余的。 您也可以從 3 開始並使用 2 的步驟,所有偶數都不能是質數。

您還可以將if/else替換為any:如果我們發現任何i % j等於 0,它將懶惰地評估和中斷。

prime_numbers = [2]

def prime_gen(upper_limit):
    for i in range(3, upper_limit, 2):
        if not any(i % j == 0 for j in range(2, i)):
            prime_numbers.append(i)

第一個沒有優化,而第二個稍微優化。 當然,“埃拉托色尼篩”是最好的。 此函數按順序生成素數,但沒有上限。

簡單且未優化:

def simple_prime_list(num):
    list_of_prime = (2, )
    current_num = 2
    is_prime = True
    while len(list_of_prime) != num:
        current_num += 1
        for i in list_of_prime:
            if current_num % i == 0:
                is_prime = False
        if is_prime == True:
            list_of_prime += (current_num,)
        #To reset the status
        is_prime = True
    return list_of_prime

通過不檢查所有的偶數略優化break的for循環出來的時候,數量不是素數:

def prime_list(num):
    list_of_prime = (2, )
    current_num = 2
    is_prime = True
    while len(list_of_prime) != num:
        current_num += 1
        if current_num % 2 != 0:
            for i in list_of_prime:
                if current_num % i == 0:
                    is_prime = False
                    break
            if is_prime == True:
                list_of_prime += (current_num, )
        #To reset the status
        is_prime = True
    return list_of_prime

嘗試測量 2 個不同的運行時間:

import time
def measureTime(fn):
    start = time.clock()
    fn()
    end = time.clock()
    #return value in millisecond
    return (end - start)*1000

print('Simple Prime List:', measureTime(lambda: simple_prime_list(1000)), 'ms')
print('Optimised Prime List:', measureTime(lambda: prime_list(1000)), 'ms')

輸出:

簡單質數列表:775.798 毫秒

優化的質數列表:69.48299999999996 ms

如果您正在尋找生成器,您應該使用yield而不是return ,這是我對無限素數生成器的回答:

def primes_generator():
    n = 1
    while True:
        for x in range(2, n): 
            if n % x == 0:
                #not prime
                break
        else: 
            #prime
            yield n #<- yield instead of return to create a generator
        n+=1

如果你需要一個上限,你可以像這樣使用它:

def primes_generator(upper_limit):
    for n in range(2, upper_limit):
        for x in range(2, n): 
            if n % x == 0: break
        else: 
            yield n

那么你可以像這樣使用它:

primes = primes_generator()
for prime in primes:
    print(i)

簡單的python控制台質數生成器

global num,primes
num = 1
primes=[]
gen = raw_input("enter the number of primes to generate: ")


while len(primes)<int(gen)+1:
    if num > 0:
        for i in range(2, num):
            if (num % i) == 0:
                num+=1
                break
    else:
        print(primes)
            primes.append(num)
            num+=1
print "Primes generated : ",len(primes)-1

暫無
暫無

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

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