初等数论逆元
Posted rign
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初等数论逆元相关的知识,希望对你有一定的参考价值。
逆元定义先摆上来
对于正整数a和m,如果a*x≡1(mod m),那么把这个同余方程中x的最小正整数解叫做a模m的逆元。
求解方法:
1.扩展欧几里得
利用欧几里得求x
先将方程转化为
ax-my=1
此时求解x和y
最后利用返回的gcd(a,m)==1
如果成立,则x为逆元存在,否则不存在
注意最后的x要取一下模(x+m)%m
void extgcd(long long a,long long b,long long& x,long long& y){ if(!b){ x=1; y=0;return a;} else{ int t=extgcd(b,a%b,y,x); y-=x*(a/b);return t;} } long long inverse(long long a,long long b) { long long x,y; return extgcd(a,b,x,y)==1?(x+b)%b:-1; }
2.费马小定理
p为素数
则
a(p-1)=1(mod p)
即a*a(p-2)=1(mod p)
也就是说,a(p-2)为a的逆元
这里要用到快速幂模运算求a(p-2)
一般来说在模意义下,进行快速幂模运算
当模p不是素数的时候需要用到欧拉定理
a^phi(p)≡1 (mod p)
a*a^(phi(p)-1)≡1 (mod p)
a^(-1)≡a^(phi(p)-1) (mod p)
->a^(phi(p)-1)
(回头再补上欧拉的公式》?
以上是关于初等数论逆元的主要内容,如果未能解决你的问题,请参考以下文章