求逆元的两种方法+求逆元的O(n)递推算法

求逆元的两种方法+求逆元的O(n)递推算法

到国庆假期都是复习阶段。。所以把一些东西整理重温一下。

 

gcd(a,p)=1,ax≡1(%p),则x为a的逆元。注意前提:gcd(a,p)=1;

 

方法一:拓展欧几里得

gcd(a,p)=1,ax≡1(%p),转化为ax+py≡1,拓展欧几里得可解决ax+by=gcd(a,b)

 1 void exgcd(int a,int b,int &x,int &y)
 2 {
 3     if(b==0) {
 4         x=1,y=0;
 5         return a;
 6     }
 7     int g=exgcd(b,a%b,x,y);
 8     int t=x;x=y;y=t-(a/b)*y;
 9     return g;
10 }

 

方法二:费马小定理

a^(p-1)≡1(%p),则a^(p-2)就是逆元。快速幂。

 

 

求逆元的O(n)算法

 

 inv[i]=((mod-mod/i))*inv[mod%i]%mod;

 

 

转自https://blog.csdn.net/acdreamers/article/details/8220787,侵删

 

它的推导过程如下,设,那么

 

       

 

对上式两边同时除,进一步得到

 

       

 

再把替换掉,最终得到

 

       

 

初始化,这样就可以通过递推法求出模奇素数的所有逆元了。

posted @ 2018-09-21 20:20 拦路雨偏似雪花 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
扩展欧几里得算法是一种解线性同余方程 ax ≡ 1 (mod m) 中 x 的逆元方法逆元是指数值 x 使得 ax 与 m 取模之后的结果为 1。 下面是一个用 Java 实现扩展欧几里得算法逆元的代码示例: ```java public class InverseElement { public static int extendedEuclidean(int a, int b) { int[] coeffs = new int[3]; // 存储扩展欧几里得算法解的系数 int x = 0, y = 0; while (b != 0) { coeffs = updateCoeffs(a, b, coeffs); a = coeffs[0]; b = coeffs[1]; x = coeffs[2]; y = coeffs[3]; } if (a == 1) { return (x % m + m) % m; // 防止结果为负数 } else { return -1; // 没有逆元 } } private static int[] updateCoeffs(int a, int b, int[] coeffs) { if (b == 0) { coeffs[0] = a; coeffs[1] = b; coeffs[2] = 1; coeffs[3] = 0; return coeffs; } coeffs = updateCoeffs(b, a % b, coeffs); int x1 = coeffs[2]; int y1 = coeffs[3]; coeffs[2] = y1; coeffs[3] = x1 - (a / b) * y1; return coeffs; } public static void main(String[] args) { int a = 7; int m = 11; int inverse = extendedEuclidean(a, m); System.out.println("逆元: " + inverse); } } ``` 在上述代码中,`extendedEuclidean` 方法实现了扩展欧几里得算法, `updateCoeffs` 方法用于更新系数, `main` 方法用于测试逆元的结果。在示例中,我们以 `a = 7` 和 `m = 11` 为例来逆元。 按照扩展欧几里得算法的步骤,我们递归调用 `updateCoeffs` 方法来更新系数,直到 b 为 0。然后,如果 a 为 1,则返回取模后的 x 值作为逆元;否则,返回 -1 表示没有逆元。 输出结果为:逆元:8,表示在模 11 下,7 的逆元为 8。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值