简体   繁体   English

Python质数生成器

[英]Python Prime Number Generator

The code prints every non-prime number twice but the prime-numbers only once.该代码将每个非质数打印两次,但质数只打印一次。 However, I only want the prime-numbers to be printed out.但是,我只想打印出质数。 I know there are way better Solutions for a prime-number-generator but I really want to know where the mistake in this code is.我知道质数生成器有更好的解决方案,但我真的很想知道这段代码中的错误在哪里。

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)

You should stop j at i , not the upper limit.您应该将j停在i ,而不是上限。 No point looking for divisors of i that are larger than i - there aren't any.寻找比i大的i除数没有意义——没有任何除数。 And i itself shouldn't be tested, as it always divides itself.而且i本身不应该受到测试,因为它总是会自我分裂。

And a number isn't prime because it's divisible by another but because it isn't.一个数不是质数,因为它可以被另一个整除,而是因为它不能。 So test all possible divisors and only at the end, if none was found, only then add i to the prime number list.所以测试所有可能的除数,只有在最后,如果没有找到,才将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)

You need the inner loop to go from 2 to i, you don't want numbers that satisfy if i % j == 0 as those are not prime.您需要内部循环从 2 到 i,您不想要满足if i % j == 0数字,因为它们不是素数。 Your last and i is also always going to be True, any number that is not 0 will be True so the test is redundant.您的 last and i也将始终为 True,任何不为0都将为 True,因此测试是多余的。 You can also start at 3 and use a step of 2, all even numbers cannot be prime.您也可以从 3 开始并使用 2 的步骤,所有偶数都不能是质数。

You can also replace the if/else with any: which will lazily evaluate and break if we find any i % j that equals 0.您还可以将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)

First one is not optimised, while the second one is slightly more optimised.第一个没有优化,而第二个稍微优化。 Of course, " Sieve of Eratosthenes " is the best.当然,“埃拉托色尼筛”是最好的。 This functions produce the prime numbers in sequence, but not having an upper limit.此函数按顺序生成素数,但没有上限。

Simple and not optimised:简单且未优化:

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

Slightly optimised by not checking all even number and break out of the for loop when the number is not a 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

Try measuring the 2 different runtime:尝试测量 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')

Output:输出:

Simple Prime List: 775.798 ms简单质数列表:775.798 毫秒

Optimised Prime List: 69.48299999999996 ms优化的质数列表:69.48299999999996 ms

if you are looking for generator you should use yield instead of return , here is my answer for a infinite primes generator:如果您正在寻找生成器,您应该使用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

if you need an upper limit you can use it like:如果你需要一个上限,你可以像这样使用它:

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

then you can use it like:那么你可以像这样使用它:

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

Simple python console prime number generator简单的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