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按位与运算(为偶数)

最新文章

  1. shell if 浮点数比较
  2. ETL简介
  3. 重写TextField Rect 改变显示位置
  4. Android jar包的导出和使用
  5. ASP.NET Web API中的参数绑定总结
  6. JS算法总结
  7. android 屏幕截取,pull到pc端
  8. java时间格式串
  9. Code(组合数学)
  10. 使用intellij idea搭建MAVEN+springmvc+mybatis框架
  11. 编写高效的C程序与C代码优化
  12. 解决英文版Windows程序乱码
  13. ABP之动态WebAPI
  14. NFS服务
  15. jqueryValidate
  16. VisualSVN+TortoiseSVN搭建版本控制系统教程
  17. 用setuptools_scm来自动控制Python包的版本
  18. mysql5.6修改字符编码,ERR:Illegal mix of collations for operation &#39;concat&#39;
  19. qtp:vbs基础教程
  20. 算法笔记_058:蓝桥杯练习 2的次幂表示(Java)

热门文章

  1. Metasploit渗透测试框架二
  2. docker-compose重新启动单个容器
  3. 调度器30—调度相关结构体—p-&gt;flags
  4. Unity 读取Json文件、创建Json文件
  5. onedrive 不显示图标
  6. Fiddle 简单用法
  7. IntelliJ IDEA修改系统缓存目录
  8. BottomNavigationBar 自定义 底部导航条、以及实现页面切换
  9. 页面布局 Stack 层叠组件 Stack 与 Align Stack 与 Positioned 实现定位布局
  10. Dynamics 365 incident原生实体特点