Miller-Robin 素数测试法 模板
测试单个素数,出错概率比计算机本身出错的概率还要低
算法是基于费马小定理(format),二次探测定理(x*x % p == 1 ,若P为素数,则x的解只能是x = 1或者x = p - 1)加上迭代乘法判断的Miller算法共同构成的
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <iostream>
#include <string> using namespace std; int N; int witness(int a, int n)//随机生成的a,来检测n的素性
{
int ans = ;
int t = n - ;//这里需要注意,你如果没有改变乘方的次数的话,最后的判断就是(ans == a) ? 0 : 1;
// 并且还要另外开辟空间来存储开始的a,比较麻烦,所以就这样了;
int x;
while (t)
{
if (t & )
{
ans = (long long int)ans * a % n;
}
x = a;//从这里开始就是迭代乘法,验证二次验证定理
a = (long long int)a * a % n;//这里就相当于 x*x % m = 1
if (a == && x != && x != (n - ))
{
return ; // 这里需要注意,返回一的话就说明,追踪过程中,出现了不是素数的依据.
}
t >>= ;
}
return (ans == ) ? : ;
} int MillerRobin(int n, int s) // 一般s取50就可以避免所有的偶然性了.
{
if (n == )
{
return ;
}
if (n < || !(n & ))
{
return ;
}
int a;
for (int i = ; i < s; i++)
{
a = (long long int )rand() * (n - ) / RAND_MAX + ; //这样生成的随机数就是真正的随机数了
if (witness(a, n))
{
return ;
}
}
return ;
} int main()
{
while (scanf("%d", &N) != EOF)
{
if (N == )
{
break;
}
if (MillerRobin(N, ))
{
printf("%d is a prime!\n", N);
}
else
{
printf("%d is not a prime!\n", N);
}
}
return ;
}
参考:https://blog.csdn.net/aledavvv/article/details/8929416
Miller-Robin 素数测试法 模板的更多相关文章
- 【数论】Prime Time UVA - 10200 大素数 Miller Robin 模板
		题意:验证1~10000 的数 n^n+n+41 中素数的个数.每个询问给出a,b 求区间[a,b]中质数出现的比例,保留两位 题解:质数会爆到1e8 所以用miller robin , 另外一个优 ... 
- Miller Robin大素数判定
		Miller Robin算法 当要判断的数过大,以至于根n的算法不可行时,可以采用这种方法来判定素数. 用于判断大于2的奇数(2和偶数需要手动判断),是概率意义上的判定,因此需要做多次来减少出错概率. ... 
- Miller Rabin素数检测与Pollard Rho算法
		一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ... 
- 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 ... 
- hdu 5901 Count primes 素数计数模板
		转自:http://blog.csdn.net/chaiwenjun000/article/details/52589457 计从1到n的素数个数 两个模板 时间复杂度O(n^(3/4)) #incl ... 
- POJ2689 Prime Distance(数论:素数筛选模板)
		题目链接:传送门 题目: Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: Accepted: Des ... 
随机推荐
- Spring、SpringMVC注解方式整合
			1 原理 Web容器在启动的时候,会扫描每个jar包下的META-INF/services/javax.servlet.ServletContainerInitializer文件. 加载META-IN ... 
- vue打包多页报错webpackJsonp is not defined
			找到build→webpack.prod.conf.js→找到HtmlWebpackPlugin插件,添加如下配置即可 chunks: ['manifest', 'vendor', 'app'] 
- python类库32[序列化和反序列化之pickle]
			一 pickle pickle模块用来实现python对象的序列化和反序列化.通常地pickle将python对象序列化为二进制流或文件. python对象与文件之间的序列化和反序列化: pi ... 
- java基础语法3 方法
			方法的定义-方法的特点 -方法的应用-方法的重载-数组定义-数组初始化-二维数组-Java中参数传递的特点:值传递 7.方法 7.1 方法的定义 什么是方法?Method方法就是定义在类中的,具有特定 ... 
- linux 上搭建sftp服务
			原文链接:https://www.cnblogs.com/yanduanduan/p/9046723.html sftp和ftp的区别 FTP是一种文件传输协议,一般是为了方便数据共享的.包括一个FT ... 
- 【leetcode】1186. Maximum Subarray Sum with One Deletion
			题目如下: Given an array of integers, return the maximum sum for a non-empty subarray (contiguous elemen ... 
- c# 谷歌动态口令对接
			https://www.cnblogs.com/easyauthor/p/11054869.html Google 身份验证器与两步验证功能配合,可在您登录 Google 帐户时为您平添一重安全保障. ... 
- Quartz监听器
			1.概念Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.TriggerLi ... 
- (49)LINUX应用编程和网络编程之四 Linux进程全解
			补充: 1. C程序的执行过程: C编译器调用链接器,链接器设置可执行程序文件的启动起始地址(启动例程),启动例程获得内核传递来的 命令行参数和环境变量值,为调用main函数做准备.[实际上该启动例 ... 
- iOS 消息转发以及 NSProxy 实战
			最后更新: 2018-01-17 一.消息派发机制-NSObject 在 iOS 开发中, 调用对象的方法就是给对象发送一个消息.了解消息的派发机制对于iOS开发来说是一个很实用且强大的工具, 下面我 ... 
