查找质数直到一个数字

Posted

技术标签:

【中文标题】查找质数直到一个数字【英文标题】:Finding prime numbers up till a number 【发布时间】:2021-10-31 18:47:40 【问题描述】:

我正在尝试列出所有素数,直到一个特定的数字,例如1000. 随着数字的增加,代码变慢。我很确定这是因为所有prime_factors都检查了(数字-1)的for循环。需要一些建议我可以如何减少更大数字的代码处理时间。谢谢

import time

t0 = time.time()
prime_list = [2]
number = 0
is_not_prime = 0
count = 0
while number < 1000:
    print(number)
    for i in range (2,number):
        count = 0
        if (number%i) == 0:
            is_not_prime = 1
        if is_not_prime == 1:
            for j in range (0,len(prime_list)):
                if(number-1)%prime_list[j] != 0:
                    count += 1
            if count == len(prime_list):
                prime_list.append(number-1)
                is_not_prime = 0
                count = 0
                break
        
    number += 1
print(prime_list)
t1 = time.time()

total = t1-t0
print(total)

【问题讨论】:

在数学中,sieve of Eratosthenes 是一种古老的算法,用于查找不超过任何给定限制的所有素数。 这有帮助吗:***.com/questions/2068372/… ? 感谢这真的有帮助 【参考方案1】:

除了令人困惑之外,您的解决方案效率非常低 - O(n^3)。请使用埃拉托色尼筛。另外,学习如何使用布尔值。

类似的东西(不是最佳的,只是一个模型)。本质上,您从所有数字的列表开始,1-1000。然后,你删除那些是某物的倍数。

amount = 1000

numbers = range(1, amount)
i = 1
while i < len(numbers):
  n = i + 1
  while n < len(numbers):
    if numbers[n] % numbers[i] == 0:
      numbers.pop(n)
    else:
      n += 1
  i += 1

print(numbers)

最后,我能够回答是因为您的问题不是特定于语言的,但请用您在示例中使用的语言标记问题。

【讨论】:

是的,那是我的第一次尝试.. 编码的第三天。顺便说一句,它的蟒蛇。无论如何,我试图理解 Eratosthenes 的 Sieve 并编写了与您刚刚解释的逻辑非常相似的代码:t_in = time.time() number_list = [] number = 1 while number&lt;100000: number += 1 number_list.append(number) i = 2 while i &lt; number: for j in number_list: if(j%i)==0: if(j!=i): number_list.remove(j) i += 1 t_out = time.time() total = t_out-t_in print(total, number_list) 那么您现在需要什么帮助? 什么都没有。谢谢:) 好的。如果它回答了问题,您可以将其标记为已接受。

以上是关于查找质数直到一个数字的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P2667 超级质数 [2017年6月计划 数论05]

在给定数字之后查找质数

c#中质数判断

Count Primes ----质数判断

等价表达式

埃氏筛法