题目描述

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 = ;
ll quickpow(ll m,ll n,ll k){
int b = ;
while (n > ){
if (n & )
b = (b*m)%k;
n = n >> ;
m = (m*m)%k;
}
return b;
} bool Miller_Rabin(){
int temp_n = n -;
j = ;
while(temp_n % == ){
++j;
temp_n /= ;
}
m = (n -) / ( << j);
int v = quickpow(b, m, n); if( == v){
flag = true;
return flag;
}
int i = ;
while(++i <= ){
if(v == n - ){
flag = true;
} else if(i == j){
flag = false;
return flag;
}
}
} bool witness(ll a,ll n){
ll t,d,x;
d=;
int i=ceil(log(n-1.0)/log(2.0)) - ;
for(;i>=;i--)//快速幂操作
{
x=d; d=(d*d)%n;
if(d== && x!= && x!=n-) return true;//二次探测法检测
if( ((n-) & (<<i)) > )
d=(d*a)%n;
}
return d==? false : true;
}
bool miller_rabin(ll n){
int s[]={,,};
if(n==) return true;
if(n== || ((n&)==)) return false;
for(int i=;i<;i++)
if(witness(s[i], n)) return false;
return true;
} int main(){
while(EOF != scanf("%d",&numCase)){
flag = false;
int count = ;
while(numCase--){
cin >> n;
if(miller_rabin(n)) ++count;
}
cout << count << endl;
}
return ;
}

HDU2138 随机素数测试 Miller-Rabin算法的更多相关文章

  1. 数学:随机素数测试(Miller_Rabin算法)和求整数素因子(Pollard_rho算法)

    POJ1811 给一个大数,判断是否是素数,如果不是素数,打印出它的最小质因数 随机素数测试(Miller_Rabin算法) 求整数素因子(Pollard_rho算法) 科技题 #include< ...

  2. Miller Rabin算法详解

    何为Miller Rabin算法 首先看一下度娘的解释(如果你懒得读直接跳过就可以反正也没啥乱用:joy:) Miller-Rabin算法是目前主流的基于概率的素数测试算法,在构建密码安全体系中占有重 ...

  3. 【数论基础】素数判定和Miller Rabin算法

    判断正整数p是否是素数 方法一 朴素的判定   

  4. Miller Rabin算法学习笔记

    定义: Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快. 定理: Miller ...

  5. Miller Rabin 算法简介

    0.1 一些闲话 最近一次更新是在2019年11月12日.之前的文章有很多问题:当我把我的代码交到LOJ上,发现只有60多分.我调了一个晚上,尝试用{2, 3, 5, 7, 11, 13, 17, 1 ...

  6. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

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

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

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

    1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先级高于乘除和取模,加减的优先级最低. 见到x^y/z这 ...

  9. 大素数测试的Miller-Rabin算法

    Miller-Rabin算法本质上是一种概率算法,存在误判的可能性,但是出错的概率非常小.出错的概率到底是多少,存在严格的理论推导. 一.费马小定理 假如p是质数,且gcd(a,p)=1,那么 a(p ...

随机推荐

  1. linux所有信息查询网址

  2. (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示

    原文 (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows She ...

  3. Laravel后台 + AngularJS前端 的网站构建与维护

    最近维护的报修网站,采用Laravel+AngularJS框架搭建,还有很多东西需要熟悉掌握,现将修复的Bug或添加的功能中值得记录的地方总结如下. 其中,需要注意的问题基本是原因不明且不是太严重的问 ...

  4. ORACLE 使用RMAN管理归档日志 archived log

    oracle 归档日志通常使用rman进行管理,作为备份集的一部分 正常情况下,可以根据方法删除 1 过期策略 crosscheck archivelog all; delete expired ar ...

  5. Swift语言iOS开发:CALayer十则示例

    如你所知,我们在iOS应用中看到的都是视图(view),包括按钮视图.表视图.滑动条视图,还有可以容纳其他视图的父视图等. AD:[活动]Web和APP兼容性实战 Win10训练营免费报名 如你所知, ...

  6. http动态调用webserive

    前言 传统方式调用WebService是直接引用服务,生成客户端代理类类,这种方式将ws进行了再次封装,并以代理的方式进行调用,这种方式的优点是简单,方便. 但是此种方式不足的地方是,当对方ws接口变 ...

  7. Android中的一些基础知识(一)

    翻译自这里,并做了部分修改. 什么是Android? Android是为移动设备提供的软件,它包括操作系统.中间件.和一些关键的应用程序.应用程序执行它自己的进程和在Dalvik虚拟机中的实例. An ...

  8. ThinkPHP - 组织分类结构

  9. Two Sum-n方优化与C++map的使用

    LeetCode第一题,刚拿到题目时虽然明知道n方的遍历算法会超时,但还是不信邪的提交了一次,然而编程不存在运气,TLE不可避免.但是之后的思维方式比较直接,我并没有立刻想到O(n)的方法,想了一种先 ...

  10. Nginx中location配置[转]

    关于一些对location认识的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我 ...