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. Java笔记_this关键字_HomeWork(1 - 4 题)

    第一题 /** * @ClassName HomeWork01 * @Description TODO * @Author Orange * @Date 2021/4/23 8:14 * @Versi ...

  2. 一、100ASK_IMX6ULL嵌入式裸板学习_LED实验(知识点补充二)

    MUX是什么?   MUX(multiplexer数据选择器):   在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关.   多路转换器的作用主要 ...

  3. bootstrap table表格按钮

    1 <body> 2 3 <form action="" method="POST" class="form-horizontal& ...

  4. Quartz 2D实现文字镂空效果

    什么是镂空效果,下图就是一个镂空效果的文字: 从图可知,文字是透明的,可以看到下面的图片内容,而UILabel其它部分是白色背景. 使用Quartz 2D绘制镂空效果,大体思路如下: 实现一个UILa ...

  5. update_base_x.txt

    update g_temp.test_baseset field_date = '20210101'::datewhere field_int = 6

  6. 算子groupByKey和reduceByKey的区别

    groupByKey根据k对v进行分组,如果要实现wordCount,需要再使用一个聚合算子,例如mapValues reduceByKey有聚合功能,最重要的是在shuffle过程之前可以对分区内相 ...

  7. twenty four

    vue基础代码 <script src="vue路径"></script> <script> const vm = new Vue({ //el ...

  8. 解决504 GATEWAY TIMEOUT Nginx网关超时

    最近遇到一个问题504 GATEWAY TIMEOUT的问题,在浏览器的NetWork里面看是这个效果.时间大概是60s. 修改nginx配置 目前后端技术架构主要是nginx和php-fpm,前端主 ...

  9. 【Python】Python 技巧集锦(长期更新)

    [Basic] 『List Comprehensions』 『Python 中 map(), filter(), reduce() 和 zip() 函数的用法』 『Python 中关于下划线 '_'  ...

  10. Andorid 悬浮窗的适配指北

    我们有时候需要显示一个悬浮窗,悬浮窗由服务开启,里面会有一些操作 但是我在开发时遇到高版本 Android12 和低版本4.4 ,显示不一样的地方 这边整理了下适配的方法方案 一:根据版本不一的时候, ...