基础数论

①:b == 0  立即推 => x = 1 , y = 0 ;

②:a && b       设a * x1 + b * y1 = gcd ( a , b )  ; 设b * x2 + ( a % b ) * y2 = gcd ( b , a % b ) ;

已知:gcd ( a , b ) == gcd ( b , a % b ) (欧几里得)

立即推 => a * x1 + b * y1 = b * x2 + ( a % b ) * y2 ;          

  => a * x1 + b * y1 = b * x2 + ( a – a / b * b ) * y2 ;                                      

    = a * y2 + b * (  x2 – ( a / b ) * y2 ) ;    

可得: x1 = y2 ;    y1 =  x2 – ( a / b  ) * y2 ;

应用:ax ≡ b ( mod m )

ax mod m=b mod m;

ax = k1m+n;

b = k2m+n;

ax-b=my;

ax+my=b;

ax+by=c;

拓展欧几里德:

void exgcd(ll a,ll b,ll &gcd,ll &x,ll &y)
{
      if(b==0)
      {
            x=1;
            y=0;
            gcd=a;
      }
      else
      {
            exgcd(b,a%b,gcd,y,x);
            y-=x*(a/b);
      }
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
      if(b==0)
      {
            x=1;
            y=0;
            return a;
      }
      
      ll r = exgcd(b,a%b,y,x);
      y-=x*(a/b);
      return r;
}

求逆元:

求法一:

费马小定理: 假如m是质数 , 且 gcd( a , m ) = 1 ;

那么 a ^ ( m – 1 ) ≡ 1 ( mod m ) 。

( 逆元 :a * x ≡ 1 ( mod m )  )

由此可以得到,逆元为 a ^ ( m – 2 ) 。

求法二: 扩展欧几里得( a , m 互质 ,且m不是质数时也可使用)

解同余方程 ax + my = 1

求得唯一解x 即为逆元。
 

if(c%gcd!=0)
{
   return false;
}
else
{
    x=x*c/gcd;
    int t=b/gcd;
    if(x>=0)
    x=x%t;
    else
    x=x%t+t;
}

为什么要求逆元:

(A/B)%C!=(A%C)/(B%C);

(A/B)%C=A乘以B的逆元模上C;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值