定義:
在數論,對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目(φ(1)=1)。此函式以其首名研究者尤拉命名(euler』s totient function),它又稱為euler』s totient function、φ函式、尤拉商數等。 例如φ(8)=4,因為1,3,5,7均和8互質。
通式:
尤拉函式的通式:φ(n)=n*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)……(1-1/pn),其中p1, p2……pn為n的所有質因數,n是不為0的整數。φ(1)=1(唯一和1互質的數就是1本身)。
求解板子:
int
euler
(int n)}}
if(n>
1)ans-
=ans/n;
return ans;
}
不懂的疑點分析:
1.**中的 ans-=ans/i; 這一步就是對應尤拉函式的通式。
2.while(n%i==0) n/=i; 這乙個語句是為了保證完全消除我們剛才得到的那個i因子。確保我們下乙個得到的i是n的素因子。因為質數是不會再有除1和本身之外的因子的。
3.if(n>1)ans-=ans/n; 這個語句是為了保證我們已經除完了n的所有的素因子,有可能還會出現乙個我們未除的因子,如果結尾出現n>1 ,說明我們還剩乙個素因子未除,這個不好理解。舉個例子:當n=10,我們第乙個迴圈只跑到了3,然而他5這乙個因子並沒有篩選出來,所以這個if就是避免這種情況的發生。
打表法:
上面的方法求單個資料很實用,但是對於一道題,多次讓你計算尤拉函式的值,不如採用打表的方式存下每個數的尤拉函式值e(x)。下面我給出板子。
打表板子:
void
euler()
}}
這個方法優化的地方在於,每次遍歷到乙個數的時候,會對他所有的倍數進行處理,即我們每次處理都可以只遍歷到質數,再有這個質數去更新他們公倍數的值。
例如:我們處理2的時候,從2開始迴圈,每次加2,改變2的倍數的e的值,而由於值的改變,我們下一次外層迴圈將不再單獨處理2的倍數的值。但是,要注意的是,這樣只是消除了2這乙個質因子。
例如6,我們在處理2的時候,他的值變成了3,但是在對3進行處理時還會更新一次,因為3也是他的質因子,最終使得e(6)=2。
數論 尤拉函式
尤拉函式,用 n 表示 尤拉函式是求小於等於n的數中與n互質的數的數目 求n的尤拉函式時我們可以減去它的所有素數因子以及它的倍數 12 12 2 2 3 素數因子有2 3所以我們減掉2,3的倍數 2的倍數 2,4,6,8,10,12 3的倍數 3,6,9,12 顯然2,3存在重複項6,12 根據容斥...
數論 尤拉函式
ll eular ll n if n 1 ans ans n n 1 return ans 尤拉函式的一些性質 當m,n互質時,有phi m n phi m phi n 若i p 0,有phi i p p phi i 對於互質x與p,有x phi 1 mod p 因此x的逆元為x phi 1 即尤拉...
數論 尤拉函式
大佬已經講的很清楚了,證明非常清晰 互質 兩個數的最大公約數為 1 稱這兩個數互質 求乙個數的尤拉函式 利用公式 int phi int n if a 1 ans ans n n 1 return ans 方法二 利用線性篩求多個數的尤拉函式 const int ma 1e5 5 bool book...