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

    费马小定理

    在模为素数p的情况下,有费马小定理

    (a^{p-1} equiv 1(mod p))

    那么(a^{p-2} equiv a^{-1}(mod p))

    也就是说(a)的逆元为(a^{p-2})

    #define ll long long
    
    ll ksm(ll a, ll b, ll mod) {
    	ll ans = 1;
    	while(b) {
    		if(b & 1) ans = ans * a % mod;
    		a = a * a % mod; b >>= 1;
    	}
    	return ans;
    }
    
    ll work(ll a, ll p) {return ksm(a, p - 2, p);} // 求a在模p意义下的逆元
    

    拓展欧几里得

    给定模数(p),求(a)的逆元相当于求解(ax equiv 1(mod m))

    这个方程可以转化为(ax-my=1)

    然后套用求二元一次方程的方法,用扩展欧几里得算法求得一组(x_0),(y_0)(gcd)

    检查(gcd)是否为(1)

    (gcd)不为(1)则说明逆元不存在

    若为(1),则调整(x_0)([0,m))的范围中即可

    PS:这种算法效率较高,常数较小,时间复杂度为(O(ln n))

    void ex_gcd(ll a, ll b, ll &x, ll &y) {
    	if(b == 0) {
    		x = 1; y = 0;
    		return;
    	}
    	ex_gcd(b, a % b, x, y);
    	ll tmp = x; x = y; y = tmp - (a / b) * y;
    }
    
    ll work(ll a, ll p) {
    	ll x, y;
    	ex_gcd(a, p, x, y);
    	return (x % p + p) % p;
    }
    
  • 相关阅读:
    Mybatis入门
    java开发七大原则
    常用的一些实用类
    sql语句大全
    jsp中9个隐含对象
    解决POST和GET方式的中文乱码问题
    Servlet跳转页面的重定向和转发
    通用增删改查的方式
    IDEA 部署spring Cloud
    Oracle基础语法
  • 原文地址:https://www.cnblogs.com/aurorapolaris/p/13489571.html
Copyright © 2011-2022 走看看