模板 - 數論 - 擴展歐拉定理
阿新 • • 發佈:2019-03-19
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; }
模板 - 數論 - 擴展歐拉定理