逆元+费马小定理+扩展欧几里得
逆元:(即是逆元素)逆元素是指一个可以取消另一给定元素运算的元素。
在一个代数系统(S,*)中,存在单位元素e,如果对S内的元素a存在a^-1 * a = e,则将 a^-1称为a 的左逆元。
同理若存在 a * a^-1 = e,则将a^-1 称为a 的右逆元。
这里的左逆元和右逆元是针对给定运算的某个元素而言的。我们说某个元素有没有逆元素,而不能说某个代数系统有没有逆元素。
另外还需要说明:
(1)一个元素可以没有左逆元和右逆元;
(2)一个元素可以只有左逆元;
(3)一个元素可以只有右逆元;
(4)一个元素可以既有左逆元,又有右逆元。
左右逆元素相等且唯一的条件是:
1)运算有单位元素;
2)元素a的左右逆元素都存在;
3)满足结合律。
通过以上分析,我们得出如下定理:
定理1 设
为S上可结合的二元运算,e为该运算的单位元,对于x∈S,如果存在左逆元 和右逆元 ,则有且y是x的唯一的逆元。
在求解 (a+b)%c, (a-b)%c, (a*b)%c 的时候,无论a,b,c多大,都可以转换成 a%c + b%c, a%c-b%c, a%c*b%c,然后直接进行运算。
但是在算 (a / b)%c 的时候,并不能直接转化成 a%c / (b%c)。
比如 5 / 2 % 3,在进行正常的运算时: 5/2 = 2 , 2%3 = 2,所以结果应该是 2
如果转化成 (5%3)/(2%3)= 2 / 2 = 1,所以结果变成了1。
费马小定理:
假如p 时一个质数,且gcd(p ,1) = 1,那么 a^(p-1) ≡ 1 (mod p)
a / b % c ≡ a * b^-1 % c ≡ a %c * b^-1 % c,其中 b^-1 为b 的逆元,当c是个素数,且b不是c的倍数的时候:
b ^(c - 1) ≡ 1 (mod c),b * b^(c-2) ≡ 1 (mod c),于是b 的逆元就是 b^(c-2) 。
当c比较大的时候,需要用快速幂。
扩展欧几里得:
给定模数m,求a的逆相当于求解a*x=1(mod m)
这个方程可以转化为a*x-m*y=1
然后套用求二元一次方程的方法,用扩展欧几里得算法求得一组x0,y0和gcd
检查gcd是否为1
gcd不为1则说明逆元不存在
若为1,则调整x0到0~m-1的范围中即可
这个方程可以转化为a*x-m*y=1
然后套用求二元一次方程的方法,用扩展欧几里得算法求得一组x0,y0和gcd
检查gcd是否为1
gcd不为1则说明逆元不存在
若为1,则调整x0到0~m-1的范围中即可
1 LL inv(LL t, LL p) 2 { 3 if(t == 1) 4 return 1; 5 return (p - p / t) * inv(p % t, p) % p; 6 }
这是求t关于p 的逆元。