ACM 进阶学习第一课----同余相关之中国剩余定理
来源:互联网 发布:伺服电机怎么编程控制 编辑:程序博客网 时间:2024/04/30 08:45
问题引入
"物不知数"问题:
今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?
答曰:'二十三.'
术曰:三三数之剩二,置一百四十,五五数之剩三,置六十三,七七数之剩二,置三十,并之,得二百三十三,以二百一十减之,即得.凡三三数之剩一,则置七十,五五数之剩一,则置二十一,七七数之剩一,则置十五,即得."
--孙子算经
当代解释
令任意固定整数为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
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
任取被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的大整数
做大整数加,减,乘法时,只要保证在这个范围内,均可转化为分别对相应的余数进行计算
选取两两互素的正整数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;}
【未完待续】。。。。
- ACM 进阶学习第一课----同余相关之中国剩余定理
- ACM 进阶学习第一课----同余相关之中国剩余定理
- ACM 进阶学习第一课----简单数学问题之同余相关(1)
- ACM 进阶学习第一课----同余相关之欧几里得算法及其扩展(2)
- ACM 进阶学习第一课----简单数学问题之同余相关
- 同余方程组,中国剩余定理,孙子定理(学习)
- 算法学习之模线性同余方程组(中国剩余定理+求解同余方程组) poj1006+hdu3579
- 中国剩余定理(同余方程组)小结
- 同余 模算术 中国剩余定理
- 中国剩余定理 孙子定理 一元线性同余方程组
- ACM之同余相关
- 同余问题之中国剩余定理 _(:з」∠)_
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- HUD-1142
- 第5天-4 rman】【rman 备份】【rman 还原】
- ORA-28001: the password has expired
- 黑马程序员-泛型的理解
- 第5天-5
- ACM 进阶学习第一课----同余相关之中国剩余定理
- atoi,atol,strtod,strtol,strtoul实现类型转换
- 第5天-5
- 从INT 到STRING的几种方法
- CF - 359 - A. Table(贪心)
- 第6天-1配RMAN】【批处理RMAN】
- 添加一个自己遇到的无法在debug查看自定义变量的错误
- 第6天-2 脚本 本地脚本 全局脚本
- 第6天-3 RMAN不完全恢复】【用scn恢复到特定的时刻】【控制文件损坏】【损坏日志文件状态非INACTIVE时,数据库打不开】【增加联机日志文件】【修改所有联机日志大小同义10M】