OI數學 簡單學習筆記
注:該學習筆記參考了lxh daolao的課件和網上其他大佬的部落格(然後加上了蒟蒻的yy),在此表示深深的感激!
基本上只是整理了一下框架,具體的學習給出了個人認為比較好的部落格的連結。
PART1 數論部分
最大公約數
對於正整數x,y,最大的能同時整除它們的數稱為最大公約數
常用的:\(lcm(x,y)=xy\gcd(x,y)\)
裴蜀定理
定理:對於方程\(ax+by=c\),其存在解的充要條件是\(gcd(a,b)|c\),可以拓展到n元的方程。
證明的話應該自己yy一下還是很容易(顯然可得),不過要是想要嚴謹證明還是去百度吧qwq
擴充套件歐幾里得定理
首先我們都知道\(gcd(a,b)=gcd(b,a \%b)\)
我們在輾轉相除的同時可以遞迴地求出\(ax+by=gcd(a,b)\)的解。當遞迴到b=0的時候,顯然有解\(x=1,y=0\)。如果b!=0,我們可以遞迴的求出\(bx'+(a\%b)y'=gcd(a,b)\)的解。
\[bx'+(a\%b)y'=bx'+(a-\lfloor \frac{a}{b}\rfloor\times b)y'=ay'+b(x'-\lfloor\frac{a}{b}\rfloor y') \]
所以\(x=x',y=(x'- \lfloor \frac{a}{b} \rfloor y')\)
時間複雜度:O(log n)
逆元
定義:
若有\(xy=1\pmod p\)
計算方法:
轉換為方程:\(xy-kp=1\),用拓展歐幾里得演算法就可以了。當然費馬小定理也可以,只不過時間複雜度上稍微遜色一些。(還有一種線性的,不過我不會)
補充:費馬小定理:若p為質數,對於任意\(1<=a<p,a^{p-1}\equiv 1 \pmod p\),那麼在p為質數的時候\(a^{p-2}就是a的逆元\)
積性函式
對於任意互質整數a,b,存在\(f(ab)=f(a)f(b)\)性質的數論函式。
完全積性函式則是沒有互質的限制。
常見的積性函式舉例:
- φ(n) -尤拉函式
- μ(n) -莫比烏斯函式,關於非平方數的質因子數目
- gcd(n,k) -最大公因子,當k固定的情況
- d(n) -n的正因子數目
- σ(n) -n的所有正因子之和
尤拉函式
定義:\(\phi(n)\)定義為1-n內與n互質的數的個數
\(\phi(x)=x\prod_1^n(1- \frac{1}{p_i}),其中x是正整數,\)p_i\(是x的質因數。 這個的計算程式十分好寫。 特別的,尤拉函式是積性函式,即\)\phi(mn)=\phi(m)\phi(n)$。
證明比較顯然。
尤拉篩(線性篩)
在埃氏篩法的基礎上,讓每個合數只被它的最小質因子篩選一次,以達到不重複的目的。
程式碼直接去看模板吧,沒什麼好說的。
尤拉定理&擴充套件尤拉定理
若\(a,m\)互質,則有\[a^{\phi(m)}\equiv1\pmod m\]
若\(a,m\)不互質,當\[b\ge\phi(m)的時候,a^b\equiv a^{b\%\phi(m)+\phi(m)}\pmod m\]
注意如果\(b<\phi(m)\)的時候,上式不一定成立。
證明請看這篇部落格 戳我
什麼時候休閒娛樂的話我會寫一份自己的證明的(咕咕咕qwqwq)
Miller-Rabin素性測試
因為當p為質數且\(1<=a<p\)時,\(a^{p-1}\equiv 1\pmod p\)(尤拉定理)
那麼當\(1\le a<p\)且\(a^{p-1}\equiv 1\pmod p\)時,p是否一定是質數呢?
當然不是啦!但是我們發現大部分合數都不滿足這個性質。
所以我們的素數判定演算法出世啦!隨機幾個a,判斷\(a^{p-1}\mod p\)是否為1——不過這個正確性有點玄學,因為有些合數對任意的a的也都滿足這個性質emmmmm,所以需要對演算法進行改進。
這樣就引出了我們的二次探測定理——
對於任意質數p,如果\(x^2\equiv1\pmod p\),那麼我們有\(x\equiv\pm1\pmod p\)。
證明:由\(x^2 \equiv1\pmod p\),可以知道\((x+1)(x-1)\equiv0\pmod p\)。那麼\((x+1)和(x-1)\)之中必定有至少一個是p的倍數。又由於p是質數,所以得證。
那麼我們就知道怎麼做了,在判定素數的時候如果指數p-1是偶數,我們可以繼續判斷\(a^{\frac{p-1}{2}}\)——如果\(a\equiv\pm 1\pmod p\)的條件不滿足,可以直接判斷此數為合數。如果\(a\equiv -1\pmod p\),就不繼續判斷,如果\(a\equiv 1\pmod p\),我們不能判斷這個數是不是素數,就要繼續判斷\(a^{\frac{p-1}{2}}\)了。
所以我們把p-1的2的次冪分解出來,求出所有的\(a^{}\frac{p-1}{2^i}\)逐一檢查。
演算法時間複雜度是log的。
加上這個玄學改進,如果我們隨機的a夠多,幾乎就卡不掉了。隨機k個判斷錯誤的概率僅有\(\frac{1}{4^k}\)。
Pollard-Rho大整數質因數分解演算法
聽說沒有什麼大用qwq???蒟蒻選擇戰略性放棄
中國剩餘定理(CRT)
exCRT
BSGS
求解同餘方程:\(a^x \equiv b (mod p)\)
\(0<=a,b<p<=1e9\),p為質數5
BSGS
拓展BSGS
斐波那契數列迴圈節
原根
階的定義:
設a,p是整數,a和p互素,那麼:
使\(a^n\equiv1\pmod p\)成立的最小正整數n叫做a模p的階。
原根的定義:
原根,是一個數學符號。設m是正整數,a是整數,若a模m的階等於\(\phi\)(m),則稱a為模m的一個原根。
原根的性質:
- 對於正整數x,只有\(x=2,4,p^a,2\times p^a\),p為奇素數,a>=1的時候才存在原根。
- \(a^1,a^2,a^3,...,a^{\phi(m)}\)在模p的時候都不相同(可以推得它構成了一個長度為\(\phi(m)\)的迴圈節)
- 對於m的原根g,滿足gi(mod p)(0<=i<=p-2)與1到p-1一一對應.
- 若m有原根,那麼它的原根個數為\(\phi(\phi(m))\)。(具體證明蒟蒻不是特別會qwq,上課沒聽懂)
對於m的情況最為常用。在這種情況下,0~m-1中每一個數都可以對應一個\(a^x\),這就相當於模意義下取對數(離散對數)。我們可以化乘為加。或者快速地計算一個數的若干次冪。
判斷一個數a是不是m的原根
即判斷是否不存在\(1<=x<\phi(m)\)。由於\(a^{\phi(m)}\equiv \pmod m\),我們只需要判斷x為\(\phi(m)\)的因數的情況就可以了,時間複雜度\(O(sqrt(m)log m)\)
實際上,對於\(\phi(m)\)的每種質因數p_i判斷\(\frac{\phi(m)}{p_i}\)也是等價的。
求出原根後,用暴力或者BSGS就可以求出來一個數的對數。
ps.一個數的原根是很多的,我們可以從小到大判斷,或者隨機化選取數字判斷。
二次剩餘
PART2 組合數學部分
PART3 線性代數部分
向量
n維向量可以看成n個數組成的n元組(或者說n個元素的陣列)
幾何意義:表示n維空間中的方向和長度
矩陣
\(n\times m\)的矩陣相當於一個\(n\times m\)的二維陣列
練習題
BZOJ3667 題解戳我