弱弱地问一道数学题

AAA20090987 2009-12-11 04:47:11
问题:
求下面同余系统的所有解
x = 1 (mod 2)
x = 2 (mod 3)
x = 3 (mod 5)
x = 4 (mod 11)
(以上所有的‘=’都是三条杆的,但我打不出来,只好用‘=’代替)

答案是:323 + 330k (k是整数)
我求了很久都得不到正确的结果,请大家帮一下忙吧(最好写出过程)。先谢谢了。
...全文
172 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
AAA20090987 2009-12-11
  • 打赏
  • 举报
回复
明白了,谢谢大家。

原来我这个式子写反了:
1*(3*5*11)+2*(2*2*5*11)+3*(2*3*11)+4*(7*2*3*5)+2*3*5*11*k
alphaxiang 2009-12-11
  • 打赏
  • 举报
回复
扩展欧几里得算法
/* m*a+n*b=gcd(m,n)*/ /*指针a,b指向求得的值 */


void exgcd(int m,int n,int *a,int *b)
{
int a1,b1,q,r,t,c,d;
a1=*b=1;
b1=*a=0;
c=m;
d=n;
while(r=c%d)
{
q = c/d;
c = d;
d = r;
t = a1;
a1 = *a;
*a = t-q*(*a);
t = b1;
b1 = *b;
*b = t-q*(*b);
}
}
void solution( )
{
int j,i=0;
int *ptr1,*ptr2,*ptr3,*ptr4,*a,*b;
int M=1;
int x=0;

printf("input how many datas in your problem:\n");
scanf("%d",&n);
ptr1 = malloc( n*sizeof ( int ) ); /* 存放输入xi */
ptr2 = malloc( n*sizeof ( int ) ); /* 存放输入mi */
ptr3 = malloc( n*sizeof ( int ) ); /* 存放乘法逆元Si */
ptr4 = malloc( n*sizeof ( int ) );/* 存放Mi */

if(( ptr1==NULL) || (ptr2==NULL) ||( ptr3==NULL) || (ptr4==NULL) )
{
printf("error in memory malloc!\n");
return;
}
for(j=0;j<n;j++)
{
printf("please input your %dth group data: ",++i);
scanf("%d %d",&ptr1[j],&ptr2[j]);
M *= ptr2[j];
}
for(j=0;j<n;j++)
{
ptr4[j] = M/ptr2[j];
exgcd(ptr4[j],ptr2[j],a,b);
ptr3[j]= *a;
while(ptr3[j]<0)
{
ptr3[j]+=ptr2[j];
}
}
for(j=0;j<n;j++)
{
x+ = ( ptr1[j]*ptr4[j]*ptr3[j] )%M;
}
printf("%d",x);
}

void main( )
{
solution();
getch();
}
绿色夹克衫 2009-12-11
  • 打赏
  • 举报
回复
LS的方法也不错,但如果mod 后面跟的数比较大的话,效率可能有些问题。
最好是先通过欧几里得扩展求模逆,这样的话效率大概是log(n),再通过模逆求解。
PeacefulBY 2009-12-11
  • 打赏
  • 举报
回复
中国剩余定理,答案为:
1*(3*5*11)+2*(2*2*5*11)+3*(2*3*11)+4*(7*2*3*5)+2*3*5*11*k
化简得323+330k
pw_Start 2009-12-11
  • 打赏
  • 举报
回复
x = 1 (mod 2) (1)
x = 2 (mod 3) (2)
x = 3 (mod 5) (3)
x = 4 (mod 11) (4)
从11开始考虑,找到一个同时满足四个求余式的最小值,然后这个最小值加上2x3x5x11的整数倍就是结果了,计算的过程如下:
1.先满足除11余4,取最小值4.
2.再满足除5余3,使(4+11*k)=3(mod 5)成立的最小k为4,所以满足(3)、(4)式的最小值为48.
3.再满足除3余2,使(48+11*5*k)=2(mod 3)成立的最小k为2,所以满足(2)、(3)、(4)式的最小值为158.
4.再满足除2余1,使(158+11*5*3*k)=1(mod 2)成立的最小k为1,所以满足(1)、(2)、(3)、(4)式的最小值为323.
所以最后的结果应该是323+2x3x5x11*k,即323+330k.

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧