FZU 1649 Prime number or not (Miller-Rabin素数测试)
#include
using namespace std;//return a * b % m
unsigned long long quick_add_mod(unsigned long long a, unsigned long long b, unsigned long long m){//为了防止long long型a * b溢出,有时需要把乘法变加法//且因为暴力加法会超时要使用二分快速乘法模(模仿二分快速幂模……)unsigned long long res = 0, tmp = a % m;while(b){if (b & 1){res = res + tmp;res = (res >= m ? res - m : res);}b >>= 1;tmp <<= 1;tmp = (tmp >= m ? tmp - m : tmp);}return res;
}//return a ^ b % m
long long exp_mod(long long a, long long b, long long m){long long res = 1 % m, tmp = a % m;while(b){if (b & 1){//如果m在int范围内直接用下一式乘就可以,否则需要用下二式把乘法化加法,用快速乘法模//res = (res * t) % m;res = quick_add_mod(res, tmp, m);}//同上//t = t * t % m;tmp = quick_add_mod(tmp, tmp, m);b >>= 1;}return res;
}//Miller_Rabin素数测试, 素数return true.
bool Miller_Rabin(long long n){int a[5] = {2, 3, 7, 61, 24251};//一般Miller_Rabin素数测试是随机选择100个a,这样的错误率为0.25^100//但在OI&&ACM中,可以使用上面一组a,在这组底数下,10^16内唯一的强伪素数为46,856,248,255,981if (n == 2)return true;if (n == 1 || (n & 1) == 0)return false;long long b = n - 1;for (int i = 0; i < 5; i ++){if (a[i] >= n)break;while((b & 1) == 0) b >>= 1;long long t = exp_mod(a[i], b, n);while(b != n - 1 && t != 1 && t != n-1){t = quick_add_mod(t, t, n);b <<= 1;}if (t == n - 1 || b & 1)continue;elsereturn false;}return true;
}int main(){long long n;while(cin >> n){if (Miller_Rabin(n))cout << "It is a prime number.\n";elsecout << "It is not a prime number.\n";}return 0;
}
转载于:https://www.cnblogs.com/AbandonZHANG/archive/2013/01/18/4114199.html
FZU 1649 Prime number or not (Miller-Rabin素数测试)相关推荐
- FZU 1649 Prime number or not (大素数测试)
题目链接 Problem 1649 Prime number or not Accept: 661 Submit: 3016 Time Limit: 2000 mSec Memory Li ...
- Magic的Miller Rabin素数测定和Pollard's Rho质因子分解法
boshi大佬帮助了litble,使愚蠢的litble(可能?)学会了这种神奇的算法. orz boshi. 例题:poj1811 Miller Rabin 又称米勒挝饼, 一种神奇的快速判定一个数是 ...
- GCD and LCM Aizu - 0005(辗转相除)+GCD LCM Inverse POJ - 2429(java或【Miller Rabin素数測试】+【Pollar Rho整数分解】)
题目:GCD and LCM Aizu - 0005 Write a program which computes the greatest common divisor (GCD) and the ...
- 素数判定算法 MILLER RABIN
入门级筛素数--试除法,复杂度O(n^2) bool rmprime( long long n ) {for(long long i = 2; i <= sqrt(n) ; i++) if(n% ...
- (Miller Rabin算法)判断一个数是否为素数
(Miller Rabin算法)判断一个数是否为素数 1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先 ...
- 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)
太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...
- Leetcode PHP题解--D57 762. Prime Number of Set Bits in Binary Representation
2019独角兽企业重金招聘Python工程师标准>>> D57 762. Prime Number of Set Bits in Binary Representation 题目链接 ...
- C++Miller Rabin算法的实现(附完整源码)
C++Miller Rabin算法的实现算法 C++Miller Rabin算法的实现算法完整源码(定义,实现,main函数测试) C++Miller Rabin算法的实现算法完整源码(定义,实现,m ...
- Prime Number Aizu - 0009(素数筛)
题意: 给一个数n,问1~n内有多少个素数 题目: Write a program which reads an integer n and prints the number of prime nu ...
最新文章
- 根据sql生成相应字段
- 项目管理流程有哪些?如何才能让项目管理更有效?
- vmware vsphere 虚拟化之安装esxi
- 观百工堰竹筏竞技比赛有感
- iOS开发——你真的会用SDWebImage?
- android系统的手机目录
- 重庆一银行发生火灾 浓烟直往外窜
- python中def _init_是什么意思_详细解读Python中的__init__()方法
- r语言 图形一览_R语言统计与绘图:ggplot2图形组合布局
- 【转载】Linux下有趣的命令
- Kubernetes共享使用Ceph存储
- vue取url路径传参_vue不通过路由直接获取url中参数的方法示例
- Redmi K50标准版工信部入网:搭载骁龙870 没有12GB内存
- 有哪些关于iPhone使用的小技巧?
- 2017百度之星资格赛:1002. 度度熊的王国战略
- Soap+xml实现webservice 调用
- m序列产生原理及其性质
- AcWing 790 数的三次方根
- A. Harry Klopf是谁?
- 将旧硬盘的内容克隆到新硬盘
热门文章
- Xilinx SelectIO 接口
- python计算输入的两个数字,try...except...判断是否输入的是数字,如果是则相加
- 从源码分析DEARGUI之add_tree_node
- Kubernetes搭建Zookeeper和Kafka集群
- [case19]聊聊eureka的TaskDispatcher
- 1001. [BJOI2006]狼抓兔子【最小割】
- 自动化学习的正确姿势
- 开源 java CMS - FreeCMS2.7 移动端首页静态化
- Outlook for Mac v15.36(170606)发布:新增收藏夹功能
- Java I/O演进与Linux网络I/O模型