1. 程式人生 > >模板 - 數論 - 擴展歐拉定理

模板 - 數論 - 擴展歐拉定理

col ans += euler pan tab clas i++ phi

歐拉定理:

$a^{\varphi(m)}=1\ mod\ m$ 當 $a,m$ 互質的時,

可以用來化簡冪次,比如求 $7^{222}\ mod\ 10$ 因為7和10互質,求出 $\varphi(10)=4$ 則 $7^4\ mod\ 10 =1$ ,提公因式 $7^{4*55+2}=1^{55}*7^2 =9=mod 10$

擴展歐拉定理:

推廣到不互質的情況:

$a^{c}=a^{c\ mod\ \varphi(m)}$ 當 $gcd(a,m)=1$ 時

$a^{c}=a^{c}$ 當 $gcd(a,m)\neq1,c<\varphi(m)$ 時

$a^{c}=a^{c\ mod\ \varphi(m) + \varphi(m)}$ 當 $gcd(a,m)\neq1,c\geq\phi(m)$ 時

求歐拉函數:

const int maxn = 100001;
ll phi[maxn];
void phi_table(ll n) {//計算1到n的歐拉函數值
    for(ll i = 2; i <= n; i++)
        phi[i] = 0;
    phi[1] = 1;
    for(ll i = 2; i <= n; i++) {
            if(!phi[i]) {
                for(ll j = i; j <= n; j+=i) {
                    if(!phi[j]) phi[j] = j;
                    phi[j] 
= phi[j] / i * (i - 1); } } } } ll euler_phi(ll n) { ll k = (ll)sqrt(n + 0.5); ll ans = n; for(int i = 2; i <= k; i++) { if(n % i == 0) { ans = ans / i * (i - 1); while(n % i == 0) n /= i; } } if(n > 1
) ans = ans / n * (n - 1); return ans; }

模板 - 數論 - 擴展歐拉定理