Miller-Rabin素性判定算法
Miller-Rabin素性判定算法是一种基于概率的判定算法,每次判定n是素数的正确性概率至少为75%,出错的概率小于25%。
如果对n进行k次素性检测,如果结果n为素数,那么n为合数的概率为1/(4^k)。如果k足够大,那么误判的概率就非常小。
算法原理如下:

#include <iostream>
#include <random>
#include <time.h>
using namespace std;
typedef unsigned __int64 llong;//无符号64位整形
//typedef为已有的类型起一个别名。
//既然是别名,对同一类型可以起多个别名。这在C/C++中是允许的,各个别名和真名的作用都是一样有效的。 llong mod_pro(llong x,llong y,llong n)
{
llong ret=0,tmp=x%n;
while(y)
{
if(y&0x1)
if((ret+=tmp)>n)
ret-=n;
if((tmp<<=1)>n)
tmp-=n;
y>>=1;//>>= 意思为:右移后赋值(按位移)
}
return ret; } //a^b mod c
llong mod(llong a,llong b,llong c)//a:原理中的b,b:m,c:n
{
llong ret=1;
while(b)
{
if(b&0x1)//b不为偶数
ret=mod_pro(ret,a,c);//1,随机数,n
a=mod_pro(a,a,c);
b>>=1;
}
return ret;
} llong ran()
{
llong ret =rand();
return ret*rand();
} bool is_prime(llong n,int t)//轮数为3
{
if(n<2)
return false;
if(n==2)
return true;
if(!(n&0x1))//按位与运算(为偶数)
return false;
llong k=0,m,a,i;
for(m=n-1; !(m&1); m>>=1,k++);// !(m&1):m是偶数
cout<<m<<" "<<k<<endl;//m是m,k是s:n-1= 2^s*m while(t--)
{
a=mod(ran()%(n-2)+2,m,n);//ran()%(n-2)+2:随机整数b
if(a!=1)//圈3
{
for(i=0; i<k&&a!=n-1; i++)
{
a=mod_pro(a,a,n);
}
if(i>=k)
return false;
}
}
return true;
} int main()
{ llong n;
cout<<"请输入一个大于三的整数:";
while(scanf("%I64u",&n)!=EOF)//__int64结构的输入格式
{
clockid_t starttime,endtime;
starttime=clock(); if(is_prime(n,3))
cout<<"YES\n";
else
cout<<"NO\n";
endtime=clock();
cout<<"用时"<<endtime-starttime<<"毫秒\n"<<endl;
cout<<"请输入一个大于三的整数:";
}
return 0;
}
学到了:
- >>= 意思为:右移后赋值(按位移)
- (n&0x1))//n和十六进制的1按位与运算(为偶数)
Miller-Rabin素性判定算法的更多相关文章
- 【数论基础】素数判定和Miller Rabin算法
判断正整数p是否是素数 方法一 朴素的判定
- Miller Rabin算法详解
何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...
- 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)
关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是 ...
- Miller Rabin 算法简介
0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 1 ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- Miller Rabin算法学习笔记
定义: Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快. 定理: Miller ...
- poj 1811 Pallor Rho +Miller Rabin
/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...
- POJ1811- Prime Test(Miller–Rabin+Pollard's rho)
题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
随机推荐
- Java笔记_this关键字_HomeWork(1 - 4 题)
第一题 /** * @ClassName HomeWork01 * @Description TODO * @Author Orange * @Date 2021/4/23 8:14 * @Versi ...
- 一、100ASK_IMX6ULL嵌入式裸板学习_LED实验(知识点补充二)
MUX是什么? MUX(multiplexer数据选择器): 在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关. 多路转换器的作用主要 ...
- bootstrap table表格按钮
1 <body> 2 3 <form action="" method="POST" class="form-horizontal& ...
- Quartz 2D实现文字镂空效果
什么是镂空效果,下图就是一个镂空效果的文字: 从图可知,文字是透明的,可以看到下面的图片内容,而UILabel其它部分是白色背景. 使用Quartz 2D绘制镂空效果,大体思路如下: 实现一个UILa ...
- update_base_x.txt
update g_temp.test_baseset field_date = '20210101'::datewhere field_int = 6
- 算子groupByKey和reduceByKey的区别
groupByKey根据k对v进行分组,如果要实现wordCount,需要再使用一个聚合算子,例如mapValues reduceByKey有聚合功能,最重要的是在shuffle过程之前可以对分区内相 ...
- twenty four
vue基础代码 <script src="vue路径"></script> <script> const vm = new Vue({ //el ...
- 解决504 GATEWAY TIMEOUT Nginx网关超时
最近遇到一个问题504 GATEWAY TIMEOUT的问题,在浏览器的NetWork里面看是这个效果.时间大概是60s. 修改nginx配置 目前后端技术架构主要是nginx和php-fpm,前端主 ...
- 【Python】Python 技巧集锦(长期更新)
[Basic] 『List Comprehensions』 『Python 中 map(), filter(), reduce() 和 zip() 函数的用法』 『Python 中关于下划线 '_' ...
- Andorid 悬浮窗的适配指北
我们有时候需要显示一个悬浮窗,悬浮窗由服务开启,里面会有一些操作 但是我在开发时遇到高版本 Android12 和低版本4.4 ,显示不一样的地方 这边整理了下适配的方法方案 一:根据版本不一的时候, ...