HDU2138 随机素数测试 Miller-Rabin算法
题目描述
Give you a lot of positive integers, just to find out how many prime numbers there are..
In each case, there is an integer N representing the number of integers to find. Each integer won’t exceed 32-bit signed integer, and each of them won’t be less than 2.
32-bit signed intege,最普通的肯定要超时,筛选法要超内存,开小的话就越界。
miller_rabin算法
一.费马小定里
if n is prime and gcd(a,n) equals one ,then a^(n-1) = 1 (mod n)
费马小定理只是个必要条件,符合费马小定理而非素数的数叫做Carmichael.
前3个Carmichael数是561,1105,1729。
Carmichael数是非常少的。
在1~100000000范围内的整数中,只有255个Carmichael数。
为此又有二次探测定理,以确保该数为素数:
二.二次探测定理
二次探测定理 如果p是一个素数,0<x<p,则方程x^2≡1(mod p)的解为x=1,p-1
根据以上两个定理,如到Miller-Rabin算法的一般步骤:
0、先计算出m、j,使得n-1=m*2^j,其中m是正奇数,j是非负整数
1、随机取一个b,2<=b
2、计算v=b^m mod n
3、如果v==1,通过测试,返回
4、令i=1
5、如果v=n-1,通过测试,返回
6、如果i==j,非素数,结束
7、v=v^2 mod n,i=i+1
8、循环到5
说明:
Miller-Rabin是随机算法
得到的结果的正确率为75%,所以应该多次调用该函数,使正确概率提高为1-(1/4)^s
解云鹏你懂了吗?
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> #include <algorithm>#define ll long long using namespace std; const int INF = 0x3f3f3f3f; int i, j, k; ll m, b; int numCase; ll n; bool flag; int S = 5; ll quickpow(ll m,ll n,ll k){int b = 1;while (n > 0){if (n & 1)b = (b*m)%k;n = n >> 1 ;m = (m*m)%k;}return b; }bool Miller_Rabin(){int temp_n = n -1;j = 0;while(temp_n % 2 == 0){++j;temp_n /= 2;}m = (n -1) / (1 << j);int v = quickpow(b, m, n);if(1 == v){flag = true;return flag;}int i = 0;while(++i <= 5){if(v == n - 1){flag = true;} else if(i == j){flag = false;return flag;}} }bool witness(ll a,ll n){ll t,d,x;d=1;int i=ceil(log(n-1.0)/log(2.0)) - 1;for(;i>=0;i--)//快速幂操作{x=d; d=(d*d)%n;if(d==1 && x!=1 && x!=n-1) return true;//二次探测法检测if( ((n-1) & (1<<i)) > 0)d=(d*a)%n;}return d==1? false : true; } bool miller_rabin(ll n){int s[]={2,7,61};if(n==2) return true;if(n==1 || ((n&1)==0)) return false;for(int i=0;i<3;i++)if(witness(s[i], n)) return false;return true; }int main(){while(EOF != scanf("%d",&numCase)){flag = false;int count = 0;while(numCase--){cin >> n;if(miller_rabin(n)) ++count;}cout << count << endl;}return 0; }
转载于:https://www.cnblogs.com/wushuaiyi/p/3879149.html
HDU2138 随机素数测试 Miller-Rabin算法相关推荐
- (Miller Rabin算法)判断一个数是否为素数
(Miller Rabin算法)判断一个数是否为素数 1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先 ...
- 与数论的厮守01:素数的测试——Miller Rabin
看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...
- Miller Rabin算法:大质数判断
问题概述:判断一个数n是不是质数(n<=10^18) 输入样例: 对应输出: 7 ...
- HDU 6608 Fansblog(随机素数测试+思维)
传送门 不得不说这种倒着除回去的想法真的是太绝了. 至于大数的素性测试,也是板子,没什么好说的. #include<bits/stdc++.h> #define int long long ...
- 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)
太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...
- 素数判定算法 MILLER RABIN
入门级筛素数--试除法,复杂度O(n^2) bool rmprime( long long n ) {for(long long i = 2; i <= sqrt(n) ; i++) if(n% ...
- Magic的Miller Rabin素数测定和Pollard's Rho质因子分解法
boshi大佬帮助了litble,使愚蠢的litble(可能?)学会了这种神奇的算法. orz boshi. 例题:poj1811 Miller Rabin 又称米勒挝饼, 一种神奇的快速判定一个数是 ...
- BZOJ 4802: 欧拉函数(大数因数分解算法 Pollard_rho 和素数测试算法 Miller_Rabin)
Description 已知N,求phi(N) Input 正整数N.N<=10^18 Output 输出phi(N) Sample Input 8 Sample Output 4 Soluti ...
- 0049算法笔记——【随机化算法】蒙特卡罗算法,主元素问题,素数测试问题
1.蒙特卡罗算法 基本概述 蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法.传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地 ...
最新文章
- 收藏 | 机器学习数据集汇总收集
- 英特尔因代言人再起风波企业网络推广之下遭抵制的Evo平台谁来背锅?
- 微信小程序富文本解析点击图片放大_微信小程序解析富文本过程详解
- scrapy基础知识之制作 Scrapy 爬虫 一共需要4步:
- Angular rxjs里自定义operator的使用
- php如何加网址链接,怎么给一个PHP密码访问页面加超链接
- 多学一招总没错吧?MP通用枚举轻松实现存储显示相分离
- Android快速开发框架XUtils
- 怎样将树的中序遍历的数输入到一个数组中_数据结构与算法-二叉查找树平衡(DSW)...
- MySQL 5.6 关于登陆的初始化设置
- java覆盖写入_java写入文件(覆盖和续写)
- 20181225股市复盘
- Vue面试题你知道多少
- vmware_无法连接虚拟机vmx提前退出
- 2019最新Java实战开发今日头条资讯网站
- Adobe 安装程序无法初始化,请下载Adobe Support Advisor检测该问题
- Python函数部分2
- 9.1 了解导航窗格
- python 实现输入一段英文,找出其中出现次数最多的单词,打印出出现最多的单词和次数
- Qt编译通过,运行时出现the process was ended forcefully问题的解决方案
热门文章
- android 发送短信 广播 demo,向Android模拟器打电话发短信的简单方法
- java单例模式的七种写法_Java设计模式之单例模式的七种写法
- slf4j的简单用法以及与log4j的区别
- swoole之代码热更新实现
- 前端学习(3315):UI提取
- Taro+react开发(30)引入静态资源地址
- [jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别?
- 前端学习(2894):列表组件的拆分和样式编写
- [vue] 你有自己用vue写过UI组件库吗?
- [css] 你用过outline属性吗?它有什么运用场景