扩展欧几里德算法求乘法逆元(C语言版)

本文介绍了一个基于扩展欧几里得算法的C语言程序,该程序能够判断两个整数是否互质,并求出它们的乘法逆元或最大公约数。通过用户输入的两个整数,程序会输出相应的结果。
部署运行你感兴趣的模型镜像
#include <stdio.h>
  int ExtendedEuclid( int f,int d ,int *result);
  int main()
  {
  int x,y,z;
  z = 0;
  printf("输入两个数:\n");
  scanf("%d%d",&x,&y);
  if(ExtendedEuclid(x,y,&z))
  printf("%d和%d互素,乘法的逆元是:%d\n",x,y,z);
  else
  printf("%d和%d不互素,最大公约数为:%d\n",x,y,z);
  return 0;
  }
  int ExtendedEuclid( int f,int d ,int *result)
  {
  int x1,x2,x3,y1,y2,y3,t1,t2,t3,q;
  x1 = y2 = 1;
  x2 = y1 = 0;
  x3 = ( f>=d )?f:d;
  y3 = ( f>=d )?d:f;
  while( 1 )
  {
  if ( y3 == 0 )
  {
  *result = x3; /* 两个数不互素则result为两个数的最大公约数,此时返回值为零 */
  return 0;
  }
  if ( y3 == 1 )
  {
  *result = y2; /* 两个数互素则resutl为其乘法逆元,此时返回值为1 */
  return 1;
  }
  q = x3/y3;
  t1 = x1 - q*y1;
  t2 = x2 - q*y2;
  t3 = x3 - q*y3;
  x1 = y1;
  x2 = y2;
  x3 = y3;
  y1 = t1;
  y2 = t2;
  y3 = t3;
  }
  }

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 扩展欧几里得算法计算模逆元的原理 扩展欧几里得算法不仅能够计算两个整数的最大公约数(GCD),还能找到满足 $ ax + by = \text{gcd}(a, b) $ 的整数解 $ x $ 和 $ y $。当 $ a $ 和 $ b $ 互素时,即 $ \text{gcd}(a, b) = 1 $,则 $ a $ 在模 $ b $ 意义下存在乘法逆元,即存在整数 $ x $ 使得 $ ax \equiv 1 \pmod{b} $。此时,$ x $ 就是 $ a $ 模 $ b $ 的逆元 [^3]。 该算法的核心思想是利用递归或迭代的方式,在计算最大公约数的同时,逐步回代得到满足等式的 $ x $ 和 $ y $。其关键步骤在于每次递归调用返回时更新 $ x $ 和 $ y $ 的值,最终得到一组整数解 [^2]。 --- ### C语言实现扩展欧几里得算法逆元 以下是一个使用扩展欧几里得算法实现逆元的 C 语言程序: ```c #include <stdio.h> // 扩展欧几里得算法函数,返回 gcd(a, b),同时出 x 和 y int extended_gcd(int a, int b, int *x, int *y) { if (b == 0) { *x = 1; *y = 0; return a; } else { int x1, y1; int gcd = extended_gcd(b, a % b, &x1, &y1); *x = y1; *y = x1 - (a / b) * y1; return gcd; } } // 逆元函数,若存在逆元则返回,否则返回 -1 int mod_inverse(int a, int m) { int x, y; int gcd = extended_gcd(a, m, &x, &y); if (gcd != 1) { // 不存在逆元 return -1; } else { // 确保结果为正数 return (x % m + m) % m; } } int main() { int a, m; printf("请输入 a 和模 m: "); scanf("%d %d", &a, &m); int inv = mod_inverse(a, m); if (inv == -1) { printf("不存在乘法逆元,因为 a 和 m 不互素。\n"); } else { printf("%d 在模 %d 下的乘法逆元是 %d\n", a, m, inv); } return 0; } ``` --- ### 算法说明 - **扩展欧几里得函数**:递归实现,每次调用返回当前层的 $ \text{gcd}(a, b) $,并根据上一层的 $ x_1, y_1 $ 推导出当前层的 $ x, y $。 - **模逆元判断**:只有当 $ a $ 和 $ m $ 互素(即 $ \text{gcd}(a, m) = 1 $)时,才存在逆元。 - **结果调整**:由于扩展欧几里得算法可能返回负数解,因此需要对结果进行模运算并调整为正数。 --- ### 示例运行 输入: ``` 请输入 a 和模 m: 3 11 ``` 输出: ``` 3 在模 11 下的乘法逆元是 4 ``` 解释:因为 $ 3 \times 4 \equiv 1 \pmod{11} $,所以 4 是 3 模 11 的逆元。 --- ### 应用场景 模逆元在密码学中广泛应用,例如 RSA 加密算法中用于计算私钥,以及在有限域上的运算中用于除法操作。扩展欧几里得算法解此类问题的高效方法之一 [^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值