zoukankan      html  css  js  c++  java
  • 乘法逆元

    前言: 乘法逆元,一般用于将模意义下的除法转换为乘法

    求解普通逆元( a x ≡ 1 ( m o d   m ) axequiv 1(mod m) ax1(mod m))

    拓展欧几里得

    首先我们看看逆元的定义:若 a x ≡ 1 ( m o d   m ) axequiv 1(mod m) ax1(mod m),且a与m互质,则 x x x a a a m o d   m mod m mod m意义下的乘法逆元,记作 a − 1 a^{-1} a1.

    根据这个同余式,我们可以得到 a x + k m = 1 ax+km=1 ax+km=1,且a和m是互质的,那么就满足贝祖等式 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b),可以用拓欧求解.

    ll exgcd(ll a,ll b,ll &x,ll &y)//ax+by
    {
    	if(b==0)
    	{
    		x=1,y=0;
    		return a;
    	}
    	int ret=exgcd(b,a%b,x,y),t=x;
    	x=y,y=t-(a/b)*x;
    	return ret;
    }
    

    这个板子虽然稍长,但返回值是gcd,用处更广泛

    另外,由于gcd求得负数和1最大公约数是-1,exgcd不能用来求解a为负数的情况

    快速幂

    观察乘法逆元的形式: a x ≡ 1 ( m o d   m ) ax equiv1(mod m) ax1(mod m).

    考虑到欧拉定理: a φ ( m ) ≡ 1 ( m o d   m ) a^{varphi (m)} equiv 1(mod m) aφ(m)1(mod m).

    由于洛谷模版题中给出m为质数,则有:
    a x ≡ a m − 1 ( m o d   m ) a ≡ a m − 2 ( m o d   m ) ax equiv a^{m-1}(mod m)\a equiv a^{m-2}(mod m) axam1(mod m)aam2(mod m)
    那 么 , a 在 m o d   m 意 义 下 的 乘 法 逆 元 即 为 a m − 2 m o d   m 那么,a在mod m意义下的乘法逆元即为a^{m-2} mod m ,amod mam2mod m,满足快速幂形式,可使用快速幂求解.

    ll fpm(ll x, ll power, ll mod) 
    {
        x%=mod;
        ll ans=1;
        for (;power;power>>=1,(x*=x)%=mod)
        	if(power&1)(ans*=x)%=mod;
        return ans;
    }
    
    ll inv(ll x)
    {
    	return fpm(x,mod-2,mod);
    }
    

    代码中的(ans*=x)%=mod即为(ans=ans*x)=(ans=ans*x)%mod.

  • 相关阅读:
    gin使用validator库参数校验若干实用技巧
    在gin框架中使用JWT
    使用zap接收gin框架默认的日志并配置日志归档
    gin框架路由拆分与注册
    Gin框架介绍及使用
    GO学习-(39) 优雅地关机或重启
    GO学习-(38) Go语言结构体转map[string]interface{}的若干方法
    WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
    [ 夜间模式 ] NightVersion
    HDU1518 Square(DFS)
  • 原文地址:https://www.cnblogs.com/huaruoji/p/14425567.html
Copyright © 2011-2022 走看看