MillarRabin模版 随机测大素数

支持long long

#include <algorithm>
typedef long long ll;
ll GCD(ll a, ll b) { return b ? GCD(b, a % b) : a; }
ll MultiMod(ll a, ll b, ll n) { // a * b % n
	ll res = 0; MillarRabin
	a %= n;
	while (b > 0) {
		if (b & 1) {
			res += a;
			if (res >= n) res -= n;
		}
		a <<= 1;
		if (a >= n) a -= n;
		b >>= 1;
	}
	return res;
}
ll QuickMod(ll a, ll b, ll n) { // a ^ b % n
	ll res = 1;
	a %= n;
	while (b > 0) {
		if (b & 1) res = MultiMod(res, a, n);
		a = MultiMod(a, a, n); b >>= 1;
	}
	return res;
}
bool MillarRabin(ll n) { // 判断是否素数
	if (n == 2 || n == 3 || n == 5 || n == 7 || n == 11) return true;
	if (n == 1 || !(n & 1) || !(n % 3) || !(n % 5) || !(n % 7) || !(n % 11)) return false;
	ll t = 0, m = n - 1, x, y;
	while (!(m & 1)) { m >>= 1; t++; }
	for (int i = 0; i < 10; i++) {
		ll a = rand() % (n - 2) + 2;
		x = QuickMod(a, m, n);
		for (ll j = 0; j < t; j++) {
			y = MultiMod(x, x, n);
			if (y == 1 && x != 1 && x != n - 1) return false;
			x = y;
		}
		if (y != 1) return false;
	}
	return true;
}
时间: 2024-10-06 07:31:47

MillarRabin模版 随机测大素数的相关文章

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu

POJ 1811 大素数判断

数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std; __int64 pri[]= {2,3,5,7,11,13,17,19,23,29,31};//用小素数表做随机种子避免第一类卡米

重复造轮子之RSA算法(一) 大素数生成

出于无聊, 打算从头实现一遍RSA算法 第一步, 大素数生成 Java的BigInteger里, 有个现成的方法 public static BigInteger probablePrime(int bitLength, Random rnd) { bitLength是期望生成的素数的二进制位数, rnd是随机数发生器 函数注释表明, 这个方法的返回值为合数的概率为2^-100 生成100个1024位的素数, 耗时13471ms 但是显然我不打算直接使用这个函数, 要做就从最底层做起! 目前的做

记一次使用快速幂与Miller-Rabin的大素数生成算法

大家都知道RSA的加密的安全性就是能够找到一个合适的大素数,而现在判断大素数的办法有许多,比如Fermat素性测试或者Miller-Rabin素性测试,而这里我用了Miller-Rabin素性测试的算法,具体的理论我写到下面. 算法的理论基础: Fermat定理:若n是奇素数,a是任意正整数(1≤ a≤ n?1),则 a^(n-1) ≡ 1 mod n. 2.  如果n是一个奇素数,将n?1表示成2^s*r的形式,r是奇数,a与n是互素的任何随机整数,那么a^r ≡ 1 mod n或者对某个j

Miller_Rabbin大素数测试

伪素数: 如果存在和n互素的正整数a满足a^(n-1)≡1(mod n),则n是基于a的伪素数. 是伪素数但不是素数的个数是非常非常少的,所以如果一个数是伪素数,那么他几乎是素数. Miller_Rabbin素数测试:随机选k个a进行a^(n-1)≡1(mod n)测试,如果都满足则判断n是素数. a^(n-1)%mod用快速幂计算.对于大数相乘(两个大于int的数相乘),中间结果可能溢出,所以需要用快速幂思想进行乘法取模. Miller_Rabbin的出错率为2^(-k). 1 //Mille

大素数筛子

题目地址:http://acm.fafu.edu.cn/problem.php?id=1011 Description: The problem is very simple,your job is just to calculate the sum of primes from the first prime to the Nth prime. Input: The input consists multiple cases. Each line contains a N(1<=N<=100

csu 1552: Friends(大素数判断+二分图)

1552: Friends Time Limit: 3 Sec  Memory Limit: 256 MB Submit: 525  Solved: 136 [Submit][Status][Web Board] Description On an alien planet, every extraterrestrial is born with a number. If the sum of two numbers is a prime number, then two extraterres

第K大素数(水题)

第K大素数 Time Limit: 1000ms   Memory limit: 32768K  有疑问?点这里^_^ 题目描述 大家都知道素数是数学中很有意思的一类数,或许聪明的你已经知道了如何判定一个数是否是素数,但今天不一样了,你的任务是求第K大素数.你能快速完成吗? 输入 输入只有一个整数K. ps:我们只关心那些正整数. 输出 输出只有一行,即第K大素数. 示例输入 5 示例输出 11 提示 来源 示例程序 #include <stdio.h> #include <math.h

大素数测试和分解质因数

Prime Test http://poj.org/problem?id=1811 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 typedef __int64 LL; 5 LL mulmod(LL a,LL b,LL c) { //ret=(a*b)%c 6 LL ret=0; 7 for(; b; a=(a<<1)%c,b>>=1) { 8 if(b&1) {