数论应用
算法講解(數論應用)
模線性方程和線性方程組
1)歐幾里得算法(gcd)
運用輾轉相除法求兩個數最大公約數(下方代碼是遞歸的最簡形式
原理來自于 gcd(a, b) = gcd(b , a%b)
2)擴展歐幾里得算法
在接觸擴展歐幾里得算法之前,我們可以先了解一下貝祖定理:
如果a、b是整數,那么一定存在整數x、y使得ax+by=mgcd(a,b)
也就是說面對ax+by=k這個方程,k一定是gcd(a,b)的整數倍
所以我們可以用傳統的歐幾里得算法來探究ax+by=k這個方程是否有解。但是,如果我們還想知道的更多,比如ax+by=k這個方程在有解的情況下解具體是多少的話。就需要用到擴展歐幾里得算法,也就是我們常說的擴展gcd。(這里所說的解是一組通解)
用x和y來表示這一組通解的話(這個地方不懂的建議學習一下不定方程的通解)
x = x + (b/gcd)*t
y = y – (a/gcd)*t
這個地方可能會有兩個問題
1>為什么b/gcd和a/gcd不用b和a代替
b/gcd和a/gcd分別是b,a的因子,最差的情況就是相等,所以/gcd后能取到的解更多
2>問什么b/gcd和a/gcd是最小的取值
因為這兩個數互質,所以這是最小的滿足的值
所以,我們只需要在傳統歐幾里得算法上面進行改進就可以了,這里直接給代碼
int exgcd(int a,int b,int &x,int &y)//擴展歐幾里得算法 {if(b==0){x=1;y=0;return a; //到達遞歸邊界開始向上一層返回}int r=exgcd(b,a%b,x,y);int temp=y; //把x y變成上一層的y=x-(a/b)*y;x=temp;return r; //得到a b的最大公因數 }3)關于同余以及求模線性方程的方法
什么是同余
給定一個正整數m,如果兩個整數a和b滿足(a-b)能夠被m整除,即(a-b)/m得到一個整數,那么就稱整數a與b對模m同余,記作a≡b(mod m)。
求解線性方程
1.當且僅當d|b時,方程ax = b(mod n)有解。d=gcd(a,n)
2.ax = b(mod n) 或者有d個不同解,或者無解。
3.令d=gcd(a,n) 假定對整數x’, y’, 有d = ax’ + ny’, 如果d | b, 則方程ax = b(mod n)有一個解的值為x, 滿足:x=x‘(b/d)(mod n)
4.假設方程ax = b(mod n)有解, x0是方程的任意一個解, 則方程對模n恰有d個不同的解,
分別為:xi = x + i * (n / d), 其中 i = 1,2,3…d - 1
偽代碼以及模板為:
4)線性方程組(高斯消元法解決
模線性方程組:
a11x1 + a12x2 + … + a1nxn = b1 (mod p)
a21x1 + a22x2 + … + a2nxn = b2 (mod p )
…
am1 x1 + am2x2 + … + amnxn = bm (mod p)
求解<x1, x2, …xn> 一般m=n
在講線性方程組之前,根據上面所講的,我們可以直接拿出一種特殊的線性方程組:模線性方程組,這種方程組的解法在常規的線性方程組上多了一個每一步高斯消元取模的步驟,所以這里就用特殊情況來講一般的情況(畢竟一般情況不用取模直接把p省略就可以了,套模板就行)
解決方法:
先求解方程組前兩項。 x=m1k1+a1=m2k2+a2-> m1k1+m2(-k2)=a2-a1
這個方程可以通過歐幾里得求解出最小正整數的k1 則x=m1k1+a1 顯然x為兩個方程的最小正整數解。則這兩個方程的通解為 X=x+kLCM(m1,m2) -> X=x(mod LCM(m1,m2)) 就轉換成了一個形式相同方程了。在通過這個方程和后面的其他方程求解。最終的結果就出來了。
以POJ2891代碼為例:
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<list> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> #include<cmath> #include<bitset> #include<climits> #define MAXN 100000 #define LL long long using namespace std; LL extended_gcd(LL a,LL b,LL &x,LL &y) //返回值為gcd(a,b) {LL ret,tmp;if (b==0){x=1,y=0;return a;}ret=extended_gcd(b,a%b,x,y);tmp=x;x=y;y=tmp-a/b*y;return ret; } int main() {LL N;while (cin>>N){long long a1,m1;long long a2,m2;cin>>a1>>m1;if (N==1)printf("%lld\n",m1);else{bool flag=0;for (int i=2;i<=N;i++){cin>>a2>>m2;if (flag==1) continue;long long x,y;LL ret=extended_gcd(a1,a2,x,y);if ((m2-m1)%ret!=0)flag=1;else{long long ans1=(m2-m1)/ret*x;ans1=ans1%(a2/ret);if (ans1<0) ans1+=(a2/ret);m1=ans1*a1+m1;a1=a1*a2/ret;}}if (!flag)cout<<m1<<endl;elsecout<<-1<<endl;}}return 0; }歐拉函數與歐拉定理
歐拉函數的定義:
在數論中,對于正整數N,少于或等于N ([1,N]),且與N互質的正整數(包括1)的個數,記作φ(n)。φ函數的值:φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))……(1-1/p(n)) 其中p(1),p(2)…p(n)為x的所有質因數;x是正整數; φ(1)=1(唯一和1互質的數,且小于等于1)。注意:每種質因數只有一個。
例如:
歐拉函數的性質:
(1) pk型歐拉函數:
若N是質數p(即N=p), φ(n)= φ( p)=p-p(k-1)=p-1。
若N是質數p的k次冪(即N=pk),φ(n)=pk-p(k-1)=(p-1)p(k-1)。
(2)mn型歐拉函數:
設n為正整數,以φ(n)表示不超過n且與n互素的正整數的個數,稱為n的歐拉函數值。若m,n互質,φ(mn)=(m-1)(n-1)=φ(m)φ(n)。
(3)特殊性質:
若n為奇數時,φ(2n)=φ(n)。
對于任何兩個互質 的正整數a,n(n>2)有:aφ(n)=1 mod n (恒等于)此公式即 歐拉定理。
當n=p 且 a與素數p互質(即:gcd(a,p)=1)則上式有: a(p-1)=1 mod n (恒等于)此公式即 費馬小定理。
歐拉函數相關的證明:
(1)pk型的歐拉函數的證明:
對于給定的一個素數p: φ( p)=p-1 那么容易證明φ(n)=pk-p(k-1)
已知少于或等于pk的正整數的個數為pk-1,其中和pk不互質的正整數有{ p×1,p×2,…,p×(p(k-1)-1)},共計p(k-1)-1個
故: φ(n) = pk-1-(p(k-1)-1)=pk-p(k-1)。
(2) mn型的歐拉函數的證明:
因為:x=mn m與n互質(即:gcd(m,n)=1);
根據中國剩余定理Z(x)和Z(m)×Z(n)之間存在一一映射,所以x的完全余數集(見下面參考)中的元素的個數Z(x)等于Z(m)×Z(n)元素的個數;而Z(m)×Z(n)= φ(m)φ(n)
故有: φ(mn) =φ(m)φ(n) 成立。
(3)任意正整數的歐拉函數的相關證明:
任意一個整數n都可以表示為其質因子的乘積:
n=(p(1)*k(1))*(p(2)*k(2)) *(p(3)*k(3))…(p(i)*k(i))…(p(I)*k(I)) 其中I為n的質因子的個數。
根據(1)(2)的結論,很容易得出它的歐拉函數為:
φ(n)=n(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))……(1-1/p(i)) 其中I為n 的質因子的個數。
對于任意n>2,2|φ(n) 必定存在 p(i)-1是偶數
歐拉定理的相關證明:
(1) 令Z(n)={ X(1),X(2),…,X(φ(n)) }
S={ a*X(1) mod n, a*X(2) mod n ,…,a*X(φ(n)) mod n },則 Z(n)=S。
(2)因為a與n互質(即:gcd(a,n)=1), X(i)(1≤i≤φ(n))與n互質(即:gcd(X(i),n)=1);
所以a*X(i)與n互質(即:gcd(a*X(i),n)=1),故 a*X(i) mod n ∈ Z(n)。
(3)若i≠j,那么 X(i)≠X(j) ,又有a與n互質(即:gcd(a,n)==1),則可得出: a*(X(i)) mod n ≠a*X(j) mod n (消去定律)。
(4) a^(φ(n))*X(1)*X(2)*X(3)*…*X(φ(n)) mod n
=(a*X(1))*(a*X(2))*(a*X(3))*…*(a*X(φ(n))) mod n
=(a*X(1) mod n)*(a*X(2) mod n)*(a*X(3) mod n)*…*(a*X(φ(n)) mod n) mod n
=X(1)*X(2)*X(3)*…*X(φ(n)) mod n。
對比等式左右兩端,因為X(i)(1≤i≤φ(n))與n互質(即:gcd(X(i),n)==1) ,
故: aφ(n)=1 mod n (恒等于)成立。
費馬小定理的相關證明:
若正整數 a與素數p互質,則有a(p-1)=1 mod n(恒等于)
由于φ( p )=p-1 且 aφ(n)=1 mod n ,又有此處的p==n;
故:a(p-1)=1 mod n成立。
此定理可以用來簡化冪的模運算:
例如: 計算 7222的個位數,實際上是求7222被10除的余數。
且7與10互質,φ(10)=1,由歐拉定理知7^4= 1mod 10
故7222=(74)55*(72)=>(155)*(72)=>49=>9 mod 10
歐拉函數的延伸:
于或等于n的數中,與n互質的數的總和為:φ(x)*x/2(n>1)。
完全余數集合:
定義小于 n 且和 n 互質的數構成的集合為 Z(n) ,稱呼這個集合為 n 的完全余數集合。 顯然 |Z(n)| =φ(n) 。
同余定理:
如果 a mod b = c 則有(a+kb) mod b =c(k為非0整數)
如果 a mod b = c 則有(ka) mod b =kc (k為正整數)
(a+b) mod c =((a mod c)+(b mod c )) mod c;
(ab) mod c=((a mod c)(b mod c)) mod c
莫比烏斯反演
學習莫比烏斯反演的前置技能
由于莫比烏斯反演是一兩個公式定理的運用,所以在學習之前,一些數論相關基礎還是必須要掌握的
莫比烏斯反演
掛鏈接莫比烏斯反演.
杜教篩
杜教篩.
min_25篩
min_25篩
總結
- 上一篇: JAVA学习笔记_StringUtil.
- 下一篇: 使用badboy录制脚本 结合Jmete