米勒拉宾算法的基本概念如下:

首先判断这个数n的奇偶性

若为偶数仅有2是质数

奇数则进入测试

测试方法:

首先确定几个基底a,范围在[2,n-1]

因为n是奇数,所以n-1必定为偶数

则n-1可以表示为(2^s)*d

s、d分别求出来

设t为a^d模n的数,有如下几个约定:

1.若t=-1或1时则该数n可能为质数

2.若此时t=n-1,则该数可能为质数

3.d*2>n-1时n必为合数

4.若上述皆不满足则让d*2,返回2

多组测试之后就能判断是否为质数,而且错误率相当低!!

不过想证明米勒拉宾的正确性还是很困难的

需要费马小定理等七七八八的数论

具体的可以百度

我就给于证明了~

直接上模板:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7
 8 ll add_mod(ll a,ll b,ll mod){    //快乘法 基于快速幂的二分思想
 9     ll ans=0;                    //由于考虑到取模数很大 快速幂会溢出
10     while(b){                    //必须使用该方法
11         if(b&1)                    //我这里写的是非递归版
12             ans=(ans+a)%mod;
13         a=a*2%mod;
14         b>>=1;
15     }
16     return ans;
17 }
18
19 ll pow_mod(ll a,ll n,ll mod){            //快速幂 递归版
20     if(n>1){
21         ll tmp=pow_mod(a,n>>1,mod)%mod;
22         tmp=add_mod(tmp,tmp,mod);
23         if(n&1) tmp=add_mod(tmp,a,mod);
24         return tmp;
25     }
26     return a;
27 }
28
29 bool Miller_Rabbin(ll n,ll a){//米勒拉宾素数判断函数主体
30     ll d=n-1,s=0,i;
31     while(!(d&1)){            // 先把(2^s)*d 算出来
32         d>>=1;
33         s++;
34     }
35     ll t=pow_mod(a,d,n);    //a^d取一次余判断
36     if(t==1 || t==-1)        //一或负一则可以声明这可能是质数
37         return 1;
38     for(i=0;i<s;i++){                //不是的话继续乘上s个2
39         if(t==n-1)            //(n-1)*(n-1)%n=1 这一步是优化
40             return 1;
41         t=add_mod(t,t,n);    // 快乘
42     }
43     return 0;
44 }
45
46 bool is_prime(ll n){
47     ll i,tab[4]={3,4,7,11};//本来应该取[1,n]内任意整数
48     for(i=0;i<4;i++){                //但一般这几个数足以,不需要太多组测试
49         if(n==tab[i])
50             return 1;        //小判断小优化~
51         if(!n%tab[i])
52             return 0;
53         if(n>tab[i] && !Miller_Rabbin(n,tab[i]))
54             return 0;
55     }
56     return 1;
57 }
58
59 int main(){
60     ll n;
61     scanf("%lld",&n);
62     if(n<2) printf("No");
63     else if(n==2) printf("Yes");
64     else{
65         if(!n%2) printf("No");
66         else if(is_prime(n))
67             printf("Yes");
68         else printf("No");
69     }
70     return 0;
71 }

Miller_Rabbin

转载于:https://www.cnblogs.com/JVxie/p/4975876.html

你知道如何判定一个大整数为素数吗?——米勒拉宾素数判定算法相关推荐

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

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

  2. 试题 基础练习 阶乘计算 (n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。   将a乘)

    问题描述 输入一个正整数n,输出n!的值. 其中n!=123*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个大整数a,A[0]表示a ...

  3. 判断一个大整数能否被11整除

    设计算法,判断一个大整数能否被11整除.可以通过以下方法:将该数的十进制表示从右端开始,每两位一组构成一个整数,然后将这些数相加,判断其和能否被11整除.例如,将562843748分割成5,62,84 ...

  4. 大素数判定以及大整数分解

    素数判定--Miller Rabin 算法 #include <cstdio> #include <cstring> #include <cmath> #inclu ...

  5. 定义一个大整数类,并重载乘法*运算符

    1 struct bigint{ 2 int a[500]; //可表示1000位以内的整数 3 bigint& operator*(int & value){ 4 for(int i ...

  6. 本题要求实现一个求整数的逆序数的简单函数。_回溯算法:求组合总和(二)...

    给「代码随想录」一个星标吧! ❝ 我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家在 ...

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

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

  8. 求一个整数的权重 c语言,Code Kata:大整数四则运算—乘法 javascript实现

    上周练习了加减法,今天练习大整数的乘法运算. 采取的方式同样为竖式计算,每一位相乘后相加. 乘法函数: 异符号相乘时结果为负数,0乘任何数都为0 需要调用加法函数 因为输入输出的为字符串,需要去除字符 ...

  9. 实验三:实现一个大素数生成算法

    一.实验内容 掌进一步掌握大素数分解的一般原理和实现方法.能用间接方法实现大素数分解.用代码实现Solovay-Strassen素性测试法或Miller-Rabin素性测试法. 二.分实现一个大素数生 ...

最新文章

  1. java内部类的权限符,static介绍、内部类、final、权限修饰符的作用范围,
  2. lua如何判断是否支持cookie_如何判断家里暖气片是否需要更换
  3. (转)Web Framework 的速度与激情 16 正式上映
  4. oracle 获取当月的1号_ORACLE认证大师(OCM)
  5. 论文浅尝 | Multilingual LAMA: 探索多语言预训练语言模型中的知识
  6. Java基础语法及其经验总结
  7. Java Web Start简介
  8. 经典Python面试题之数据库和缓存
  9. SQL查询中的笛卡尔积现象解决方法
  10. html圆圈里面有歌词,html5+js带滚动歌词的音乐播放器(同时支持列表,json) | 小灰灰博客...
  11. python ttk_tkinter进阶版——ttk
  12. Webpack项目中引入Bootstrap4.x
  13. Java面试题全集(下)
  14. 商务智能-第二章 数据仓库
  15. 新手入门:计算机网络基础知识总结
  16. 团体程序设计天梯赛-练习集 L2-028 秀恩爱分得快 (25 分) (详细解法)
  17. 百度增值税发票调用示例
  18. CRM软件哪个好?该如何选择?
  19. 【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
  20. 智能锁方案的软硬件开发简述

热门文章

  1. 王者荣耀的服务器是什么系统,王者荣耀健康系统 健康系统是什么
  2. 区块链是如何解决慈善公益项目中存在的问题呢?
  3. MFC实现简单连续加减计算器
  4. 宏碁暗影骑士擎2022-重装系统-扬声器无声音
  5. 前端基础 HTML 第九章 使用框架结构 ----暑假学习第五天
  6. Stereo Parallel Tracking and Mapping for robot localization(S-PTAM)
  7. Latex-TiKZ绘制数学平面几何图教程
  8. 在线进行立体几何画图——GeoGebra
  9. cocos creator 插件开发
  10. Java通过freemaker实现健康报告生成(包含列表、列表合并列)