简体   繁体   English

加速大数的素数查找算法

[英]Speeding up prime number finding algorithm for large numbers

My code for Project Euler problem 7 seems correct because it works for small numbers, but it takes forever for large numbers.我为Project Euler 问题 7编写的代码似乎是正确的,因为它适用于小数,但对于大数则需要永远。 Where did I go wrong我哪里做错了

prime_numbers = []
for number in (range(2,2000000000)):
    if number > 1:
        for i in range(2, number):
            if number % i == 0:
                break
        else:
            prime_numbers.append(number)
print(prime_numbers[10001])

Look at comments and other answers for inspiration on using a faster algorithm.查看评论和其他答案以获得使用更快算法的灵感。 This answer suggests some small speed optimizations to your algorithm, which may be enough to get the result in time.这个答案建议对您的算法进行一些小的速度优化,这可能足以及时获得结果。

  1. Stop as soon as you have your result:得到结果后立即停止:

     prime_numbers = [] number = 1 while True: number += 1 for i in range(2, number): if number % i == 0: break else: prime_numbers.append(number) if len(prime_numbers) > 10001: break print(prime_numbers[10001])
  2. No need to look at even numbers or divisors:无需查看偶数或除数:

     prime_numbers = [2] number = 1 while True: number += 2 for i in range(2, number, 2): if number % i == 0: break else: prime_numbers.append(number) if len(prime_numbers) > 10001: break print(prime_numbers[10001])
  3. The upper limit of i can be lower: the square root of number: i 的上限可以低于:数的平方根:

     import math prime_numbers = [2] number = 1 while True: number += 2 for i in range(2, math.isqrt(number) + 1, 2): if number % i == 0: break else: prime_numbers.append(number) if len(prime_numbers) > 10001: break print(prime_numbers[10001])
  4. Only look at prime divisors:只看素数:

     import math prime_numbers = [2] number = 1 while True: number += 2 divisor_limit = math.isqrt(number) no_divisor = True for d in prime_numbers: if d > divisor_limit: break if number % d == 0: no_divisor = False break if no_divisor: prime_numbers.append(number) if len(prime_numbers) > 10001: break print(prime_numbers[10001])

Your code is valid, but not very fast - and therefore for large numbers, your program is just going to take far too long.您的代码是有效的,但速度不是很快——因此对于大数字,您的程序将花费太长时间。 You could try to make some changes, skip even numbers, don't range from 2 to the number but rather 2 to the square root and so on, but you could also look at a different, faster approach called the Sieve of Eratosthenes, you can read about it here .您可以尝试进行一些更改,跳过偶数,范围不是从 2 到数字而是从 2 到平方根等等,但是您也可以查看一种不同的、更快的方法,称为埃拉托色尼筛法,您可以在这里阅读。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM