1 #include<iostream>   //该程序为哥德巴赫猜(想输出所有的组合)
 2 #include<cmath>
 3 #include<cstdlib>
 4 #include<ctime>
 5 #include<cstdio>
 6
 7 using namespace std;
 8
 9 typedef unsigned long long ull;
10 typedef unsigned long long LL;
11
12 LL prime[6] = {2, 3, 5, 233, 331};
13 LL qmul(LL x, LL y, LL mod) { // 乘法防止溢出, 如果p * p不爆LL的话可以直接乘; O(1)乘法或者转化成二进制加法
14 //快速乘法取模算法
15
16     return (x * y - (long long)(x / (long double)mod * y + 1e-3) *mod + mod) % mod;
17     /*
18     LL ret = 0;
19     while(y) {
20         if(y & 1)
21             ret = (ret + x) % mod;
22         x = x * 2 % mod;
23         y >>= 1;
24     }
25     return ret;
26     */
27 }
28
29 LL qpow(LL a, LL n, LL mod) {
30     LL ret = 1;
31     while(n) {
32         if(n & 1) ret = qmul(ret, a, mod);
33         a = qmul(a, a, mod);
34         n >>= 1;//n=n/2二进制乘除法
35     }
36     return ret;
37 }
38
39
40 bool Miller_Rabin(LL p) {
41     if(p < 2) return 0;
42     if(p != 2 && p % 2 == 0) return 0;
43     LL s = p - 1;
44     while(! (s & 1)) s >>= 1;//排除掉偶数
45     for(int i = 0; i < 5; ++i) {
46         if(p == prime[i]) return 1;
47         LL t = s, m = qpow(prime[i], s, p);
48         //二次探测定理卡米歇尔数保证该数为素数
49         //卡米歇尔数若一个数为合数当0<x<p,则方程x^p≡a(mod p)
50         //二次探测定理如果p是一个素数,0<x<p,则方程x^2≡1(mod p)的解为x=1,p-1
51         while(t != p - 1 && m != 1 && m != p - 1) {
52             m = qmul(m, m, p);
53             t <<= 1;
54         }
55         if(m != p - 1 && !(t & 1)) return 0;//不是奇数且m!=p-1
56     }
57     return 1;
58 }

转载于:https://www.cnblogs.com/Fy1999/p/8908462.html

米勒罗宾素性测试(Miller–Rabin primality test)相关推荐

  1. 2018宁夏邀请赛 - Goldbach(米勒罗宾素数测试)

    题目链接:点击查看 题目大意:给出一个偶数,将其拆为两个素数之和 题目分析:因为将一个偶数拆为两个素数和时,答案会有多种情况,挑较小的素数最小时,一般此素数会非常小,最大也超不过一万,所以我们需要解决 ...

  2. 与数论的厮守01:素数的测试——Miller Rabin

    看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...

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

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

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

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

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

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

  6. miller_rabin_素性测试

    摘自:http://blog.csdn.net/pi9nc/article/details/27209455 看了好久没看懂,最后在这篇博客中看明白了. 费马定理的应用,加上二次探测定理. Ferma ...

  7. (Miller Rabin算法)判断一个数是否为素数

    (Miller Rabin算法)判断一个数是否为素数 1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先 ...

  8. 素数与素性测试(Miller-Rabin测试)(目前为止我见过最好的博客)

    原地址(原地址比我好了100倍):https://www.cnblogs.com/Norlan/p/5350243.html 以下是原文: 转载自Matrix大牛的博客 把代码翻译成C++ http: ...

  9. Magic的Miller Rabin素数测定和Pollard's Rho质因子分解法

    boshi大佬帮助了litble,使愚蠢的litble(可能?)学会了这种神奇的算法. orz boshi. 例题:poj1811 Miller Rabin 又称米勒挝饼, 一种神奇的快速判定一个数是 ...

最新文章

  1. OpenEye | Windows下安装配置OpenEye
  2. grub legacy
  3. 分享一个针对触摸设备优化的图片幻灯jQuery插件 - touchtouch
  4. java即时编译器_Java即时编译:不仅仅是一个流行词
  5. arduino 按钮读取_Arduino内置教程-数字-检测按键状态
  6. ubuntu mysql双主热备配置_mysql学习:mysql双主热备+lvs+keepalived配置
  7. 各类电商购物网站商城系统静态网页html制作(含静态网站源码)
  8. 通用有限元软件简介及比较
  9. android studio在夜神上打开_android studio 使用夜神模拟器 开发调试
  10. C语言《计算两点间距离》
  11. ARM学习笔记:HC-SR501人体红外传感器
  12. Definer 预言机攻击事件分析
  13. 打开Word文档的时候提示mathtype “安全警告 宏已被禁用”
  14. 帝国CMS[!--onclick--]标签动态显示页面点击数,解决刷新页面浏览量无变化的问题
  15. 暴君专栏和谐按钮_质量工具:卑微的仆人还是暴君?
  16. ArcGIS10.5安装出现1068错误:依赖服务或组无法启动(已解决)
  17. 如何联系NOI各省特派员?
  18. nmap扫描出错sendmsg: No route to host
  19. 打字会覆盖后面原有的字解决方案
  20. 蓝牙耳机到底哪款好?纠结症一定要知道的蓝牙耳机冷知识

热门文章

  1. 记录一下g++的编译选项
  2. java文件锁定_如何使用java锁定文件(如果可能的话)
  3. java 折半插入排序_[Java代码] Java实现直接插入排序和折半插入排序算法示例
  4. html代码闪烁的文字怎么打,HTML最简单的文字闪烁代码
  5. python 写脚本 预约课程_Python盘纪念币系列之三:自动预约脚本编写 03 系列总结...
  6. c语言编程学生管理系统的代码,C语言学生管理系统源代码.doc
  7. python3程序下载安装_程序猿的语言,Python 3.7.0下载安装
  8. 景德镇陶瓷学院计算机协会,景德镇陶瓷学院计算机协会换届大会总结报告
  9. ubuntu18.04上安装TensorFlow2.0
  10. Tensor VS NumPy