题目链接:http://acm.fzu.edu.cn/problem.php?pid=1649 题目大意:很直接,判断一个数n(2<=n<=10^18)是不是素数.   当n达到long long的范围或者更大时,那么先筛好素数或者枚举1~sqrt(n)判断都行不通了,这时便要使用著名的素数测试算法---Miller_Rabin素数测试. 关于算法的学习Matrix67有一篇博客(“数论部分第一节:素数与素数测试”)讲的不错. 而且Miller-Rabin测试还要用到快速幂模计算a ^ b % c的知识,Here有介绍. 但是在Miller-Rabin测试中,判断的素数一般会达到64位,所以需要优化的(速度、不会long long溢出)快速幂模算法.也就是FZU 1752. 当模数也超过long long时,t * t乘法就会有溢出的危险,所以我们就要类似快速幂模设计一个基于加法的快速乘法模求a * b % m. 而且FZU 1752这道题的数据之强已经说明了非递归形式的速度要由于递归形式.   综合起来就是我们最后的 Miller-Rabin素数测试 or 计算a ^ b % c (a,b,c <= 10^18)的模版:


#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素数测试)相关推荐

  1. FZU 1649 Prime number or not (大素数测试)

    题目链接 Problem 1649 Prime number or not Accept: 661    Submit: 3016 Time Limit: 2000 mSec    Memory Li ...

  2. Magic的Miller Rabin素数测定和Pollard's Rho质因子分解法

    boshi大佬帮助了litble,使愚蠢的litble(可能?)学会了这种神奇的算法. orz boshi. 例题:poj1811 Miller Rabin 又称米勒挝饼, 一种神奇的快速判定一个数是 ...

  3. 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 ...

  4. 素数判定算法 MILLER RABIN

    入门级筛素数--试除法,复杂度O(n^2) bool rmprime( long long n ) {for(long long i = 2; i <= sqrt(n) ; i++) if(n% ...

  5. (Miller Rabin算法)判断一个数是否为素数

    (Miller Rabin算法)判断一个数是否为素数 1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先 ...

  6. 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)

    太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...

  7. Leetcode PHP题解--D57 762. Prime Number of Set Bits in Binary Representation

    2019独角兽企业重金招聘Python工程师标准>>> D57 762. Prime Number of Set Bits in Binary Representation 题目链接 ...

  8. C++Miller Rabin算法的实现(附完整源码)

    C++Miller Rabin算法的实现算法 C++Miller Rabin算法的实现算法完整源码(定义,实现,main函数测试) C++Miller Rabin算法的实现算法完整源码(定义,实现,m ...

  9. Prime Number Aizu - 0009(素数筛)

    题意: 给一个数n,问1~n内有多少个素数 题目: Write a program which reads an integer n and prints the number of prime nu ...

最新文章

  1. 根据sql生成相应字段
  2. 项目管理流程有哪些?如何才能让项目管理更有效?
  3. vmware vsphere 虚拟化之安装esxi
  4. 观百工堰竹筏竞技比赛有感
  5. iOS开发——你真的会用SDWebImage?
  6. android系统的手机目录
  7. 重庆一银行发生火灾 浓烟直往外窜
  8. python中def _init_是什么意思_详细解读Python中的__init__()方法
  9. r语言 图形一览_R语言统计与绘图:ggplot2图形组合布局
  10. 【转载】Linux下有趣的命令
  11. Kubernetes共享使用Ceph存储
  12. vue取url路径传参_vue不通过路由直接获取url中参数的方法示例
  13. Redmi K50标准版工信部入网:搭载骁龙870 没有12GB内存
  14. 有哪些关于iPhone使用的小技巧?
  15. 2017百度之星资格赛:1002. 度度熊的王国战略
  16. Soap+xml实现webservice 调用
  17. m序列产生原理及其性质
  18. AcWing 790 数的三次方根
  19. A. Harry Klopf是谁?
  20. 将旧硬盘的内容克隆到新硬盘

热门文章

  1. Xilinx SelectIO 接口
  2. python计算输入的两个数字,try...except...判断是否输入的是数字,如果是则相加
  3. 从源码分析DEARGUI之add_tree_node
  4. Kubernetes搭建Zookeeper和Kafka集群
  5. [case19]聊聊eureka的TaskDispatcher
  6. 1001. [BJOI2006]狼抓兔子【最小割】
  7. 自动化学习的正确姿势
  8. 开源 java CMS - FreeCMS2.7 移动端首页静态化
  9. Outlook for Mac v15.36(170606)发布:新增收藏夹功能
  10. Java I/O演进与Linux网络I/O模型