您的位置:首页 > 其它

数论学习之同余 中国剩余定理

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个互质同余方程组

#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的
除数相同,那么各个余数要乘的“数”也分别相同,所不同的就是最后两步。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: