初识中国余数定理 (Chinese Remainder Theorem)

初识中国余数定理 (Chinese Remainder Theorem)

中国余数定理介绍

起源:

在《孙子算经》中有这样一个问题:
“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”
这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。

解法:

设未知数为X
1. 找到三个数:
    1). 从3和5的公倍数中找到被7除余1的数,15;
    2). 从5和7的公倍数中找到被3除余1的数,70;
    3). 从3和7的公倍数中找到被5除余1的数,21。
2. 用第1步得到的三个数除以响应的余数:
    1). 15乘以2(2为X除以7的余数),30;
    2). 70乘以2(2为X除以3的余数),140;
    3). 21乘以3(3为X除以5的余数),63。
    将三个乘积结果相加,30 + 140 + 63 = 233。
3. 用第2步结果除以三个数的最小公倍数的余数即为所求结果
    X = mod(233,105) = 23

原理:

前提已知:

前提1. if a % b = c, then (a + kb) % b = c;
前提2. if a % b = c, then 2a % 2b = 2c.

则由此

1. 设n1, n2, n3分别为除3, 5, 7分别余2, 3, 2的数,
    1). n1 % 3 = 2;
    2). n2 % 5 = 3;
    3). n3 % 7 = 2.
    则问题变为能否找到数n1+n2+n3满足条件
    1). (n1+n2+n3) % 3 = 2;
    2). (n1+n2+n3) % 5 = 3;
    3). (n1+n2+n3) % 7 = 2.
2. 可见,当
    1). n2与n3是3的倍数,条件1成立;
    2). n1与n3是5的倍数,条件2成立;
    3). n1与n2是7的倍数,条件3成立。
3. 此时有
    1). n1为5与7的公倍数;
    2). n2为3与7的公倍数;
    3). n3为3与5的公倍数。
4. 结合1中的前提
    1). n1为5与7的公倍数,并且除以3余2,为140;
    2). n2为3与7的公倍数,并且除以5余3,为63;
    3). n3为3与5的公倍数,并且除以7余2,为30。
    PS:注,此时古人采用了已知前提的第二个条件,先求余1数,再乘相应余数值得到想要的数值。
5. n1+n2+n3即为想要的数值,但是这个数值不是最小的满足条件的数值,此时利用已知前提1,可以得到
    (n1+n2+n3) = 140+62+30 = 233;
    233对3,5,7的最小公倍数105取模得到最终结果
    233 % 105 = 23.

用途:频率估计?

原文地址:https://www.cnblogs.com/silentzpf/p/8387010.html

时间: 2024-11-06 09:32:07

初识中国余数定理 (Chinese Remainder Theorem)的相关文章

HDU 1788 Chinese remainder theorem again 中国剩余定理

题意: 给定n,AA 下面n个数m1,m2···mn 则有n条方程 res % m1 = m1-AA res % m2 = m2-AA 问res的最小值 直接上剩余定理,嘿嘿 #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #include<set> #include<queue> #i

Chinese remainder theorem again(中国剩余定理)

C - Chinese remainder theorem again Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,…,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡a2(mod m2) … x≡ak(mod mk) 在0<=<m1m2…mk内有唯一解

hdu 1788 Chinese remainder theorem again 最小公倍数

Chinese remainder theorem again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2014    Accepted Submission(s): 777 Problem Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余

HDU——1788 Chinese remainder theorem again

Chinese remainder theorem again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3174    Accepted Submission(s): 1371 Problem Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的:假设m1,m2,…,mk两两互素,则下面同余

Chinese remainder theorem again(中国剩余定理+不互质版+hud1788)

Chinese remainder theorem again Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1788 Appoint description:  System Crawler  (2015-04-27) Description 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,m

HDU 1788 Chinese remainder theorem again

题目链接 题意 : 中文题不详述. 思路 : 由N%Mi=(Mi-a)可得(N+a)%Mi=0;要取最小的N即找Mi的最小公倍数即可. 1 //1788 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <iostream> 6 #define LL long long 7 8 using namespace std ; 9 10 LL gcd(LL x,LL y)

Chinese remainder theorem 中国剩余定理

中国剩余定理: x ≡ a1 (% m1) x ≡ a2 (% m2) . . . x ≡ an (% mn) m1,m2...mn 互质.我们求里面的x,就会用到中国剩余定理.首先将 x 看成 s ,则 s ≡ a1 (% m1) 1式 s + m1 * y = a1 另 M = m1 * m2 * m3 * m4 * ... * mn Mi = M / mi 因为 m1,m2...mn 互质所以 (Mi, mi) = 1 所以 可以表示成 Mi * x + mi * y = 1 2式 所以

HDU1788 Chinese remainder theorem again【中国剩余定理】

题目链接: pid=1788">http://acm.hdu.edu.cn/showproblem.php?pid=1788 题目大意: 题眼下边的描写叙述是多余的... 一个正整N除以M1余M1-a,除以M2余M2-a.除以M3余M3-a. 即除以Mi余Mi-a(a < Mi < 100),求满足条件的最小的数. 思路: 这是一道中国剩余定理的基础题.由题目得出N % Mi + a = Mi,即得:N + a = 0(mod Mi).也 就是全部的Mi都能整除N+a. 那么题

【数论】【中国剩余定理】【LCM】hdu1788 Chinese remainder theorem again

根据题目容易得到N%Mi=Mi-a. 那么可得N%Mi+a=Mi. 两侧同时对Mi取余,可得(N+a)%Mi=0. 将N+a看成一个变量,就可以把原问题转化成求Mi的LCM,最后减去a即可. #include<cstdio> #include<algorithm> #include<iostream> using namespace std; typedef long long ll; int K; ll a; int main(){ ll x; while(1){ c