Loj#143-[模板]质数判定【Miller-Rabin】

正题

题目链接:https://loj.ac/p/143


题目大意

给出一个数ppp,让你判定是否为质数。


解题思路

Miller−RabinMiller-RabinMillerRabin是一种基于费马小定理和二次探测定理的具有较高正确性的高效质数判定算法。
首先讲一下两个定理

  1. 费马小定理:gcd(a,p)=1⇒ap−1=1(modp)gcd(a,p)=1\ \ \ \Rightarrow\ \ \ a^{p-1}=1(mod\ p)gcd(a,p)=1      ap1=1(mod p)
  2. 二次探测定理:若ppp是一个素数且有0<x<p0<x<p0<x<p那么有xn=1(modp)⇒n=1orp−1x^n=1(mod\ p)\ \ \ \Rightarrow\ \ \ n=1\ or\ p-1xn=1(mod p)      n=1 or p1

这两个定理我们怎么使用呢,我们先将p−1p-1p1分解成2st2^st2st的形式,这样我们对于一个数ata^tat就可以进行sss次平方将其变为ap−1a^{p-1}ap1

再选取一个较小的质数aaa,然后不停将ata^tat平方,每平方一次就使用一次二次探测定理来判定质数。知道ata^tat平方sss次后变为ap−1a^{p-1}ap1就再用一次费马小定理。

当然这样无法完全保证正确性,但是如果我们多拿几个质数试一试就可以大大缩小错误概率。并且目前可以证明在intintint范围内使用前303030个质数是保证不会出错的,但是一般代码中为了确保效率会使用少一些素数。

注意使用longlonglong\ longlong long时乘数可能会超过范围,所以可以用黑科技O(1)O(1)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 Mr(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(Mr(x))printf("Y\n");else printf("N\n");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LCT】Tree II(luogu 1501)

Tree II luogu 1501 题目大意 给出一棵树&#xff0c;让你进行若干操作&#xff0c;操作如下&#xff1a; 1.把两个点路径上的所有点权值加k 2.把两个点路径上的所有点权值乘k 3.把一条边断开&#xff0c;连上另一条边 4.查询两个点路径上的权值和 输入样例 3 2 1 2 2 3 *…

图论复习汇总

三元环计数&四元环计数 Blog dfs树,点双,边双,强连通分量 Blog bfs树 对一个图运行 bfs 算法&#xff0c;每个点uuu的父亲定义为第一次遍历uuu时的前驱结点&#xff0c;若无则为根。 非树边只存在在同一层的两个点和相邻层的点中。 hihoCoder1147 时空阵 题意&#x…

P4718-[模板]Pollard-Rho算法

正题 题目链接:https://www.luogu.com.cn/problem/P4718 题目大意 给出一个数nnn&#xff0c;如果它是质数则输出PrimePrimePrime&#xff0c;否则输出它的最大质因子。 解题思路 Pollard-Rho\text{Pollard-Rho}Pollard-Rho算法的前置知识是Miller-Rabin\text{Miller-Rabin}M…

T-Dongle-S3开发笔记——创建工程

创建Hello world工程 打开命令面板 方法1&#xff1a;查看->命令面板 方法2&#xff1a;按F1 选择ESP-IDF:展示示例项目 创建helloworld 选择串口 选择芯片 至此可以编译下载运行了 运行后打印的信息显示flash只有2M。但是板子上电flash是W25Q32 4MB的吗 16M-bit

hdu 1576 A/B

文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;hdu 1576题目&#xff1a; 要求(A/B)%9973&#xff0c;但由于A很大&#xff0c;我们只给出n(nA%9973)(我们给定的A必能被B整除&#xff0c;且gcd(B,9973) 1)。 Input 数据的第一行是一个T&#xff0c;表示有T组数据。…

ASP.NET Core 中断请求了解一下(翻译)

本文所讲方式仅适用于托管在Kestrel Server中的应用。如果托管在IIS和IIS Express上时&#xff0c;ASP.NET Core Module(ANCM)并不会告诉ASP.NET Core在客户端断开连接时中止请求。但可喜的是&#xff0c;ANCM预计在.NET Core 2.2中会完善这一机制。1. 引言假设有一个耗时的Act…

子数整数(luogu 1151)

子数整数 luogu 1151 题目大意 给出一个数k&#xff0c;让你在10000~30000中求出满足前三位&#xff0c;中间三位&#xff0c;后三位都可被k整除的数 输入样例 15输出样例 22555 25555 28555 30000数据范围 0<k<1000 解题思路 暴力枚举 代码 #include<cstd…

2021-10-22

扫描线&#xff1a; https://www.cnblogs.com/Parsnip/p/10887135.html https://blog.csdn.net/Emma2oo6/article/details/120584307 https://blog.csdn.net/weixin_30609331/article/details/96234492 LIS& LCS https://www.xuebuyuan.com/586419.html https://blog.csdn…

.net core实践系列之短信服务-架构优化

前言通过前面的几篇文章&#xff0c;讲解了一个短信服务的架构设计与实现。然而初始方案并非100%完美的&#xff0c;我们仍可以对该架构做一些优化与调整。同时我也希望通过这篇文章与大家分享一下&#xff0c;我的架构设计理念。源码地址&#xff1a;https://github.com/SkyCh…

Poj 1061 青蛙的约会

Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 143491 Accepted: 33018 Description 文章目录题目&#xff1a;思路:代码:题目传送题目&#xff1a; 两只青蛙在网上相识了&#xff0c;它们聊得很开心&#xff0c;于是觉得很有必要见一面。它们很高兴地发现它们住…

P3649-[APIO2014]回文串【PAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3649 题目大意 一个字符串&#xff0c;求最大的回文串长度出现次数 解题思路 构建出PAM\text{PAM}PAM然后统计一下每个节点作为后缀的次数&#xff0c;failfailfail树上上传一下信息就好了&#xff0c;时间复杂度O(n)O(n)O…

【数学】拉格朗日插值(luogu 4781/金牌导航 拉格朗日插值-1)

拉格朗日插值 luogu 4781 金牌导航 拉格朗日插值-1 题目大意 给出n个点&#xff0c;让你确定经过这n个点且不超过n-1次的方程&#xff0c;现在给出k&#xff0c;让你求出其函数值 样例#1 输入样例#1 3 100 1 4 2 9 3 16输出样例#1 10201样例#2 输入样例#2 3 100 1 1 …

游戏 (博弈论)

https://blog.csdn.net/Mys_C_K/article/details/91443390

.NET Core中Object Pool的简单使用

前言复用&#xff0c;是一个重要的话题&#xff0c;也是我们日常开发中经常遇到的&#xff0c;不可避免的问题。举个最为简单&#xff0c;大家最为熟悉的例子&#xff0c;数据库连接池&#xff0c;就是复用数据库连接。那么复用的意义在那里呢&#xff1f;简单来说就是减少不必…

数论 欧几里得与扩展欧几里得

欧几里得算法&#xff1a; 求a&#xff0c;b的最大公约数 gcd&#xff08;a,b&#xff09; gcd(b,a%b) ll gcd(ll a,ll b) {return b0?a:gcd(b,a%b); }扩展欧几里得算法&#xff1a; 如果a&#xff0c;b是整数&#xff0c;一定存在x和y使得axbygcd&#xff08;a&#xff0c…

P4173-残缺的字符串【FFT】

正题 题目链接:https://www.luogu.com.cn/problem/P4173 题目大意 给出两个字符串S,TS,TS,T&#xff0c;其中包含小写字母和一些???&#xff0c;???可以匹配任何字符。 求有多少个ppp使得T0∼∣t∣−1Sp∼p∣t∣−1T_{0\sim |t|-1}S_{p\sim p|t|-1}T0∼∣t∣−1​Sp∼…

转圈游戏(luogu 1965)

转圈游戏 luogu 1965 题目大意 求(xm10k)%n(x m\times 10^k)\%n(xm10k)%n 输入样例 10 3 45输出样例 5数据范围 1<n<10000000<m<n,1⩽x⩽n,0<k<1091<n<10000000<m<n,1\leqslant x\leqslant n,0<k<10^91<n<10000000<m<n…

.Net Core应用框架Util介绍(三)

上篇.Net Core应用框架Util介绍&#xff08;二&#xff09;介绍了Util的开发环境&#xff0c;并让你把Demo运行起来。本文将介绍该Demo的前端Angular运行机制以及目录结构。目录结构在VS上打开Util Demo&#xff0c;会看见如下的目录结构。现代前端通常采用VS Code开发&#xf…

【DP】字串距离(luogu 1279)

字串距离 luogu 1279 题目大意 给出两个字符串&#xff0c;让你加上若干空格&#xff0c;使其长度相同 对于第i位&#xff0c;如果都是字母那代价就是ASCII码的差值&#xff0c;如果一个是字母那就是k&#xff0c;如果没有一个是字母那就是0&#xff0c;让你求最小代价 输入…

hdu 1525 Euclid‘s Game

hdu 1525 文章目录Problem Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Problem Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtracts any positive multiple of the lesser of the two n…