【问题标题】:counting the number of prime numbers up to some large value [duplicate]计算质数的数量直到某个大值[重复]
【发布时间】:2019-01-27 15:20:46
【问题描述】:

我编写了这个超级简单的 python 代码来计算素数的数量,直到某个较大的值。问题在于像1e+8这样的值,程序花费了很多时间,我想改进这个代码以获得更快的结果和更好的性能。 这是代码:

import math

def is_prime(num):
    if num%2 ==0 and num>2:
        return 0
    for i in range(3, int(math.sqrt(num)) + 1, 2):
        if num % i == 0:
            return 0
    return 1

def count_prime(num):
    ct=0;
    for i in range(2,num+1,1):
        if is_prime(i)==1:
            ct+=1
    return ct

【问题讨论】:

  • 尝试记忆
  • 您可以将 i 的搜索限制为 6k±1 形式的值,其中 k 是任意整数
  • 这会在 codereview.stackexchange.com 上得到更好的回答。
  • 正如@L3viathan 所说:如果is_prime 声明该数字为素数,请将其添加到(全局)列表中。 is_prime 那么只需要检查num 是否可以被primes 的元素整除。这将减少 许多 个检查。

标签: python primes


【解决方案1】:

按照 cmets 中的建议,您可以开始改进您的 is_prime() 函数。 尝试其他算法,如建议的筛子或Miller Rabin test。我在密码学研讨会上实现了后者,这并不难。 (注意:该算法是一种概率算法,但不要太在意)。 这可能会为您的主要检查带来更好的时间复杂度。

在此之后,您可能会考虑多次运行您的 count_prime() 函数。在这里,您可以存储运行中的值,并在下次开始时从这一点开始。

示例:

  1. 在第一次运行中,您计算​​ n = 5000 的所有素数。你得到一些结果 = x 你将 x 存储为 5000。
  2. 在第二次运行中,您可能输入 10.000 作为您的指定输入。现在您不需要从 2 重新开始,但您可以从存储的结果开始并从 5001 继续计算。然后将结果相加为 10.000 的结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2012-09-05
    相关资源
    最近更新 更多