美文网首页程序员码农
Miller test算法——验证 一个数是否为质数

Miller test算法——验证 一个数是否为质数

作者: FSS_Sosei | 来源:发表于2024-03-20 23:56 被阅读0次

是由CMU的教授Miller在1976年依据广义黎曼猜想(GRH)提出的一个算法

如果广义黎曼猜想成立,那这就是个确定性质数验证算法

当前广义黎曼猜想还没有被证明,这个算法只能算是概率性验证

如果猜想成立,那这个算法时间复杂度O((\log n)^5)是已知确定性验证算法中最低的

这儿用python具体实现下优化的Miller test

根据输入n的大小分段选择验证方法能更高效

在执行复杂度较高检验前先过个小质数序列的筛,这样大量含小因数的n就直接被判别了

还有用头几个小质数序列做基执行Miller Rabin检验,可以在出现首个伪素数范围内形成确定性验证

from itertools import takewhile

from gmpy2 import mpz, ceil, log, is_strong_prp

initial_prime_number_list = (2, 3, 5, 7, 11, 13)  #Must be a continuous sequence of prime numbers starting from 2

strong_pseudoprime_list = (2047, 1373653, 25326001, 3215031751, 2152302898747, 3474749660383, 341550071728321, 341550071728321, 3825123056546413051, 3825123056546413051, 3825123056546413051, 318665857834031151167461, 3317044064679887385961981)  #https://arxiv.org/pdf/1207.0063.pdf; https://oeis.org/A014233

strong_pseudoprime = strong_pseudoprime_list[len(initial_prime_number_list) - 1]  #ψ6

def miller_test(n):

    if n <= initial_prime_number_list[-1]:

        if n in initial_prime_number_list:

            return True

        else:

            return False

    elif n <= initial_prime_number_list[-1] ** 2:

        if all(map(lambda p: (n % p) != 0, takewhile(lambda x: x * x <= n, initial_prime_number_list))):

            return True

        else:

            return False

    elif any(map(lambda p: (n % p) == 0, initial_prime_number_list)):

        return False

    elif n < strong_pseudoprime:

        if all(map(lambda a: is_strong_prp(n, a), initial_prime_number_list)):

            return True

        else:

            return False

    else:

        m = mpz(ceil((log(n) ** 2) * 2))

        if all(map(lambda a: is_strong_prp(n, a), range(2, m + 1))):

            return True

        else:

            return False

n = int(input('请输入一个要检验的正整数:'))

if miller_test(n):

    print(f'{n}是质数')

else:

    print(f'{n}是非质数')

相关文章

  • Miller–Rabin

    Miller–Rabin算法用于检测大素数,时间复杂度是使用费马小定理和二次探测检测一个数是否是质数。当p是质数时...

  • 数学知识

    一、数论 首先需要掌握质数的定义,判断一个数是否是质数的试除法、Miller–Rabin等。学习筛法,求出1~N之...

  • 《Python高性能编程》札记1_判断质数

    判断一个数是否为质数:

  • 素数(质数)筛选法模板

    判断一个数是否为质数 素数筛选法(时间复杂度O(nlogn))

  • 2019-09-03

    判断一个数是否是质数 求出1-100 范围内的质数

  • 质数判断算法 Go

    说明 质数算法常见于RSA中应用这个方法来判定一个数是否是素数。 代码 代码说明 算法核心就是将参数开根号,然后不...

  • 质数问题

    给定一个数n(n >=2),判断是否为质数 最简单的方法 若n不能被2至n-1之间的任意一个数整除则为质数 2.降...

  • Leetcode.204.Count Primes

    题目 给一个整数n,求0到n一共有多少个质数。 思路1 常规遍历,对每个数进行判断是否为质数。中间有大量重复的计算...

  • 如何快速的判断一个数是否是质数?

    任意的一个数,你如何能判断它是否是质数呢?我们学过的235的倍数的特点,就该想到如何判断一个数是否是质数 只要是2...

  • 质数判断与埃氏筛

    质数判断 我们来看这么一道问题: 给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内)...

网友评论

    本文标题:Miller test算法——验证 一个数是否为质数

    本文链接:https://www.haomeiwen.com/subject/hshftjtx.html