大數因數分解Pollard rho 演算法詳解

2022-09-08 03:51:15 字數 2111 閱讀 2671

有一類問題,要求我們將乙個正整數x,分解為兩個非平凡因子(平凡因子為1與x)的乘積x=ab。

顯然我們需要先檢測x是否為素數(如果是素數將無解),可以使用miller-rabin演算法來進行測試。

大數分解最簡單的思想也是試除法,就是從2到sqrt(n),乙個乙個的試驗,直到除到1或者迴圈完,最後判斷一下是否已經除到1了即可。(當然這是幼稚做法,複雜度是相當高的,不然我就是想打試除法多方便呀)

如果一年只有365天(不計算閏年),且每個人的生日是任意一天的概率均相等,那麼只要隨機選取23人,就有50%以上的概率有兩人同一天生日

解釋:第乙個人不會和前面的人重生日(因為前面沒有人),第二個人不重生日的概率為364/365,第三個人363/365……以此類推,那麼只要到第23個人,就有

,說明這時就有50%以上的概率有兩人同生日

更多的,當一年有n天時,只要人數到達θ(sqrt(n))的數量級,有至少兩個人同一天生日的概率就可以達到50%以上

圖象表達:

利用生日悖論來因數分解,重要的思想就是隨機。

已知我們隨機地從[2,n-1]中選擇出乙個數是n的因數的概率是極小的,這也就意味著需要重複隨機選擇來提高正確率。

那麼如果我們不是只選擇乙個數,而是選擇k個數,保證其中兩個數的差值是n的因數。

而如果其中兩個數x,y的差值為n的因數,就一定會有gcd(|x-y|,n)>1

假設n只有兩個因數(除去自己和1)p和q的情況下,那麼就意味著此時只有這兩個數能整除n

但是如果我們要求的是有多少個數x保證gcd(x,n)>1,此時答案就很多了,有p+q-2個

於是我們就得出了乙個簡單的策略:

1.在區間[2,n-1]中隨機選取k個數,x1~k

2.判斷是否存在gcd(xi-xj,n)>1,若存在,則顯然gcd(xi-xj,n)是n的乙個因數

同時也出現了乙個問題,就是我們需要選取大約(n¼)個數,記憶體顯然是不可能夠的,那麼又要如何解決這個問題呢?於是pollard-rho演算法就出現了。

因為數字太多記憶體不夠,所以pollard-rho只把連續的兩個數存在記憶體中。

也就是說,我們並不會選出k個數,而是乙個乙個地生成偽隨機數,並檢查連續的兩個數是否符合條件。

我們會用乙個函式來生成偽隨機數,就是這個→f(x)=(x2+a)%n

其中的a可以自己指定或rand()生成,但是這樣也伴隨了乙個問題就是這個函式生成的偽隨機數還是有規律的,會無限迴圈。

於是就會出現像希臘字母ρ

'>ρ

一樣的情況,這也是為什麼這個演算法名字中含有rho

那麼我們又要如何避免這種情況呢?

首先為了保證沒有答案可能被遺漏,那麼至少要把這個環完整的掃一遍。

聯想一下乙個比較常見的問題,就是小學數學題做過的兩個人在環形操場上跑步,在同時起跑的情況下,當速度快的那個人追上速度慢的那個人的時候,一定已經多跑了一圈,也就是說此時兩人肯定都至少跑完了一圈,恰好符合我們的要求。

那麼就是說我們要用兩個變數來儲存,乙個用v的速度掃瞄環,乙個用2v的速度,如果當兩個變數相等時還沒有找到答案,就退出這個環,重新取隨機數,再次帶入上面提到的函式中。

這裡有一點要說明一下,就是為什麼快的速度一定要是慢的速度的兩倍而不能更大。

假設快的速度為kv(k>2),整個環的路程為s,快的追上慢的所需時間為t,那麼我們可以列出式子:

kvt−vt = s ⇒ (k−1)vt = s ⇒ vt = sk−1
因為 k > 2,所以 k-1 > 1,那麼就有 sk−

1<

s'>s/(k−1) 

,也就意味著此時用來判斷答案是否符合條件的(也就是速度較慢的那個)還沒有掃瞄完整個環,那麼就有可能會有答案被遺漏。

以上就是完整的pollard-rho演算法過程,接下來上**

void pollard_rho(long long n)

d=gcd(abs(x2-x1),n);

if(d>1&&d

} return;

}

質因數分解

題目16 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完 成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新...

質因數分解

短除法 求乙個數分解質因數,要從最小的質數除起,一直除到結果為質數為止。分解質因數的算式的叫短除法 和除法的性質差不多,還可以用來求多個個數的公因式 求 最大公因數的一種方法,也可用來求 最小公倍數。求幾個數最大公因數 的方法,開始時用觀察比較的方法,即 先把每個數的因數找出來,然後再找出公因數,最...

質因數分解

講乙個數分解為幾個質數相乘的結果 int a maxn 用來存質因數 int b maxn 用來存質因數的個數 int main if n 1 不能忘記這一步操作 輸出 第1種寫法 a a a b b b b c c printf 第一種寫法 for int i 1 i tot i else pri...