扩展欧拉定理
扩展欧拉定理
欧拉函数
设 为 范围内和 互质的数的数量.
对于质数 , 由于和 中任意数字互质, 所以有结论
对于正整数 , 表示第 个质数, 由正整数的唯一分解设
由于被 整除的数有 个, 这些数一定不和 互质. 结合容斥原理, 对于所有的 , 和 互质的数有
提公因式:
整理得
设 ,
把两式相乘
已知 和 不能同时满足, 又因为 , 所以只要 , 当且仅当 , 上式变成
因此得出结论, 对于 , , 有
我们把 这种性质称作 积性函数
欧拉定理
设正整数 , 互质
则
由此可以推得费马小定理, 即对于正整数 和质数 , 有
这就是快速幂求乘法逆元的原理
扩展欧拉定理
前置知识
- 引理一, 设正整数 , , , , ..., , 如果 , 则有
- 引理二, 设质数 , 正整数 , 则
证明
设正整数 , , , 质数 , 满足
由于 是质数, 所以对于 , 有两种情况, 即 或 .
- 针对 的情况, 一定有 , 根据欧拉定理, , 所以一定有
- 针对 的情况, 由引理二得 . 一定有 . 所以
综上, 对于所有正整数 , , , 质数 , , 有
设正整数 , 将其拆分为质因数对应幂的乘积, 由引理一和 的积性函数性质得
因为 , 所以对于所有 满足 , 有
因此
再次利用引理一, 得到
这就是扩展欧拉定理
模板 Luogu5091
求 ,
根据扩展欧拉定理
易证
所以 对 取模, 可以在快读过程中不断取模避免高精
值得一提的是, 本题中可能出现 的情况, 这时, 是错误的, 应该是 , 所以读入时也要判断 , 的大小关系.
while (ch < '0' || ch > '9') {
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
B *= 10;
B += ch - '0';
if(B > C) {
flg = 1;
B %= C;
}
ch = getchar();
}
关于求 , 由于只求一个数, 且 , 所以线性筛就不好使了, 用下面的式子求出 (先除后乘防溢出)
unsigned Phi(unsigned x) {
unsigned tmp(x), anotherTmp(x), Sq(sqrt(x));
for (register unsigned i(2); i <= Sq && i <= x; ++i) {
if(!(x % i)) {
while (!(x % i)) {
x /= i;
}
tmp /= i;
tmp *= i - 1;
}
}
if (x > 1) {//存在大于根号 x 的质因数
tmp /= x;
tmp *= x - 1;
}
return tmp;
}
这里要说明一下为什么枚举到 , 把这些质因数除掉后剩下的 一定是质数. 首先, , 如果是合数, 一定存在因数 使得 或 , 而这个 或 至少有一个已经被枚举到了, 所以 不可能是合数.
最后便是求乘积了, 用最普通的取模快速幂完成这个任务
unsigned Power(unsigned x, unsigned y) {
if(!y) {
return 1;
}
unsigned tmp(Power(x, y >> 1));
tmp = ((long long)tmp * tmp) % D;
if(y & 1) {
return ((long long)tmp * x) % D;
}
return tmp;
}
最后是加了一点特判的完整 main()
int main() {
A = RD();
D = RD();
C = Phi(D);
while (ch < '0' || ch > '9') {
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
B *= 10;
B += ch - '0';
if(B > C) {
flg = 1;
B %= C;
}
ch = getchar();
}
if(B == 1) {
printf("%u\n", A % D);
return Wild_Donkey;
}
if(flg) {
printf("%u\n", Power(A, B + C));
}
else {
printf("%u\n", Power(A, B));
}
return Wild_Donkey;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
2020-03-14 数论: 莫比乌斯反演 ( 三 ) 证明