数学-乘法逆元

因为luogu博客不知道为什么一直抽风,数学公式有渲染不出来,所以我直接用图片了...

1.定义

逆元素,是指一个可以取消另一给定元素运算的元素,在数学里,逆元素广义化了加法中的加法逆元和乘法中的倒数。

如果说 a 在模 p 意义下的乘法逆元是 x,那么 ax1(modp)

2.求逆元的方法

·扩展欧几里得

1. 同余方程的转化

ax1(modp) > ax+by=gcd(a,b)

b2

ax mod b = 1 mod b

ax mod b =1

根据模的定义,我们设 y ,使 y 满足 ax+by=1 (此时 y 为负数)。

k|a , k|b

k|ax , k|by

k|ax+by

ax+by=1

gcd(a,b)|1

x , y 有整数解时, gcd(a,b) 只能等于 1

ax+by= gcd(a,b)

2. 扩展欧几里得的求解

G=gcd(a,b),令 ax+by=G

x , y,使其满足
bx+( a mod b )y=G

那么 ax+by=bx+( a mod b )y

a mod b = ab×(a/b)

bx+( a mod b )y

=bx+( ab×(a/b))×y

=bx+ayb×(a/b)×y

=ay+b×(x(a/b)y)

ax+by=ay+b×(x(a/b)y)

{x=yy=xa/b×y

那么 xy怎么求呢?其实对辗转相除法较为熟悉的朋友们,现在已经知道该怎么求解了。如果还不知道也不用着急。我们回看这两个式子。
ax+by=bx+( a mod b )y

bx+( a mod b )y=G

其实这便于 辗转相除法 相同,通过不断缩小求解未知数,然后递归求解。

代码如下

#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y;
void exgcd(int a,int b){
	//ax+by=gcd(a,b);
	if(b==0){
		x=1;
		y=0;
		return;
	}
	exgcd(b,a%b);
	int tmp=x;
	x=y;
	y=tmp-a/b*y;
}
signed main(){
	long a,b;
	cin>>a>>b;
	exgcd(a,b);
	x=(x%b+b)%b;
	cout<<x;
	return 0;
}

作者:wh1sky

出处:https://www.cnblogs.com/wh1sky/p/17557715.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Wh1sky  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示