Loj#143-[模板]质数判定【Miller-Rabin】
正题
题目链接:https://loj.ac/p/143
题目大意
给出一个数\(p\),让你判定是否为质数。
解题思路
\(Miller-Rabin\)是一种基于费马小定理和二次探测定理的具有较高正确性的高效质数判定算法。
首先讲一下两个定理
- 费马小定理:$$gcd(a,p)=1\ \ \ \Rightarrow\ \ \ a^{p-1}=1(mod\ p)$$
- 二次探测定理:若\(p\)是一个素数且有\(0<x<p\)那么有$$x^n=1(mod\ p)\ \ \ \Rightarrow\ \ \ n=1\ or\ p-1$$
这两个定理我们怎么使用呢,我们先将\(p-1\)分解成\(2^st\)的形式,这样我们对于一个数\(a^t\)就可以进行\(s\)次平方将其变为\(a^{p-1}\)。
再选取一个较小的质数\(a\),然后不停将\(a^t\)平方,每平方一次就使用一次二次探测定理来判定质数。知道\(a^t\)平方\(s\)次后变为\(a^{p-1}\)就再用一次费马小定理。
当然这样无法完全保证正确性,但是如果我们多拿几个质数试一试就可以大大缩小错误概率。并且目前可以证明在\(int\)范围内使用前\(30\)个质数是保证不会出错的,但是一般代码中为了确保效率会使用少一些素数。
注意使用\(long\ long\)时乘数可能会超过范围,所以可以用黑科技\(O(1)\)的快速乘来解决
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll pri[20]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
ll ksc(ll a,ll b,ll p){
a%=p;b%=p;
ll c=(long double)a*b/p;
long double ans=a*b-c*p;
if(ans<0)ans+=p;
else if(ans>=p)ans-=p;
return ans;
}
ll power(ll x,ll b,ll p){
ll ans=1;
while(b){
if(b&1)ans=ksc(ans,x,p);
x=ksc(x,x,p);b>>=1;
}
return ans;
}
bool MB(ll p){
if(p==2)return 1;
if(p<2||!(p&1))return 0;
ll s=0,t=p-1;
while(!(t&1))
s++,t>>=1;
for(ll i=0;i<10&&pri[i]<p;i++){
ll x=power(pri[i],t,p),k;
for(ll j=0;j<s;j++){
k=ksc(x,x,p);
if(k==1&&x!=1&&x!=p-1)
return 0;
x=k;
}
if(x!=1)return 0;
}
return 1;
}
int main()
{
ll x;
while(scanf("%lld",&x)!=EOF){
if(MB(x))printf("Y\n");
else printf("N\n");
}
}
Loj#143-[模板]质数判定【Miller-Rabin】的更多相关文章
- 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)
关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是 ...
- Miller Rabin 详解 && 小清新数学题题解
在做这道题之前,我们首先来尝试签到题. 签到题 我们定义一个函数:\(qiandao(x)\) 为小于等于 x 的数中与 x 不互质的数的个数.要求 \(\sum\limits _{i=l}^r qi ...
- LibreOJ#143 质数判定 [Miller_Rabin]
题目传送门 质数判定 题目描述 判定输入的数是不是质数. 输入格式 若干行,一行一个数 x. 行数不超过 $1.5\times 10^4$ 输出格式 对于输入的每一行,如果 x是质数输出一行 Y,否则 ...
- 【数论基础】素数判定和Miller Rabin算法
判断正整数p是否是素数 方法一 朴素的判定
- HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- Miller Rabin 算法简介
0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 1 ...
- poj 1811 Pallor Rho +Miller Rabin
/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...
- Miller Rabin算法详解
何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...
随机推荐
- sentinel使用(结合gateway)
前 如果你想在Spring Cloud Gateway中使用Sentinel Starter,你需要添加Spring - Cloud -alibaba- Sentinel - Gateway依赖,并添 ...
- 异步编程async体会
namespace 异步编程{ class Program { static void Main(string[] args) { Console.WriteLine("mian this ...
- lock学习篇(上)
why? 当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待. 但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候, ...
- EL表达式学习(一)
一.初次接触EL表达式: <%@ page language="java" import="java.util.*" pageEncoding=" ...
- cookie实现访问时间查看
package day01.cookies; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEn ...
- flex布局中flex属性运用在随机发红包的算法上
flex布局是现在前端基本上都会运用的一种布局,基本上用到比较多的是父元素设置display:flex,两个子元素,一个设置固定宽度,另一个设置为flex:1(这里都指flex-direction为r ...
- ORB_SLAM2 Ubuntu16.04编译错误
Ubuntu14.04一切正常,迁移到Ubuntu16.04后编译报错,提示: /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:745:3: ...
- 前端axios请求二进制数据流转换生成PDF文件空白问题(终极解决方案)
本文章共1570字,预计阅读时间1 - 3分钟. 问题场景: axios请求二进制数据转换生成PDF空白问题,使用axios请求后端接口,后端返回的二进制流文件,需要转换成PDF,但是在postman ...
- Selenium4 IDE初体验
今天闲来无事,尝试了一番Selenium4的IDE,提供了录制和回放的功能.下面是对它的简单介绍. 安装 下载地址:https://www.selenium.dev/selenium-ide/ 在下载 ...
- VUE005. 在data中使用 / 改变data,或在data中调用method函数
使用三方UI库时经常会遇到在data中写入方法的场景,如Element-UI的级联选择器(动态加载part)需要在data中写入lazyLoad. 但后端总会给出意想不到的需求: 通过接口调取一串数据 ...