【数论】逆元

逆元

    我们定义:若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

 

posted @ 2016-11-22 20:32  wxjor  阅读(444)  评论(0编辑  收藏  举报