中国剩余定理解析_中国剩余定理详解

中国剩余定理解析_中国剩余定理详解孙子问题最早,在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?用白话描述就是,现在有一个数不知道是多少,只知道这个数除以3余2,除以5余3,除以7余2,问这个数是多少?上面的问题可以转换为以下这样一个方程组:{xmod3=2xmod5=3xmod7=2\begin{cases}x\quadmod\quad3=2\\x\…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

孙子问题

最早,在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?用白话描述就是,现在有一个数不知道是多少,只知道这个数除以3余2,除以5余3,除以7余2, 问这个数是多少?

上面的问题可以转换为以下这样一个方程组:

{ x m o d 3 = 2 x m o d 5 = 3 x m o d 7 = 2 \begin{cases} x \quad mod \quad 3 =2\\ x \quad mod \quad 5 =3\\ x \quad mod \quad 7 =2\\ \end{cases} xmod3=2xmod5=3xmod7=2

其中这个 x x x就是我们要求的数。而中国剩余定理就是用来解决上述形式的方程组的 x x x解的。

解答讲解

在开始解答这个问题之前,我们先来了解一下几个数论基本知识。

基本等式

( 1 ) a m o d b = ( a + k ∗ b ) m o d b (1)a \quad mod \quad b=(a+k*b) \quad mod \quad b (1)amodb=(a+kb)modb

( 2 ) ( a ∗ k ) m o d b = k ∗ ( a m o d b ) (2)(a*k) \quad mod \quad b=k*(a \quad mod \quad b) (2)(ak)modb=k(amodb)

需要注意: a ≡ b ( m o d c ) \\a \equiv b(mod \quad c) ab(modc)的意思是 a m o d c = b m o d c a \quad mod \quad c = b \quad mod \quad c amodc=bmodc

在了解两个基本等式之后我们就可以对上述方程组做一些变换了:
{ x = k 1 ∗ 3 + 2 x = k 2 ∗ 5 + 3 x = k 3 ∗ 7 + 2 \begin{cases} x =k_1*3+2\\ x =k_2* 5 +3\\ x =k_3*7+ 2\\ \end{cases} x=k13+2x=k25+3x=k37+2

直接看上面的方程组,好像直接求解出 k 1 、 k 2 、 k 3 k_1、k_2、k_3 k1k2k3不太现实,所以我们需要另寻出路。在这里我们先假设三个数,分别是 n 1 、 n 2 、 n 3 n_1、n_2、n_3 n1n2n3,满足一下条件:
{ n 1 m o d 3 = 2 n 2 m o d 5 = 3 n 3 m o d 7 = 2 \begin{cases} n_1 \quad mod \quad 3=2\\ n_2 \quad mod \quad 5=3\\ n_3 \quad mod \quad 7=2\\ \end{cases} n1mod3=2n2mod5=3n3mod7=2
假如 n 2 、 n 3 n_2、n_3 n2n3均能整除3的话,那么按照等式 ( 1 ) (1) (1)就有:

{ n 2 = k 2 ′ ∗ 3 n 3 = k 3 ′ ∗ 3 \begin{cases} n_2 =k_2’*3\\ n_3 =k_3’*3\\ \end{cases}\\ {
n2=k23n3=k33

( n 1 + k 2 ′ ∗ 3 + k 3 ′ ∗ 3 ) m o d 3 = n 1 m o d 3 = 2 ( n 1 + n 2 + n 3 ) m o d 3 = 2 (n_1+k_2’*3+k_3’*3) \quad mod \quad 3=n_1 \quad mod \quad 3=2\\ (n_1+n_2+n_3) \quad mod \quad 3 =2\\ (n1+k23+k33)mod3=n1mod3=2(n1+n2+n3)mod3=2

那么我们继续假如 n 1 、 n 3 n_1、n_3 n1n3能被5整除, n 1 、 n 2 n_1、n_2 n1n2能被7整除,那么就有:
{ ( n 1 + n 2 + n 3 ) m o d 3 = 2 ( n 1 + n 2 + n 3 ) m o d 5 = 3 ( n 1 + n 2 + n 3 ) m o d 7 = 2 \begin{cases} (n_1+n_2+n_3) \quad mod \quad 3=2\\ (n_1+n_2+n_3) \quad mod \quad 5=3\\ (n_1+n_2+n_3) \quad mod \quad 7=2\\ \end{cases} (n1+n2+n3)mod3=2(n1+n2+n3)mod5=3(n1+n2+n3)mod7=2

对比题目中的方程组,可以看出只要满足以下条件就能使我们需要求解的 x = ( n 1 + n 2 + n 3 ) x=(n_1+n_2+n_3) x=(n1+n2+n3):

  1. n 1 n_1 n1除以3余2,且是5和7的公倍数。
  2. n 2 n_2 n2除以5余3,且是3和7的公倍数。
  3. n 3 n_3 n3除以7余2,且是3和5的公倍数。

我们只需要将 n 1 、 n 2 、 n 3 n_1、n_2、n_3 n1n2n3求出来后相加即可得我们想求的 x x x值。不过,这只是其中一个解,并不是最小解。要求最小解我们还需要除以 n 1 、 n 2 、 n 3 n_1、n_2、n_3 n1n2n3的最大公约数。

这里呢,我们以 n 1 n_1 n1求解为例, n 2 、 n 3 n_2、n_3 n2n3求解过程类似。

求解 n 1 n_1 n1过程

首先我们先罗列一下基本约束条件:

{ n 1 m o d 3 = 2 n 1 = 5 ∗ k 2 ′ n 1 = 7 ∗ k 3 ′ \begin{cases} n_1 \quad mod \quad 3 =2\\ n_1 = 5 * k_2’\\ n_1 = 7 * k_3’\\ \end{cases} n1mod3=2n1=5k2n1=7k3

根据等式 ( 2 ) (2) (2),可以得到:

n 1 m o d 3 = 2 ∗ ( n 1 2 m o d 3 ) = 2 n_1 \quad mod \quad 3 =2*(\dfrac{n_1}{2} \quad mod \quad 3)=2 n1mod3=2(2n1mod3)=2

n 1 2 m o d 3 = 1 \dfrac{n_1}{2} \quad mod \quad3 =1 2n1mod3=1

如果 n 1 2 \dfrac{n_1}{2} 2n1是5、7的整数倍,那么 n 1 n_1 n1自然也是5、7的整数倍。不过在这里呢,我们并没有从5和7的公倍数中直接找一个除以3余2的数,而是先找一个除以3余1的数,再乘以2。也就是先求出5和7的公倍数模3下的逆元,再用逆元去乘余数。具体过程如下:参考来源

推算过程如下:

首 先 我 们 令 K = n 1 2 , 首先我们令K=\dfrac{n_1}{2}, K=2n1,

因 为 K m o d 3 = 1 ( K 是 5 和 7 的 整 数 倍 ) , 所 以 g c d ( 5 ∗ 7 , 3 ) = 1 , 即 35 与 3 互 质 , 由 拓 展 欧 几 里 得 算 有 : K ≡ 1 ( m o d 3 ) ⇒ K = a ∗ x = ( 5 ∗ 7 ) ∗ x ≡ 1 ( m o d 3 ) 35 ∗ x + 3 ∗ y = 1 ⇒ 整 数 解 为 : { x = 2 , y = − 23 , 可 求 得 a 的 逆 元 x = 2 , 则 K = 70 ⇒ n 1 = 2 ∗ K = 140 因为\\\quad K \quad mod \quad3 =1(K是5和7的整数倍),\\所以\\\quad gcd(5*7,3)=1,即35与3互质,由拓展欧几里得算有:\\\quad K\equiv1(mod \quad3)\Rarr K=a*x=(5*7)*x\equiv1(mod \quad 3)\\\quad 35*x+3*y=1\Rarr整数解为:\begin{cases}x=2,\\y=-23,\end{cases}\\可求得a的逆元x=2,则K=70\Rarr n_1=2*K=140 Kmod3=1(K57),gcd(57,3)=1,353:K1(mod3)K=ax=(57)x1(mod3)35x+3y=1:{
x=2,y=23,
ax=2,K=70n1=2K=140

类 似 , 可 求 出 n 2 = 63 , n 3 = 30 ⇒ x = ( n 1 + n 2 + n 3 ) = 233 类似,可求出n_2=63,n_3=30\Rarr x=(n_1+n_2+n_3)=233 ,n2=63n3=30x=(n1+n2+n3)=233

不 过 此 时 并 不 是 最 小 数 , 我 们 还 需 要 将 233 ÷ ( 3 、 5 、 7 ) 最 大 公 约 数 105 = 23 , 这 才 是 符 合 条 件 的 最 小 数 不过此时并不是最小数,我们还需要将233\div(3、5、7)_{最大公约数105}=23,这才是符合条件的最小数 233÷(357)105=23

最大公倍数=各个数的乘积 ÷ \div ÷最大公约数,最大公约数可使用辗转相除法获取(欧几里得算法)

中国剩余定理公式

设正整数 m 1 , m 2 , . . . , m k , m_1,m_2,…,m_k, m1,m2,...,mk,两两互素,则同余方程组:
{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) . . . . . . x ≡ a k ( m o d m k ) \begin{cases} x\equiv a_1(mod \quad m_1)\\ x\equiv a_2(mod \quad m_2)\\ ……\\ x\equiv a_k(mod \quad m_k)\\ \end{cases} xa1(modm1)xa2(modm2)......xak(modmk)
有整数解。并且在模 M = m 1 ∗ m 2 ∗ . . . ∗ m k M=m_1*m_2*…*m_k M=m1m2...mk下的解是唯一的,解为

x ≡ ( a 1 M 1 M 1 − 1 + a 2 M 2 M 2 − 1 + . . . + a k M k M k − 1 ) m o d M x\equiv(a_1M_1M_1^{-1}+a_2M_2M_2^{-1}+…+a_kM_kM_k^{-1})mod \quad M x(a1M1M11+a2M2M21+...+akMkMk1)modM

其中 M i = M m i M_i=\dfrac{M}{m_i} Mi=miM,而 M i M_i Mi m i m_i mi的逆元。

关于扩展欧几里得算法

参考文章:欧几里德算法与扩展欧几里德算法

用途

用来求解形如 a x + b y = c ( a , b , c ∈ Z ) ax + by = c(a, b, c \in Z) ax+by=c(a,b,cZ)的方程的一组整数解.。

使用条件

c m o d g c d ( a , b ) = 0 , g c d ( a , b ) 表 示 a / b 的 最 大 公 约 数 c \quad mod \quad gcd(a,b)=0,gcd(a,b)表示a/b的最大公约数 cmodgcd(a,b)=0,gcd(a,b)a/b

求解过程

求 解 方 程 : a x + b y = g c d ( a , b ) 求解方程:ax+by=gcd(a,b)\\ :ax+by=gcd(a,b)

( 1 ) 当 b = 0 时 , 原 方 程 可 化 为 a x = g c d ( a , 0 ) ⇒ 解 得 : ​ ​ { x = 1 y = 0 (1)当 b = 0 时,原方程可化为 ax = gcd(a, 0) \Rarr 解得:​​\begin{cases}x=1\\y=0 \end{cases} (1)b=0ax=gcd(a,0):{
x=1y=0

( 2 ) 设 a ′ = b , b ′ = a m o d b , 有 如 下 方 程 : (2)设 a’ = b, b’ = a \quad mod \quad b,有如下方程: (2)a=b,b=amodb,:

{ a ′ x ′ + b ′ y ′ = g c d ( a ′ , b ​ ′ ) = g c d ( b , a m o d b ) a x + b y = gcd ⁡ ( a , b ) \begin{cases} a’x’+b’y’=gcd(a’,b​’)=gcd(b,a \quad mod \quad b)\\ ax + by = \gcd(a, b) \end{cases} {
ax+by=gcd(a,b)=gcd(b,amodb)ax+by=gcd(a,b)

另 有 恒 等 式 : g c d ( a , b ) = g c d ( b , a m o d b ) , 则 : 另有恒等式:gcd(a,b)=gcd(b,amodb),则: :gcd(a,b)=gcd(b,amodb):

a x + b y = a ′ x ′ + b ′ y ′ = b x ′ + ( a m o d b ) y ′ = b x ′ + ( a − ⌊ ​ a b ​ ​ ⌋ b ) y ′ ax+by=a’x’+b’y’=bx’+(a\quad mod\quad b)y’=bx’+(a−⌊​\dfrac{a}{b}​​⌋b)y’ ax+by=ax+by=bx+(amodb)y=bx+(abab)y
整 理 得 : 整理得: :
a x + b y = = b x ′ + ( a − ⌊ ​ a b ​ ​ ⌋ b ) y ′ ⇓ { x = y ′ y = x ​ ′ − ⌊ a b ​ ​ ​ ​ ⌋ y ​ ′ ax+by==bx’+(a−⌊​\dfrac{a}{b}​​⌋b)y’\\ \Darr\\ \begin{cases} x=y’\\ y=x​’−⌊\dfrac{a}{b}​​​​⌋y​’ \end{cases} ax+by==bx+(abab)y{
x=yy=xbay

通过上述这个解可知道,如果反复迭代递归,最终一定会到达临界条件 b = 0 b=0 b=0,即情况 ( 1 ) (1) (1),从而计算出最终值。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215476.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月15日 上午8:22
下一篇 2025年7月15日 上午9:01


相关推荐

  • VScode常用插件_AE必备插件

    VScode常用插件_AE必备插件这篇博客主要是我使用vscode过程中的插件汇总,使用了这么长时间,总想有个总结,也方便日后查看,这里我将我使用的插件分为基础、框架、工具三个类型。官网地址VSCode插件官网地址,里面有很多的插件可以使用。基础插件这部分插件主要是和html、css、js有关的。htmlCSSSupport这个插件支持以下语言,提供基础的语法知识编写辅助。这是插件地址htmllarav…

    2026年4月19日
    7
  • android之短信发不出去,短信空指针,smsManager.sendTextMessage报空指针异常

    昨天下午测试的时候遇到的问题,今早才解决,错误代码如下:String phone = dbHelper.getPhoneByTime(timeString);SmsManager sms = SmsManager.getDefault();Intent sentIntent = new Intent(Const.SENT_SMS_ACTION);PendingIntent sent

    2022年3月11日
    84
  • 四大主流CA机构_CA机构的作用

    四大主流CA机构_CA机构的作用四大主流CA机构–wosign是唯一支持免费证书的找到免费SSL证书了,刚刚看到他们网站有快捷申请免费SSL证书,很方便,10分钟颁发,试了一下,申请了2个域名,一个颁发很快,另一个稍微有点慢,问他们客服,客户说另外一个域名,涉及到敏感信息,需要两签,所以审核会慢一下,好吧,只要证书好用,等一会也无所谓啦!另外,我是看到微博上面的这个四大主流CA机构证书对比表,才去的申请的哦!…

    2025年6月17日
    3
  • 谷歌为什么被中国赶出去_护士失误事件

    谷歌为什么被中国赶出去_护士失误事件

    腾讯科技讯(中涛)北京时间12月22日消息,美国知名IT杂志《eWeek》网络版今天刊文称,虽然谷歌多项产品在2010年期间取得了市场成功,但同样也出现了不少市场失误。不仅如此,由于谷歌知名度的提高,该公司还遭到了欧盟等监管部门的反垄断调查。《eWeek》为此评出了谷歌2010年十大产品失误和开局不利事件,其中包括谷歌街景收集用户上网隐私信息受指责、Buzz社交网络服务遭批评、没能成功收购美国团购网站Groupon等等。
    《eWeek》认为,在谷歌创建以来的12年当中,20

    2022年10月9日
    5
  • opcode 查询,opcode 汇总

    opcode 查询,opcode 汇总http ref x86asm net HTML Editions

    2026年3月17日
    2
  • 算法(一)时间复杂度「建议收藏」

    算法(一)时间复杂度「建议收藏」算法很重要,但是由于做移动开发并不经常用到,所以很多同学早就将算法打了个大礼包送还给了老师了,况且很多同学并没有学习过算法。这个系列就让对算法头疼的同学能快速的掌握基本的算法。过年放假阶段玩了会游戏NBA2K17的生涯模式,没有比赛的日子也都是训练,而且这些训练都是自发的,没有人逼你,从早上练到晚上,属性也不涨,但是如果日积月累,不训练和训练的人的属性值就会产生较大差距。这个突然让我意识到

    2022年5月15日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号