当前位置:网站首页>Miller_Rabin 米勒拉宾概率筛【模板】
Miller_Rabin 米勒拉宾概率筛【模板】
2022-07-31 13:28:00 【秦小咩】
Miller_Rabin筛法是一种正确率极高,复杂度优秀的概率筛法,将质数分为2和奇质数,对于奇质数n,将n-1其分解为 2^p + m ,然后,取若干[1,n-1]的随机数a,本模板取了20次,每次判断是否有
a^m 三 1(mod n) 或者 是否有 [0,p-1]的j,满足 a^(2jm) 三 n-1 (mod n)
满足二者之一表示本次判断成功,20次中有一次失败就表明不是素数,20次都成功,那么可以说是一个素数。
验证正确性如下,取2-1e6全部数字,进行正确性判断,正确个数1e6-1,全部正确
甚至可以将判断次数缩小至5,也能保证完全正确
# include<iostream>
# include<iomanip>
# include<math.h>
using namespace std;
typedef long long int ll;
ll random(ll n) //生成[0,n]范围内随机数
{
return rand()%(n-1);
}
ll quick_mul(ll a, ll b, ll mod)
{
ll ans=0;
while(b)
{
if(b&1)
ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans;
}
ll quick_pow(ll base,ll pow, ll mod)
{
ll ans=1;
while(pow)
{
if(pow&1)
ans=ans*base%mod;
pow>>=1;
base=base*base%mod;
}
return ans;
}
bool witness(ll a, ll n)
{
ll temp=n-1;
int j=0;
while(temp%2==0)
{
temp/=2;
j++;
}
ll x=quick_pow(a,temp,n);
if(x==1||x==n-1)
return 1;
while(j--)
{
x=quick_mul(x,x,n);
if(x==n-1)
return 1;
}
return 0;
}
bool miller_rabin(ll n)
{
if(n==2)
return 1;
if(n<2||n%2==0)
return 0;
for(int i=1; i<=20; i++)
{
ll a=random(n)+1;
// cout<<a<<endl;
if(!witness(a,n))
return 0;
}
return 1;
}
int prime[1000000+10];
bool not_prime[1000000+10];
int tot;
void init()
{
for(int i=2; i<=1000000; i++)
{
if(!not_prime[i])
{
tot++;
prime[tot]=i;
}
for(int j=1; j<=tot&&prime[j]*i<=1000000; j++)
{
not_prime[i*prime[j]]=1;
if(i%prime[j]==0)
{
break;
}
}
}
}
int main ()
{
init();
ll n;
int cnt=0;
for(n=2;n<=1000000;n++)
{
if(miller_rabin(n)!=(!not_prime[n]))
{
cout<<"***";
}
else
cnt++;
}
cout<<cnt<<endl;
return 0;
}
边栏推荐
- C# control ListView usage
- ECCV2022: Recursion on Transformer without adding parameters and less computation!
- Spark Learning: Add Custom Optimization Rules for Spark Sql
- C#控件 ToolStripProgressBar 用法
- SAP e-commerce cloud Spartacus SSR Optimization Engine execution sequence of several timeouts
- CLion用于STM32开发
- 基于改进YOLOv5的轻量化航空目标检测方法
- TensorRT安装及使用教程「建议收藏」
- 20.nn.Module
- CodeIgniter 打开错误日志
猜你喜欢
随机推荐
百度网盘安装在c盘显示系统权限限制的解决方法
IDEA如何运行web程序
SAP 电商云 Spartacus UI 和 Accelerator UI 里的 ASM 模块
ADS与C#通信
Invalid bound statement (not found)出现的原因和解决方法
EXCEL如何快速拆分合并单元格数据
最新完整代码:使用word2vec预训练模型进行增量训练(两种保存方式对应的两种加载方式)适用gensim各种版本
C# control StatusStrip use
P5019 [NOIP2018 提高组] 铺设道路
ECCV2022: Recursion on Transformer without adding parameters and less computation!
六石编程学:不论是哪个功能,你觉得再没用,会用的人都离不了,所以至少要做到99%
Centos7 install mysql5.7
How IDEA runs web programs
0X7FFFFFFF,0X80000000「建议收藏」
MATLAB | 我也做了一套绘图配色可视化模板
golang-gin-优雅重启
查看Mysql数据库版本
How to quickly split and merge cell data in Excel
技能大赛训练题:交换机虚拟化练习
numpy矩阵和向量的保存与加载,以及使用保存的向量进行相似度计算