正题

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


题目大意

给出一个数\(p\),让你判定是否为质数。


解题思路

\(Miller-Rabin\)是一种基于费马小定理和二次探测定理的具有较高正确性的高效质数判定算法。

首先讲一下两个定理

  1. 费马小定理:$$gcd(a,p)=1\ \ \ \Rightarrow\ \ \ a^{p-1}=1(mod\ p)$$
  2. 二次探测定理:若\(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");
}
}

最新文章

  1. Windows10的革命之路-全新UWP开发平台
  2. android两种基本联网方式与一种第三方开源项目的使用
  3. 学习记录 java session保存用户登录
  4. SpringMVC接收页面表单参数(转)
  5. 怎么实现类似星星闪烁的效果(box-shadow)
  6. cocos2d-x protobuf; cocos2dx protocol buffer
  7. 能自学成为WEB前端工程师吗?
  8. 12. ZooKeeper配额和认证
  9. 多线程里面的关键字,wait, notfiy, 锁(synchronized), lock接口
  10. 基于 HTML5 OpenLayers3 实现 GIS 电信资源管理系统
  11. day正则表达式补充
  12. 总结web自动化测试页面常用字段的定位方法
  13. 【SQL】SQL整表复制
  14. 逆袭之旅DAY13.东软实训.Oracle.简单的查询语句.限制.排序
  15. YQCB冲刺第二周第五天
  16. 6、SpringMVC源码分析(1):分析DispatcherServlet.doDispatch方法,了解总体流程
  17. SQL Server -&gt;&gt; 使用CROSS APPLY语句是遇到聚合函数中包含外部引用列时报错
  18. VarPtr 得到地址 指针
  19. Mac里用终端ssh远程连接Centos服务器
  20. 75.[LeetCode] Sort Colors

热门文章

  1. uwp 之资源的访问
  2. webpack4学习之 babel
  3. ES6基础之let、const
  4. 高德地图&amp;兴趣点(poi)
  5. python常用工具库介绍
  6. MySQL双主+Keepalived高可用
  7. Qt5创建模态和非模态对话框
  8. Selenium4 IDE初体验
  9. Jenkins拉取Git远程仓库中指定目录至本地指定目录
  10. springMVC学习总结(二) --springMVC表单处理、标签库、静态文件处理