题目描述

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算法相关推荐

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

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

  2. 与数论的厮守01:素数的测试——Miller Rabin

    看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...

  3. Miller Rabin算法:大质数判断

    问题概述:判断一个数n是不是质数(n<=10^18) 输入样例:                              对应输出: 7                             ...

  4. HDU 6608 Fansblog(随机素数测试+思维)

    传送门 不得不说这种倒着除回去的想法真的是太绝了. 至于大数的素性测试,也是板子,没什么好说的. #include<bits/stdc++.h> #define int long long ...

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

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

  6. 素数判定算法 MILLER RABIN

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

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

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

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

  9. 0049算法笔记——【随机化算法】蒙特卡罗算法,主元素问题,素数测试问题

    1.蒙特卡罗算法 基本概述        蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法.传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地 ...

最新文章

  1. 收藏 | 机器学习数据集汇总收集
  2. 英特尔因代言人再起风波企业网络推广之下遭抵制的Evo平台谁来背锅?
  3. 微信小程序富文本解析点击图片放大_微信小程序解析富文本过程详解
  4. scrapy基础知识之制作 Scrapy 爬虫 一共需要4步:
  5. Angular rxjs里自定义operator的使用
  6. php如何加网址链接,怎么给一个PHP密码访问页面加超链接
  7. 多学一招总没错吧?MP通用枚举轻松实现存储显示相分离
  8. Android快速开发框架XUtils
  9. 怎样将树的中序遍历的数输入到一个数组中_数据结构与算法-二叉查找树平衡(DSW)...
  10. MySQL 5.6 关于登陆的初始化设置
  11. java覆盖写入_java写入文件(覆盖和续写)
  12. 20181225股市复盘
  13. Vue面试题你知道多少
  14. vmware_无法连接虚拟机vmx提前退出
  15. 2019最新Java实战开发今日头条资讯网站
  16. Adobe 安装程序无法初始化,请下载Adobe Support Advisor检测该问题
  17. Python函数部分2
  18. 9.1 了解导航窗格
  19. python 实现输入一段英文,找出其中出现次数最多的单词,打印出出现最多的单词和次数
  20. Qt编译通过,运行时出现the process was ended forcefully问题的解决方案

热门文章

  1. android 发送短信 广播 demo,向Android模拟器打电话发短信的简单方法
  2. java单例模式的七种写法_Java设计模式之单例模式的七种写法
  3. slf4j的简单用法以及与log4j的区别
  4. swoole之代码热更新实现
  5. 前端学习(3315):UI提取
  6. Taro+react开发(30)引入静态资源地址
  7. [jQuery] 谈一下Jquery中的bind(),live(),delegate(),on()的区别?
  8. 前端学习(2894):列表组件的拆分和样式编写
  9. [vue] 你有自己用vue写过UI组件库吗?
  10. [css] 你用过outline属性吗?它有什么运用场景