乘法逆元

http://lzxandcyx.cn/2020/08/20/%E4%B9%98%E6%B3%95%E9%80%86%E5%85%83/

原始链接:[https://blog.csdn.net/weixin_43872728/article/details/99687168?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159788598219725211921229%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159788598219725211921229&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-4-99687168.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E4%B9%98%E6%B3%95%E9%80%86%E5%85%83&spm=1018.2118.3001.4187](https://blog.csdn.net/weixin_43872728/article/details/99687168?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159788598219725211921229%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159788598219725211921229&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-4-99687168.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E4%B9%98%E6%B3%95%E9%80%86%E5%85%83&spm=1018.2118.3001.4187)

逆元:在数论中称倒数为逆元。

求余:

(a + b) % p = (a%p + b%p) %p (对)

(a - b) % p = (a%p - b%p) %p (对)

(a * b) % p = (a%p * b%p) %p (对)

(a / b) % p = (a%p / b%p) %p (错)

ps: (100/50)%20 = 2 ≠ (100%20) / (50%20) %20 = 0

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

如果

a*x = 1

那么x是a的倒数,x = 1/a

但是a如果不是1,那么x就是小数

那数论中,大部分情况都有求余,所以现在问题变了

a*x = 1 (mod p)

那么x一定等于1/a吗

由前面我们推得的求余的概念,算式中出现了除法,那么x不一定等于1/a。

所以说数论中的逆元与常说的倒数之间的差别就在于逆元多了一个求余条件,所以x叫做a关于p的逆元。

总结起来就是

设c是b的逆元,则有b*c≡1(mod m);
推论:(a/b)mod m = (a/b)*1mod m = (a/b)bc mod
m=a*c(mod m); 即a/b的模等于a * (b的逆元)的模;

求 (A / B) %p ;在B的值非常大的情况下,B作为除数,极有可能会爆精度;除数不能太大;所以我们可以把他转化为乘法来解决;

(a/b)mod m = (a/b)*1mod m = (a/b)bc mod
m=ac(mod m);
即a/b的模等于a * (b的逆元)的模;

必不可少的板子:

扩展欧几里得算法求逆元:

long long extend_gcd(long long a,long long b,long long &x,long long &y) {
	if(a==0&&b==0)
		return -1ll;
	if(b==0)
	{
		x=1ll;
		y=0ll;
		return a;
	}
	long long d=extend_gcd(b,a%b,y,x);
	y-=a/b*x;
	return d;
}
long long mod_reverse(long long a,long long n) {
    long long x,y,d=extend_gcd(a,n,x,y);
    if(d==1) {
	    if(x%n<=0)return x%n+n;
		else return x%n;
	} else return -1ll;
}

费马小定理+快速幂求逆元

long long PowMod(long long a,int b) {
	long long ret=1;
	while(b) {
		if(b&1)ret=ret*a%Mod;
		a=a*a%Mod;
		b>>=1;
	}
	return ret;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值