数论——逆元

拓展gcd(拓展欧几里得)

有个博客写的挺好的,在这里贴上去:扩展欧几里得算法及求逆元

由gcd(a, b)==gcd(b, a%b) = d
可以化为
ax1+by1 = d;
b*x2+(a%b)*y2 = d
两式相等化简可得x1 = y2, y1 = x2 - [a/b] * y2;

而拓展gcd的作用是求出上面的 d 和 x1 和y1

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

上面这个递归调用仔细想一想就明白了。
在多次调用后最后一次返回那次函数中,x相当于x2, y 相当于y2,那么用上面的关系进行赋值。

在紫书上我看到了一种十分简便的写法我觉的这个好记一点:

void ex_gcd(int a, int b, int &d, int &x, int &y)
{
	if(!b)  {d = a; x = 1; y = 0;}
	else{gcd(b, a%b, d, y, x); y -= x*(a/b);}
}

这个写法很显然d是a,b的gcd,而这个写法相比较于上一个写法不用的是,这里的x,y的位置一直在变化。

这个时候我们用ex_gcd 求出了一组解,那么我们怎么用这个解来求出其他解呢? 上图!在这里插入图片描述
所以用ex_gcd我们求出来了(x0, y0),我们就可以用求出来的这个解算出
其他的解是**(x0+k*(a/d), y0-k*(b/d))**

其次当时我对为什么ax1+by1 = d这个式子一定成立产生了疑问,而这个问题似乎叫裴蜀定理,证明

所以从ex_gcd我们可以得出设a,b,c是任意整数,g = gcd(a,b),方程ax+by = g 的一个解是(x0, y0),则当c是g的倍数时ax+by=c的一个解是(x0c/g, y0c/g);当c不是g 的倍数的时候没有整数解

拓展gcd的逆元求法

逆元引出
在一个取余的世界中,所有数字都要取余,但是这个世界不允许有除法,因而一帮人就利用万物要取余的规则相应研究出来一个方法:
(a*b的逆元)%m == (a/b)%m

这里设置b的逆元为b1
那么在m的取余世界中:b * b1≡1(mod m)

而不是所有情况下b都能够找出逆元的只有b⊥m的情况下, b才能有逆元
那么就可以用拓展gcd进行求解:
以前一直没弄懂为什么一定是互质的情况,直到看了书:
首先b1b≡1(mod m)
得出b1
b % m =1 % m;
继续变形(b1b - 1 )% m = 0
这个时候再次变形b1
b-1 = ny
b1
b - n*y = 1
已知b,n,1
这个不就是上面gcd中的推导么,只有gcd(b, n) = 1的时候x,y才会有整数解

int mod_reverse(int a, int n)
{
	int x, y;
	int d = ex_gcd(a, n, x, y );
	if(d == 1)
		return (x%n+n)%n ;//x可能是负数,这里x能当逆元的原因是,y为0
}

欧拉定理

在欧拉定理可以知道对于任意互素的a和n,有在这里插入图片描述
aa^(欧拉-1)≡ 1(mod n)
a^(-1)≡ a ^(欧拉-1)(mod n)
而欧拉的求法是:将n进行质因数分解p1, p2……pn
欧拉=n(1-1/p1)
(1-1/p2)*……(1-1/p3);

费马小定理

当n是质数时候,a和n肯定互质,而当n为质数时候欧拉(n)=n-1
显然费马小定理是欧拉的特殊情况:a^-1≡ a ^(n-2)(mod n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值