【定義】 對於,若是有
使得
,則稱
整除
,記爲
.ios
關於整除有以下結論:算法
【定義】 全部同時整除和
的整數中,最大的那個,稱爲
和
的最大公因子,記爲
,也可記爲
.函數
【引理】 設,這裏
,則
.測試
證實:因爲
,全部
和
的公因子同時整除
和
,因此也能整除
,因此也是
和
的公因子。因爲
,全部
和
的公因子同時整除
和
,因此也能整除
,因此也是
和
的公因子。也就是說,
和
的公因子,
和
的公因子是同一撥,那麼
和
的公因子中最大的那個,
和
的公因子中最大的那個 固然是同一個了。 因此
。ui
歐幾里德算法又稱展轉相除法,是指用於計算兩個正整數和
的最大公因子。證實過程主要依據上面的引理
。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;
}
複製代碼
【定義】 對於,咱們稱
爲
的整係數線性組合,並用
表示它們構成的集合。數學
【擴展歐幾里得算法】 設和
是兩個正整數(至少有一個非零),
,則存在整數
和
使得
成立,若是
和
都是素數,那麼存在整數
和
使得
成立。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
複製代碼
最大公因子的最小可能取值是,當
,即
和
的最大公因子爲
時,咱們稱
和
互素。
當時,有時候咱們很但願求得一個數
,
,使
,這樣的數咱們稱爲
的乘法逆元, 這看起來就像是在
到
這些整數中找到
的倒數同樣。那怎麼找到這樣的數呢?
擴展歐幾里得算法能夠幫咱們解決這個問題。
因爲,根據擴展歐幾里得算法,可求得兩個係數
和
,使得
,因此有
,因此
,因此
,而
,因此
就是咱們想要的那個乘法逆元。
【算數基本定理(整數的惟一分解定理)】任何大於的整數
可表示成有限個(可重複)素數的乘積,並且不計乘積中因子順序時分解仍是惟一的。
根據算數基本定理,大於的整數
惟一地表示成
的形式,這裏
爲不一樣素數,
,咱們稱這樣的形式爲
的標準(素數)分解式。
對任意一個正整數,在
到
的這 個整數裏,顯然有些和
是互素的,而有些和
是不互素的,那些和
互素的整數 的數量就是
的歐拉函數,記做
。
那麼該怎麼計算呢?
咱們都知道任意整數均可以表示成它的全部素因子的乘積:
因此全部那些和不互素的數,必定和
有其中某個素因子做爲公共因子。因此咱們只要從
到
中的全部整數中,是
的倍數的依次剔除,剩下的就是與
互素的數。
例如,的倍數一共有多少個呢,因爲
的倍數在
到
中是均勻分佈的,因此佔據的比例是
,剔除
的倍數後,還剩下
個;在剩下的數中,因爲
的倍數在
到
中也是均勻分佈的,因此佔據的比例是
,因此再剔除
的倍數後,剩下
個。以此類推,當把全部素因子的整數倍都剔除後,剩下的數共有
個。即:
$
因而可知,求歐拉函數的關鍵在於求出的全部素因子,即對
作素因子分解。
有一種特殊狀況,爲素數,那麼
僅有一個素因子,即它本身。此時
。
還有一種特殊狀況,僅有兩個素因子,即
,那麼
。若是已知
和
,顯然
是好求的;而若是僅知道
,而不知道
和
,那麼必需要先對
作素因子分解,獲得
和
,才能求得
。
若是這兩個素因子都極大,那麼固然
也就極大。要從
到
這
個數中找出這兩個素因子,就如同大海撈針,複雜度極高。
古希臘數學家丟番圖首次系統地研究了方程的整數解問題,如今涉及整數解的方程都叫作丟番圖方程,也叫不定方程。
丟番圖方程,又稱不定方程,是未知數只能使用整數的整數係數多項式等式;即形式如的等式,而且其中全部的
,
和
均是整數。若其中能找到一組整數解
,
者則稱之爲有整數解。線性丟番圖方程爲線性整數係數多項式等式,即此多項式爲次數爲
或
的單項式的和。
【定理】設,則線性丟番圖方程
有整數解當且僅當
.
對任何整數和
,關於未知數
和
的線性丟番圖方程(稱爲貝祖等式):
.有整數解時當且僅當
是
和
的最大公約數
的倍數,即
.