zoukankan      html  css  js  c++  java
  • 逆元+费马小定理+扩展欧几里得

    逆元:(即是逆元素)逆元素是指一个可以取消另一给定元素运算的元素。

    在一个代数系统(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的范围中即可
    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 的逆元。

  • 相关阅读:
    常用排序算法(JAVA版)
    常用排序算法(PHP)
    POJ 1308 hdu 1325 Is It A Tree?【并查集+入度 判断一个有向图是树】
    【转】常用的正则表达式
    POJ 1611 The Suspects【并查集入门】
    POJ 2524 Ubiquitous Religions【并查集入门】
    归并排序和快速排序比较【算法设计与分析实验报告】
    2013_CSUST_3_23校内训练赛第一场【old】【hdu 3496、2191、4508、4506、2181 POJ 3264 3210 3094】
    POJ 3264 Balanced Lineup 【RMQ求区间最值模板题】
    搜索专题训练【CSUST_Newer_12级入门】
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/8688255.html
Copyright © 2011-2022 走看看