【模板】素数测试(Miller-Rabin测试)
基础素数测试模板
对于大数的素性判断,目前Miller-Rabin算法应用最广泛。一般底数仍然是随机选取,但当待测数不太大时,选择测试底数就有一些技巧了。比如,如果 被测数小于4759123141,那么只需要测试三个底数 a[]={2,7,61} 就足够了。当然,测试的越多,正确的范围也越大。如果你每次都用前7个素数 a[]={2,3,5,7,11,13,17} 进行测试,所有不超过341550071728320的数都是正确的。如果选用 a[]={2,3,7,61,24251} 作为底数,那么10^16内唯一的强伪素数为46856248255981。这样的一些结论使得Miller-Rabin算法在OI中非常实用。通常认为,Miller-Rabin素性测试的正确率可以令人接受,随机选取k个底数进行测试算法的失误率大概为4^(-k)。
tip:1无法进行判断,只能自行特判为false!
#include<iostream>
using namespace std ;
typedef long long ll;
ll pow_mod(ll a,ll b,ll r)
{
ll ans=,buff=a;
while(b)
{
if(b&)
ans=(ans*buff)%r;
buff=(buff*buff)%r;
b>>=;
}
return ans;
} bool test(ll n,ll a,ll d)
{
if(n==)return true;
if(n==a)return false;
if(!(n&))return false;
while(!(d&))d>>=;
ll t=pow_mod(a,d,n);
while(d!=n-&&t!=n-&&t!=)
{
t=t*t%n;
d<<=;
}
return t==n-||(d&)==;//要么t能变成n-1,要么一开始就t=1
} bool isprime(ll n)
{
int a[]={,,,}; //看情况取值
for(int i=;i<=;i++)
{
if(n==a[i])return true;
if(!test(n,a[i],n-))return false;
}
return true;
}
int main()
{
int t;
ll n;
for(cin>>t;t;t--)
{
cin>>n;
cout<<((isprime(n))?"Yes":"No")<<endl;
}
return ;
}
ps:注意上述算法中的幂运算是longlong类型,longlong×longlong肯定会出现溢出现象,如果不会java大整数,手里也没有大整数乘法模板的话,有一个小技巧可以避免溢出,方法就是乘法改为加法,把上面的代码:
ll pow_mod(ll a,ll b,ll r)
{
ll ans=,buff=a;
while(b)
{
if(b&)
ans=(ans*buff)%r;
buff=(buff*buff)%r;
b>>=;
}
return ans;
}
改为:
ll mod_mul(ll a,ll b,ll n)
{
ll res=;
while(b)
{
if(b&)
res=(res+a)%n;
a=(a+a)%n;
b>>=;
}
return res;
} ll pow_mod(ll a,ll b,ll n)
{
ll res=;
while(b)
{
if(b&)
res=mod_mul(res,a,n);
a=mod_mul(a,a,n);
b>>=;
}
return res;
}
【模板】素数测试(Miller-Rabin测试)的更多相关文章
- 与数论的厮守01:素数的测试——Miller Rabin
看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...
- 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)
关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是 ...
- Miller Rabin算法详解
何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- Miller Rabin 大素数测试
PS:本人第一次写随笔,写的不好请见谅. 接触MillerRabin算法大概是一年前,看到这个算法首先得为它的神奇之处大为赞叹,竟然可以通过几次随机数据的猜测就能判断出这数是否是素数,虽然说是有误差率 ...
- HDU1164_Eddy's research I【Miller Rabin素数测试】【Pollar Rho整数分解】
Eddy's research I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 【数论基础】素数判定和Miller Rabin算法
判断正整数p是否是素数 方法一 朴素的判定
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- OpenGL-----深度测试,剪裁测试、Alpha测试和模板测试
片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测 ...
- POJ2429_GCD & LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...
随机推荐
- 【学习笔记】Java实用类:枚举(Enum)
Java API(Java Application Programming Interface)Java应用程序编程接口... 实用类:Java API提供了几个常用包: 1.java.lang:编写 ...
- SQL Server迭代求和
drop table t_geovindu create table t_geovindu ( xid int IDENTITY (1, 1), price money, DebitCredit VA ...
- Angular 基础教程(1)
简介 什么是AngularJS 一个功能非常完备的前端框架,通过增强HTML的方式提供一种便捷开发Web应用程序的方式 其核心特点就是几乎无任何DOM操作,让开发人员的精力和时间全部集中于业务 MVC ...
- wxpython CustomTreeCtrl
转自 http://xoomer.virgilio.it/infinity77/Phoenix/lib.agw.customtreectrl.CustomTreeCtrl.html这个网址中有许多控件 ...
- requireJS基本配置相关
requireJS: (1)实现js文件的异步加载,避免页面失去响应: (2)管理模块之间的依赖性,便于代码的编写和维护. 加载: <script src="js/require.js ...
- matlab练习程序(生成黑白网格)
提供了两种生成方法,一个是自己编程实现,比较灵活:另一个是调用系统的checkerboard函数,似乎只能生成8*8网格. 至于用途,也许可以用来下国际象棋. 自己函数生成: 系统函数生成: 代码如下 ...
- spring----对IoC和DI的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和 ...
- head标签必不可少的元素
<head> 标签用于定义文档的头部,它是所有头部元素的容器.<head> 中的元素可以引用脚本.指示浏览器在哪里找到样式表.提供元信息等等. 文档的头部描述了文档的各种属性和 ...
- Selenium2学习(二)-- 操作浏览器基本方法
前面已经把环境搭建好了,这从这篇开始,正式学习selenium的webdriver框架.我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是web ...
- 牛客网数据库SQL实战1-查找最晚入职员工的所有信息
题目描述 查找最晚入职员工的所有信息CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`fi ...