中国剩余定理,也称孙子定理,是中国古代求解一次同余式组的重要方法。

《孙子算经》里面的"物不知数"说的是这样的一个题目:一堆东西不知道具体数目,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了。

而中国剩余定理就是解决上述问题的通用方法,模板如下。

#include <iostream>
#include <cstdio>
using namespace std;int exgcd(int a, int b, int &x, int &y)//拓展欧几里得 (可处理负数版本)
{if (b == 0){x = 1;y = 0;return a;}int ans = exgcd(b, a%b, x, y);int TT = x;if (a*b < 0){x = -y;y = a / b*y - TT;}else{x = y;y = TT - a / b*y;}return ans;//ans是a,b的最大公约数
}int chinasolve(int a[],int m[],int k)//除数即m数组必须都是素数
{int mm = 1;int result = 0;for (int i = 0; i < k; i++){mm *= m[i];}for (int j = 0; j < k; j++){int L, J;                     // Ni%mi=1↓     ↓因为Ni能被m1, m2,...,mi-1, mi+1,...,mk整除exgcd(mm / m[j], -m[j], L, J);// mi*J + 1  =  mm/mi *L  ==> (-mi)*J + mm/mi*L = 1result += (m[j] * J + 1)*a[j];//70*2 + 21*3 + 15*2 = 233。}return (result%mm + mm) % mm;//此处mm实际上是最小公倍数,但是因为m数组都是素数,所以最小公倍数就是mm
}

a数组里存的是所要求的余数,m数组则是对应的除数。例如文章开头那道题,调用函数的方法如下。

int main()
{  int a[3] = {2, 3, 2};  int m[3] = {3, 5, 7};      cout<<"结果:"<<calSYDL(a, m, 3)<<endl;
}  

输出的结果便是满足题目要求的最小数,23。

中国剩余定理(孙子定理)相关推荐

  1. 中国剩余定理(孙子定理)的证明和c++求解

    <孙子算经>里面的"物不知数"说的是这样的一个题目:一堆东西不知道具体数目,3个一数剩2个,5个一数剩3个,7个一数剩2个,问一共有多少个. 书里面给了计算过程及答案: ...

  2. 中国剩余定理(孙子定理)(精华详细版!)

    问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 简单点说就是,存在一个数x,除以3余2,除以5余三,除以7余二,然后求这个数.上面给出了解法.再明白这个解法的原理之前,需要 ...

  3. 孙子定理c语言程序,中国剩余定理(孙子定理)的证明和c++求解

    <孙子算经>里面的"物不知数"说的是这样的一个题目:一堆东西不知道具体数目,3个一数剩2个,5个一数剩3个,7个一数剩2个,问一共有多少个. 书里面给了计算过程及答案: ...

  4. 中国剩余定理 (孙子定理) 的证明和代码

    目录 [引入] [中国剩余定理] [代码实现] [借鉴于] [引入] <孙子算经>里有这样一个题目:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 术曰:" ...

  5. 中国剩余定理——孙子定理

    孙子定理是中国古代求解一次同余式组(见同余)的方法.是数论中一个重要定理.又称中国余数定理. 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何?即,一个整数除以三余二,除以五余三,除以 ...

  6. 中国剩余定理(孙子定理)详解

    为什么发现了这个定理,这要源于一道题 淮安民间传说着一则故事--"韩信点兵",其次有成语"韩信点兵,多多益善".韩信带1500名兵士打仗,战死四五百人,站3人一 ...

  7. 中国剩余定理matlab程序,中国剩余定理即孙子定理的五种解法

    中国剩余定理即孙子定理的五种解法 -- 学习初等数论心得笔记 2013-10-04 博文2015-12修改 "中国剩余定理"是公元5-6世纪.我国南北朝时期的一部著名算术著作< ...

  8. 中国剩余定理即孙子定理的五种解法

    加深一下理解,找了点纯数学的资料(老者善学,尤老骥伏枥,况乎我也): "中国剩余定理"是公元5-6世纪.我国南北朝时期的一部著名算术著作<孙子算经>中的一个" ...

  9. FJNU2018低程A 逃跑路线(Lucas + 中国剩余定理 + LGV定理)题解

    题目描述 n个人在w*h的监狱里面想要逃跑,已知他们的同伙在坐标(bi,h)接应他们,他们现在被关在(ai,1)现在他们必须要到同伙那里才有逃出去的机会,这n个人又很蠢只会从(x,y)->(x+ ...

  10. 算法——中国剩余定理(孙子定理)

    借15级上机的一道题数论の重逢来总结一下中国剩余定理 先举一个小例子 问题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 说明白一点就是说,存在一个数x,除以3余2,除以5余三 ...

最新文章

  1. 利用奇异值分解(SVD)简化数据
  2. mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
  3. h5新增 history的应用
  4. linux查询所建文件夹,linux中的文件和文件夹的新建、查询、删除
  5. Echart 5.0+版本报错Error in data(): “TypeError: Cannot read properties of undefined (reading ‘graphic‘)“
  6. 前后台分离--概念相关
  7. go mod管理golang包
  8. [转]Laravel 4之Eloquent ORM
  9. jquery比较时间大小
  10. Linux系统环境:DM8数据库安装
  11. 安装易飞ERP打开出错的两例
  12. Vue 国家省市三级联动
  13. TS是什么?特性是什么?与JS的区别?使用ts的好处?
  14. 查询当前数据库名、用户名、数据库服务器IP、端口、数据库版本信息。
  15. 搜狗校招笔试题编程之一
  16. 网易2018校园招聘:相反数 [python]
  17. Gerrit版本升级
  18. 西电计算机学院2019年复试线,2021西安电子科技大学研究生分数线一览表(含2019 2020历年复试)...
  19. spring项目如何升级mysql包_SpringBoot项目版本升级:从1.5.3升级到2.1.8版本
  20. 东距(easting)、北距(northing)、东伪偏移(false easting)、北伪偏移(false northing)

热门文章

  1. cad快速选择命令快捷键_CAD快捷键命令:倒角的使用技巧
  2. OpenSSH 修复预认证双重释放漏洞
  3. 一文搞懂什么是遗传算法Genetic Algorithm【附应用举例】
  4. 云上OneNET智慧大棚
  5. Android:规范命名,让合作更加愉快
  6. 计算机所选区域单元格数值,筛选Excel2007单元格区域或表中的数据
  7. 学习笔记(19):零基础搞定Python数据分析与挖掘-常用的正则符号(二)
  8. 漫谈程序员(十)大白菜装机版安装win7系统使用教程
  9. 计算机联锁想系统包括哪几层,计算机联锁系统技术_习题.ppt
  10. 如何解释vue的生命周期才能令面试官满意?