[关闭]
@iwktd981220 2018-12-23T14:41:37.000000Z 字数 1132 阅读 423

CRT in C

CINTA


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. // s1 s2 a
  5. // t1 t2 b
  6. void egcd(int *a,int *b,int *s1,int *s2,int *t1,int *t2){
  7. printf("%d %d %d\n",*s1,*s2,*a);
  8. printf("%d %d %d\n\n",*t1,*t2,*b);
  9. if(*b == 0)
  10. return ;
  11. int divisor = (*a) / (*b);
  12. *s1 -= (divisor * (*t1));
  13. *s2 -= (divisor * (*t2));
  14. *a = (*a) % (*b);
  15. egcd(b,a,t1,t2,s1,s2);
  16. }
  17. // Calculate the inverse of M/mi mod mi
  18. int GetInverse(int Mi,int mi){
  19. int s1 = 1;
  20. int s2 = 0;
  21. int t1 = 0;
  22. int t2 = 1;
  23. int MiTemp = Mi;
  24. int miTemp = mi;
  25. egcd(&MiTemp,&miTemp,&s1,&s2,&t1,&t2);
  26. if(MiTemp == 0){
  27. printf("%d * %d + %d * %d = 1\n",Mi,t1,mi,t2);
  28. if(t1 < 0)
  29. return mi + t1;
  30. return t1;
  31. }
  32. if(miTemp == 0)
  33. printf("%d * %d + %d * %d = 1\n",Mi,s1,mi,s2);
  34. if(s1 < 0)
  35. return mi + s1;
  36. return s1;
  37. return 1;
  38. }
  39. int main(){
  40. int equations;
  41. scanf("%d",&equations);
  42. int res[equations];
  43. int m[equations];
  44. int M = 1;
  45. // read all the mi and calculate M
  46. for(int i = 0;i < equations;i++){
  47. scanf("%d %d",&res[i],&m[i]);
  48. M *= m[i];
  49. }
  50. // we can not store inverse as well
  51. int inverse[equations];
  52. int sum = 0;
  53. int mi = 0;
  54. printf("M = %d\n",M);
  55. for(int i = 0;i < equations;i++){
  56. mi = M / m[i];
  57. // use GetInverse to get the inverse of Mi mod m[i]
  58. inverse[i] = GetInverse(mi,m[i]);
  59. printf("a[%d] = %d, bi = %d, bi-1 = %d\n\n",i,res[i],m[i],inverse[i]);
  60. sum += (res[i] * mi * inverse[i]);
  61. }
  62. int x = sum % M;
  63. printf("x = %d",x);
  64. return 0;
  65. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注