博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板 素数判定,求合数因子
阅读量:4544 次
发布时间:2019-06-08

本文共 1639 字,大约阅读时间需要 5 分钟。

#include 
#include
#include
#include
#include
using namespace std;typedef long long int64;int64 gcd(int64 a,int64 b){ return b==0?a:gcd(b,a%b);}int64 mult_mod(int64 a,int64 b,int64 c)//计算a*b%c{ int64 ret=0; int64 tmp=a; a%=c,b%=c;//保证a,b小于c,节约计算时间。 while(b) { if(b&1) { ret+=tmp; if(ret>c) ret-=c; } tmp<<=1; if(tmp>c)tmp-=c; b>>=1; } return ret;}int64 pow_mod(int64 a,int64 n,int64 mod)//计算a^n%mod{ int64 ret = 1; int64 tmp = a%mod; while(n) { if(n & 1)ret = mult_mod(ret,tmp,mod); tmp = mult_mod(tmp,tmp,mod); n >>= 1; } return ret;}bool check(int64 a,int64 n,int64 x,int64 t)//判断是不是合数{ int64 ret = pow_mod(a,x,n); int64 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;}bool Miller_Rabin(long long n,int k)//米勒罗宾(判断是不是素数){ if( n < 2)return false; if( n == 2)return true; if( (n&1) == 0)return false;//偶数 long long x = n - 1; long long t = 0; while( (x&1)==0 ){x >>= 1; t++;} srand(time(NULL)); for(int i=0;i
=n) p=pollard_rho(p,c--);//值变化,防止死循环k findfac(p,k); findfac(n/p,k);}int main(){ int T; scanf("%d",&T); int64 ans,n; while(T--) { scanf("%I64d",&n); if(Miller_Rabin(n,5)) printf("Prime\n"); else { tot=0; findfac(n,107); ans=0xfffffff; for(int i=0;i

转载于:https://www.cnblogs.com/ghh1995/p/4349011.html

你可能感兴趣的文章
c语言诊断_断言库函数#include<assert.h>
查看>>
input type="file"获取文件名方法
查看>>
强力上攻后,缓解期结束,MACD死叉的案例
查看>>
Linux文件权限
查看>>
js替换字符串中特殊字符
查看>>
第一单元OO总结
查看>>
让 Windows7 - 64bit 支持 VC++ 6.0 的解决方法(无法启动此程序,因为计算机中丢失 MSVCRTD.dll。尝试重新安装该程序以解决此问题)...
查看>>
SSH 整合及注意事项
查看>>
带分页的sql语句
查看>>
CS231n Solver.py 详解
查看>>
OC内存管理
查看>>
使用FMDB事务批量更新数据库
查看>>
Android Fragment 真正的完全解析(上)
查看>>
C++面试宝典2011版
查看>>
Android学习笔记——ProgressBar
查看>>
Flume的监控参数
查看>>
第三天记录
查看>>
Centos下关于ssh、scp与rsync设置与应用
查看>>
排列组合+组合数取模 HDU 5894
查看>>
WCF(一) 创建第一个WCF
查看>>