Miller Rabin

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

来自 https://baike.baidu.com/item/米勒-拉宾素性检验/22719763

代码实现

import numpy as npdef get_random(i, j=None):if j == None:# 返回0-i的随机整数return np.random.randint(i + 1)if i > j:i, j = j, i# 获取i-j的随机整数return np.random.randint(i, j + 1)def fast_power(base, power, n):result = 1tmp = basewhile power > 0:if power & 1 == 1:result = (result * tmp) % ntmp = (tmp * tmp) % npower = power >> 1return resultdef Miller_Rabin(n, s):# 2是素数if n == 2:return True# n是偶数或小于2if n & 1 == 0 or n < 2:return False# n-1 = (2^s) mm, p = n - 1, 0while m & 1 == 0:m = m >> 1p += 1for _ in range(s):b = fast_power(get_random(2, n - 1), m, n)if b == 1 or b == n - 1:continuefor __ in range(p - 1):b = fast_power(b, 2, n)if b == n - 1:breakelse:return Falsereturn Trueif __name__ == '__main__':num = 50000s = 3prime = [x for x in range(2, num) if not [y for y in range(2, int(np.sqrt(x) + 1)) if x % y == 0]]result = []for i in range(num):flag = Miller_Rabin(i, s)if flag and i not in prime:print('error1: %d' % i)elif not flag and i in prime:print('error2: %d' % i)

代码复现了Miller-Rabin算法
代码测试方面预先计算出2-50000之间的素数,然后使用Miller-Rabin算法判断2-50000的数字是否为素数
打印说明:
'error1’表示Miller-Rabin错误判断为素数
'error2’表示Miller-Rabin错误判断为非素数

代码测试

测试1:
input:
s=1
output:

error1: 63
error1: 217
error1: 703
error1: 2977
error1: 2993
error1: 7033
error1: 7381
error1: 8911
error1: 9301
error1: 10963
error1: 12805
error1: 12871
error1: 20263
error1: 21097
error1: 26677
error1: 29539
error1: 31621
error1: 34861
error1: 42121
error1: 43553
error1: 44545
error1: 45795

测试2:
input:
s=2
output:

error1: 5461
error1: 45451

测试3:
input:
s=3
output:

None

结论

可以看出1次测试和2次测试都在计算上都出现了错误,从第3次测试开始没有出现错误,这也符合Miller-Rabin算法理论:
1.若在 s 次测试中没有找到见证者, MillerRabin(n, s)假定这是因为证据不存在,因此可认为 n 是素数。
2.当 s 足够大时,这个结果往往是对的,但在很少的情况下也可能由于选取 a 不合适而出错。

Python Miller Rabin 米勒-拉宾素性检验相关推荐

  1. 数论 判断素数:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验

    普通的素数判断法 当我们要判断一个数字是否是素数的时候,往往会直接看这个数字模1到这个数字的根号,看有没有等于零的,从而判断这个数字是不是素数,这样做的时间复杂度为O(sqrt(n)) bool is ...

  2. 费马素性测试和米勒—拉宾素性测试

    chapter 1 Fermat's little theorem 费马小定理 费马小定理说的是:如果p是一个素数,那么对于任意一个整数a,a p − a 能被p整除,也可以用模运算表示如下: (p是 ...

  3. 【学习笔记】Miller-Rabin(米勒-拉宾)素性测试,附常用表

    @TOC 素性测试是检验一个给定的整数是否为素数的测试. 最简单的就是用 n\sqrt{n}n​ 以内的数去试除.这是确定性的算法,即能准确知道 nnn 是否为质数. 但今天学习的是一种随机算法. F ...

  4. 米勒-拉宾素性检测算法

    米勒-拉宾素性检测就是目前应用比较广的一种随机化素性检测算法. 它是基于下面两个定理: (费马小定理)如果 p 为素数,且 a 无法被 p 整除,则对于所有大于0小于 p 的整数 a,有 ap−1≡1 ...

  5. 米勒-拉宾(MillerRabbin)素性测试算法

    原创滴博客~https://www.cnblogs.com/precious-ZPF/p/9481599.html 小编赶紧摘过来的,多看几遍向银家多学习学习QAQ 首先,在了解米勒-拉宾素性测试之前 ...

  6. C++实现伪大素数生成算法(费马小定理判别法、米勒拉宾素数判定法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.伪大素数生成原理 方法一 方法二 数学基础 二.费马小定理判别法 1.算法 2.代码实现 3.运行结果 二.米勒拉宾素数 ...

  7. C++米勒拉宾算法模板

    //我也忘了从哪找来的板子,不过对于2^63级的数据请考虑使用java内置的米勒拉宾算法. 1 #include <iostream> 2 #include <string> ...

  8. 你知道如何判定一个大整数为素数吗?——米勒拉宾素数判定算法

    米勒拉宾算法的基本概念如下: 首先判断这个数n的奇偶性 若为偶数仅有2是质数 奇数则进入测试 测试方法: 首先确定几个基底a,范围在[2,n-1] 因为n是奇数,所以n-1必定为偶数 则n-1可以表示 ...

  9. 2018宁夏网络赛 B Goldbach (米勒拉宾素数测试)

    2018宁夏网络赛 B Goldbach (米勒拉宾素数测试) 题目链接 题目大意: 给你一个偶数n (2<n<=1e18) 让你把n分解成两个素数的和.(如果有多个输出任意一个) 解题思 ...

  10. 算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))

    这篇博客讲的很好: https://www.cnblogs.com/ZERO-/p/9302169.html 题目描述 木南有一天学习了欧拉函数,知道了对正整数n,欧拉函数是小于n的正整数中与n互质的 ...

最新文章

  1. iOS 实现多个可变 cell 复杂界面的制作
  2. 如何建立JSP操作用以提高数据库访问效率
  3. 将字典结果写入excel
  4. python代码需要背吗-纠结应该先学Python还是Java?看完就有数了
  5. SQL——将表中的最大ID+1插入新的ID中------Insert into 表 MAX(表id) +1
  6. 3.1.6 基本分页存储管理的基本概念
  7. Phython 3 笔记2 —— 基础语法
  8. 趣谈设计模式 | 代理模式(Proxy):利用代理来控制对象的访问
  9. 通过Java 8流使用Oracle AQ
  10. jqgrid下treegrid排序问题
  11. nodejs的mysql模块_Nodejs的mysql模块学习(一)
  12. C++提高部分_C++类模板与函数模板的区别---C++语言工作笔记088
  13. element-UI:el-table 表格排序
  14. 【java笔记】转换流
  15. 学校做计算机教室锐捷,锐捷网络云课堂:让学生爱上每一节课
  16. 《linux内核分析》第三次课 实验作业
  17. H5页面调起关注微信公众号的方法
  18. python声纹识别_【kaldi学习.4】Aishell V1(说话人识别、声纹识别)中的run.sh详解...
  19. 少儿学编程系列 --- 如何让ChatGPT使用turtle画画
  20. SVD的原理及python实现——正本清源

热门文章

  1. 微软自带dns服务器,win10微软设置哪个DNS服务器地址最快
  2. Spark基础练习题(RDD)
  3. QT小项目练手——用QTimer做一个倒计时程序
  4. pandas 第八章 文本数据
  5. 服务器w7系统怎么开启端口,win7如何打开21端口|win7开启21端口的方法
  6. 训练集、测试集和验证集的作用
  7. 北京智和信通企业级网络流量监控方案
  8. springboot系列(二十七):如何实现word携带图片导出?这你得会|超级详细,建议收藏
  9. K8s 集群上运行ca机制
  10. 微软服务器2016各版本区别,Win10系统有几个版本?Windows10各版本区别详细介绍