孙子剩余定理代码C语言实现?

《孙子算经》里面的"物不知数"说的是这样的一个题目:一堆东西不知道具体数目,3个一数剩2个,5个一数剩3个,7个一数剩2个,问一共有多少个。书里面给了计算过程及答案:70*2 + 21*3 + 15*2 -105*2 = 23。它的计算思路如下:70是能被5或7整除的数字,但是除以3正好余1。21是能被...
孙子剩余定理代码C语言实现?
没听过这个理论,可能比较高端的吧2019-12-05
《孙子算经》里面的"物不知数"说的是这样的一个题目:一堆东西不知道具体数目,3个一数剩2个,5个一数剩3个,7个一数剩2个,问一共有多少个。

书里面给了计算过程及答案:70*2 + 21*3 + 15*2 -105*2 = 23。

它的计算思路如下:

70是能被5或7整除的数字,但是除以3正好余1。

21是能被3或7整除的数字,但是除以5正好余1。

15是能被3或5整除的数字,但是除以7正好余1。

所以若有数N = 70 * N1 + 21 * N2 + 15 * N3(其中N,N1,N2,N3为正整数),则整数N是符合题目要求的结果(mod3为N1,mod5为N2, mod7为N3)。

我们把N1赋值2,N2赋值3,N3赋值2。

则: N = 70*2 + 21*3 + 15*2 = 233。

但是3,5,7的最小公倍数为105。

所以N + 105*M均为正解。

因此为了求得最小正整数解,我们需要用(N mod 105)也就是23了。

中国剩余定理(西方数学史中的叫法),就是上一题目的一般情况。

设m1,m2...mk是两两互素的正整数,即: gcd(mi, mj) = 1 (其中 i != j, i, j >= 1且 <=k).

则同余方程组:

x ≡ a1(mod m1)

x ≡ a2(mod m2)

... ...

x ≡ ak(mod mk)

存在唯一[m1,m2...mk]使方程成立.

解法同物不知数是一致的.我们可以稍微模仿一下.

唯一的难题就是如何把上面70, 15, 21的求法,对应到一般情况来.

假设: N1, N2, ... ,Nk.就是对应的权值, 满足如下条件:

N1 能够被 m2, m3..., mk整除,但是除以m1正好余1.

N2 能够被 m1, m3..., mk整除,但是除以m2正好余1.

... ...

Nk能够被m1, m2,...,mk-1整除,但是除以mk正好余1.

N1->Nk如果求出来了,那么假设:

x1 = N1*a1 + N2*a2 + ... + Nk*ak就是我们要求的x一个解, 同物不知数一样,我们把x1 mod (m1*m2*...*mk)的结果

就是x的最小整数解,若为负数,则再加上一个m1*m2*...*mk.因为加减整数倍个m1*m2*...*mk所得结果都是x的解.

所以问题只剩下一个,就是求N1, N2,...,Nk.

怎么求呢?我需要先化简一番:

设m = m1*m2*...*mk, L, J为任意整数.

因为Ni能被m1, m2,...,mi-1, mi+1,...,mk整除(其中i+1<k)

因此: Ni = m/mi *L

又因为Ni除以mi余1
因此: Ni = mi*J + 1
即: mi*J + 1 = m/mi *L ==> (-mi)*J + m/mi*L = 1
而m1-->mk这些数都是互质数,所以(-mi) 同 m/mi也是互质数.即:
gcd(mi, m/mi) = 1也就是说:
(m/mi)*L + (-mi)*J = gcd(m/mi, -mi)==>其中-mi和m/mi都是已知的,J和L未知
这就是经典扩展欧几里德定理的原型(由定理知J和L是唯一的, 因此,N1-->Nk有唯一解).
按照扩展欧几里德定理求解即可.
扩展欧几里德定理:
a和b都是不全为0的正整数,则:
a*x + b*y = gcd(a, b)
存在唯一的x, y使得上面等式成立。
(当然,容易得知,如果,a和b中有负数,那么也是成立的。)
本题中,m/mi相当于a, -mi相当于b, L相当于x, J相当于y。求出L, J就能求出Ni。
此时Ni求解完毕.
我们要求的x的最小整数解也就呼之欲出了.
————————————————
版权声明:本文为CSDN博主「hard_man」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hard_man/article/details/77327952019-12-06
榛子树定理代码则与实现。2019-12-05
mengvlog 阅读 25 次 更新于 2025-09-10 21:17:44 我来答关注问题0
  • 书里面给了计算过程及答案:70*2 + 21*3 + 15*2 -105*2 = 23。它的计算思路如下:70是能被5或7整除的数字,但是除以3正好余1。21是能被3或7整除的数字,但是除以5正好余1。15是能被3或5整除的数字,但是除以7正好余1。所以若有数N = 70 * N1 + 21 * N2 + 15 * N3(其中N,N1...

  •  及食行乐zz C语言取余的原理是怎么回事? 比如 int X,Y X-X/Y*Y=x%y

    重要定理:若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(10) 若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(11) 若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a - c) ≡ (b - d) (%p), (a * c) ≡ (b *...

  •  文暄生活科普 JAVA路上的小坑(一)取余%

    取模运算(Modulo Operation)和取余运算(Complementation)在一般意义上相似,都涉及求余数。但它们在处理负数时,取整的规则不同。执行计算时,第一步是求出整数商(c = a/b)。取余运算中,c的值以0方向舍入(fix函数),而取模运算则以负无穷方向舍入(floor函数)。例如,计算-7 Mod 4:对于...

  •  潭竹月Ri c语言getprime是什么意思

    d是e模 varphi(n) 的逆元,CTF的角度看就是,d是由e,p,q可以求解出的 一般CTF就是把我们想要获得的flag作为明文,RSA中表示为m。然后通过RSA加密,得到密文,RSA中表示为C。加密过程 c=m^e mod n c=pow(m,e,n)1 解密过程 m=c^d mod n m=pow(c,d,n)1 求解私钥d d = gmpy2.i...

  •  爱TVXQ啊啊 质数研究了有什么作用???

    特殊的东西都是特殊的用途,在于去发现,还有很多未知的地方 举一个例子,RSA加密算法就是利用质数.http://baike.baidu.com/view/7520.htm?fr=ala0_1 你去取钱,刷公交卡等等,登陆账号啊,说不定就涉及这些素数的基本性质 自然界也有很多素数的典型例子....

檬味博客在线解答立即免费咨询

代码相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部