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

因此: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的最小整数解也就呼之欲出了.

代码:

#include

using namespace std;

//参数可为负数的扩展欧几里德定理

void exOJLD(int a, int b, int &x, int &y){

//根据欧几里德定理

if(b == 0){//任意数与0的最大公约数为其本身。

x = 1;

y = 0;

}else{

int x1, y1;

exOJLD(b, a%b, x1, y1);

if(a*b < 0){//异号取反

x = - y1;

y = a/b*y1 - x1;

}else{//同号

x = y1;

y = x1 - a/b* y1;

}

}

}

//剩余定理

int calSYDL(int a[], int m[], int k){

int N[k];//这个可以删除

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;

exOJLD(mm/m[j], -m[j], L, J);

N[j] = m[j] * J + 1;//1

N[j] = mm/m[j] * L;//2 【注】1和2这两个值应该是相等的。

result += N[j]*a[j];

}

return (result % mm + mm) % mm;//落在(0, mm)之间,这么写是为了防止result初始为负数,本例中不可能为负可以直接 写成:return result%mm;即可。

}

int main(){

int a[3] = {2, 3, 2};

int m[3] = {3, 5, 7};

cout<

}

孙子定理c语言程序,中国剩余定理(孙子定理)的证明和c++求解相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 弦截法c语言程序,高数介质定理——弦截法求根代码实践(C语言)

    在高等数学中,我们一开始接触概念时就接受了ε-δ(epsilon-delta)语言的洗礼,但即使到课程的结束,许多人依然会对各种抽象的数学符号.定理证明感到无所适从,我也不例外,尽管在写这篇博客以前已 ...

  9. 中国剩余定理(孙子定理)学习笔记

    参考博客:https://blog.csdn.net/S_999999/article/details/89298179 啥是中国剩余定理 孙子定理是中国古代求解一次同余式组(见同余)的方法.是数论中 ...

最新文章

  1. cannot find package “github.com/json-iterator/go“cannot find package “github.com/modern-go/reflect2“
  2. 第二届清华大学项目管理精英训练营【敏捷个人】分享
  3. java基础知识总结1
  4. ubuntu c++ 实现自动回车键功能_从X86到ARM,实现C和C++语言90% Code自动迁移
  5. 已知向量坐标求三角形面积
  6. 获取Linux内存、cpu、磁盘IO等信息
  7. 在DLL Project中定义配置文件
  8. python的Singleton模式实现
  9. HUAWEI 机试题:相对开音节
  10. CAN唤醒硬件方案和软件分析
  11. K8S、Kubernetes发音
  12. PV,VG,LV的关系和操作
  13. 学习Altium Designer软件总结
  14. 不吹不黑,思购甄选现在还能玩吗?
  15. 一文搞懂SQL中的各种联结——内联结、自然联结、自联结、交叉联结
  16. 【移动安全】315钓鱼Wifi获取个人信息的深入剖析
  17. java 英文日期转数字_DatePickerDialog的月份为英文转成数字
  18. cesium-模型室内漫游
  19. 我用C#写的CF外挂
  20. 魅族手机刷ubuntu php,国内版魅族pro5刷ubuntu教程

热门文章

  1. 修改文件后是否需要重启服务器
  2. 网易云视频获取标题和时长
  3. ORACLE drop user时遇到的ORA-00604和ORA-00942错误排查
  4. 获取iframe里面的数据
  5. 酒越陈越醇,OPPO Reno越更越香
  6. 数字货币或将消灭银行 未来3至5年,银行业可能将崩溃?
  7. 微信上看到的一篇文章,为什么保险公司一直在招人~
  8. 成都敏之澳:拼多多投诉问题类型客服怎么做?
  9. CSS中flex的用法( 学习笔记 )
  10. 小米5s Plus安装类原生系统