1. 程式人生 > >Miller-Rabin演算法與Pollard's Rho演算法總結

Miller-Rabin演算法與Pollard's Rho演算法總結

Miller-Rabin素數測試

費馬小定理:

p是素數時,對於a[1,p1],滿足

ap11(modp)
但是其逆命題是假命題,也就是說對於a[1,p1],我們測試所有的ap1,就算全部=1p也不一定是素數(可能是偽素數),但出錯的概率很小。於是可以選擇若干個a來測試,再加上下文中的二次探測,正確率就十分接近100%了。

二次探測:

首先有一個顯然的性質:x21(modp)x1/xp1(modp)
我們設

p1=2sr,序列bi=a2ir
那麼bs=1,而且b0..s1要麼全部=1,要麼存在bk=p1bk+1..s1=1
滿足上述條件才可能是素數。

總結一下,Miller-Rabin測試就是選擇若干個用來測試的a(一般選擇前10個素數即可),進行二次探測,如果全部通過就可以認定其為素數了。

Pollard’s Rho大數質因數分解

假設要質因數分解n,我們使用一個偽隨機數f(seed)=(seed2+c)modn。先設兩個變數

x=y=seed,讓y=f(y)迭代並檢測gcd(|xy|,n)是否>1,迭代k次之後把x賦為y並把k2(倍長迭代),直到gcd>1找到了一個因子,或者x=y(進入迴圈)則重新換一個c尋找。
該演算法期望在迭代O(p)次找到n的一個因子p,考慮到n的質因子中>n的最多隻有一個,所以複雜度大概是O(n14)的。

板子題:BZOJ3667

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define ll long long #define F(x) (mul(x,x,n)+c)%n using namespace std; const ll pri[]={2,3,7,61,10007,24251}; ll mx; ll rd(ll x) { return (((((((ll)rand()<<15)+rand())<<15)+rand())<<15)+rand())%x; } ll gcd(ll x,ll y) { if(!y) return x; return gcd(y,x%y); } ll mul(ll a,ll b,ll mod) { a=(a>=mod?a%mod:a); b=(b>=mod?b%mod:b); ll tmp=(a*b-(ll)((long double)a/mod*b+1e-2)*mod); return tmp<0?tmp+mod:tmp; } ll ksm(ll a,ll b,ll mod) { ll re=1; for(a%=mod;b;b>>=1,a=mul(a,a,mod)) if(b&1) re=mul(re,a,mod); return re; } ll check(ll a,ll n,ll r,ll s) { ll t=ksm(a,r,n),u=t; while(s--) { t=mul(t,t,n); if(t==1&&u!=1&&u!=n-1)

相關推薦

Miller-Rabin演算法Pollard's Rho演算法總結

Miller-Rabin素數測試 費馬小定理: 當pp是素數時,對於a∈[1,p−1]a∈[1,p−1],滿足 ap−1≡1(modp)ap−1≡1(modp) 但是其逆命題是假命題,也

C++實現的大整數分解Pollard's rho演算法程式

C++語言程式程式碼如下: /* C++ program to find a prime factor of composite using Pollard's Rho algorithm */ #include<bits/stdc++.h> usin

Pollard's Rho演算法的理解

之前曾經碰到過要用到Pollard's Rho演算法的題目,不過當時沒有學這個演算法,只是備忘了一下,這兩天沒事幹把這個演算法學了。wiki上說這個演算法是一個通用的因數分解演算法,對於分解因子較小的組合數特別有用。 對於一個正整數n,在一般情況下,我們主要使用的是列舉1到

【快速因數分解】Pollard's Rho 演算法

演算法目的 給一個數n,快速提取n的一個因數。 演算法根據:生日悖論 講生日悖論之前,先看一個東西。 給出[1..1000]的數,從中任意選出一個數為k的概率是11000。 但是假如選出兩

Pollard's Rho演算法總結

先貼一份程式碼在這。 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cctype&

【快速因數分解】Pollard's Rho 演算法

**Pollard-Rho** 是一個很神奇的演算法,用於在 $O(n^{\frac{1}4}) $的期望時間複雜度內計算合數 n 的某個非平凡因子(除了1和它本身以外能整除它的數)。事書上給出的複雜度是 $O(\sqrt{p})$ , p 是 n 的某個最小因子,滿足 p 與 n/p 互質。雖然是隨機的,但

演算法資料結構】演算法複雜度分析

一、什麼是複雜度分析? 1.資料結構和演算法解決是“如何讓計算機更快時間、更省空間的解決問題”。 2.因此需從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。 4.複雜度描述的是演算法執行時間(或佔用空間)與資料

Fibonacci數列遞迴演算法非遞迴演算法

轉載於:http://blog.csdn.net/qq_33951180/article/details/52484080 一、斐波那契數列  由於斐波納挈數列是以兔子的繁殖引入的,因此也叫“兔子數列”。它指的是這樣一個數列:0,1,1,2,3,5,8,13……從這組數可以很明顯看出這

梯度上升演算法隨機梯度上升演算法的實現

1. 引言 上一篇日誌中,我們最終推匯出了計算最優係數的公式。 Logistic 迴歸數學公式推導 本文,我們就利用上一篇文章中計算出的公式來實現模型的訓練和資料的分類。 2. 通過 python 實現 logistic 演

二叉樹先序遍歷、中序遍歷、後序遍歷的遞迴演算法非遞迴演算法

首先是二叉樹資料結構的定義: typedef struct TNode *Position; typedef Position BinTree; /* 二叉樹型別 */ struct TNode{ /* 樹結點定義 */ int Data; /* 結點資料 */ BinTre

垃圾收集器記憶體分配策略——垃圾收集演算法HotSpot虛擬機器演算法實現

垃圾收集演算法的具體實現涉及大量的程式細節,這裡只描述其演算法的基本思想和發展過程 一、常見的垃圾收集演算法對比如下 收集演算法 具體實現 優點 不足 標記-清除演算法 1、首先標記出所有需要回收的物件 2、標記完成之後,統一回

克魯斯卡爾演算法普里姆演算法詳解

最近資料結構老師講了好幾個演算法,今晚上正好有空,所以就來整理一下 一:Kruskal演算法思想:直接以邊為目標去構建最小生成樹,注意只找出n-1條邊即可,並且不能形成迴路。圖的儲存結構採用的是邊集陣列,且權值相等的邊在陣列中的排練次序是任意的,如果圖中的邊數較多則此演算法會很浪費時間! 二

Pollard's Rho 快速質因數分解 複習小記

Description 為什麼又是複習小記?因為又忘了個精光QAQ Pollard’s Rho 分治思想 我們實現過程find(n)表示對n進行質因數分解。 如果能找到任意一個d|n,

遺傳演算法差分進化演算法總結比較

遺傳演算法 遺傳演算法的基本原理: 遺傳演算法是一種基於生物進化原理構想出來的搜尋最優解的仿生演算法,它是模擬基因重 組與進化的自然過程,把待解決問題的引數編成二進位制碼或十進位制碼(也可編成其他進

《程式設計師的數學》:漢諾塔問題(Hanoi問題)的遞迴演算法非遞迴演算法總結

從被呼叫函式返回呼叫函式前,系統也應完成3件事: ①儲存被呼叫函式的結果; ②釋放被呼叫函式的資料區; ③依照被呼叫函式儲存的返回地址將控制轉移到呼叫函式。 當有多個函式構成巢狀呼叫時,按照“後呼叫先返回”的原則(LIFO),上述函式之間的資訊傳遞和控制轉移必須通過“棧”來實現,即系統將整個程式執行時所需的

斐波那契數列的遞迴演算法非遞迴演算法

一、斐波那契數列 由於斐波納挈數列是以兔子的繁殖引入的,因此也叫“兔子數列”。它指的是這樣一個數列:0,1,1,2,3,5,8,13......從這組數可以很明顯看出這樣一個規律:從第三個數開始,後邊

KMP演算法樸素模式匹配演算法(C語言)

在上一篇部落格中介紹了KMP演算法和樸素模式匹配演算法的區別,本文主要針對這兩種演算法的C語言實現進行講解。 #include<stdio.h> #define OK 0 #define ERROR -1 #define FAILED 1 in

Hash演算法散列表基礎演算法

把一個較大集合P對映到一個較小集合Q中,其中對映演算法位H,即Q=H(P),每一個p對應一個q,一個q可能對應多個p,這就是Hash編碼的初步理解。其中散列表,可以認為是一種特殊的資料結構,有|Q|個所謂的槽,儲存相應的Q值,其中P中的元素出現,就在Q中相對應的

Pollard's Rho Algorithm——求正整數的質因數

Pollard Monte Carlo factorization method 是J. M. Pollard 於1975提出的一種質因數分解的方法。由於其演算法中迭代公式形成的序列點集合X={x1,x