(数论六)关于欧拉(定理、公式、函数、降幂)
? 最最開始的時候,我以為歐拉函數,歐拉定理,歐拉公式是一個東西,傻傻分不清。傻笑~
? 后來知道,這完完全全是三種東西!!要說有啥必然的聯系,它們可能都叫歐拉吧~
? 首先,我們來講一下三者的定義:
? 歐拉定理:若n,a為正整數且互質,則a^(Φ(n)) = 1 (mod n)
? 歐拉公式:e^(i✖️x) = cos(x) + i✖️sin(x) (例如把x = π帶進去,得e^(i✖️π) = -1)
? 歐拉函數:Φ(n),用于求1~n中與n互質的個數,若n為質數,那么Φ(n) = n - 1
? 歐拉降冪:我們知道當冪特別大的時候可以用快速冪來求,而當冪大到10^1000時快速冪也求不了了。。這時候就需要用到歐拉降冪,它的定理如下(前提是a,p互質):
? a^b ≡ a^(b % Φ(p) + Φ(p)) (mod p),當x >= p時
? a^b ≡ a^(b % Φ(p)) (mod p),當x < p時
關于歐拉公式在ACM中我還沒有做過相關的題,因此先只講歐拉函數和歐拉降冪,歐拉定理
一.關于歐拉定理沒什么好說的~
? 之前我們說過一嘴費馬小定理:a ^ (p - 1 ) ≡ 1 (mod p)
? 又說過當p為素數時Φ(p) = p - 1,因此歐拉定理實際上是費馬小定理的推廣
二.關于歐拉函數的求解,我們知道n為質數的情況了,若n為合數呢?
? 學到了以下四種求法n的歐拉函數:
? 1.利用容斥原理:
? 我們先找到n的全部質因子,然后利用容斥原理刪掉全部的因子,剩下的就是與n互質的個數
? 例如30 = 2✖️3✖️5
? Φ(30) = 30 - 30 / 2 - 30 / 3 - 30 / 5 + 30 / (2✖️3) + 30 / (2✖️5) + 30 / (3✖️5) - 30 / (2✖️3✖️5)
? = 8
? 2.上面的寫法很麻煩,下面有種簡便的寫法:
? 30 = 30✖️1 / 2 ✖️2 / 3✖️4 / 5 = 8,這樣就能自動容斥啦,時間復雜度是O(sqrt(n))
? 3.埃篩法:
? 是不是很耳熟!!!對,求素數有埃篩和線篩,求歐拉函數也有埃篩和線篩~,埃篩的原理就是利用方法2~,時間復雜度是O(n✖️sqrt(n))
?
? 代碼如下:
void getEuler() {
|
?
? 4.線性篩
? 線性篩,顧名思義就是線性求解1~n的歐拉函數,需用到一下幾個性質:
? 1.當p為素數時,Φ(p) = p - 1;
? 2.當p為素數且i % p ==0時,Φ(i✖️p) = Φ(i)✖️p
? 3.當p為素數且i % p != 0時,Φ(i✖️p) = Φ(i)✖️(p - 1)
? 代碼如下:
ll phi[N + 5]; //存儲歐拉函數 |
三.歐拉降冪:
? 根據 a^b ≡ a^(b % Φ(p) + Φ(p)) (mod p),當x >= p時
? a^b ≡ a^(b % Φ(p)) (mod p),當x < p時
? 我們可以得到以下代碼:
#define Mod(a, b) a < b? a: a % b + b //重定義取模,按照歐拉定理的條件 |
注意!!當快速冪需要用到之前的遞歸時,也需要迭代模!!!
? 例如 a[1]^(a[2]^(a[3]^(a[4]…)))
LL solve(LL l,LL r,LL mod) {
|
轉載請注明出處!!!
如果有寫的不對或者不全面的地方 可通過主頁的聯系方式進行指正,謝謝
總結
以上是生活随笔為你收集整理的(数论六)关于欧拉(定理、公式、函数、降幂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP Fiori里Contact Su
- 下一篇: 一个好用的便利设置浏览器代理的Chrom