鱼C论坛

 找回密码
 立即注册
查看: 2319|回复: 0

[技术交流] 随机生成一个大质数

[复制链接]
发表于 2021-10-6 17:48:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import random


  2. def fast_power(a, b, n):
  3.     result = 1
  4.     tmp = a
  5.     while b > 0:
  6.         if b & 1 == 1:
  7.             result = (result * tmp) % n
  8.         tmp = (tmp * tmp) % n
  9.         b = b >> 1
  10.     return result


  11. def testMillerRabin(n, iter_num=8):
  12.     """检验一个数是否为质数,参数1为整数,参数2为检验次数,一般不低于5"""
  13.     if n == 2:
  14.         return True
  15.     if n & 1 == 0 or n < 2:
  16.         return False
  17.     # n-1 = (2^s)m
  18.     m, s = n - 1, 0
  19.     while m & 1 == 0:
  20.         m = m >> 1
  21.         s += 1
  22.     # M-R test
  23.     for _ in range(iter_num):
  24.         b = fast_power(random.randint(2, n - 1), m, n)
  25.         if b == 1 or b == n - 1:
  26.             continue
  27.         for __ in range(s - 1):
  28.             # print(__, b)
  29.             b = fast_power(b, 2, n)
  30.             # print(__, b)
  31.             if b == n - 1:
  32.                 # print("xxx",b)
  33.                 break
  34.         else:
  35.             return False
  36.     return True


  37. def pro(n, m):
  38.     while 1:
  39.         d = random.randint(n, m)
  40.         if d % 2 == 0: d += 1
  41.         if d in [2,3,5,7,11,13]:return d
  42.         for i in range(50):  # 伪素数附近50个奇数都没有真素数的话,重新再产生一个伪素数
  43.             d6 = d % 6
  44.             if d6 != 1 and d6 != 5: continue  # 如果不是6的倍数加减1,则跳过
  45.             u = testMillerRabin(d + 2 * i, 5)
  46.             if u:
  47.                 return d + 2 * i




  48. ra = pro(2 ** 1023, 2 ** 1025)
  49. print("生成的质数为:", ra)
  50. print("对质数的检验结果为:", testMillerRabin(ra, 8))
复制代码



生成的质数为: 165642865589367291753144458650768183278332548522028487791596939640348023684042023851331565191716285510932368772690219194796681339904005320345063457632125052309558645336982330245838237490843678865014664211039823856305981897993435581155010814865055573859784255321889274048239167417659167583100404569601766950057
对质数的检验结果为: True
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-16 17:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表