zoukankan      html  css  js  c++  java
  • 线性同余方程

    如何解方程$$axequiv b({ m mod} m)​$$呢?因为$ax-b|m​$, 故令$ax-b=-ym​$,即$$ax+my=b​$$。根据Bezout定理,该方程有解当且仅当$gcd(a,m)|b​$。我们把等式两边同乘以$frac{gcd(a,m)}{b}​$,得到$$ax_0+my_0=gcd(a, m)​$$。这个方程可以用扩展欧几里得算法求得得到$x_0​$。等式是怎么乘的,就再把它除回来,也就是$$x=x_0cdot frac{b}{gcd(a,m)}​$$。关于方程的通解,$$ax+k{ m lcm}(a,m)+my-k{ m lcm}(a,m)=b,{ m lcm}(a,m)=frac{am}{gcd(a,m)}​$$,也就是$$a(x+kfrac{m}{gcd(a,m)})+m(y+kfrac{a}{gcd(a,m)})=b​$$,所以方程的通解为所有与$x​$同余$frac{m}{gcd(a,m)}​$的数。若要求最小正整数解,令$p=frac{m}{gcd(a,m)}​$,然后x=(x%p+p)%p即可。 

    ll Exgcd(ll a, ll b, ll &x, ll &y)
    {
    	if (b == 0)
    	{
    		x = 1;
    		y = 0;
    		return a;
    	}
    	ll d = Exgcd(b, a%b, x, y);
    	ll tx = x;
    	x = y;
    	y = tx - (a / b) * y;
    	return d;
    }
    
    ll Gcd(ll a, ll b)
    {
    	return b ? Gcd(b, a%b) : a;
    }
    
    ll Eq(ll a, ll b, ll m)
    {
    	ll gcd = Gcd(a, m);
    	if (b%gcd)
    		return -1;
    	ll x, y;
    	Exgcd(a, m, x, y);
    	x = x * b / gcd;
    	ll p = m / gcd;
    	return (x%p+p) % p;
    }
  • 相关阅读:
    存储与服务器的连接方式对比(DAS,NAS,SAN)
    FreeNAS系统总结
    FreeNAS-9.10虚拟机测试安装
    rsync实时同步服务部署
    无限循环与嵌套循环
    几种循环语句
    选择结构if
    java引用数据类型
    java运算符的优先级
    java运算符-逻辑、三元运算符
  • 原文地址:https://www.cnblogs.com/headboy2002/p/8908090.html
Copyright © 2011-2022 走看看