- 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务,要用git记录实现过程,git commit不能低于5次
- 严格按照《密码工程》p112伪代码实现ExtendedGCD(int a, int b, int *k, int *u, int *v)算法(10’)
2.根据ExtendedGCD 实现计算模逆元的函数int modInverse(int a, int m) ,返回a相对于m的模逆元(3‘)- 在测试代码中计算74模167的模逆元。自己再设计至少两个类似测试代码。(2’)
- 提交代码和运行结果截图,git log截图
- 提交使用Markdown并转为pdf格式,或者使用doc、docx格式
代码如下:
//myexgcd
#include<stdio.h>
int main()
{
unsigned int a,b;
int u,v,gcd;
int extendedgcd(unsigned int a,unsigned int b,int *x,int *y);
printf("请输入a和b:");
scanf("%d%d",&a,&b);
gcd=extendedgcd(a,b,&u,&v);
printf("u=%d,v=%d\n",u,v);
printf("最大公因子k=%d\n",gcd);
printf("%d*%d+%d*%d=%d\n", u, a, v, b, gcd);
return 0;
}
int extendedgcd(unsigned int a,unsigned int b,int *x,int *y)//扩展欧几里得算法;
{
if(b==0)
{
*x=1;
*y=0;
return a;
}
int ret=extendedgcd(b,a%b,x,y);
int t=*x;
*x=*y;
*y=t-a/b*(*y);
return ret;
}
类似算法
#include <stdio.h>
int extendedgcd(unsigned int a,unsigned int b,int *x,int *y) {
if (a == 0) {
*x = 0;
*y = 1;
return b;
}
int x1, y1;
int gcd = extendedgcd(b % a, a, &x1, &y1);
*x = y1 - (b / a) * x1;
*y = x1;
return gcd;
}
int modinv(int a, int m) {
int x, y;
int g = extendedgcd(a, m, &x, &y);
if (g != 1) {
return -1;
}
return (x % m + m) % m;
}
int main() {
int num1, num2;
printf("请输入两个整数,用空格分隔:");
scanf("%d %d", &num1, &num2);
int mod_inverse = modinv(num1, num2);
if (mod_inverse == -1) {
printf("%d 没有模逆元\n", num1);
} else {
printf("%d 模 %d 的模逆元为: %d\n", num1, num2, mod_inverse);
}
return 0;
}
#include <stdio.h>
int extendedgcd(unsigned int a,unsigned int b,int *x,int *y {
if (a == 0) {
*x = 0;
*y = 1;
return b;
}
int x1, y1;
int gcd = extendedgcd(b % a, a, &x1, &y1);
*x = y1 - (b / a) * x1;
*y = x1;
return gcd;
}
int modinv(int a, int m) {
int x, y;
int g = extendedgcd(a, m, &x, &y);
if (g != 1) {
return -1; // 没有模逆元
}
return (x % m + m) % m;
}
int main() {
int num1, num2;
do {
printf("请输入两个整数 a 和 m(用空格分隔):");
if (scanf("%d %d", &num1, &num2) != 2) {
printf("输入错误,请重新输入\n");
while (getchar() != '\n'); // 清空输入缓冲区
} else {
break;
}
} while (1);
if (num2 <= 0) {
printf("m 必须是正整数\n");
return 1;
}
int mod_inverse = modinv(num1, num2);
if (mod_inverse == -1) {
printf("%d 在模 %d 下没有模逆元\n", num1, num2);
} else {
printf("%d 在模 %d 下的模逆元为: %d\n", num1, num2, mod_inverse);
}
return 0;
}
git log
第一次提交
第二次提交
第三次提交
第四次提交
第五次提交