专栏文章
欧拉定理及扩展欧拉定理
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqv24ok
- 此快照首次捕获于
- 2025/12/04 11:13 3 个月前
- 此快照最后确认于
- 2025/12/04 11:13 3 个月前
整除
若 则 ,即 可以被 整除。
同余
若 除于 的余数相同,则记为 。
通常情况下 。
欧拉函数
。
是积性函数,即满足 。
单个欧拉函数求法:
CPP
int GetPhi(int n) {
int ans = n;
for(int i = 2;i * i <= n;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;
}
证明:
设 且 是质数,则显然 与 不互质,那么 。
将 唯一分解:
则由积性函数得:
由于欧拉函数是积性函数,所以可以直接线性筛。
CPPvoid Sieve(int siz,int p[],int phi[]) {
int ncnt = 0;
vector<int> vis(siz + 5);
phi[1] = 1;
for(int i = 2;i <= siz;i++) {
if(!vis[i]) {
p[++ncnt] = i;
phi[i] = i - 1;
}
for(int j = 1;j <= ncnt && i * p[j] <= siz;j++) {
vis[i * p[j]] = 1;
if(i % p[j] == 0) {
phi[i * p[j]] = phi[i] * p[j]; //p[j]是i*p[j]的最小质因子
break;
}
phi[i * p[j]] = phi[i] * phi[p[j]];
}
}
}
欧拉定理
若 。
证明:
这里不包含 的情况。
由于 ,那么由上面的方法可得 在模 后互不相同。
特别的,当 是质数时 ,这就等价于 也就是费马小定理。
扩展欧拉定理
简单来说就是若 则 ,这可用于 很大时降次。
证明:
第一行式子由欧拉定理易得,不证。
第二与第三行:
我们取 且 是质数,令 。
由欧拉定理得:。
因为 ,所以 。
同时乘 ,得到 。
所以 。
因为 ,所以这个结论显然成立。
所以 。
这就可以证明 为质数的幂次方时的情况。剩余的用唯一分解定理即可简单证明。
CPP#include <bits/stdc++.h>
using namespace std;
#define int long long
template<class T>T Pow(T a,T b,T p,T ans=1){for(;b;b/=2){ans=((b&1?a:1)*ans%p),a=a*a%p;}return ans;}
int a,b,m,v;
inline int Read() {
int x = 0,f = 0;
char c = getchar();
for(;c < '0' || c > '9';c = getchar());
for(;c >= '0' && c <= '9';c = getchar()) {
x = (x << 3) + (x << 1) + (c ^ 48);
if(x >= v) f = 1;
x %= v;
}
return f ? x + v : x;
}
int GetPhi(int n) {
int ans = n;
for(int i = 2;i * i <= n;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;
}
signed main() {
cin >> a >> m;
v = GetPhi(m);
b = Read();
if(b < v) cout << Pow(a,b,m) << '\n';
else cout << Pow(a,b % v + v,m) << '\n';
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...