首页 > 编程语言 >密码工程-扩展欧几里得算法

密码工程-扩展欧几里得算法

时间:2023-05-10 09:46:07浏览次数:44  
标签:old gcd temp int 欧几里得 密码 算法 ex printf

任务详情

0. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
1. 参考《密码工程》p112伪代码实现ExtendedGCD(int a, int b, int *k, int *u, int *v)算法(5
2. 在测试代码中计算74模167的逆。(5
3. 自己设计至少两个测试代码。5
4. 提交代码和运行结果截图

代码实现
    #include <stdio.h>
     
    //这里用了int类型,所支持的整数范围较小且本程序仅支持非负整数,可能缺乏实际用途,仅供演示。
    struct EX_GCD { //s,t是裴蜀等式中的系数,gcd是a,b的最大公约数
        int s;
        int t;
        int gcd;
    };
     
    struct EX_GCD extended_euclidean(int a, int b) {
        struct EX_GCD ex_gcd;
        if (b == 0) { //b等于0时直接结束求解
            ex_gcd.s = 1;
            ex_gcd.t = 0;
            ex_gcd.gcd = 0;
            return ex_gcd;
        }
        int old_r = a, r = b;
        int old_s = 1, s = 0;
        int old_t = 0, t = 1;
        while (r != 0) { //按扩展欧几里得算法进行循环
            int q = old_r / r;
            int temp = old_r;
            old_r = r;
            r = temp - q * r;
            temp = old_s;
            old_s = s;
            s = temp - q * s;
            temp = old_t;
            old_t = t;
            t = temp - q * t;
        }
        ex_gcd.s = old_s;
        ex_gcd.t = old_t;
        ex_gcd.gcd = old_r;
        return ex_gcd;
        }
     
    int main(void) {
        int a, b;
        printf("Please input two integers divided by a space.\n");
        scanf("%d%d", &a, &b);
        if (a < b) { //如果a小于b,则交换a和b以便后续求解
            int temp = a;
            a = b;
            b = temp;
        }
        struct EX_GCD solution = extended_euclidean(a, b);
        printf("%d*%d+%d*%d=%d\n", solution.s, a, solution.t, b, solution.gcd);
        printf("所以%d模%d的逆=%d\n", a,b,solution.t);
        return 0;
    }

运行结果:

 代码实现2

#include<stdio.h>
#include<assert.h>
int main()
{
    unsigned int a,b;
    int s,t,m,gcd;
    int ExtendedGCD(unsigned int a,unsigned int b,int *k,int *u,int *v);
    printf("input two number:");
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        assert(a>=0);
        assert(b>=0);
        gcd=ExtendedGCD(a,b,&s,&t,&m);
        printf("%d %d\n",s,t);
            printf("gcd = 1\n",b);
        printf("input two number:");
    }
    return 0;
}
int ExtendedGCD(unsigned int a,unsigned int b,int *k,int *u,int *v)//扩展欧几里得算法;
{
    if(b==0)
    {
        *k=1;
        *u=0;
        return a;
    }

    int i=ExtendedGCD(b,a%b,k,u,u);
    int t=*k;
    *k=*u;
    *u=t-a/b*(*u);
    return i;

}
 

 

运行结果

 

标签:old,gcd,temp,int,欧几里得,密码,算法,ex,printf
From: https://www.cnblogs.com/syf0105/p/17387007.html

相关文章

  • 扩展欧里几得算法
    一、任务详情在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考《密码工程》p112伪代码实现ExtendedGCD(inta,intb,int*k,int*u,int*v)算法(5在测试代码中计算74模167的逆。(5自己设计至少两个测试代码。5提交代码和运行结果截图......
  • 密码工程-小素数
    密码工程-小素数20201331黄文刚任务详情在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考《密码工程》p107伪代码基于Eratosthenes算法实现intSmallPrimeList(intn,int*plist,int*len),其中plist返回素数列表,len返回列表长度2写出测试代码,至少包括......
  • 密码工程-扩展欧几里得算法
    密码工程-扩展欧几里得算法0.在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务1.参考《密码工程》p112伪代码实现ExtendedGCD(inta,intb,int*k,int*u,int*v)算法(52.在测试代码中计算74模167的逆。(53.自己设计至少两个测试代码。54.提交代码和运行结果......
  • 密码工程-扩展欧几里得算法
    任务详情在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考《密码工程》p112伪代码实现ExtendedGCD(inta,intb,int*k,int*u,int*v)算法(5在测试代码中计算74模167的逆。(5自己设计至少两个测试代码。5提交代码和运行结果截图代码代码一:#include<stdi......
  • 密码工程-扩展欧几里得算法
    密码工程-扩展欧几里得算法20201331黄文刚任务详情:0.在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考《密码工程》p112伪代码实现ExtendedGCD(inta,intb,int*k,int*u,int*v)算法(5在测试代码中计算74模167的逆。(5自己设计至少两个测试代码。5提交代......
  • 密码工程—小素数
    一、任务详情在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考《密码工程》p107伪代码基于Eratosthenes算法实现intSmallPrimeList(intn,int*plist,int*len),其中plist返回素数列表,len返回列表长度(5’)2写出测试代码,至少包括n=2,n=你的四位学号,n>2^2......
  • 密码工程-小素数
    在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考《密码工程》p107伪代码基于Eratosthenes算法实现intSmallPrimeList(intn,int*plist,int*len),其中plist返回素数列表,len返回列表长度(10’)2写出测试代码,至少包括n=2,n=你的四位学号,n>2^20次方的测试代......
  • 密码工程-小素数
    密码工程-小素数0.在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务1.参考《密码工程》p107伪代码基于Eratosthenes算法实现intSmallPrimeList(intn,int*plist,int*len),其中plist返回素数列表,len返回列表长度(5’)2写出测试代码,至少包括n=2,n=你的四位......
  • 可变策略的拟人式三维装箱算法实现-开源
    问题给定一个长方体容器和较多不同形态的长方体货物,需确定装箱策略,使货物尽可能多地装填到容器中。假设与约束1、货物可向上码放;2、货物必须完全包含在容器中;3、任意两个货物内的任意一点不可在空间中的同一位置;4、货物不可悬空放置,即货物下方必须有其他货物或容器底部支撑;5、......
  • 密码工程-小素数
    在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考《密码工程》p107伪代码基于Eratosthenes算法实现intSmallPrimeList(intn,int*plist,int*len),其中plist返回素数列表,len返回列表长度(5’)2写出测试代码,至少包括n=2,n=你的四位学号,n>2^20次方的测试代......