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素性判定算法的更多相关文章

  1. 【数论基础】素数判定和Miller Rabin算法

    判断正整数p是否是素数 方法一 朴素的判定   

  2. Miller Rabin算法详解

    何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...

  3. 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)

    关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是 ...

  4. Miller Rabin 算法简介

    0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 1 ...

  5. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

  6. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  7. Miller Rabin算法学习笔记

    定义: Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快. 定理: Miller ...

  8. poj 1811 Pallor Rho +Miller Rabin

    /* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...

  9. POJ1811- Prime Test(Miller–Rabin+Pollard's rho)

    题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...

  10. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

随机推荐

  1. c-->extern关键字的使用

    extern关键字的使用 作用:声明外部符号(使用其他文件的全局变量) 例子: 源文件: test.c #include <stdio.h> extern int year;//使用ext ...

  2. gulp安装出错

    gulp安装出错 标签(空格分隔): gulp 贴上报错: [root@localhost web]# npm install gulp --save-dev gulptest@1.0.0 /mnt/ ...

  3. 12组-Beta冲刺-3/5

    一.基本情况 队名:字节不跳动 组长博客:https://www.cnblogs.com/147258369k/p/15599024.html Github链接:https://github.com/ ...

  4. Apache SSI远程命令执行漏洞复现

    漏洞原理:当目标服务器开启了SSI与CGI支持,就可以上传shtml文件,并利用语法执行任意命令,例如<!- - #exec cmd="ls"- ->,cmd后面跟要执 ...

  5. 掌控安全学院SQL注入靶场-布尔盲注(一)

    靶场地址:http://inject2.lab.aqlab.cn/Pass-10/index.php?id=1 判断注入点: http://inject2.lab.aqlab.cn/Pass-10/i ...

  6. CentOS 7 安装步骤以及初始化

    2. 虚拟机分配的资源 因为用的软件不一样,这里设置方法无法截图,但大至如下: 2CPU/1G内存/200G硬盘 去掉打印机等没用的硬件(macOS要去掉打印机和摄像头) 光盘开始选择空白光盘,不要在 ...

  7. 用Bootstrap设计后端页面模板

    <!doctype html><html lang="zh-CN"> <head> <meta charset="utf-8&q ...

  8. Mybatis插件-分批次插入数据

    背景 有时候使用insert into xxx values (),()语句插入大量数据时,会使得SQL语句超长,为了解决这个问题,在Mybatis中编写一个分批次插入的插件. 实现 package ...

  9. uniapp安卓本地文件读取(html5+)

    plus.io.resolveLocalFileSystemURL(                    "_www/static/caise.json",//static下路径 ...

  10. Docker 使用阿里云加速拉取官方镜像

    首先登陆阿里云容器镜像服务控制台,在左侧导航栏选择镜像工具 > 镜像加速器,在镜像加速器页面获取镜像加速地址. 例如: 加速器地址:[系统分配前缀].mirror.aliyuncs.com 配置 ...