jtyoui.algorithm.MillerRabin 源代码

#!/usr/bin/python3.7
# -*- coding: utf-8 -*-
# @Time  : 2020/1/10 14:19
# @Author: Jtyoui@qq.com
from random import randint

"""
米勒-拉宾素性检验是一种素数判定法则,利用随机化算法判断一个数是合数还是可能是素数。
卡内基梅隆大学的计算机系教授Gary Lee Miller首先提出了基于广义黎曼猜想的确定性算法,
由于广义黎曼猜想并没有被证明,其后由以色列耶路撒冷希伯来大学的Michael O. Rabin教授作出修改,
提出了不依赖于该假设的随机化算法。
"""


[文档]def miller_rabin_prime(n, k=50): """米勒-拉宾素性检验是一种素数判定法则 米勒-拉宾素性检验是一种素数判定法则,利用随机化算法判断一个数是合数还是可能是素数。 卡内基梅隆大学的计算机系教授Gary Lee Miller首先提出了基于广义黎曼猜想的确定性算法, 由于广义黎曼猜想并没有被证明,其后由以色列耶路撒冷希伯来大学的Michael O. Rabin教授作出修改, 提出了不依赖于该假设的随机化算法。 :param n: 质数 :param k: 检验的次数 :return: 是质数返回True,不是返回False """ if n < 6: return [False, False, True, True, False, True][n] elif n & 1 == 0: return False else: s, d = 0, n - 1 while d % 2 == 0: s += 1 d >>= 1 for _ in range(k): a = randint(2, n - 2) x = pow(a, d, n) if x == 1 or x == n - 1: continue for _ in range(s - 1): x = pow(x, 2, n) if x == 1: return False elif x == n - 1: a = 0 break if a: return False return True
[文档]def random_big_prime(n=15): """随机生成一个大位质数 >>> print(random_big_prime(128)) 这种算法具有不确定,错误概率在亿分之一以下。犹如买彩票一样 :param n: 质数的位数 :return: 大质数 """ while True: s = randint(10 ** (n - 1), 10 ** n) if miller_rabin_prime(s): return s
if __name__ == '__main__': m = miller_rabin_prime(1202665577221067947046558160900252532924577373213201474275893551111) print(m) print(random_big_prime(128))