数论学习之同余 中国剩余定理
2011-07-21 11:07
162 查看
1.同余定义:
设两个整数a, b,正整数m, m | a - b, 即 m * c = k ( a - b),则称a 模m同余于b, 或a 与b 模m 同余,记做 a = b (mod m).
2.同余性质:
1) 自反性
2) 传递性
3) 对称性
4) 若 a = b (mod m), c = d (mod m)
则 a+b = b+ d(mod m)
a - b= b - d(mod m)
ac = bd (mod m);
3.中国剩余定理CRT
(中国剩余定理CRT)设m1,m2,...,mk是两两互素的正整数,即gcd(mi, mj) =1, i≠j, i,j = 1,2,...,k
则同余方程组:
x≡b1 (mod m1)
x≡b2 (mod m2)
...
x≡bk (mod mk)
中国剩余定理就是求一系列同余方程组。。
韩信点兵:韩信带1500名兵士打仗,战死四五百人,站3人一排,多出2人;站5人一排,多出4人;站7人一排,多出6人。
即 x = 3 (mod 3)
x = 4 (mod 5)
x = 6 (mod 7)
.用c语言实现中国剩余定理: 可以求n个互质同余方程组
百度上还有几题,贴上来。都可用此程序实现。原理大家自己百度吧。。
例4:有一个年级的同学,每9人一排多5人,每7人一排多1人,每5人一排多2人,问这个年级至少有多少人
?(幸福123老师问的题目)题中9、7、5三个数两两互质。则〔7,5〕=35;〔9,5〕=45;〔9,7〕=63;〔9,7,5〕=315。为了使
35被9除余1,用35×8=280;使45被7除余1,用45×5=225;使63被5除余1,用63×2=126。然
后,280×5+225×1+126×2=1877,因为,1877>315,所以,1877-315×5=302,就是所求的数。
例5:有一个年级的同学,每9人一排多6人,每7人一排多2人,每5人一排多3人,问这个年级
至少有多少人 ?
题中9、7、5三个数两两互质。则〔7,5〕=35;〔9,5〕=45;〔9,7〕=63;〔9,7,5〕=315。为了使35被9除余1,用
35×8=280;使45被7除余1,用45×5=225;使63被5除余1,用63×2=126。然
后,280×6+225×2+126×3=2508,因为,2508>315,所以,2508-315×7=303,就是所求的数。(例5与例4的
除数相同,那么各个余数要乘的“数”也分别相同,所不同的就是最后两步。)
设两个整数a, b,正整数m, m | a - b, 即 m * c = k ( a - b),则称a 模m同余于b, 或a 与b 模m 同余,记做 a = b (mod m).
2.同余性质:
1) 自反性
2) 传递性
3) 对称性
4) 若 a = b (mod m), c = d (mod m)
则 a+b = b+ d(mod m)
a - b= b - d(mod m)
ac = bd (mod m);
3.中国剩余定理CRT
(中国剩余定理CRT)设m1,m2,...,mk是两两互素的正整数,即gcd(mi, mj) =1, i≠j, i,j = 1,2,...,k
则同余方程组:
x≡b1 (mod m1)
x≡b2 (mod m2)
...
x≡bk (mod mk)
中国剩余定理就是求一系列同余方程组。。
韩信点兵:韩信带1500名兵士打仗,战死四五百人,站3人一排,多出2人;站5人一排,多出4人;站7人一排,多出6人。
即 x = 3 (mod 3)
x = 4 (mod 5)
x = 6 (mod 7)
.用c语言实现中国剩余定理: 可以求n个互质同余方程组
#include <stdio.h> struct node { int g, l; }T[1000]; int gcd ( int n, int m) { return m ? gcd(m, n%m) : n; } int main( ) { int i, j, a, b, c, n, t = 0,l1 = 1, sum = 0, lcm_max = 0, MAX_NUM, MIN_NUM; int flag = 0; printf("请输入有几个除数:\n"); //如上题韩信点兵。输入3 scanf("%d", &n); printf("请输入每组数据( 除数 余数):\n"); // 3 2 5 4 7 6 for ( i = 0; i < n; i++) scanf("%d%d",&T[i].g, &T[i].l); printf("请输入所求值的值域:min max\n" ); scanf("%d%d",&MIN_NUM, &MAX_NUM); for ( i = 0; i < n; i++) { lcm_max = gcd (T[i].g, lcm_max); l1 = l1 * T[i].g; } lcm_max *= l1; for ( i = 0; i < n; i++) { t = 0;l1 = 1; flag = 0; for ( j = 0; j < n; j++) { if (j != i ) { t = gcd( T[j].g , t); l1 = l1 * T[j].g; } } t = l1 * t; l1 = t; while (l1 % T[i].g != 1) l1 += t; sum += l1 * T[i].l; } printf("最小的值为:\n"); printf("%d\n",sum % lcm_max); printf("在所求的值域内值:\n"); while(sum > MAX_NUM) sum -= lcm_max; while(sum < MIN_NUM) sum += lcm_max; if (sum >= MIN_NUM && sum <= MAX_NUM) printf("%d\n",sum); else printf("No Solution!\n"); return 0; }
百度上还有几题,贴上来。都可用此程序实现。原理大家自己百度吧。。
例4:有一个年级的同学,每9人一排多5人,每7人一排多1人,每5人一排多2人,问这个年级至少有多少人
?(幸福123老师问的题目)题中9、7、5三个数两两互质。则〔7,5〕=35;〔9,5〕=45;〔9,7〕=63;〔9,7,5〕=315。为了使
35被9除余1,用35×8=280;使45被7除余1,用45×5=225;使63被5除余1,用63×2=126。然
后,280×5+225×1+126×2=1877,因为,1877>315,所以,1877-315×5=302,就是所求的数。
例5:有一个年级的同学,每9人一排多6人,每7人一排多2人,每5人一排多3人,问这个年级
至少有多少人 ?
题中9、7、5三个数两两互质。则〔7,5〕=35;〔9,5〕=45;〔9,7〕=63;〔9,7,5〕=315。为了使35被9除余1,用
35×8=280;使45被7除余1,用45×5=225;使63被5除余1,用63×2=126。然
后,280×6+225×2+126×3=2508,因为,2508>315,所以,2508-315×7=303,就是所求的数。(例5与例4的
除数相同,那么各个余数要乘的“数”也分别相同,所不同的就是最后两步。)
相关文章推荐
- ACM 进阶学习第一课----同余相关之中国剩余定理
- ACM 进阶学习第一课----同余相关之中国剩余定理
- 数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)
- 数论继续学习9---中国剩余定理(CRT)
- 数论学习(3)——中国剩余定理
- 中国剩余定理求解同余线性方程组—(互素和非互素的情况)
- HDU 1573 中国剩余定理 (未学习)
- 学习笔记:中国剩余定理(CRT)及扩展中国剩余定理
- bzoj2219: 数论之神【中国剩余定理+原根+BSGS】
- 数论——中国剩余定理
- 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)
- 同余方程组,中国剩余定理,孙子定理(学习)
- HDU 1573 中国剩余定理 (未学习)
- [中国剩余定理]【学习笔记】
- 一些关于中国剩余定理的数论题(POJ 2891/HDU 3579/HDU 1573/HDU 1930)
- 数论复习之中国剩余定理
- 中国剩余定理求解同余线性方程组—(互素和非互素的情况)
- HDU 1573 中国剩余定理 (未学习)
- 20140714 「初等数论 - 中国剩余定理」 POJ 1006 Biorhythms
- 【数论】中国剩余定理