ACM 进阶学习第一课----同余相关之中国剩余定理

原创 2013年11月04日 01:05:16

问题引入

"物不知数"问题:
今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?
答曰:'二十三.'
术曰:三三数之剩二,置一百四十,五五数之剩三,置六十三,七七数之剩二,置三十,并之,得二百三十三,以二百一十减之,即得.凡三三数之剩一,则置七十,五五数之剩一,则置二十一,七七数之剩一,则置十五,即得." 
 --孙子算经

当代解释

令任意固定整数为M,当M/A余a,M/B余b,M/C余c,M/D余d,…,M/Z余z时,这里的A,B,C,D,…,Z为除数,除数为任意自然数(如果为0,没有任何意义,如果为1,在孙子定理中没有计算和探讨的价值,所以,不包括0和1)时;余数a,b,c,d,z为自然整数时。
1、当命题正确时,在这些除数的最小公倍数内有解,有唯一的解,每一个最小公倍数内都有唯一的解;当命题错误时,在整个自然数范围内都无解。
2、当M在两个或两个以上的除数的最小公倍数内时,这两个或两个以上的除数和余数可以定位M在最小公倍数内的具体位置,也就是M的大小。
3、正确的命题,指没有矛盾的命题:分别除以A,B,C,D,…,Z不同的余数组合个数=A,B,C,D,…,Z的最小公倍数=不同的余数组合的循环周期.

问题分析

一、
"物不知数"问题的抽象表示:
x≡2(mod 3)
x≡3(mod 5)
x≡2(mod 7)

求满足上述条件的最小正整数x

二、
"物不知数"解法的数学表示:
任取被3除余2的5和7的倍数:140
任取被5除余3的7和3的倍数:63
任取被7除余2的3和5的倍数:30
140+63+30=233

减去3,5,7的公倍数中不超过233的最大的数210得到答案23

三、问题归化
一般性问题:给定两两互质的正整数n1,n2,...,nk,要求找到最小的正整数a,满足a≡ai(mod ni)
将问题分解成若干次求解二元模线性方程组的解


算法步骤

令n=n1n2···nk,mi=n/ni
利用扩展欧几里德算法计算出xi满足mixi ≡ 1(mod ni),由于n1,n2,...,nk两两互质,必有gcd(mi,ni)=1,即可保证一定有解
则a≡a1x1m1 + a2x2m2 + ... + akxkmk (mod n)


典型应用

大整数的表示
选取两两互素的正整数n1,n2,...,nk
已知对每个ni取模的值ri,就可以唯一确定一个1~n1n2...nk的大整数
做大整数加,减,乘法时,只要保证在这个范围内,均可转化为分别对相应的余数进行计算

模板代码

/*****  ACM之中国剩余定理 ********/

/******** written by C_Shit_Hu ************/

////////////////扩展欧几里得算法的运用///////////////

/****************************************************************************/
/* 
由于VC下面无法使用cout或者cin输出64位的整数。
故改用printf.
*/
/****************************************************************************/

#include<iostream>
using namespace std;
typedef _int64 llong;
llong b[1000],w[1000];


// 扩展欧几里得算法
// 递归的形式
llong extended_euclid(llong a, llong b, llong &x, llong  &y) 
{
    llong d;
    if(b == 0) 
	{x = 1; y = 0; return a;}
	
    d = extended_euclid(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

// 中国剩余定理
llong chinese_remainder(int len) 
{ 
    llong i, d, x, y, m, n, ret;
    ret = 0; n = 1; 
    for(i=0; i < len ;i++) n *= w[i];
    for(i=0; i < len ;i++) 
	{ 
        m = n / w[i];
        d = extended_euclid(w[i], m, x, y);
        ret = (ret + y*m*b[i]) % n;
    }
    return (n + ret%n) % n;
}

int main()
{
    int  n,i;
    llong res;
	// 输入测试的除数和余数的组数
	cout << "输入测试的除数和余数的组数: " ;
    while (scanf("%d",&n)!=EOF)
    {
		// 输入除数和余数
		cout << "输入余数和除数:" << endl;
        for(i=0;i<n;i++)  scanf("%I64d%I64d",&b[i],&w[i]);
        res=chinese_remainder(n);
		cout << "结果为:" ;
        printf("%I64d\n",res);
		cout << "输入测试的除数和余数的组数: " ;
    }
    return 0;
}


运行结果:



【未完待续】。。。。














poj 1006+hdu 1788(中国剩余定理求解同余方程组)

中国剩余定理: 求解此类同余方程组最小非负整数解的算法实现: ll China() { ll M1,ans=0; M=1; for(int i=1;i...
  • u012717411
  • u012717411
  • 2015-01-26 23:38:13
  • 932

中国剩余定理解线性同余方程

先说一个典故:淮安民间传说着一则故事——“韩信点兵”,其次有成语“韩信点兵,多多益善”。韩信带1500名兵士打仗,战死四五百人,站3人一排,多出2人;站5人一排,多出4人;站7人一排,多出6人。韩信马...
  • he_qiao_2010
  • he_qiao_2010
  • 2012-10-25 14:03:49
  • 1518

中国剩余定理求解同余线性方程组—(互素和非互素的情况)

 数论——中国剩余定理(互质与非互质) 中国剩余定理 非互质  中国剩余定理      中国剩余定理是中国古代求解一次同余方程组的方法,是数论中的一个重要定理。      设m1...
  • Dream_going
  • Dream_going
  • 2015-06-07 22:04:19
  • 1413

同余方程[组] 乘法模逆元 中国剩余定理【模板】

扩展欧几里得,求一组解x,y,使得gcd(a,b) = d = a * x + b * y 扩展欧几里得,求所有解x,y,使得c = a * x + b * y 扩展欧几里得,求a关于n的逆元a^-...
  • u011676797
  • u011676797
  • 2015-04-15 16:05:36
  • 1334

同余方程组,中国剩余定理,孙子定理(学习)

同余方程组,中国剩余定理(孙子定理)学习 从孙子定理介绍起把,其实对于它的由来大家还是很有兴趣了解一下的。 以下是我取于互动百科的内容: 中国南北朝时期(5~6世纪)著名的著作《孙子算经》中“物...
  • qq_33199236
  • qq_33199236
  • 2016-05-24 22:28:28
  • 2125

poj 2891 Strange Way to Express Integers 模数不互素的中国剩余定理

题目地址:http://poj.org/problem?id=2891 #include #include using namespace std; typedef long long inta; ...
  • jingqi814
  • jingqi814
  • 2013-07-09 23:29:03
  • 1136

acm茵茵的第一课

描述 茵茵今年已经六年级了,爸爸给她报了一个学习程序设计的班。 第一节课上,老师讲的就是如何输入一个数,再原样输出出来。 以现在的你看来,挺容易的是不? 那么,就请你也写出一个一样的程序吧 输入第一行...
  • qq_36238595
  • qq_36238595
  • 2016-12-14 12:50:51
  • 389

中国剩余定理在ACM上的使用

Biorhythms 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Some people believe that there are three cyc...
  • qin603499247
  • qin603499247
  • 2014-12-11 13:45:05
  • 999

hdu 1370 中国剩余定理

首先介绍一下中国剩余定理,在寒假回来的飞机上曾经看过证明……但是看着看着就睡着了……先把方法写上,证明以后再补吧……(虽然也只会最简单的三个数的,还互素……) 中国剩余定理介绍了这样一个问题...
  • ctrss
  • ctrss
  • 2016-04-04 23:03:47
  • 799

同余 模算术 中国剩余定理

相关知识点: 1、a≡b(modc),a,b关于模c同余  ,即a modc=b mod c , 等价于a%c=b 2、如果a,b互质(a,b)=1,则可得a关于模b的逆 ax≡1(modb)  3、...
  • u014141559
  • u014141559
  • 2014-07-19 17:27:09
  • 726
收藏助手
不良信息举报
您举报文章:ACM 进阶学习第一课----同余相关之中国剩余定理
举报原因:
原因补充:

(最多只允许输入30个字)