zoukankan      html  css  js  c++  java
  • 【数论】逆元

    逆元

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

  • 相关阅读:
    小结
    五种常见的 PHP 设计模式
    php克隆 自动加载
    小知识点
    php抽象 与接口
    php静态
    iOS开发零碎笔记
    iOS开发错误日志
    Objective-C:Foundation框架-常用类-NSObject
    Objective-C:Foundation框架-常用类-NSDate
  • 原文地址:https://www.cnblogs.com/wxjor/p/6091016.html
Copyright © 2011-2022 走看看