Miller-Rabin素性判定算法
2024-09-08 19:42:39
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按位与运算(为偶数)
最新文章
- shell if 浮点数比较
- ETL简介
- 重写TextField Rect 改变显示位置
- Android jar包的导出和使用
- ASP.NET Web API中的参数绑定总结
- JS算法总结
- android 屏幕截取,pull到pc端
- java时间格式串
- Code(组合数学)
- 使用intellij idea搭建MAVEN+springmvc+mybatis框架
- 编写高效的C程序与C代码优化
- 解决英文版Windows程序乱码
- ABP之动态WebAPI
- NFS服务
- jqueryValidate
- VisualSVN+TortoiseSVN搭建版本控制系统教程
- 用setuptools_scm来自动控制Python包的版本
- mysql5.6修改字符编码,ERR:Illegal mix of collations for operation &#39;concat&#39;
- qtp:vbs基础教程
- 算法笔记_058:蓝桥杯练习 2的次幂表示(Java)