• 乘法逆元


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

    求解普通逆元( 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.

  • 相关阅读:
    MYSQL数据库基础
    MSYQL操数据DML
    MYSQL外键约束
    MYSQL多表查询
    MYSQL结果排序、分页查询、聚合函数
    未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项”的解决方法
    由于扩展配置问题而无法提供您请求的页面。
    JS中的prototype(转载)
    mvc表单如何绑定bool类型的属性或变量
    使用c#正则验证关键字并找出匹配项
  • 原文地址:https://www.cnblogs.com/huaruoji/p/14425567.html
Copyright © 2020-2023  润新知