同余問題1(超詳細!!!)


同余基本概念


 

剩余系


 

歐拉函數

歐拉函數φ(n)表示1~n中所有與n互質的數。比如1~8中與8互質的數有1,3,5,7,所以φ(8)=4。

公式1:如果p是素數,有φ(p)=p-1。 

公式2(積性):如果(a,b)=1,有φ(a*b)=φ(a)*φ(b),

--->以下是公式二的證明過程

設模a的一個簡系為a1,a2,a3,…,aφ(a),模b的一個簡系為b1,b2,b3,…,bφ(b) 現在我們要證明:所有ai∗b+bj∗a(共φ(a)*φ(b)個)組成了模a*b的一個簡系(即φ(a*b)=φ(a)*φ(b))。 判定簡系需要證明下面三點:

  1. (ai∗b+bj∗a,a∗b)=1。

  2. ai∗b+bj∗a≢ak∗b+bt∗a(mod a∗b)(i!=k或j!=t)

  3. 對於任意k滿足(k,a*b)=1,則一定有k≡ai∗b+bj∗a(mod a∗b)(即沒有遺漏)

證明1:  (ai∗b+bj∗a,a∗b)=1。

因為(a,ai)=1,(a,b)=1,所以(a,ai*b)=1,由輾轉相除法可得(a,ai*b+bj*a)=(a,ai*b)=1,同理得(b,ai*b+bj*a)=1。 所以1得證。

證明2:  ai∗b+bj∗a≢ak∗b+bt∗a(mod a∗b)(i!=k或j!=t)

證明3: 對於任意k滿足(k,a*b)=1,則一定有k≡ai∗b+bj∗a(mod a∗b)

所以φ(n)是積性函數(但不是完全積性,因為要滿足(a,b)=1)。 有了這個公式,就可以推得歐拉函數的通項公式。

又因任意兩個p互質(沒有共同質因子),

所以:

公式4:歐拉函數的通項公式


 

求歐拉函數值

1.如果只求φ(n),唯一分解 那么我們就直接將n唯一分解處理出每一個n的素數,然后用通項公式就行了。 效率:O(√n) 

2、如果要求φ(1~n) 用唯一分解就比較慢了,所以我們可以用篩法求出φ(1~n),原理和篩素數是一樣的。普通篩法用到的是通項公式,而線性篩法用到公式1、公式2(積性)和公式3。

普通篩法代碼:

線性篩法代碼:

解釋一下上面代碼make_phi函數里的第一個循環(下圖中的x即循環中的i)

這里附幾道求歐拉函數值的習題:

洛谷 P2303 [SDOi2012]Longge的問題

--->題解

洛谷 P2568 GCD

--->題解


 模運算

【同余的幾個性質】

性質1:a≡a(mod m),(自反性)

性質2:若a≡b(mod m),那么b≡a(mod m)(對稱性)

性質3:若a≡b(mod m),b≡c(mod m)=>a≡c(mod m)(傳遞性)

性質4:若a≡b(mod m),c≡d(mod m),那么a±c≡b±d(mod m)(可加減性)

證明:設a=A+Ka*m,b=A+Kb*m,c=C+Kc*m,d=C+Kd*m則(a±c)%m=(A±C),(b±d)%m=(A±C)即a±c≡b±d(mod m)

性質5:若a≡b(mod m),c≡d(mod m),那么ac≡bd(mod m)(可乘性)

證明:設a=A+Ka*m,b=A+Kb*m,c=C+Kc*m,d=C+Kd*m則ac=( A+Ka*m)( C+Kc*m),bd=( A+Kb*m)( C+Kd*m)所以ac%m=AC bd%m=AC即ac≡bd(mod m)

性質6:若a≡b(mod m),那么an≡bn(mod m)(其中n為自然數)

證明:由性質1和性質5得。

性質7:若ac≡bc(mod m),(c,m)=1,那么a≡b(mod m)

證明:ac≡bc(mod m)=>c(a-b)≡0(mod m)=>c%m*(a-b)%m=0 =>m|c或m|(a-b)又因為(m,c)=1.所以m|(a-b)即a≡b(mod m)

性質8:若a≡b(mod m),那么a^t≡b^t(mod m)

證明:由性質5得。

性質9:若 a≡b(mod m1) a≡b(mod m2)…. a≡b(mod mk) 則 a≡b(mod [m1,m2……mk])

證明:由題意得mi|(a-b) (1<=i<=k)即(a-b)是mi的公倍數,所以[m1,m2……mk]|(a-b)即a≡b(mod [m1,m2……mk])


 

歐拉定理

若正整數a、n互素,有:

消去律:如果 gcd(c,p) = 1 ,則 ac ≡ bc mod p ⇒ a ≡ b mod p 。


 

費馬小定理 

若正整數 a 與素數 p 互質,則有 a^(p-1) ≡ 1 mod p。

證明這個定理非常簡單,由於 φ(p) = p -1,代入歐拉定理即可證明。


 

歐拉定理的推論

 


 

擴展歐幾里得算法

歐幾里得定理,即gcd(a,b)=gcd(b,a mod b)

定理1:如果a、b是不全為0的整數,那么一定存在整數x、y使得ax+by=gcd(a,b)。

對於線性同余方程

可以改寫成ax+ny=b的形式

如何求解 (以下討論a>b):

當 b=0,gcd(a,b)=a。此時 x=1,y=0;(特解)

當a>b>0 時 設 ax1+ by1= gcd(a,b);

bx2+ (a mod b)y2= gcd(b,a mod b);

根據歐幾里德原理有 gcd(a,b) = gcd(b,a mod b);

則:ax1+ by1= bx2+ (a mod b)y2;

即:ax1+ by1= bx2+ (a - [a / b] * b)y2 = ay2+ bx2- [a / b] * by2;

(a mod b = a - [a / b]*b;[a / b]為a整除b) 也就是ax1+ by1 = ay2 + b(x2- [a / b] *y2);

根據恆等定理得:x1=y2;y1=x2- [a / b] *y2;

這樣就得到了求解 x1,y1 的方法:x1,y1 的值基於 x2,y2 :

引理

ax+by = z,z為gcd(a,b)若干倍,求方程的解;

先求解ax+by = gcd(a,b),再將求出的解乘以 z/gcd(a,b)就好了。

 

求得了方程ax+by=gcd的一組特解為x0,y0;

通解

  • 如果a,b互質通解為x=x0+b*t, y=y0-a*t;

  • 如果a,b不互質通解為x=x0+b/gcd*t, y=y0-a/gcd*t;

最小正整數解:X=(x0%(b/gcd)+b/gcd)%(b/gcd);


 

板子題來嘍——

[NOIP2012]同余方程(信息學奧賽一本通 1872)

【題目描述】

求關於 x 的同余方程 ax≡1(modb)  的最小正整數解。

【輸入】

輸入只有一行,包含兩個正整數 a,b,用一個空格隔開。

【輸出】

輸出只有一行,包含一個正整數 x0 ,即最小正整數解。輸入數據保證一定有解。

【輸入樣例】

3 10

【輸出樣例】

7

 

 


 

模意義下乘法的逆元

求逆元

一、使用歐拉定理求逆元(a,m互質)

二、使用擴展歐幾里得求逆元(a,m互質)

同余方程ax≡1(mod m)的最小正整數解即為a的逆元

 

線性求逆元:遞推法

求1~M模M的所有逆元,M為質數。用快速冪一個個求復雜度O(MlogM) 對於1000000以上級別的素數,有更優秀的求逆元算法,遞推式如下:

 

推導過程:設t=M/i , k=M%i

 

對上式兩邊同時除i*k ,進一步得到

再把t,k替換回來,得到

初始化 inv[1]=1 ,這樣就可以通過遞推法求出1~M模素數 M的所有逆元了。


 

練練手——

Sumdiv(信息學奧賽一本通 1633)

【題目描述】

求 AB 的所有約數之和 mod9901。

【輸入】

輸入兩個整數 A,B。

【輸出】

輸出答案 mod9901。

【輸入樣例】

2 3

【輸出樣例】

15

 

 別着急,我的博客后面還有同余問題2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM