1. 程式人生 > >C++實現Miller-Rabin素數測試

C++實現Miller-Rabin素數測試

原理參見《離散數學》P201

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>

using namespace std;

bool Miller_Rabin(long long n)
{
	if(n < 2)
		return false;
	else if(n == 2)
		return true;
	
	long long q = 0, m = n - 1;
	while(m % 2 == 0) {
		m /= 2;
		++q;
	}

	long long a = rand()%(n-2)+2;
	long long x1 = (long long)pow(a, m) % n, x2;

	for(int i = 1; i <= q; ++i) {
		x2 = (x1*x1) % n;
		if(x2 == 1 && x1 != 1 && x1 != n-1)
			return false;
		x1 = x2;
	}

	if(x2 != 1)
		return false;
	else
		return true;
}


int main(void) 
{
	srand((unsigned)time(NULL));
	long long num;
	while(cin >> num) {
		if(num > 1) {
			if(Miller_Rabin(num))
				cout << "true" << endl;
			else
				cout << "false" << endl;
		}
	}

	return 0;
}


相關推薦

C++實現Miller-Rabin素數測試

原理參見《離散數學》P201 #include<iostream> #include<cstdlib> #include<ctime> #include<cmath> using namespace std; bool M

【模板】Miller-Rabin素數測試

參考題目:HDU2138 解析: 又是一個看心情更新的板子題。。。 程式碼: #include<bits/stdc++.h> using namespace std; #define ll long long #define re register

素數判斷_fermat素性測試+Miller-Rabin素性測試

一、樸素的判斷一個數是否為素數: 原理:若一個數為合數,那麼必然存在這樣的兩個數:2<=a<=sqrt(n) <=b<n,使得n=a*b。 解法:從 2 到 sqrt(n) 列舉,若存在數字 a 為數 n 的因子,那麼數字 n 即為合數。若不存在,則

Miller-Rabin 素性測試

ret return 如果 iostream while abi using logs %d 根據費馬小定理,若p為素數,則必有a^(p-1) mod p=1 對和p互質的a成立。 根據二次探測定理:如果p是素數,且0<x<p,則方程x^2 mod p=1的解

hihocoder 1287 : 數論一·Miller-Rabin質數測試 大質數判定

公鑰 queue 是否 iostream abi i+1 href 其中 興趣 時間限制:10000ms 單點時限:1000ms 內存限制:256MB 描述 小Hi和小Ho最近突然對密碼學產生了興趣,其中有個叫RSA的公鑰密碼算法。RSA算法的計算過

Miller-Rabin素數檢測算法

aps ear html blog tar ces line integer least Description: Goldbach‘s conjecture is one of the oldest and best-known unsolved problems in

Miller-Rabin素性測試

定義 過去 lean 現在 我們 targe tro 不同的 greatest 以前判斷一個數n是否是素數我們一般都是暴力枚舉,O(sqrt(n))的算法。 最近看見了Miller Rabin算法,能以對數復雜度檢驗一個數是否為素數。 這個算法基於費馬小定理和二次探測定理。

合併排序(Merge Sort)C 實現(簡單效能測試

#include <time.h> #include <stdlib.h> #include <stdio.h> #define sential RAND_MAX  /* 定義哨兵*/ #define SIZE 1000000/

Miller-rabin素性測試與pollard-rho快速質因數分解

~~~~ Miller-Rabin 可以在O(log n)的時間內檢測一個數是否為質數。 理論上是一個概率演算法,但在一定範圍以內的數經過驗證全部可以判出來。 所以OI範圍內可以視作是一個確定演算法。 費馬小定理 若p是質數,且a<pa

Fermat素性測試Miller-Rabin素性測試

昨天看了看spoj的第2題(坑啊~), 說的是找出 A,B之間的素數, 有T<=10組資料, A, B均小於10^9, A,B之差小於10^5。 打表是不可能了, 只能一個一個判斷。 這是我們需要一個強力的方法來判斷一個數是素數呢,還是合數。 所以可以想到這個素性測

Miller-Rabin素性測試與二次探測

演算法簡介 首先是一些概念: 費馬小定理:對於素數p和任意整數a,有ap≡a(modp). 反之,對於一個數p,如果滿足ap≡a(modp),則 p 很可能是素數。 偽素性測試:瞎猜若干個x,只要不滿足上式,那麼p就不是素數。看起來沒毛病了。 Carm

Miller-Rabin素性測試演算法詳解

看了一些別人的部落格,發現裡面涉及到的公式沒有證明,於是就打算自己寫一篇比較詳細的講解。 先看兩個引理及其證明(建議把證明搞懂)。 PS:以下圖片均為作者用wps製作,如想使用請附上作者部落格連結,謝

Miller-Rabin素數檢測演算法

由於收到某退役學長的鞭策,忽然就想學習一丟數論 來補充一下虎哥基礎數論中沒有出現的東西 **本文轉載須聯絡作者,並標明出處** --- # 定義 Miller-Rabin素數測試,又稱米勒-拉賓素性檢驗,是一種素數判定法則,利用隨機化演算法判斷一個數是合數還是可能是素數。 卡內基梅隆大

Miller Rabin素數檢測與Pollard Rho演算法

一些前置知識可以看一下我的[聯賽前數學知識](https://www.cnblogs.com/liuchanglc/p/13692477.html) ## 如何判斷一個數是否為質數 ### 方法一:試除法 掃描$2\sim \sqrt{n}$之間的所有整數,依次檢查它們能否整除$n$,若都不能整除,則$n$

Miller-Rabin隨機性素數測試演算法

大佬部落格 個人比較菜會用板子就好了。 送上例題hdu 2138 雖然暴力可以過但是還是用來學演算法吧。 #include<cstdio> #include<cstring

素數與素性測試Miller-Rabin測試)(目前為止我見過最好的部落格)

素數的個數無限多(不存在最大的素數) 存在任意長的一段連續數,其中的所有數都是合數(相鄰素數之間的間隔任意大) 所有大於2的素數都可以唯一地表示成兩個平方數之差。 當n為大於2的整數時,2n+1和2n-1兩個數中,如果其中一個數是素數,那麼另

C++實現費馬小定理素數測試

#include<iostream> #include<iomanip> #include<cstdlib> #include<ctime> #include<cmath> using namespace std

素數,費馬!米勒—拉賓 素性測試MillerRabin primality test)

chapter 1 Fermat's little theorem  費馬小定理 費馬小定理說的是:如果p是一個素數,那麼對於任意一個整數a,a p − a 能被p整除,也可以用模運算表示如下: (p是素數,a是整數) 這個定理又如下變式:如果p是一個素數,且整數a與p互素,那麼 a p−1 

簡單測試--C#實現中文漢字轉拼音首字母

esp chart htm foreach ext ads linq 類庫 play 第一種: 這個是自己寫的比較簡單的實現方法,要做漢字轉拼音首字母,首先應該有一個存儲首字母的數組,然後將要轉拼音碼的漢字與每個首字母開頭的第一個漢字即“最小”的漢字作比較,這裏的最小指的是

C++實現密碼強度測試

謝謝 break 差距 font class src com 密碼強度檢測 return 最近在博客中看到許多用js寫的密碼強度檢測,我覺得挺有意思的,所以呢我打算自己也寫個來玩玩,最可悲的是我還沒學js,當然這不重要,所以呢打算用C++來寫一個密碼強度檢測,這裏我來給大家