【问题标题】:is there a fast and efficient way to check if a number is prime (10^18 digit) in python [duplicate]有没有一种快速有效的方法来检查python中的数字是否为素数(10 ^ 18位)[重复]
【发布时间】:2021-01-28 23:51:21
【问题描述】:

我一直在使用这个代码来检查一个数字是否是素数:

def pcheck(number):
    if number < 2:
        k = "NO"
    # theres no prime number less than 2
    else:
        i = 2
        factors = []
        while i * i <= number:
            if number % i:
                i += 1
            else:
                number //= i
                factors.append(i)
        if number > 1:
            factors.append(n)
        # get the factors of the number, a prime number will only have 1 factor, not including 1
        if len(factors) == 1:
            k = "YES"
        else:
            k = "NO"
    return k


n = int(input())
print(pcheck(n))

但是即使进行了修改,它仍然会与具有 18 位数字的数字作斗争,这对我来说相当麻烦,因为在这种情况下我无法使用它。我听说过 rabin miller 测试,但从未能够在我的代码中实现它。有没有更有效的方法来检查大数的素数但仍然尽可能快?

【问题讨论】:

  • 我确信在这个网站上已经有关于计算一个数是否是素数的话题了。 stackoverflow.com/questions/4114167/…
  • 在非素数的情况下,您不需要找到所有因素 - 只需在找到的第一个因素处打破循环。
  • “在 python 中”——没有。
  • 另外,您可以通过立即消除所有偶数来加快循环 50%,然后以 i = 3 开始循环,然后以两个 (i += 2) 的形式向上。
  • 没有必要附加每个因素。它将极大地增加程序消耗的时间和空间。只需循环直到 i²&lt;=n 。如果在 i² 接近 n 之前找到任何因子,则中断循环并打印 NO

标签: python python-3.x primes


【解决方案1】:

有很多方法可以改进此功能。首先,您只需检查直到number 的平方根,以确定您是否会找到任何有意义的因素。此外,一旦找到因素,您可以立即终止该功能(您不必继续搜索)。

不过,一般来说,没有快速的方法可以做到这一点。这是素数的一种美。知道一个大数是否是素数需要大量的计算时间。找到一个大数的质因数也需要大量的计算时间。

【讨论】:

  • 他已经只检查了数字的平方根。看起来有点好笑,因为他检查 i*i 是
  • 是的,抱歉,我忽略了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 2021-04-27
  • 2020-08-02
  • 1970-01-01
相关资源
最近更新 更多