歐拉函數,歐拉定理(費馬小定理),擴展歐拉定理的證明和應用——楊子曰數學
超鏈接:數學合集
瞎BB:破紀錄,最長的博客名!(英文題目除外)
先做個預告:
在文章的最後我們要解決一個灰常玄學的問題:求aaaa⋅⋅⋅mod p(無窮多個a)
一、歐拉函數
1.它是啥
φ(n):就是小於等於n的數中與n互質的數的個數
2.性質一:歐拉函數是積性的
就是φ(n∗m)=φ(n)∗φ(m) (條件:m,n互質)
爲什麼捏?
我們不妨假設小於m的數中於m互質的數爲:x1,x2,x3...xφ(m),我們給它取個名字叫做m的簡化剩餘系
我們不妨假設小於n的數中於n互質的數爲:y1,y2,y3...yφ(n),我們給它取個名字叫做n的簡化剩餘系
你會發現我們如果能證明好下面三個事情就得證了:
- gcd(xi∗n+yj∗m,mn)=1,也就是這小於mn的數中與mn互質的數可以從m的簡化剩餘系裏選一個n的簡化剩餘系選一個用(xi∗n+yj∗m)mod mn算出來,我們要φ(n∗m)個數,有φ(n)∗φ(m)種選法
- 這樣選出來的φ(n)∗φ(m)個數沒有重複
- 這樣選出來的φ(n)∗φ(m)個數沒有少
一個一個慢慢來:
①gcd(xi∗n+yj∗m,mn)=1
首先我們從gcd(xi,m)=1開始
n和m互質,So,我們給x乘一個n等式依然成立
gcd(xi∗n,m)=1
然後我們在給xi∗n加上一個m的倍數yj∗m,等式依然成立
gcd(xi∗n+yj∗m,m)=1⋯①
同理(對稱一下),我們也可以得到:
gcd(yj∗m+xi∗n,n)=1⋯②
①和②放在一起看,你會發現:xi∗n+yj∗m又和m互質,又和n互質,那麼和mn也一定互質:
gcd(xi∗n+yj∗m,mn)=1
得證
②這樣選出來的φ(n)∗φ(m)個數沒有重複
也就是任意的xi∗n+yj∗m模mn都不同餘
那麼我們能不能這樣來:如果我們能通過:xi∗n+yj∗m≡xp∗n+yq∗m(mod mn)推出i=p,j=k的話這個部分就得證了
那我們就來試試看唄:
xi∗n+yj∗m≡xp∗n+yq∗m(mod mn)
模mn下同餘,那麼在模m下也同餘
xi∗n+yj∗m≡xp∗n+yq∗m(mod m)
yj∗m和yq∗m都是m的倍數,模m都是0,So,扔掉也無所謂:
xi∗n≡xp∗n(mod m)
同餘號兩邊同時除掉一個n:
xi≡xp(mod m)
m的簡化剩餘系中的數都互不相等
哦,那不就是i=p了嗎!
同理j=q,得證!
③這樣選出來的φ(n)∗φ(m)個數沒有少
設 z 是mn的簡化剩餘系的集合的任意某個元素,那麼我們現在就是要證明z一定能用xi∗n+yj∗m表示,黑喂狗:
我們都知道m∗x0+n∗y0=gcd(m,n)一定有關於x0,y0的整數解
(有人問爲什麼嗎?貝祖定理←自己瞧)
然後我們還知道:gcd(m,n)=1,So,一定存在整數x0,y0使得m∗x0+n∗y0=1 ,然後同時乘個z,於是我們得到了:
m∗x0∗z+n∗y0∗z=z
也就是一定存在整數x,y,滿足:m∗x+n∗y=z
然後我們把gcd(z,mn)=1裏的z帶掉,得到了:
gcd(m∗x+n∗y,mn)=1
那麼下面這個也一定成立:
gcd(m∗x+n∗y,m)=1
m∗x是m的倍數,So,m∗x對這兩個東西的互質毫無貢獻,於是乎我們又得到了:
gcd(n∗y,m)=1
有沒有發現n和m是互質的,然後我們就美滋滋地得到了:
gcd(y,m)=1
然後咱們再用一下歐幾里得算法(戳我):
gcd(m,y mod m)=1
也就是說y mod m是一個小於m且和m互質的數,有沒有發現它一定在m的簡化剩餘系的簡化剩餘系裏(←它的定義就是這樣的呀)
然後我們就開心地得到了:
y≡xi(mod m)
我們再把整個式子都乘個n,我們就有了:
n∗y≡n∗xi(mod nm)⋯①
同理,我們還有:
m∗x≡m∗yj(mod nm)⋯②
最後把①②咔嚓一加:
m∗x+n∗y≡n∗xi+m∗yi(mod nm)
就是:
z≡n∗xi+m∗yi(mod nm)
完美得證!
至此我們終於得到了,歐拉函數的積性o( ̄▽ ̄)ブ
3.性質二:p是質數時:φ(pk)=(p−1)∗pk−1
已知小於pk的正整數的有pk−1個,其中和pk不互質的正整數有p×1,p×2,...,p×(pk−1−1),共計pk−1−1個
so, φ(pk)=pk−1−(pk−1−1)=pk−pk−1=(p−1)∗pk−1
4.怎麼求捏?
我們就來根據性質一和性質二來推導一下:
我們先分解一下質因數:
φ(n)=φ(p1k1∗p2k2∗p3k3∗⋯∗psks)
然後再由它的積性,我們得到了:
φ(n)=φ(p1k1)∗φ(p2k2)∗φ(p3k3)∗⋯∗φ(psks)
然後性質2搞一搞:
φ(n)=(p1k1−1∗p2k2−1∗p3k3−1∗⋯∗psks−1)∗(p1−1)∗(p2−1)∗(p3−1)∗⋯∗(ps−1)
從右邊的每個小括號裏拿出一個pi乘到左邊的括號中,我們得到了:
φ(n)=(p1k1∗p2k2∗p3k3∗⋯∗psks)∗(1−p11)∗(1−p21)∗(1−p31)∗⋯∗(1−ps1)
也就是說,我們得到了φ(n)的通項公式:
φ(n)=n∗(1−p11)∗(1−p21)∗(1−p31)∗⋯∗(1−ps1)
複雜度O(n)
求歐拉函數還有一種線性篩的做法(戳我)
我們馬上進入歐拉定理
二、歐拉定理
1.它是啥?
先上個歐拉定理(條件是a和n互質):
aφ(n)≡1(mod n)
2.它爲啥?
黑喂狗:
我們不妨假設小於n的數中於n互質的數爲:x1,x2,x3...xφ(n),我們給它取個名字叫做集合X(這個X其實就是n的簡化剩餘系)
然後我們再分別令:
⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧m1m2m3⋮mφ(n)=a∗x1=a∗x2=a∗x3=a∗xφ(n)
我們管這個m的序列叫集合M
有了集合X和集合M,我們就可以開始了
不過在開始前,我們先要證明兩件事情:
- M中任意兩個數都不模n同餘
- M中的數模n得到的數都與n互質
一個一個來:
①M中任意兩個數都不模n同餘
我們用反證法
假設集合M中有mi和mj兩個數模n同餘
即:mi≡mj(mod n)
也就是:mi−mj≡0(mod n)
代入一下:a∗xi−a∗xj≡0(mod n)
a∗(xi−xj)≡0(mod n)
我們都知道a和n互質(大條件),So:
xi−xj≡0(mod n)
我們都知道xi和xj都是小於n的不同數,所以xi−xj一定大於0小於n,So上面那個式子怎麼可能成立
得證!
②M中的數模n得到的數都與n互質
這個比較easy
我們知道:mi=a∗xi,這個式子裏a與n互質,xi與n互質,然後你就會發現mi也和n互質,然後歐幾里得算法搞一下:
gcd(mi,n)=gcd(n,mi mod n)=1
完美,得證!
然後咱們正式開始:
由我們在上面得到的第二條可以得到:mi mod n出來的一定是一個小於n而且和n互質的數,So,mi mod n這個數一定在集合X裏(集合X的定義就是這樣的呀!)
有根據第一條集合M中的每個mi mod n得到的數都不相同,So,你有沒有發現集合M中這每個mi mod n與集合X中的每個xi一 一對應相等
於是我們就得到了:
m1∗m2∗m3∗⋯∗mφ(n)≡x1∗x2∗x3∗⋯∗xφ(n)(mod n)
代入一下:
a∗x1∗a∗x2∗a∗x3∗⋯∗a∗xφ(n)≡x1∗x2∗x3∗⋯∗xφ(n)(mod n)
aφ(n)∗(x1∗x2∗x3∗⋯∗xφ(n))≡x1∗x2∗x3∗⋯∗xφ(n)(mod n)
哦,移過去:
(aφ(n)−1)∗(x1∗x2∗x3∗⋯∗xφ(n))≡0(mod n)
美滋滋,集合X中的所有數都與n互質,於是乎:
aφ(n)−1≡0(mod n)
aφ(n)≡1(mod n)
得證
到這裏,你一定會問了——“這玩意什麼用捏?”
“沒用”
“…”
"BUT,我們把歐拉定理轉換一下就有用了"
3.它能幹啥?
主要可以做兩件事情:
- 轉換成費馬小定理後,進行素數檢測(就是給你一個數說出它是不是素數)
- 轉換成費馬小定理後求逆元(戳我)
- 轉換成擴展歐拉定理以後,歐拉降冪算abmod p(這不是快速冪搞搞不就好了,戳這裏就老實了)
咱們一件一件說:
4.費馬小定理
當p是質數時:ap−1≡1(mod p)
這……
不就是歐拉定理的特殊情況嗎?
你可不要小看這個東西,他可以告訴你n是不是一個質數
“哦哦,我知道了,隨便找一個小於n的數a,然後代入到費馬小定理裏面,看看是不是同餘就可以了”
沒錯,就是這樣,但是有一個很尷尬的事情:p爲質數是費馬小定理的充分不必要條件!
也就是說,對於2<=a<p,素數p一定滿足費馬小定理
對於一個a,滿足費馬小定理的p可能是合數可能是素數
不滿足費馬小定理一定是合數
“哦,什麼垃圾算法,居然有概率是錯的”
那你多找幾個a不久好了,又要拼rp,美滋滋!
(一般還是不要用這個算法)
int check_prime(int n){
if (n==1) return 0;
if (n==2) return 1;
for (int i=1;i<=20;i++){
int tmp=rand()%(n-2)+2;
if (pow(tmp,n-1,n)!=1) return 0;
}
return 1;
}
大家還可以去學習一種更加nb的素數檢驗方法——米勒拉賓素數測試
5.擴展歐拉定理
在講擴展歐拉定理之前,先試試這個:口算7555 mod 13
相信機智的大佬們一定有所想法,7和13互質φ(13)=12,那我們就要湊712:
7555=712∗46+3=(712)46∗73
於是乎,就可以使用歐拉定理了
(712)46∗73≡146∗73(mod 13)
那我們就只需要算一算73 mod 13就好了,得到答案5
於是有沒有發現我們似乎得到了一個定理:
ab≡ab mod φ(n)(mod n)
BUT,它只有在a和p互質的時才成立,沒啥卵用,我們能不能把它拓展到一般情況捏?
於是,我們得到了擴展歐拉定理:
ab≡ab mod φ(n)+φ(n)(mod n)
證明走起:
我們先把a分解一下質因數:a=p1r1∗p2r2∗p3r3∗⋯∗psrs
如果我們可以證明:對於裏面的每個質數pi,我們都能證明:
pib≡pib mod φ(n)+φ(n)(mod n)
那麼也就是我們一定可以得到:
(piki)b≡(piki)b mod φ(n)+φ(n)(mod n)
然後我們把每個(piki)b乘起來,就得到了:
(p1r1∗p2r2∗p3r3∗⋯∗psrs)b≡(p1r1∗p2r2∗p3r3∗⋯∗psrs)b mod φ(n)+φ(n)(mod n)
也就是我們要證明的:
ab≡ab mod φ(n)+φ(n)(mod n)
那現在我們就開始證明:pb≡pb mod φ(n)+φ(n)(mod n)(p是一個質數)
p是一個質數,So,如果n不是p的倍數,那麼n和p一定互質,顯然成立,就是我們上面自己推出來的那個式子右邊多乘了一個pφ(n)
而pφ(n) mod n=1(歐拉定理),So,等式當然成立
那麼我們現在就來考慮n是p的倍數的情況:
假設:n=pk∗s(s和p互質)
由於s和p的互質,我們就可以歐拉定理了:
pφ(s)≡1(mod s)
這個式子也顯然成立:
(pφ(s))φ(pk)≡1(mod s)
上面已經說過了,歐拉函數是積性函數,又因爲pk和s互質,So:
φ(n)=φ(pk)∗φ(s)
於是我們就得到了:
pφ(n)≡1(mod s)⋯①(這個式子下面還要用)
又因爲:
pb=(pφ(n))⌊b/φ(n)⌋∗pb mod φ(n)
還因爲:
(pφ(n))⌊b/φ(n)⌋ mod s=1(看①式)
我們得到了:
pb≡pb mod φ(n)(mod s)
我們再把整個式子乘pk,得到:
pb+k≡pb mod φ(n)+k(mod s∗pk)
pb+k≡pb mod φ(n)+k(mod n)
如果,我們把左右兩邊同時乘pφ(n)−k,你就會驚悚地發現:
pb+φ(n)≡pb mod φ(n)+φ(n)(mod n)⋯②
已經非常接近答案了,我們在把①乘pk,得到了:
pφ(n)+k≡pk(mod pk∗s)
pφ(n)+k≡pk(mod n)⋯③
然後我們有這樣的等式:
pb≡pb−k∗pk(mod n)
然後根據③把pk用pφ(n)+k帶掉,我們有了:
pb≡pb+φ(n)(mod n)
最後把這個式子帶回②的左邊:
pb≡pb mod φ(n)+φ(n)(mod n)
哦,我們得證了!
接下來我來解答文章開頭的那個問題:
求aaaa⋅⋅⋅mod p(無窮多個a)
我們不妨令x=aaaa⋅⋅⋅
那麼我們現在就是要求x mod p
然後你會發現x這個數有一個很神奇但很好理解的性質:x=ax
So,我們現在要求:ax mod p
哦,有沒有發現可以用拓展歐拉定理了!
於是我們得到了:
ax≡ax mod φ(p)+φ(p)(mod p)
然後問題就轉化爲求等式右邊那個東西,想要求出這個東西,就是要求出——x mod φ(p)
哦,有沒有發現問題變回了開始的樣子,只不過p變成了φ(p),我們在繼續試試:
這時x依然等於ax
根據歐拉定理:
ax≡ax mod φ(φ(p))+φ(φ(p))(mod φ(p))
此時,我們就要求的就是x mod φ(φ(p))了
p不停地變φ(p),顯然是不斷減小的
顯然這是一個遞歸的過程,那麼到什麼時候結束捏?
——當p=1的時候,顯然所有的數模1都是0,然後再回溯上去
OK,完事
如果想要嘗試這道題,你可以戳我(略有區別,它的a永遠等於2)
參考:
https://www.cnblogs.com/wangxiaodai/p/9758242.html
https://blog.csdn.net/qq9764312/article/details/79616041
https://zhuanlan.zhihu.com/p/31510871
https://blog.csdn.net/hzj1054689699/article/details/80693756
https://blog.csdn.net/summonlight/article/details/51967425
https://www.cnblogs.com/handsomecui/p/4755455.html
於HG機房&TJQ高層小區