鱼C论坛

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

[技术交流] 质数 - 米勒-拉宾质数判定法 Miller–Rabin Primality Test

[复制链接]
发表于 2021-10-10 14:54:41 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 傻眼貓咪 于 2021-10-12 19:18 编辑
质数
米勒-拉宾质数判定法 Miller–Rabin Primality Test


计算 100万 (1,000,000)以内的所有质数,用时:1.911秒
代码:
  1. import time

  2. def isPrime(n, k=5): # 米勒-拉宾质数判定法 Miller–Rabin Primality Test
  3.     from random import randint
  4.     if n < 2: return False
  5.     for p in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]: # 小质数(50以内的质数作为范本)
  6.         if not n%p: return n == p
  7.     s, d = 0, n-1
  8.     while not d%2:
  9.         s, d = s+1, d>>1
  10.     for i in range(k):
  11.         x = pow(randint(2, n-1), d, n)
  12.         if x == 1 or x == n-1: continue
  13.         for r in range(1, s):
  14.             x = (x * x) % n
  15.             if x == 1: return False
  16.             if x == n-1: break
  17.         else: return False
  18.     return True

  19. arr = []
  20. start_time = time.time()
  21. for i in range(1000000):
  22.     if isPrime(i):
  23.         arr.append(i)
  24. end_time = time.time() - start_time
  25. print(f"共 {len(arr)} 个质数")
  26. print("执行时间为:%s秒"%end_time)
复制代码
  1. 共 78498 个质数
  2. 执行时间为:1.9118878841400146秒
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 20:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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