1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| 1.欧拉函数 2.欧拉定理 3.拓展欧拉定理 4.欧拉降幂
1.欧拉函数 Φ(n) = 小于等于n的与n互质的数的数量 (Φ(1) = 1) 计算公式:Φ(n) = ∏(p - 1)p^(a[p] - 1) = n∏(1 - 1/p); if(n&1) Φ(n) = n-1; if(n&1 && b mod a == 0) Φ(a*b) = Φ(b) * a; if(gcd(a,b) == 1) Φ(a*b) = Φ(a) * Φ(b); 编程实现:
方法1 素数表法:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5;
int m[maxn], phi[maxn], p[maxn], nump;
void get_prime() { phi[1] = 1; for (int i = 2; i <= maxn; ++i) { if (!m[i]) { p[++nump] = i; phi[i] = i - 1; } for (int j = 1; j <= nump && p[j] * i <= maxn; ++j) { m[p[j] * i] = 1; if (i % p[j] == 0) { phi[p[j] * i] = phi[i] * p[j]; break; } else phi[p[j] * i] = phi[i] * (p[j] - 1); } } }
int main() { get_prime(); for (int i = 1; i <= 10; i++) printf("%d ",phi[i]); return 0; }
方法2 根号(n) 暴力:
ll Euler(int n) { ll ans = n; for (int i = 2; i * i <= n; i++) { if (n % i == 0) { ans -= ans / i; while (n % i == 0) n /= i; } } if (n > 1) ans -= ans / n; return ans; } 方法3 递推 :
#pragma warning (disable : 4996)
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5; #define rep(i,a,b) for(int i = a ; i <= b ; ++i)
int phi[maxn];
void Euler() { rep(i, 1, maxn) phi[i] = i; rep(i, 2, maxn) phi[i++] /= 2; rep(i, 3, maxn) { if (phi[i] == i) { rep(j, i, maxn) { phi[j] -= phi[j] / i; j += i - 1; } } i++; } }
int main() { Euler(); rep(i, 1, 10) printf("%d ",phi[i]); return 0; }
2.欧拉定理
欧拉定理 : 当a,m互质时,a^Φ(m) ≡ 1 (mod m); 费马小定理 : 当m为质数且a不为m的倍数时,a^(m-1) ≡ 1 (mod m);
3.拓展欧拉定理
a^c = a^(c mod Φ(m)) , gcd(a,m) = 1; = a^c , gcd(a,m) != 1 && c < Φ(m) = a^((c mod Φ(m)) + Φ(m)) , gcd(a,m) != 1, c >= Φ(m)
|