浅谈同余1(常用定理和乘法逆元)

点个赞吧,球球了~

下一篇:2(BSGS)

https://www.cnblogs.com/xyy-yyds/p/17418472.html

 

LATEX太多了,分成几个部分
0x00 总写(瞎说)

同余是数学中非常重要的东西,这里会写出同余的基本运用

amodm=bmodm则称a,bm同余,记做ab(modm)

0x10 欧拉定理和推论,费马小定理
欧拉定理:
若正整数a,n互质,则aφ(n)1(modn)

不会证明

费马小定理:
p是质数,则对于任意正整数a,有apa(modp)

欧拉定理左右两边乘上p就是费马小定理

欧拉定理的推论
若正整数a,n互质,则对于任意正整数b,有ababmodφ(n)(modn)

证明:
b=q×φ(n)+r , 其中0r<φ(n), 即r=bmodφ(n)
于是:abaq×φ(n)+r(aφ(n)q)×ar1q×ararabmodφ(n)(modn)
证毕

所以乘方级的取模为:amodnbmodφ(n)

0x10 乘法逆元
若正整数b,m互质,并且b|a, 则存在一个整数x, 使得a÷ba×x(modm)
xb的模m乘法逆元,记做 b1modm 

因为 a÷ba×b1a÷b×b×b1(modm) ,所以b×b1(modm)

如果m是质数并且b<m,根据费马小定理,bm11(modm),即b×bp21(modm)
因此,当模数m为质数时,bm2即为b的乘法逆元,可以用快速幂来解决

Code:

复制代码
int gcd(int a, int b) { return a % b == 0 ? b : gcd(b, a % b); } int fast_power(int a, int b, int p) { if (gcd(a, p) > 1) return -1; a %= p; int res = 1; while (b) { if (b & 1) res = res * a % p; b >>= 1; a = a * a % p; } return res; } t = fast_power(a, p - 2, p);
复制代码

 

但是当m不是质数且b,m互质时,费马小定理不再适用,要用扩展欧几里得算法计算同余方程
b×x1(modm)

线性求1n乘法逆元

inv(i)=pi×inv(pmodi)modp

证明有空补
只能用这种方法,别的算法都比这些要求一串要慢。

#### Code:

res[1] = 1; for (int i = 2; i <= n; i ++ ) { res[i] = (long long)(p - p / i) * res[p % i] % p; printf("%lld\n", res[i]); }

 


__EOF__

本文作者xyy's blog
本文链接https://www.cnblogs.com/xyy-yyds/p/17418458.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   xuyiyang  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示