逆元(数论倒数)【密码学笔记】

本小妞迷上赌 提交于 2019-12-01 07:05:57

数论倒数,又称逆元

取模

对于取模,有一下一些性质:

但是唯独除法是不满足的:

为什么除法错的呢?很好证明:

而对于一些题目,我们必须在中间过程中进行求余,否则数字太大,电脑存不下,那如果这个算式中出现除法,我们就需要逆元了。

逆元

定义:

我们知道,如果a*x = 1,那么x是a的倒数,x = 1/a

而在数论问题中,大部分情况都有取模,所以问题就变成了:

那么x就不一定等于1/a了

所以这时候,我们就把x理解为在模p空间下,a的倒数,满足:

 现在就要在回到刚才的问题了,除以一个数等于乘上这个数的倒数,在除法取余的情况下,就是乘上这个数的逆元,即:

这样就把除法,完全转换为乘法了。

逆元的求解

对于逆元的求解,如果n较小的话,是容易算出来的,例如,求3在模26下的逆元:

但是当n非常大的时候,就需要引入一个算法来计算

(1)扩展欧几里得算法(extend_gcd)

对于逆元的表达式可以做一些变换:

 

当gcd(a,n)=1时,代入extend_gcd(a,b,x,y),得到的非负的x值,就是a对模n的逆元。

算法实现与证明

也就是说,我们得到了一个和gcd算法中,gcd(m,n)=gcd(n,m%n)相似的恒等式

 什么意思呢?举个例子,就是

 如果想要x为正值

 只再做一步:

if (x < 0) {
    x += b; y -= a;
}

扩展:

完整算法:

int extend_gcd(int a, int b, int& x, int& y) {
    if (b == 0) {
        x = 1, y = 0;
        return a;
    }
    int q = extend_gcd(b, a % b, x, y);
    int temp = x;
    x = y;
    y = temp - a / b * y;
    return q;
}

(2)费马小定理

如果p是一个质数,并且gcd(a,p)=1

两边同除以 a

所以

用快速幂求一下,复杂度O(logn)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!