[关闭]
@iwktd981220 2018-09-25T14:49:47.000000Z 字数 1645 阅读 337

CINTA作业3. 编程题

CINTA 作业


Q1.GCD算法的迭代版本

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(){
  4. int a,b;
  5. scanf("%d %d",&a,&b);
  6. if(b > a){
  7. a = a ^ b;
  8. b = a ^ b;
  9. a = a ^ b;
  10. }
  11. while(b){
  12. int temp = b;
  13. b = a % b;
  14. a = temp;
  15. }
  16. printf("gcd = %d",a);
  17. return 0;
  18. }

Q2.验证EGCD算法的正确性

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(){
  4. int a,b;
  5. int r1 = 1;
  6. int r2 = 0;
  7. int s1 = 0;
  8. int s2 = 1;
  9. scanf("%d %d",&a,&b);
  10. if(b > a){
  11. a = a ^ b;
  12. b = a ^ b;
  13. a = a ^ b;
  14. }
  15. int a0 = a;
  16. int b0 = b;
  17. while(b){
  18. int temp = b;
  19. int q = a / b;
  20. b = a % b;
  21. int temp1 = r1;
  22. int temp2 = s1;
  23. r1 = r2;
  24. s1 = s2;
  25. r2 = temp1 - q * r1;
  26. s2 = temp2 - q * s1;
  27. a = temp;
  28. }
  29. printf("gcd(%d,%d) = %d = %d * a + %d * b",a0,b0,a,r1,s1);
  30. return 0;
  31. }

Q3. ax = b (mod N),即给定整数a、b和N,求x

假设前提:x需要是整数,题目好像没提到....

思路:
*
*
*
* 由裴蜀定理得 x,y为整数 <==> gcd(a,N) | b
* 由egcd可得一组解xr,yr
*

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int egcd(int a,int b,int *r1,int *s1){
  4. int r2 = 0;
  5. int s2 = 1;
  6. if(b > a){
  7. a = a ^ b;
  8. b = a ^ b;
  9. a = a ^ b;
  10. }
  11. while(b){
  12. int temp = b;
  13. int q = a / b;
  14. b = a % b;
  15. int temp1 = *r1;
  16. int temp2 = *s1;
  17. r1 = &r2;
  18. s1 = &s2;
  19. r2 = temp1 - q * *r1;
  20. s2 = temp2 - q * *s1;
  21. a = temp;
  22. }
  23. printf("gcd = %d\n",a);
  24. return a;
  25. }
  26. int main(){
  27. int a,b,n;
  28. scanf("%d %d %d",&a,&b,&n);
  29. int r1 = 1;
  30. int s1 = 0;
  31. printf("a = %d,b = %d,n = %d\n",a,b,n);
  32. int gcd = egcd(a,n,&r1,&s1);
  33. if(b % gcd){
  34. printf("No result.");
  35. }
  36. else {
  37. printf("x = %d + %d * k, k belongs to Integer",r1*b/gcd,n);
  38. }
  39. return 0;
  40. }

Q4. ax = (1 mod N),即给定整数a和N,求x

感觉就像是Q3的特殊情况

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int egcd(int a,int b,int *r1,int *s1){
  4. int r2 = 0;
  5. int s2 = 1;
  6. if(b > a){
  7. a = a ^ b;
  8. b = a ^ b;
  9. a = a ^ b;
  10. }
  11. while(b){
  12. int temp = b;
  13. int q = a / b;
  14. b = a % b;
  15. int temp1 = *r1;
  16. int temp2 = *s1;
  17. r1 = &r2;
  18. s1 = &s2;
  19. r2 = temp1 - q * *r1;
  20. s2 = temp2 - q * *s1;
  21. a = temp;
  22. }
  23. printf("gcd = %d\n",a);
  24. return a;
  25. }
  26. int main(){
  27. int a,n;
  28. int b = 1;
  29. scanf("%d %d",&a,&n);
  30. int r1 = 1;
  31. int s1 = 0;
  32. printf("a = %d,b = %d,n = %d\n",a,b,n);
  33. int gcd = egcd(a,n,&r1,&s1);
  34. if(b % gcd){
  35. printf("No result.");
  36. }
  37. else {
  38. printf("x = %d + %d * k, k belongs to Integer",r1*b/gcd,n);
  39. }
  40. return 0;
  41. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注