日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每个程序员都应该知道的基础数论

發(fā)布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每个程序员都应该知道的基础数论 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


這篇文章討論了數(shù)論中每個程序員都應(yīng)該知道的幾個重要概念。本文的內(nèi)容既不是對數(shù)論的入門介紹,也不是針對數(shù)論中任何特定算法的討論,而只是想要做為數(shù)論的一篇參考。如果讀者想要獲取關(guān)于數(shù)論的更多細(xì)節(jié),文中也提供了一些外部的參考文獻(xiàn)(大多數(shù)來自于 Wikipedia 和 Wolfram )。


0、皮亞諾公理


整個算術(shù)規(guī)則都是建立在 5 個基本公理基礎(chǔ)之上的,這 5 個基本公理被稱為皮亞諾公理。皮亞諾公理定義了自然數(shù)所具有的特性,具體如下:


(1)0是自然數(shù);

(2)每個自然數(shù)都有一個后續(xù)自然數(shù);

(3)0不是任何自然數(shù)的后續(xù)自然數(shù);

(4)不同自然數(shù)的后續(xù)自然數(shù)不同;

(5)如果集合S包含了數(shù)字0,并且包含S中每一個數(shù)字的后續(xù)自然數(shù),那么集合S就包含了所有的自然數(shù)。


上述第5個公理也被稱為“數(shù)學(xué)歸納法的基礎(chǔ)”。


通常,除了我們想要證明其他算術(shù)定理的情況,我們很少直接使用上述公理。但作為算術(shù)的基石,這些公理是值得我們?nèi)チ私獾摹?/span>


延伸閱讀:

https://en.wikipedia.org/wiki/Peano_axioms

http://mathworld.wolfram.com/PeanosAxioms.html? ?


1、算術(shù)基本定理和除法運(yùn)算法則


正如這個定理的名稱所言,算術(shù)基本定理是數(shù)論中所有概念的核心。算術(shù)基本定理含義如下:任何一個大于1的整數(shù)都可以以某種特定的方式寫成質(zhì)數(shù)的乘積的形式(這種特定方式取決于乘積中質(zhì)數(shù)的順序)。例如,18 = 2 * 9, 1755 = 33 *5 * 13. 這個定理在幾乎所有的數(shù)論運(yùn)算法則中都扮演著十分重要的角色,例如求一個數(shù)的質(zhì)數(shù)因子、最大公約數(shù)、除數(shù)的和等等。想要證明這個定理其實(shí)很簡單,實(shí)際上它是歐幾里得第一個定理的一個推論(下面小節(jié)會討論到)。


除法運(yùn)算法則含義是說:給定兩個整數(shù)a,b(b不等于0),那么存在兩個整數(shù)q和r使得下面的等式成立:


a = bq + r, 0 <= r < b

通常我們把q稱為商,而把r稱為余數(shù)。如果r = 0,那么我就說b整除a,并且表示為:b | a.


延伸閱讀:

https://en.wikipedia.org/wiki/Fundamental_theorem_of_arithmetic

http://mathworld.wolfram.com/FundamentalTheoremofArithmetic.html

https://en.wikibooks.org/wiki/Number_Theory/Elementary_Divisibility

https://en.wikipedia.org/wiki/Division_algorithm


2、歐幾里得定理


數(shù)學(xué)中兩個重要定理,被稱為“歐幾里德的第一定理(或歐幾里德的引理)”和“歐幾里德的第二定理(通常簡稱為”歐幾里德定理“),內(nèi)容如下:


第一定理:p|ab => p|a or p|b。該定理的直接結(jié)論就是算術(shù)基本定理。

第二定理:質(zhì)數(shù)的數(shù)量是無限的。有很多簡單的證明方法。


雖然確實(shí)存在無限多的質(zhì)數(shù),但也應(yīng)該記住,質(zhì)數(shù)之間存在任意大的差值。換句話說,給定n的前提下,總是可以獲得一些列的n個連續(xù)復(fù)合數(shù)。


延伸閱讀:Euclid's Theorem、Euclid's Lemma、walfram


3、最大公約數(shù)、最小公倍數(shù)和貝祖定理


歐幾里得算法是求兩個數(shù)的最大公約數(shù)最常用的算法,而且也是一個很高效的算法,因?yàn)槭褂脷W幾里得算法求解兩個數(shù)的最大公約數(shù)的算法步驟最多不會超過這兩個數(shù)中較小的那個數(shù)的5倍。最大公約數(shù)通常使用圓括號表示—— (a,b) 表示a和b的最大公約數(shù)。類似地,最小公倍數(shù)通常使用方括號表示—— [a,b] 表示a和b的最小公倍數(shù)。

如果 (a,b) = 1,即 [a,b] = ab,此時我們稱a和b互質(zhì)。


如果 (a,b) = d,那么 (a/d,b/d) = 1。


最大公約數(shù)和最小公倍數(shù)之間的關(guān)系可以由一個非常簡單的等式來表示:(a,b) * [a,b] = ab. 該等式為我們提供了一種快速計算兩個數(shù)的最小公倍數(shù)的方法。


貝祖定理是說,如果 d = (a,b) 那么一定存在整數(shù) x 和整數(shù) y 滿足 ax + by = d. (當(dāng)然,如果存在的話,那么線性雙變量方程的理論保證了無窮多解的存在性)。同樣值得注意的是,k = d 是滿足 ax + by = k 有一個關(guān)于 x 和 y 的解的最小正整數(shù)。?


指定 a 和 b,我們可以通過遞歸或迭代的方式實(shí)現(xiàn)擴(kuò)展的歐幾里得算法來求解滿足等式 ax + by = d 的 x 和 y。


延伸閱讀:GCD、Bezout's Identity、Euclid's Algorithm、Extended Euclid's Algorithm


4、整數(shù)因式分解


整數(shù)因子分解的最常用的算法是?Eratosthenes 篩選法。在分解N時,將質(zhì)數(shù)掃描到 sqrt(N)就足夠了。另外,如果我們需要對 1 到 N 之間的所有數(shù)字進(jìn)行因式分解,則可以使用該算法的單次運(yùn)行來完成此任務(wù) - 對于 1 到 N 之間的每個整數(shù) k ,我們可以保持一對映射——整除 k 的最小質(zhì)數(shù)、最大倍數(shù),(p,a)。k 的剩余質(zhì)因子與 k/(pa) 的相似。


延伸閱讀:wikipedia、?interactive animation


5、線性同余方程組


形如ax≡b (mod n)的方程式(x是未知數(shù))稱為線性同余。當(dāng)且僅當(dāng)存在整數(shù)x使得n | (ax-b)成立時,這樣的方程組將有一個解,即ax -b = ny,y是整數(shù),換句話說,ax + n(-y)= b。我們已經(jīng)從Bezout的等式中得知,像這樣的線性不定方程將只有在(a,n)的gcd(假設(shè)該值為d)整除b時才有解。在這種情況下,讓b = dd',a = da',n = dn',所以我們有:


da'x + dn'( - y)= dd',其中g(shù)cd(a',n')= 1
帶入變量d
a'x + n'( - y)= d'。
由于gcd(a',n') = 1,現(xiàn)在我們可以使用擴(kuò)展的歐幾里德的算法來找到a'x + n'( - y)= 1的解,然后將該解乘以d'得到對于a'x + n'( - y)= d'的解。

注意,如果ax≡b(mod n)有一個解,則mod(n / d)有且僅有一個解。如果這個解是用x0表示的,那么mod n將恰好有d個解,由x0 + kn/d給出,其中0<= k<d。在關(guān)于二次方程的教程中詳細(xì)討論了這一點(diǎn)。


延伸閱讀:Linear Congruence Theorem、Solving Linear Congruences


6、中國剩余定理


典型的問題形式是“尋找一個數(shù),除以2余1,除以3余2,除以7余5”其余各項(xiàng)可以被推廣為一元線性同余方程組之后可以使用中國剩余定理來解決。舉個例子,下面的問題可以被表示為三個線性同余式:“x ≡ 1 (mod 2), x ≡ 2 mod(3), x ≡ 5 mod (7)”

也就是一元線性同余式方程組:
x ≡ a1 (mod n1)
x ≡ a2 (mod n2)
x ≡ a3 (mod n3)
....
x ≡ ak (mod nk)

假設(shè)整數(shù)ni,nj兩兩互質(zhì),則對任意的n=n1n2...nk,方程組有解

對于任意的i,當(dāng)0 <= di?< ni,令ci=n/ni,令di為同余式cix=1(mod ni)的解(這個解法可以在利用擴(kuò)展的歐幾里德算法)。上面的線性方程組的通解可以給出為:

c = a1c1d1 + a2c2d2 + ... + akckdk


中國剩余定理的直接推論如下:假設(shè) n = p1a1 * p2a2 * .... * pkak 為 n 的素因子分解。 那么,對于任何整數(shù) a 和 b,我們對于每個 i 都有?a = b (mod n) iff a = b (mod piai?)?。


討論一下?Ni 的不一定都是兩兩互質(zhì)的中國剩余定理的推廣,如下 - 線性同余系統(tǒng)

x≡a1(mod n1)
x≡a2(mod n2)
x≡a3(mod n3)
....
x≡ak(mod nk)


有解,當(dāng)對于每個?i != j?都有?iff gcd(ni,nj) 除?(ai-aj) ,且存在唯一解?mod n,其中 n 是 n1,n2 ... nk 的最小公倍數(shù)


進(jìn)一步閱讀:中國剩余定理,求解線性同余,小程序


7、二次方一致性


給定 q 和 n,如果等式 x2≡q(mod n) 具有解,則 q 稱為二次殘差的模 n。如果該方程不具有解,則q被稱為“二次非殘差”。例如,x2≡9(mod 15)具有解 x = 12,因此 9 是模 15 的二次余數(shù)。另一方面,等式 x2≡11(mod 15)沒有解,因此 11 是二次非殘差,為了簡單起見,如果一個正方形可以取一些正整數(shù) n 的形式(nk + q),則整數(shù) q 是模 n 的二次余數(shù)。


發(fā)現(xiàn)具有質(zhì)數(shù)模的二次一致性是否具有一個解,是有些容易的:x2≡a(mod p)只有在(p-1)/ 2 = 1(mod p)時才具有解。 在這種情況下,可以使用 Shank-Tonelli 算法來獲得解決方案。


延伸閱讀:?二次殘差、二次互反性、模擬、Shank-Tonelli算法、E4手冊


8、歐拉 Phi 函數(shù)、除數(shù)函數(shù)、約數(shù)和、Mobius 函數(shù)


歐拉的?Phi 函數(shù)?(又稱為常數(shù)函數(shù),由φ表示)是自然數(shù)的函數(shù),給出與相應(yīng)的自然數(shù)互質(zhì)的正整數(shù)的數(shù)目。因此,φ(8) = 4,?φ(9) = 6 等。 該函數(shù)的以下屬性值得注意:


a)?如果 p 是素數(shù),則?φ(pk) = (p-1)pk-1?

b)?φ?函數(shù)是乘法的,即如果 if (a,b) = 1?則?φ(ab) =?φ(a)φ(b)。?

c)?φ(n) 的值可以通過歐拉公式獲得:令 n = p1a1?* p2a2?* .... * pkak?是 n 的素因子分解。則


  • φ(n) = n * (1- 1/p1)) * (1- 1/p2)) * ... * (1- 1/pk))


d) 以編程方式,如果我們欲求 1 到 n 的?φ?, 那么我們可以非常好地使用篩選算法連同?φ 的乘法性質(zhì)。中心思想是:如果 n 是素數(shù),則?φ(n) = n-1。否則,如果 n 是素數(shù)的冪,例如 n= pk,則?φ(n) = (p-1)pk-1。否則,對于某個素數(shù)p,令 n=pk*q?。使用乘法屬性,?我們有?φ(n) =?φ(pk)φ(q)


φ(n) 的兩個重要屬性:


i. aφ(n)?≡?1 (mod n)?每當(dāng) (a,n) = 1。 具體來說, 對于素數(shù)p,如果 p?不能整除 a,則 ap-1?≡?1 (mod p)。 這種特化也被稱為費(fèi)馬小定理。


ii.?令 d1, d2, ...dk?為 n 的所有除數(shù)(包括 n)。則?φ(d1) +?φ(d2) + ... +?φ(dk) = n
例如,18的除數(shù)是1、2、3、6、9?和 18。觀察到?φ(1) +?φ(2) +?φ(3) +?φ(6) +?φ(9) +?φ(18) = 1 + 1 + 2 + 2 + 6 + 6 = 18

除數(shù)函數(shù),表示為 d(n),給出了一個自然數(shù)的除數(shù)的數(shù)目。例如,d(18) = 6。類似地,除數(shù)函數(shù)之和,表示為?σ(n),給出了 n 的除數(shù)的和。 因此,σ(18) = 1+2+3+6+9+18 = 39。關(guān)于這兩個函數(shù)以下屬性毫無價值:

a)?如果 p 是素數(shù),則 d(p) = 2。另外, d(pk) = k+1,?并且?σ(p) = p+1

b)?如果 n 是兩個不同的素數(shù)的乘積,假使 n = pq,?則?σ(n) = n+1+(p+q)。另外觀察到這種情況:φ(n) = n+1-(p+q)。


c) 一般來說,令 n = p1a1?* p2a2?* .... * pkak?。則 d(n) = (a1+1) * (a2+1) * ... (ak + 1),并且?σ(n) 由以下乘積給出:


  • σ(n) = ( (p1(a1+1) - 1) / (p1-1) ) * ( (p2(a2+1) - 1) / (p2-1) ) * ... * ( (pk(ak+1) - 1) / (pk-1) )?


如果?σ(n) =2n,則 n 被稱為“完全數(shù)”。換句話說,?完全數(shù)的真因子(即除了自身以外的除數(shù))的和恰好等于它本身。


mobius函數(shù)μ(n)?在所有正整數(shù)中定義如下:


  • 在 n 是非平方數(shù)(即 n 是不能被任意整數(shù)平方得到)并且 n 有偶數(shù)個不同的素數(shù)因子,則 μ(n) = 1

  • 在 n 是非平方數(shù)(即 n 是不能被任意整數(shù)平方得到)并且?n 具有奇數(shù)個不同素數(shù)因子,則μ(n) = -1


在 n 是平方數(shù),即 n 是某個整數(shù)的平方,則?μ(n) = 0?

Mobius 函數(shù)是乘法分配性的,即 a 和 b 互為質(zhì)數(shù),則 μ(ab) =?μ(a)*μ(b).

計算歐拉方程函數(shù)的一個有用公式可以用 mobius 函數(shù)給出:令 d1,d2,... dk 為 n 的所有除數(shù)。然后


φ(n) = (d1?* mu (n/d1) ) + (d2?*?μ(n/d2) ) + .... + (dk?*?μ(n/dk) )

這也可以寫成:

φ(n) = (μ(d1)?*? (n/d1) ) + (μ(d2)?*?(n/d2) ) + .... + (μ(dk)?*?(n/dk) )


使用篩選法計算 phi[n] 的 Java 實(shí)現(xiàn)如下:

//read/get n
int phi[] = new int[n+1]; ? for(int i=2; i <= n; i++) phi[i] = i; //phi[1] is 0 ?
for(int i=2; i <= n; i++) ? if( phi[i] == i ) ? for(int j=i; j <= n; j += i ) ? phi[j] = (phi[j]/i)*(i-1);

階乘


階乘是非常重要的。N 的階乘定義如下:N = (N)*(N-1)*(N-2)*(N-3)...1。在計算 nPr nCr 時需要使用階乘。他們像這里描述的那樣很快變得非常大,所以他們需要非常仔細(xì)的處理大數(shù)、大整數(shù)表示等。


延伸閱讀:歐拉的 Totient 函數(shù)、除數(shù)函數(shù)、除數(shù)和總和、Mobius函數(shù)

到此我們完成了對基本數(shù)理論概念的討論。對于那些對數(shù)理論感興趣的人,這里有一些值得一讀的書——


An introduction to the theory of numbers:?by Niven, Zukerman and Montgomery (數(shù)論導(dǎo)論)

Elementary Number Theory?:?by David Burton (數(shù)論基礎(chǔ))


整數(shù)序列


流行的整數(shù)序列有很多。它們中的許多都基于遞歸關(guān)系。主要的定理被廣泛用于了解其復(fù)雜性,邊界與循環(huán)的關(guān)系。很多流行的整數(shù)序列,例如:費(fèi)布那切數(shù)列,魯卡斯數(shù)字,?斯特恩雙原子數(shù)字,?懶卡特數(shù)字,?帕多萬數(shù)字?還有多邊形數(shù)字,諸如?五角形數(shù)字,?六角形數(shù)字。


對數(shù)論的介紹:哈迪和賴特

初等數(shù)論:?瓊斯和瓊斯

數(shù)學(xué)誘導(dǎo) - 一種技術(shù)教程,經(jīng)常用于離散空間的證明。

具有數(shù)學(xué)歸納原理的問題和解決方案的教程。


來自:開源中國社區(qū)

鏈接:https://www.oschina.net/translate/tutorial-number-theory

原文:https://www.codechef.com/wiki/tutorial-number-theory/


總結(jié)

以上是生活随笔為你收集整理的每个程序员都应该知道的基础数论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。