數論——算數基本定理、歐幾里得算法、丟番圖方程

整除

【定義】 對於a,b \in Z,若是有q \in Z使得aq=b,則稱a整除b,記爲a|b.ios

關於整除有以下結論:算法

  • c=k_1a+k_2be|a,且e|b,則e|c.

最大公因子

【定義】 全部同時整除ab的整數中,最大的那個,稱爲ab的最大公因子,記爲 (a,b),也可記爲gcd(a,b).函數

【引理】 設a=bq+c,這裏a,b,c,q\in Z,則(a,b)=(b,c).測試

證實:因爲a=bq+c,全部bc的公因子同時整除bc ,因此也能整除a,因此也是ab的公因子。因爲c=a-bq,全部ab的公因子同時整除ab ,因此也能整除c,因此也是bc的公因子。也就是說,ab的公因子,bc的公因子是同一撥,那麼ab的公因子中最大的那個,bc的公因子中最大的那個 固然是同一個了。 因此(a,b)=(b,c)ui

歐幾里得算法

歐幾里德算法又稱展轉相除法,是指用於計算兩個正整數ab的最大公因子。證實過程主要依據上面的引理(a,b)=(b,c)spa

代碼實現以下:code

#include<algorithm>
#include<iostream>

/* 歐幾里德算法:展轉求餘 原理: gcd(a,b)=gcd(b,a mod b) 當b爲0時,兩數的最大公約數即爲a */
int gcd(int a, int b){
    if (a < b){
        std::swap(a, b);
    }
    if (0 == b){
        return a;
    }else{
        return gcd(b, a % b);
    }
}

// 簡單測試
int main() {
    int t = gcd(10,25);
    std::cout<<t;
}
複製代碼

擴展歐幾里得算法

【定義】 對於a_1,\cdots,a_n\in Z,咱們稱a_1x_1+ \cdots + a_nx_n(x_1,\cdots,x_n\in Z)a_1,\cdots,a_n的整係數線性組合,並用a_1Z+\cdots+a_nZ表示它們構成的集合。數學

【擴展歐幾里得算法】 設ab是兩個正整數(至少有一個非零),d=gcd(a,b),則存在整數xy使得ax+by=d成立,若是ab都是素數,那麼存在整數xy使得ax+by=1成立。string

代碼實現:it

def egcd(a,b):
    if 0 == b:
        return a,1,0
    gcd,k1,k2 = egcd(b, a%b)
    return gcd,k2,k1-a/b*k2
複製代碼

互素

最大公因子的最小可能取值是1,當(a,b)=1ab的最大公因子爲1時,咱們稱ab互素。

乘法逆元

(a,b)=1時,有時候咱們很但願求得一個數k0\leq k \lt b,使ka\ mod\ b=1 ,這樣的數咱們稱爲a的乘法逆元, 這看起來就像是在0b-1這些整數中找到 a的倒數同樣。那怎麼找到這樣的數呢?

擴展歐幾里得算法能夠幫咱們解決這個問題。

因爲(a,b)=1,根據擴展歐幾里得算法,可求得兩個係數k_1k_2,使得k_1a+k_2b=(a,b)=1,因此有k_1a=-k_2b+1,因此k_1a\ mod\ b=1 ,因此(k_1\ mod\ b)a\ mod\ b=1,而0\leq(k_1\ mod\ b)\lt b,因此(k_1\ mod\ b)就是咱們想要的那個乘法逆元。

算數基本定理

【算數基本定理(整數的惟一分解定理)】任何大於1的整數n可表示成有限個(可重複)素數的乘積,並且不計乘積中因子順序時分解仍是惟一的。

根據算數基本定理,大於1的整數n惟一地表示成p_1^{a_1}\cdot \cdots \cdot p_r^{a_r}的形式,這裏p_1<\cdots<p_r爲不一樣素數,a_1,\cdots,a_r\in{Z^{+}},咱們稱這樣的形式爲n的標準(素數)分解式。

歐拉函數

對任意一個正整數n,在1n的這 個整數裏,顯然有些和n是互素的,而有些和n是不互素的,那些和n互素的整數 的數量就是n的歐拉函數,記做\phi(n)

那麼\phi(n)該怎麼計算呢?

咱們都知道任意整數n均可以表示成它的全部素因子的乘積:

n=p_1^{l_1}p_2^{l_2}\cdots p_s^{l_s}\tag{1}

因此全部那些和n不互素的數,必定和n有其中某個素因子做爲公共因子。因此咱們只要從1n中的全部整數中,是p_1,p_2,\cdots,p_s的倍數的依次剔除,剩下的就是與n互素的數。

例如,p_1的倍數一共有多少個呢,因爲p_1的倍數在1n中是均勻分佈的,因此佔據的比例是\frac{1}{p_1},剔除p_1的倍數後,還剩下n(1-\frac{1}{p_1})個;在剩下的數中,因爲p_2的倍數在1n中也是均勻分佈的,因此佔據的比例是\frac{1}{p_1},因此再剔除 p_2的倍數後,剩下n(1-\frac{1}{p_1})(1-\frac{1}{p_2})個。以此類推,當把全部素因子的整數倍都剔除後,剩下的數共有n(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdots (1-\frac{1}{p_s})個。即:\phi(n) = n\prod_{i=1}^{s}(1-\frac{1}{p_s}) \tag{2}$

因而可知,求歐拉函數的關鍵在於求出n的全部素因子,即對n作素因子分解。

有一種特殊狀況,n爲素數,那麼n 僅有一個素因子,即它本身。此時\phi(n)=n(1-\frac{1}{n})=n-1

還有一種特殊狀況,n僅有兩個素因子,即n=pq,那麼\phi(n)=pq(1-\frac{1}{p})(1-\frac{1}{q})=(p-1)(q-1)。若是已知pq,顯然\phi(n)是好求的;而若是僅知道n,而不知道pq,那麼必需要先對n作素因子分解,獲得pq,才能求得\phi(n)

若是這兩個素因子p,q都極大,那麼固然 n也就極大。要從1nn個數中找出這兩個素因子,就如同大海撈針,複雜度極高。

丟番圖方程

古希臘數學家丟番圖首次系統地研究了方程的整數解問題,如今涉及整數解的方程都叫作丟番圖方程,也叫不定方程。

丟番圖方程,又稱不定方程,是未知數只能使用整數的整數係數多項式等式;即形式如a_1x_1^{b_1} + a_2x_2^{b_2}+\cdots +a_nx_n^{b_n}=c的等式,而且其中全部的a_j,b_jc均是整數。若其中能找到一組整數解m_1,m_2\cdots m_n者則稱之爲有整數解。線性丟番圖方程爲線性整數係數多項式等式,即此多項式爲次數爲01的單項式的和。

【定理】設a_1,\cdots,a_n,b\in Z,則線性丟番圖方程a_1x_1+a_2x_2+\cdots+a_nx_n=b有整數解當且僅當(a_1,\cdots,a_n)|b.

貝祖等式

對任何整數a,bm,關於未知數xy的線性丟番圖方程(稱爲貝祖等式):ax+by=m.有整數解時當且僅當mab的最大公約數d的倍數,即(a,b)|m.

相關文章
相關標籤/搜索