由於作者也是邊學習邊記錄,所以必然會存在某些神筆錯誤,感謝指正。
由於 \(oi\) 涉及到的數學數論知識實在太多,本內容也會分為幾篇文章共同呈上。
過後這裡會新增完整筆記的索引
\[\huge
\]如果存在乙個整數 \(k\),使得 \(a = kd\),則稱 \(d\) 整除 \(a\),記做 \(d \mid a\),稱 \(a\) 是 \(d\) 的倍數,如果 \(d > 0\),稱 \(d\) 是 \(a\) 的約數。
特別地,任何整數都整除 \(0\)。
素數,又稱為質數,是指在大於 \(1\) 的自然數中,除了 \(1\) 和它本身以外不再有其他因數的自然數,即不存在其它因數。
否則稱之為合數。
因此無論是合數還是素數,都意味著在假設的有限集外還存在其他素數。上述假設不成立。
該證明源自歐幾里得的《幾何原本》。
素數計數函式:小於或等於 \(x\) 的素數的個數,用 \(\pi(x)\) 表示。隨著 \(x\) 的增大,有這樣的近似結果:\(\pi(x) \sim \frac\) 。
直接按照定義從小到大判斷其是否可以被除 \(1\) 和自身外的某個數整除。
bool check_prime(int x)
小學數學老師給我們講過:
如果 \(x\) 是 \(a\) 的約數,那麼 \(\frac\) 必然也是 \(a\) 的約數。
所以對於每一對 \((x, \frac )\),只需要檢驗其中的乙個就好了。為了方便起見,我們之考察每一對裡面小的那個數。不難發現,所有這些較小數就是 \([1, \sqrt]\) 這個區間裡的數。而 \(1\) 直接忽略即可。
bool check_prime(int x)
如果要尋找某一範圍內的素數,只需多加一層迴圈然後判定統計答案即可。
時間複雜度 \(o(n\sqrt)\)
即篩去所有從2(素數是指大於1的自然數)開始的某一範圍內的非素數,剩下的則都為素數。
埃式篩
埃拉託斯特尼篩法(eratosthenes),簡稱埃氏篩或愛氏篩,是一種由希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的演算法。
要得到自然數 \(n\) 以內的全部素數,必須把不大於根號 \(n\) 的所有素數的倍數剔除,剩下的就是素數。
也就是說,對於任意整數 \(x\) 的倍數 \(2x,3x,\dots\) 都是不素數。根據素數的定義,該命題顯然成立。
不難想到,如果我們已經找到某個素數,那麼它一定是後面應該被篩去=8/某個合數的質因子。如此往復下去,就可以篩掉範圍內所有的合數。
時間複雜度 \(o(n\log\log n)\) 。
int find_prime(int n) //1 ~ n 內所有的素數
}return p;
}
尤拉篩
即線性篩,類似於埃式篩,區別就是不會像埃式篩那樣重複篩去某乙個數。
尤拉篩通過「從小到大累積質因子」的方式標記每乙個非素數,這樣每個素數就可以以唯一形式表達。
設陣列 \(pf\) 記錄每個數的最小質因子,
一次考慮 \(2 \sim n\) 之間的每乙個數 \(i\)
若 \(pf[i]=i\) ,則 \(i\) 為質數,將它記錄下來
掃瞄不大於 \(pf[i]\) 的每個質數 \(p\) ,令 \(pf[i*p]=p\) 。即在 \(i\) 的基礎上累積乙個質因子 \(p\) 。由於 \(p \leq pf[i]\) ,所以 \(p\) 即為 \(i*p\) 的最小質因子。
**:
int pf[_]; //prime_factor ,用來記錄最小素因子
int find_prime(int n)
for (int j = 0; j < p && prime[j] * i <= n; j++)
}return p;
}
約數的定義詳見前置部分。
也成為最大公約數、最大公因子(greatest common divisor,即 gcd),是指兩個及以上整數共同擁有的所有因數中最大的乙個。
已知兩個數 \(a\) 和 \(b\) ,如何求二者的最大公因數呢?如果兩個數 \(a\) 和 \(b\) 滿足 \(\gcd(a, b) = 1\),我們稱 \(a\) 和 \(b\) 互質。
假設 \(a > b\) ,
**:
int gcd(int a, int b)
函式遞迴至 \(b=0\) (即上層 \(a\%b=0\) )時返回。
補充: 如果兩個數 \(a\) 和 \(b\) 滿足 \(gcd(a,b)=1\) ,則 \(a\) 與 \(b\) 互質。
時間複雜度 \(o(\log n)\)。
如果實在想卡時間的話把題目構造成求斐波那契數列相鄰兩項的最大公約數就可以把時間卡到最壞複雜度。
計算出其中兩個數的最大公約數,放回到原序列,重複進行知道求出最後兩個數的最大公約數。
筆記 數學數論(三)
huge 形如 ax equiv c pmod b 的方程被稱為線性同餘方程 congruence equation 方程 ax by c 與方程 ax equiv c pmod b 是等價的,有整數解的充要條件為 gcd a,b mid c 根據定理 1 方程 ax by c 我們可以先用擴充套件...
學習筆記 數學建模
層次分析法 將與決策總是有關的元素分解成目標,準側和方案等層次,在此基礎之上進行定性和定量分析。使用層次分析法建模,首先要把問題條理化和層次化,構想出乙個有層次的模型。層次分析法建模大體分為三步 建立遞階層次模型 大致分為 目標層 準側層 最低層。將複雜問題分解成構層問題的元素,再對按照元素之間的關...
演算法筆記 數學問題
原題鏈結 原理 最大公約數 遞迴 歐幾里得演算法 最小公倍數 得到a,b的最大公約數d 最小公倍數 a d b include include intgcb int a,int b 求最大公約數 intmain printf d n d return0 include include include...