10^9以上素数判定,Miller_Rabin算法
2024-08-29 12:09:38
#include<iostream>
#include<cstdio>
#include<ctime>
#include<string.h>
#include<stdlib.h>
#define LL long long
using namespace std; const int S=20;//随机算法判定次数,S越大,判错概率越小
LL ans;
//给定一个数,判断是否是素数(常用long long大数)
LL mult_mod(LL a,LL b,LL mod) //(a*b)%c a,b,c<2^63
{
a%=mod;
b%=mod;
LL ans=0;
while(b)
{
if(b&1)
{
ans=ans+a;
if(ans>=mod)
ans=ans-mod;
}
a=a<<1;
if(a>=mod) a=a-mod;
b=b>>1;
}
return ans;
} LL pow_mod(LL a,LL b,LL mod) // a^b%mod
{
LL ans=1;
a=a%mod;
while(b)
{
if(b&1)
{
ans=mult_mod(ans,a,mod);
}
a=mult_mod(a,a,mod);
b=b>>1;
}
return ans;
} //以a为基,n-1=x*2^t a^(n-1)=1(mod n) 验证n是不是合数
//一定是合数返回true,不一定返回false bool check(LL a,LL n,LL x,LL t)
{
LL ret=pow_mod(a,x,n);
LL last=ret;
for(int i=1;i<=t;i++)
{
ret=mult_mod(ret,ret,n);
if(ret==1 && last!=1 && last!=n-1) return true;//合数
last=ret;
}
if(ret!=1) return true;
else return false;
} // Miller_Rabin()算法素数判定
//是素数返回true.(可能是伪素数,但概率极小)
//合数返回false; bool Miller_Rabin(long long n)
{
if(n<2)return false;
if(n==2) return true;
if( (n&1)==0) return false;//偶数
LL x=n-1;
LL t=0;
while( (x&1)==0 ) { x>>=1;t++;}
for(int i=0;i<S;i++)
{
LL a=rand()%(n-1)+1;//rand()需要stdlib.h头文件
if(check(a,n,x,t))
return false;//合数
}
return true;
}
void find(long long n,int c)
{
if(n==1)
return ;
if(Miller_Rabin(n))
{
//m[n]++;
ans=min(ans,n);
return ;
}
long long p=n;
while(p>=n)
p=pollard_rho(p,c--);
find(p,c);
find(n/p,c);
}
int main(){
int a;
scanf("%d",&a);
while(a--)
{
long long x;
scanf("%lld",&x);
if(Miller_Rabin(x))cout<<"prime"<<endl;
else{
find(x,12312);
cout<<ans<<endl;
}
}
}
最新文章
- 安装SqlServer的时候性能计数器注册表配置单元一致性失败的解决办法
- Golang gopath
- HTML5 Wijmo:控制 Wijmo Grid 插件的编辑模式
- 浅谈CLR
- Listview实现不同类型的布局
- bzoj3405:[Usaco2009 Open]Grazing2 移动牛棚
- MTU of IPV4 and IPV6
- bzoj1430
- hive中left/right join on连接中and与where的使用问题
- 第一节,初识OpenCV3-图像的读、写、显、格式转化等
- react router @4 和 vue路由 详解(八)vue路由守卫
- mariadb semi plugin遇到的坑
- Eclipse插件安装常见方法
- 软件工程第二次作业(One who wants to wear the crown, Bears the crown.)
- Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解
- react-native react-navigation使用
- 定制UITabBar显示样式
- php 内存泄漏
- Nginx使用的php-fpm的两种进程管理方式及优化
- html中音频和视频
热门文章
- 比特币--私钥->;公钥->;钱包地址
- WebGL 踩坑系列-3
- POJ 3164——Command Network——————【最小树形图、固定根】
- 初次搭建spring boot 项目(实验楼-学习笔记)
- poj 3162 树DP+单调队列
- Spring课程 Spring入门篇 1-1Spring入门课程简介
- 【起航计划 026】2015 起航计划 Android APIDemo的魔鬼步伐 25 App->;Notification->;Status Bar 状态栏显示自定义的通知布局,省却声音、震动
- Linux读取NTFS类型数据盘
- 【js基础修炼之路】- 手把手教你实现bind
- express不是内部命令