HDU2138(Miller-Rabin素数检测)
最近在看RSA,找到一个一个大素数是好多加密算法的关键一步,而大素数无法直接构造,一般情况下都是生成一个随机数然后判断是不是素数。判断是否是素数的方法有好多,有的能够准确判断,比如可以直接因式分解(RSA的安全性就基于这是困难的),速度稍微快一点的对素数又有特殊要求,而Miller-Rabin素数检测法可以在一定概率上认为一个数是素数,以极小概率的错误换取时间。Miller-Rabin算法基于一个数如果是素数就满足费马小定理,即a^(n-1) ≡1(mod n),而如果满足此现象却不是素数就成为基于a的伪素数(Carmichael)数,Carmichael数是非常少的。在1~100000000范围内的整数中,只有255个Carmichael数。Miller-Rabin使用多个随机生成的a进行检测就可以将错误率降低到相当低,并且在每次计算模取幂时如果发现对模n来说1的非平凡平方根,就可以提前判断n为素数了。
#include <stdio.h>
#include <stdlib.h>
#include <math.h> #define S 50 int miller_rabin(int n,int s);
bool witness(long long base,long long n); int main()
{
int m;
while(scanf("%d",&m) != EOF){
int n,cnt = ; for(int i = ;i < m;i++){
scanf("%d",&n); if(n % == ){
cnt += (n == );
}
else{
cnt += miller_rabin(n,S);
}
} printf("%d\n",cnt);
} return ;
} int miller_rabin(int n,int s)
{
for(int i = ;i < s && i < n;i++){
long long base = rand() % (n - ) + ; if(witness(base,n)){
return ;
}
} return ;
} bool witness(long long base,long long n)
{
int len = ceil(log(n - 1.0) / log(2.0)) - ;
long long x0 = ,x1 = ; for(int i = len;i >= ;i--){
x0 = x1;
x1 = (x1 * x1) % n; if(x1 == && x0 != && x0 != n - ){
return true;
}
if(((n - ) & ( << i)) > ){
x1 = (x1 * base) % n;
}
}
return x1 != ;
} //10902607 2014-06-23 23:34:23 Accepted 2138 125MS 228K 946 B G++ 超级旅行者
HDU2138(Miller-Rabin素数检测)的更多相关文章
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- Miller Rabin素数检测
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #inclu ...
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- POJ2429_GCD & LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...
- POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- HDU1164_Eddy's research I【Miller Rabin素数测试】【Pollar Rho整数分解】
Eddy's research I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)
关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是 ...
- 与数论的厮守01:素数的测试——Miller Rabin
看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...
- 【数论基础】素数判定和Miller Rabin算法
判断正整数p是否是素数 方法一 朴素的判定
随机推荐
- h5 ios键盘卡死页面
失去焦点以后重新设置页面顶部位置 $('input,textarea').on('blur',function(){ window.scroll(0,0); }); $('select').on('c ...
- Vue-admin工作整理(十九):从数字渐变组件谈第三方JS库Count-to的使用
1.组件封装基础 npm install countup@latest 2.组件中使用id值 3.组件中获得dom 如何封装一个组件,在组件中用到需要传入HTML元素ID值的JS库时如何处理,如何获取 ...
- 提供HTML5播放RTSP流 提供微信播放RTSP流 HTML5支持rtsp web播放rtsp,微信支持rtsp
首先H5的video不支持RTSP播放,以下是html5的video官方介绍 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(O ...
- 日常安装chocolatey报错此系统上禁止运行脚本
查看计算机上的现用执行策略get-executionpolicy ( 默认:Restricted ) 若要在本地计算机上运行您编写的未签名脚本和来自其他用户的签名脚本,使用以下命令将计算机上的 执行 ...
- CSS之不常用但重要的样式总结
1,设置颜色渐变 background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.67), rgba(255, 255, 255, 0));( ...
- 内网环境使用ansible安装software 需要外网时,如何绑定代理呢
内网环境使用ansible安装software 需要外网时,如何绑定代理呢? 方法一: 在ansible 的脚本里,yum install 的地方,添加语句: environment: https_p ...
- 添加“Git Bash Here”到右键菜单
1.按键盘上的组合键[Win+R]把运行调出来 2.在运行中输入[regedit]再点击确定. 3.定位到HKEY_CLASSES_ROOT\Directory\Background\shell(如果 ...
- spring boot2 kafka
一.软件版本 1.linux:centos6 2.zookeeper:zookeeper-3.4.1 3.kafka:kafka_2.12-2.2.0 4.jdk:1.8 5.instelliJ Id ...
- Vue route的使用
1.route.js文件 import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) const router = ne ...
- 关于node
nodejs npm常用命令 npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. ...