zoukankan      html  css  js  c++  java
  • 中国剩余定理

    中国剩余定理

    今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?

    这是《孙子算经》中的一个问题,称为“孙子问题”。这个问题的一般解法称为中国剩余定理。具体解法分三步:

    1. 找出三个数:从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找出被5除余1 的最小数21,最后从5和7的公倍数中找出除3余1的最小数70。
    2. 用15乘以2(2为最终结果除以7的余数),用21乘以3(3为最终结果除以5的余数),同理,用70乘以2(2为最终结果除以3的余数),然后把三个乘积相加15∗2+21∗3+70∗2得到和233。
    3. 用233除以3,5,7三个数的最小公倍数105,得到余数23,即233%105=23。这个余数23就是符合条件的最小数。

    古人是怎么想到这个方法的呢?

    首先这个问题可以被抽象成这样:已知(iin [1, n]),x满足(x=c_i mod p_i),求出最小的x。

    对于每个方程i,我们试图构造出一个(A_i),使得(A_i=c_imod p_i),同时(A_{其他}=0mod p_i),这样答案就是(sum A_i mod p_1p_2dots p_n)

    (M_i=frac{p_1p_2dots p_n}{p_i})(invM_i=M_i^{-1}mod p_i),那么Ai的公式就是(A_i=M_i*invM_i*c_i)。为什么这么构造?(M_i=frac{p_1p_2dots p_n}{p_i})乘在Ai里,保证只有(A_i)不被(p_i)整除。再乘上(M_i)对于(p_i)的逆元,此时的(A_i) mod (p_i)就为1了。再乘上(c_i),就可以满足方程(A_i=c_imod p_i)

    扩展中国剩余定理

    来自大佬:https://blog.csdn.net/litble/article/details/75807726。

    假设这里有两个方程:(egin{aligned} x=a_1*x_1+b_1 \ x=a_2*x_2+b_2 end{aligned}),它们的原方程是(x=b_1 mod a_1,x=b_2 mod a_2)

    那么合并一下两个方程,可以得到:(a_1x_1-a_2x_2=b_2-b_1 (gcd(a_1, a_2)mid b_2-b_1))。还不赶快有请扩展欧几里得!(这幽默感学不来)

    解出(x_1)后,就可以求出带入方程求出(x=k mod [a_1, a_2]),继续处理这个方程和下一个方程即可。

  • 相关阅读:
    组合模式扩展,有选择的递归
    SQL分页查询【转】
    facade外观模式
    C#:几种数据库的大数据批量插入 faib
    装饰模式的扩展
    yeild之我理解
    数据库操作 sqlserver查询存储过程+分页
    SQL Server 索引结构及其使用(二)[转]
    SQL索引使用初步,(转)
    解决多集成,多子类,扩展等 装饰模式
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/9343504.html
Copyright © 2011-2022 走看看