欧几里得算法c语言实现代码,密码学 欧几里得算法

Euclidean欧几里德算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。

简介

欧几里德算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里德在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里德算法。

扩展欧几里德算法可用于RSA加密等领域。

假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里德算法,是这样进行的:

1997 / 615 = 3 (余 152)

615 / 152 = 4(余7)

152 / 7 = 21(余5)

7 / 5 = 1 (余2)

5 / 2 = 2 (余1)

2 / 1 = 2 (余0)

至此,最大公约数为1

以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

算法

cd1c40dcf3667167ed987285b37e0ebd.png

代码实现

/*

欧几里德算法:辗转求余

原理: gcd(a,b)=gcd(b,a mod b)

当b为0时,两数的最大公约数即为a

getchar()会接受前一个scanf的回车符

*/

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c语言可以使用指针来实现扩展欧几里得算法。下面是一段使用指针实现的c代码示例: ```c int exgcd(int a, int b, int *x, int *y) { if (b == 0) { *x = 1; *y = 0; return a; } int ret = exgcd(b, a % b, x, y); int t = *x; *x = *y; *y = t - a / b * (*y); return ret; } ``` 以上是欧几里得算法实现。你可以调用这个函数,传入a、b以及x和y的指针,来得到gcd以及对应的x和y的值。 你还可以使用这个算法来解决线性同余方程。下面是一个示例代码: ```c int solve(int a, int b, int *x, int *y) { int gcd = exgcd(a, b, x, y); if (c % gcd == 0) { int k = c / gcd; *x *= k; *y *= k; return 1; } else { return 0; } } ``` 以上代码中,solve函数用于求解线性同余方程。你可以调用这个函数,传入a、b以及x和y的指针,来得到方程的解。如果方程无整数解,则返回0。 你还可以通过调用exgcd函数来计算逆元。下面是一个示例代码: ```c #include <stdio.h> #include <string.h> int main() { char code[51]; int exgcd(int a, int b, int *x, int *y); int k, i, _k, y, len, gcd; while (scanf("%s%d", code, &k) != EOF) { int q = 26; len = strlen(code); gcd = exgcd(k, q, &_k, &y); _k = (_k % q + q) % q; //求解逆元_k for (i = 0; i < len; i++) { code[i] = (_k * (code[i] - 'A') % q) + 'A'; //逆天了!字母表顺序从0开始啊! } for (i = 0; i < len; i++) { printf("%c", code[i]); } printf("\n"); } return 0; } int exgcd(int a, int n, int *x, int *y) { //扩展欧几里得算法 if (n == 0) { *x = 1; *y = 0; return a; } int ret = exgcd(n, a % n, x, y); int t = *x; *x = *y; *y = t - a / n * (*y); return ret; } ``` 以上代码中,我们使用扩展欧几里得算法来计算逆元,并将一个字符串中的字母进行加密。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值