Extended_gcd应用之求逆元

http://blog.csdn.net/only_air/article/details/51675261推荐我哥们的讲的逆元,当然也可以看我写的偷笑吐舌头

下面来看看逆元的定义的用处:

逆元应用于除法取模之中,有两种求法,扩展欧几里得和小费马定理;

1. 扩展欧几里得适用于任何情况,下面介绍Euclid的Extended——gcd求逆元:

比如:如果(a * b)% mod == 1 ,那么的话a  和 b 互为逆元,已知 a,和 mod 就能求出a的逆元,相同地,已知b和mod就能求出b的逆元b了,不过对应的存在逆元的条件是

  a % mod 的逆元存在的充要条件是 a和 mod 互质,即gcd( a , mod ) ==1 ;类似地,求b %mod 的逆元也是一样的。

然后求逆元的方法是:

比如求a % mod的逆元b,则利用方程  a * x + mod  * y == 1;利用Extended_gcd()扩展欧几里得求出x 的值就是a % mod 的逆元, 这个方程的 y 代表的是 mod % a 的逆元。

利用同模方程求出的x经过最小正数操作就是逆元了,即(x% mod +mod)%mod;


有了逆元就可以进行一些巧妙的操作:

比如要求 ( a/b)%mod的值,如果gcd( b , mod ) == 1,设p 是 b % mod的逆元,即 (b * p)% mod ==1,所以(a/b) % mod == (a * p) % mod;

(a/b)%Mod=c;    (b*p)%Mod=1;    ==》   (a/b)*(b*p) %Mod=c;    ==》    (a*p)%Mod=c;

利用b * x +mod * y =1 和扩展gcd就可以求出a 的逆元p,代入,结果就可以出来了。

2.小费马定理适用于mod为质数的去情况,比如求(a/b)%mod,这样的话就要求b %mod的逆元,如果mod是质数的话,就可以利用 b ^(mod - 2)  % mod,其实就相当于转到了快速幂的模块了,敲一个快速幂就出来了。微笑

下面来说说小费马定理:

费马小定理:对于质数 p 和任意整数 a,有 a ^ p ≡ a (mod p)
将两边同时约去一个 a,则有 a ^ (p - 1) ≡ 1(mod p)


解决a/b的另一个方法:

3.当除数不存在逆元并且b|a,那么a/b % mod = a % (b * mod) /b % mod;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
欧几里得算法是一个用于计算两个整数的最大公约数的算法,扩展欧几里得算法可以在求得最大公约数的同时计算出满足贝祖等式 ax + by = gcd(a,b) 的整数解 x 和 y,其中 a 和 b 是输入的整数。 扩展欧几里得算法可用于求解模反元素(逆元),其中逆元是指某个整数关于模数的乘法逆元素。 下面是我用C语言实现扩展欧几里得算法求逆元的示例代码: ``` #include <stdio.h> int extended_gcd(int a, int b, int *x, int *y) { if (b == 0) { *x = 1; *y = 0; return a; } int x1, y1; int gcd = extended_gcd(b, a % b, &x1, &y1); *x = y1; *y = x1 - a / b * y1; return gcd; } int mod_inverse(int a, int m) { int x, y; int gcd = extended_gcd(a, m, &x, &y); if (gcd != 1) { printf("逆元不存在\n"); return -1; // 逆元不存在 } int inverse = (x % m + m) % m; return inverse; } int main() { int a, m; printf("请输入要求逆元的整数a和模数m:"); scanf("%d %d", &a, &m); int inverse = mod_inverse(a, m); if (inverse != -1) { printf("%d关于模数%d的逆元是:%d\n", a, m, inverse); } return 0; } ``` 这是一个简单的扩展欧几里得算法求逆元的实现,首先通过`extended_gcd`函数求出`a`和`m`的最大公约数,并计算满足贝祖等式的整数解`x`和`y`。如果最大公约数不为1,则逆元不存在。若最大公约数为1,则通过求模的方式计算`x`关于模数`m`的逆元。代码中的`mod_inverse`函数用于调用`extended_gcd`函数,并处理逆元不存在的情况。最后,通过用户输入需要求逆元的整数`a`和模数`m`,并输出结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值