目錄給定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...