逆元的计算方法?
今天装修百科网给各位分享如何求逆元的知识,其中也会对逆元的计算方法?(逆元的计算方法是什么)进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在我们开始吧!
逆元的计算方法?
存在取模运算公式:
(a + b) % c = (a % c + b % c) % c
(a * b) % c = (a % c * b % c) % c
(a - b) % c = (a % c - b % c + c) % c
但是不存在取模运算公式:
(a / b) % c = (a % c / b % c) % c
这时候逆元就出现了,逆元就是在mod下,不能直接除以一个数,而是要乘以它的逆元。
我们令inv(b)表示b的逆元,即inv(b) = b ^ -1
那么对于公式 (a / b) % c = (a % c / b % c) % c 我们可以写成乘法取模运算的形式,
可以转化成 (a * inv(b)) % c = (a % c * inv(b) % c) % c, 这样不就合法了。
求逆元的方法及例题?
逆元是指一个数的乘法逆元,它的定义是:如果一个数 $a$ 在模 $m$ 意义下存在乘法逆元 $b$,则有 $ab \equiv 1 \pmod m$。在模意义下的逆元可以用于求解不定方程组、求解同余方程组、解决线性同余方程、求模意义下的阶等问题。求逆元的方法有如下几种:先求出最大公约数,如果最大公约数为 $1$,则有逆元,否则无逆元。扩展欧几里得算法,求出模意义下的逆元。使用扩展欧几里得算法求出模意义下的逆元的迭代过程。例题:求解下列同余方程组:$\begin{cases} 2x \equiv 3 \pmod 5 \ 3x \equiv 2 \pmod 7 \end{cases}$解:根据求逆元的方法,我们可以求出 $2$ 在模 $5$ 意义下的逆元为 $3$,$3$ 在模 $7$ 意义下的逆元为 $5$。于是,我们可以得到如下同余方程组:$\begin{cases} 2 \cdot 3x \equiv 3 \cdot 3 \pmod 5 \ 3 \cdot 5x \equiv 2 \cdot 5 \pmod 7 \end{cases}$移项得到:$\begin{cases} 6x \equiv 9 \pmod 5 \ 15x \equiv 10 \pmod 7 \end{cases}$

欧几里得算法求逆元详细步骤?
求逆元是求解一个数在模意义下的“倒数”的问题。欧几里得算法的本质就是利用扩展欧几里得算法求模意义下的逆元。
假设我们要求a关于模m的逆元x。则a*x ≡ 1 (mod m)。
1. 使用欧几里得算法求 a 和 m 的最大公约数:
gcd(a, m) = d
2. 如果d不为1,则a在模m意义下不存在逆元,此时解不存在。
3. 如果d为1,则使用扩展欧几里得算法,求出a和m的一组解(a', m') 使得 a * a' + m * m' = 1。
4. 因为a和m是互质的,根据扩展欧几里得算法,我们可以知道a'就是a在模m意义下的逆元。
即a * a' ≡ 1 (mod m),其中a'就是a关于模m的逆元。
下面是欧几里得算法求逆元的具体步骤:
1. 使用欧几里得算法求出a和m的最大公约数d:
a, m = m, a % m
重复执行这个步骤,直到m为0,此时a就是a和m的最大公约数。
2. 如果d不为1,则a在模m意义下不存在逆元,直接返回无解。
3. 如果d为1,则使用扩展欧几里得算法求解a和m的一组解(a', m') 使得 a * a' + m * m' = 1。扩展欧几里得算法的具体步骤如下:
定义递归函数extgcd(a, b):
- 如果b == 0,则返回(a, 1, 0),其中1和0是因为我们需要保留a的一组解。 - 否则,假设有(a, x1, y1) = extgcd(b, a % b),则有(b, x2, y2) = (a % b, y1, x1 - a // b * y1)。 - 返回(x2, y2)。
利用extgcd(a, m)求出一组解(a', m')。
4. 返回a',它就是a关于模m的逆元。
完整的求逆元的Python代码如下:
```pythondef extgcd(a, b): if b == 0: return (a, 1, 0) else: d, x, y = extgcd(b, a % b) return (d, y, x - a // b * y)
def modinv(a, m): d, x, y = extgcd(a, m) if d != 1: return None # 不存在逆元 else: return x % m # 返回a关于模m的逆元```
离散数学中,一个集合的逆元怎么求?
求逆元,要看具体的运算规则是啥, 只要满足x*y=0(注意*是群中定义的运算,不是普通的数字乘法,另外其中0是单位元) x与y互为逆元
aes中的乘法逆元怎么计算?
一般根据定义 A^-1==A^254,所以求A的254次方就可以了,254次又等于 128+64+32+16+8+4+2=2*( 2*(2*(2*(2*(2*(2+1)+1)+1)+1)+1)+1),所以只需要做7次平方和7次乘A。 当然在AES运算中,需要求出全部256个数的倒数,都用这种算法还是比较费的,可以用以下的方法 首先求3的全部255次幂,并做成两个查找表,即正向通过幂次查结果,和反向通过结果查幂次,这个过程可以,因为乘3是最简单的一个乘法操作 ,并且3的255次幂可以遍历整个GF(2,8)空间。 因为3^255=1,所以 当m+n=255时,3^m 和3^n互为倒数,即3^m的逆元就是3^n, n=255-m,那么求一个数A的逆元,可以先通过上面生成的反查表查出A对于3的幂次m,再用255-m=n,在正向表中查出3的n次幂,那个数就是A的逆元,这样求一个逆元就只是两次查表操作了。
5的逆元mod19计算方法?
逆元(Inverse element)就是在mod意义下,不能直接除以一个数,而要乘以它的逆元。比如a∗b≡1(modp)a∗b≡1(modp),那么a,b互为模n意义下的逆元,比如你要算x/a,就可以改成x*b%p
观察a∗b≡1(modp)a∗b≡1(modp),变形为a∗b+k∗p=1a∗b+k∗p=1,就可以用扩展欧几里得算法求a了,同时这里也说明了a和p只有在互素的情况下才存在逆元。
注意在下面所有的算法中,最好先把除数取个模再运算。
方法一:扩展欧几里得算法原理a∗b≡1(modp)a∗b≡1(modp)a∗b+k∗p=1a∗b+k∗p=1然后a就是我们要求的逆元,最终得到一个正数a的话就要对a mod p,因为a加上mp的时侯k减少mb可以使得等式依然成立。
如果你不想让逆元为正数,那么直接返回x也是可以正确的逆元
代码LL exgcd(LL a,LL b,LL &x,LL &y)//扩展欧几里得算法 {if(b==0){x=1,y=0;return a;}LL ret=exgcd(b,a%b,y,x);y-=a/b*x;return ret;}LL getInv(int a,int mod)//求a在mod下的逆元,不存在逆元返回-1 {LL x,y;LL d=exgcd(a,mod,x,y);return d==1?(x%mod+mod)%mod:-1;}12345678910111213141516171234567891011121314151617注意:返回的时候可以改成(x+mod)%mod,因为扩展欧几里得算法算出来的x应该不会太大.
性能分析:
时间复杂度:O(logn)(实际是斐波那契数列)适用范围:只要存在逆元即可求,适用于个数不多但是mod很大的时候,也是最常见的一种求逆元的方法。方法二:费马小定理/欧拉定理原理费马小定理:若p为素数,则有ap−1≡1(modp)ap−1≡1(modp)ap−2∗a≡1(modp)ap−2∗a≡1(modp)ap−2ap−2就是a在mod p意义下的逆元啦。
欧拉定理:若a、p互素,则有aφ(p)≡1(modp)aφ(p)≡1(modp)(费马小定理的一般形式)aφ(p)∗a≡1(modp)aφ(p)∗a≡1(modp)aφ(p)−1aφ(p)−1就是a在mod p意义下的逆元啦。
代码LL qkpow(LL a,LL p,LL mod){LL t=1,tt=a%mod;while(p){if(p&1)t=t*tt%mod;tt=tt*tt%mod;p>>=1;}return t;}LL getInv(LL a,LL mod){return qkpow(a,mod-2,mod);}123456789101112131415123456789101112131415性能分析:
O(logmod)适用范围:一般在mod是个素数的时候用,比扩欧快一点而且好写。但是如果是合数,相信一般没人无聊到去算个欧拉函数。方法三:递推求逆元原理p是模数,i是待求的逆元,我们求的是i−1i−1在mod p意义下的值p=k∗i+rp=k∗i+r令 r < i,则k=p/i,r=p%ik∗i+r≡0(modp)k∗i+r≡0(modp)k∗r−1+i−1≡0(modp)k∗r−1+i−1≡0(modp)i−1≡−k∗r−1(modp)i−1≡−k∗r−1(modp)i−1≡−p/i∗inv[pmodi]i−1≡−p/i∗inv[pmodi]嗯。。好难看的公式说白了就是:inv[i]=-(mod/i)*inv[i%mod]然后边界是inv[1]=1这不仅为我们提供了一个线性求逆元的方法,也提供了一种O(logmod)求逆元的方法
代码线性求逆元LL inv[mod+5];void getInv(LL mod){inv[1]=1;for(int i=2;i<mod;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;}12345671234567注意:
调用前要先预处理调用的时候要先对除数取mod性能分析:
时间复杂度O(n)适用范围:mod数是不大的素数而且多次调用,比如卢卡斯定理。递归求逆元LL inv(LL i){if(i==1)return 1;return (mod-mod/i)*inv(mod%i)%mod;}1234512345性能分析
时间复杂度:O(logmod)好像找到了最简单的算法了!!适用范围: mod数是素数,所以并不好用,比如中国剩余定理中就不好使,因为很多时候可能会忘记考虑mod数是不是素数。
怎么求7 = 1(mod 26)的逆元?
可以遍历1到26中和26互素的数,能和7相乘mod26等于1点数就是它的逆。很容易求出7*15=105,26*4=104。所以逆元是15