【问题标题】:Big integer prime checking algorithm大整数素数检查算法
【发布时间】:2021-12-02 15:11:38
【问题描述】:

我知道这是一个非常重复的问题,但我想了解是否可以通过检查它是否可被 2、3、5 或 7 整除来简单地检查一个大整数(例如 157,632,829),或者我错过了极端情况吗?

即。

if (n < 4) :
        return True
if (n % 2 == 0 or n % 3 == 0 or n % 5 == 0 or n % 7 == 0) :
        return False

【问题讨论】:

  • 是的,11 * 13 怎么样
  • 17 * 19怎么样
  • 你必须检查所有素数直到sqrt(num)
  • 素数很频繁,你会有很多数字要检查,否则你会有23*3129*1011999*2003等cunterexamples
  • 如果您要实施 Miller-Rabin 检验,请记住它决定 可能 素性,因此不是确定性

标签: python primes


【解决方案1】:

如果你不介意循环方法,那么你可以试试这个。在我的机器上运行 6 毫秒:

import math
import time

def gen_prime():
    D = {}
    q = 2
    while True:
        if q not in D:
            yield q
            D[q * q] = [q]
        else:
            for p in D[q]:
                D.setdefault(p + q, []).append(p)
            del D[q]
        q += 1


def isprime(n):
    if n >= 2:
        g = gen_prime()
        s = int(math.sqrt(n))
        while True:
            d = next(g)
            if d > s:
                return True
            if n % d == 0:
                break
    return False

s = time.perf_counter()
r = isprime(157_632_829)
e = time.perf_counter()
print(f'{r} {e-s:.4f}s')

注意:gen_prime() 生成器不是我的。不幸的是,我不记得我是从哪里得到它的,所以不能给予信任

【讨论】:

    【解决方案2】:

    一个非常简单的例程是

    bool isprime( int n )
    {
       for( int i = 2; i < n; i++ ) if( n % i == 0 ) return false;
       return true;
    }
    

    有很多方法可以优化它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      相关资源
      最近更新 更多