Pollard Rho大質數分解學習筆記

2022-03-01 04:21:48 字數 1699 閱讀 9499

目錄給定n,要求對n質因數分解

普通的試除法已經不能應用於大整數了,我們需要更快的演算法

大概就是找出\(n=c*d\)

如果\(c\)是素數,結束,不是繼續遞迴處理。

具體一點的話

1.先對n進行\(miller\_rabin\)測試,是素數就直接結束了

如果不會的話,看我前篇部落格的介紹吧

為何還要多寫個\(miller\_rabin\),他沒有非平凡因子,他要保證複雜度?

2.隨機基底a和c,生成序列\(x_=a,x_=x_^+c(mod n)\),可以認為\(}\)是有迴圈節的隨機序列(rho就是密度的那個符號,長得很像是不是)

3.若出現\((x_-x_,n)≠1\),停止演算法,令\(d=(x_-x_,n)\),若\(d≠n\),那d就是n的非平凡因子,n被分為d和n/d相乘的結果,遞迴下去繼續分解

4.若d=n,重選基底a和c,重複過程(出現迴圈了)

劉汝佳先生說:想象一下,假設有兩個小孩子在乙個「可以無限向前跑」的跑道上賽跑,同時出發。但其中乙個小孩的速度是另乙個的兩倍。如果跑道是直的,跑得快的小孩永遠在前面;但如果跑道有環,則跑得快的小孩將「追上」跑得慢的小孩。

演算法複雜度\(o(n^ }*pro)\)

具體的我也不知道咋證

#include using namespace std;

const int maxn = 10005;

typedef long long ll;

ll fpm(ll a, ll k, ll p) //calc a^k % p

int prime = ;

bool detective(ll a, ll n)

x = y;

} return false;

}bool miller_rabin(ll n)

return true;

}vectorres;

int irand()

ll irand(ll n)

ll mul(ll a, ll b, ll n)

ll rho(ll n)

return d;

}void pollard_rho(ll n)

ll d = n; while (d == n) d = rho(n);

pollard_rho(d); pollard_rho(n / d);

}int main()

(當然,我們這裡的一年是穩定365天,和我們不一樣)

23個人中至少有一對兩個人生日相同的概率在一半以上,感覺不可思議吧,與我們自我感覺的有很大差異,其實,當我們看到「有人生日相同」時,下意識地會用「與我生日相同」去推測,直覺就讓我們直覺產生了「兩人生日相同」概率很小。理性計算的結果與日常經驗產生了如此明顯的矛盾,所以叫做「生日悖論」。

可以說,直覺沒有錯,錯的是我們沒有正確地去理解問題。因此,當我們剝開直覺的謊言,看清事實的那一刻,才會覺得如此不可思議。

我們的問題是「任意兩個人的生日相同的概率」(所以要理性分析呀qwq)。

我們討論兩個人生日相同的情況。

總概率是365*365,生日不同的情況\(365*364\)

那生日相同的情況就是 \(\frac=\frac\)

四個人同理\(\frac}\)

再大一點可以用long double 計算,可以算出23人時概率就大於一半了

鳴謝

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

有一類問題,要求我們將乙個正整數x,分解為兩個非平凡因子 平凡因子為1與x 的乘積x ab。顯然我們需要先檢測x是否為素數 如果是素數將無解 可以使用miller rabin演算法來進行測試。大數分解最簡單的思想也是試除法,就是從2到sqrt n 乙個乙個的試驗,直到除到1或者迴圈完,最後判斷一下是...

判斷質數 分解質因數

質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數,質數也叫素數。與質數相對的是合數,合數是指在大於1的整數中除了能被1和本身整除外,還能被其他數整除的數。bool is prime int n 迴圈中不建議寫成i sqrt n 因為sqrt函式很慢,每次for迴圈都會執行一遍,耗...

HDU 4497 質數分解和計數)

如果l g 0,說明一定無解。把k l g質數分解,l g p1 t1 p2 t2 p3 t3 同時 x g,y g,z g,不影響結果。假設三個數字的質數分解是 x p1 i1 p2 i2 p3 i3 y p1 j1 p2 j2 p3 j3 z p1 k1 p2 k2 p3 k3 要保證x,y,z...