【数论】逆元
逆元
我们定义:若a*x同余1(MOD b)
那么则称x为a的逆元,可以记作a^(-1)
那么怎么求解逆元呢?
我们可以假设a*x+b*y=1,这个式子在原来MOD b的意义下并没有发生本质的改变
因为当把这个式子MOD b后,a*x这项我们假设不能被整除,但是b*y这一项有b,所以在全式MOD b下一定能被整除,也就是MOD b=0,但是1这一项只有0不符合条件,所以逆元也是有所谓的“不存在”的。
我们可以使用扩展欧几里得方法来求解,逆元可以把(S/a) mod b转换为S*a^(-1) mod b
使用扩展欧几里得方法的求解过程如下:
void ext_gcd(int a,int b,int &x,int &y){//我们求最小公因数没有用 if(a==0){ x=0,y=c/b; return ; } int xl,yl; ext_gcd(b%a,a,xl,yl); x=yl-(b/a)*xl; y=xl; return ; }
首先我们可得知:1的-1次方同余1 (MOD p)
我们可以设p=k*i+r (条件是:r<i,1<i<p)
对于条件1:如果i大于了r那么可以在加上一个i,不是最简形式
对于条件2:p如果小于i那么k为小数
将p=k*i+r在MOD p的意义下为:
k*i+r同余0 (MOD p)
在在两边乘上i^(-1)和r^(-1)
原式得:k*i*i^(-1)*r^(-1)+r*r^(-1)*i^(-1)同余0 (MOD p)
那么可得 k*r^(-1)+i^(-1)同余0 (MOD p)
那么我们现在可以把r和k替换过来 and 移项
i^(-1)同余-[p/i]*(p mod i)^(-1) (MOD p)
那么很显然式子只有一行,就可以使用O(log(p))求出1~p-1的逆元:
A[i]=-(p/i)*A[p%i];
可能求i的时候p%i的逆元没有求出来吗?
看了上面的条件就知道不可能了,因为1<i<p