去模运算(逆元)

diary

1.最近这几天连着训练,累s了,咸鱼属性正在觉醒.....

attention

文章逻辑较为繁琐,请仔细耐心阅读
建议放大后远距离阅读,感受最佳

引入

许多题目中要用到除法取模
但在取模等式等价变形中没有除法,为啥?

(6÷3)mod4(6mod4÷3mod4)mod4

说明如果在计算数字过大时可能超范围,那么应该怎么办呢?

前置知识

快速幂

不懂可以去看鄙人的博客关于位运算

同余符号

a1(modn) 这个三条横线的符号表示an取模等于1对n取模

单位元 a1(modn)

在一个集合中,对于某种运算,如果对于任何的集合元素 a,和元素 e 运算,得到还是集合元素 a 本身,则称 e 为这个运算下的单位元。

加法

a为任意实数,若a + e = a 则称 e是 单位元 0

乘法

a为任意实数,若 a * e = a 则称 e 是单位元 1

模乘

模乘的单位元是1(modn)
证明如下:
对于模 n 乘法,所有模 n 和 a 同余的数都可以表示成
a(modn)=kn+a
设单位元为e(modn),我们将e(modn)a(modn)进行模乘,得:
e(modn) * a(modn)
= (k1n + e) * (k2n + a)
= k1k2n2+ak1n+ek2n+ae
= (k1k2n+ak1+ek2)n+ae

有因为 根据单位元的定义: e(modn) * a(modn) = a(modn)
进一步可得: (k1k2n+ak1+ek2) n + ae = kn+a

{k=k1k2n+ak1+ek2e=1
模乘的单位元是1(modn)
得证

逆元

在一个集合中,对于某种运算 ,如果任意两个元素的运算结果等于单位元 e ,则称这两个元素互为逆元。

加法

a为任意实数,a的逆元是 -a

乘法

a为任意非零实数,a的逆元是 a11a

模乘

主角登场
 模乘运算中,任意整数 a(modn) 的逆元表示为: a1(modn)
提前避坑
分数的取模运算非常"神奇"
如 解 13 mod 8
设:n(13)(mod8)
3n1(mod8)
3n(mod8) = 1
易得n = 3

所以 13 mod 8 = 3

根据逆元的定义,可知
aa11(modn)

引入

学到这我们知道了求(a ÷ b)mod n可以转换为(a*b1)mod n a(modn) * b1(modn)

b1(modn)b(modn)的逆元

那么逆元怎么求呢

求解逆元

费马小定理

p是质数,则对于任意整数a,有apa(modp)
进行转换得1ap1(modp)
a1ap2(modp)

显然,当你要求x1时且 模数 为质数时,用费马小定理求即可

扩展欧几里得定理(Be´zout定理)

在这之前你需要学习欧几里得算法也就是求gcd,不懂的同学可以去看最大公约数(gcd)

对于任意整数a,b, 存在一对整数,满足ax+by=gcd(a,b)

证明如下:

1、在欧几里得算法的最后一步,即求出a1=gcd(a,b),b1 = 0 时显然有一对整数 x = 1 y=0 满足
a11+b1*0 =gcd(a,b) = a1
2、若b>0, 则gcd(a,b) = gcd(b,amodb).假设存在一对整数x,y,满足b * x+(amodb) * y = gcd(b,amodb)

转换得: bx+(a-ba/b )y = ay+b(x - a/by ) = gcd(b,amodb)

所以令 x = y, y = x - a/by
就得到了 ax + by=gcd(a,b)
对欧几里得算法的递归过程应用数学归纳法,可知Be´zout定理成立

当你要求s1时,已知模数为n(质数)
根据ss11(modn)转化得 ss1 = kn+1
ss1 - kn = 1
因为 k的正负无关 可看为 ss1 + kn = 1

由于ax+by=gcd(a,b)
a = s,b = n ,x = s1 , y = k
由于b = n是质数,所以gcd(a,b) = 1

用上述公式递归求出即可
代码实现如下

#include <bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y){
	int temp,d;
	if (b==0){
		x=1;
		y=0;
		return a;
	}d=exgcd(b,a%b,x,y);
	temp=x;
	x=y;
	y=temp-a/b*y;
	return d;
}
int main(){
	int d,x,y;
	d=exgcd(i,n,x,y);
	return 0;
}

线性同余方程(逆元同理)

题目

给定整数a,b,m,求一个整数x满足axb(modm) , 或者给出无解.因为未知数x的指数是1,我们称之为一次同余方程,也称线性同余方程
a
xb(modm)
等价于 ax = -km + b (k 的正负不重要)
移项 a * x + k * m = b
根据Be´zout定理 ( ax + by = gcd(a,b) )
gcd(a,m)|b时,此同余方程有解

设已知的a,ma,b,设未知的x,kx,y

求出一组整数x0,y0,满足 a * x0 + b * y0 = gcd(a,b)
然后x = x0 * b / gcd(a,b)
就是原线性方程的一个解

后记

家人们,博主为了这篇博客整整做了好几天,劳烦家人们点个小赞
Thanks♪(・ω・)ノ

posted @   hewt  阅读(238)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
diaryattention引入前置知识快速幂同余符号单位元 a1(modn)加法乘法模乘逆元加法乘法模乘引入求解逆元费马小定理扩展欧几里得定理(Be´zout定理)线性同余方程(逆元同理)题目后记
点击右上角即可分享
微信分享提示