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 的逆元。

  • 相关阅读:
    86. Partition List
    2. Add Two Numbers
    55. Jump Game
    70. Climbing Stairs
    53. Maximum Subarray
    64. Minimum Path Sum
    122. Best Time to Buy and Sell Stock II
    以场景为中心的产品设计方法
    那些产品经理犯过最大的错
    Axure教程:如何使用动态面板?动态面板功能详解
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/8688255.html
Copyright © 2011-2022 走看看