扩展欧几里得算法(求ax+by=gcd(a,b)的一组特解)
欧几里得算法(求最大公约数)
gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
扩展欧几里得
exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return;
}
exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return;
}
斐蜀定理:一定存在ax+by=gcd(a,b)的解
gcd(a,b)|a=>gcd(a,b)|ax ----------(1)
gcd(a,b)|b=>gcd(a,b)|by ----------(2)
(1)(2)=>gcd(a,b)|ax+by=>ax+by=gcd(a,b) 两边同除gcd(a,b)得
a1 x1 + b1 y1 =1 ( a1 , b1 互质)
=>exgcd()
扩展欧几里得
求ax+by=gcd(a,b) 的一组特解
若b=0令x=1,y=0
否则先求 b,a的解
求得bx1+(a%b)y1=gcd(b,a%b)=gcd(a,b)
bx1+[a−⌊a/b⌋∗b]∗y1
ay1+b(x1−⌊a/b⌋∗y1)
与ax+by对比,发现只要令x=y1y=x1−⌊a/b⌋∗y1就能得到特解因此,只要一直递归就能求解
通解(没有遗漏)
x=x0+b/gcd(a,b)
y=y0−a/gcd(a,b)
x,y同时变化,带入原式可发现ax+by不变
证明挖坑优秀的证明
upd: 之前一直忽略的点,关于通解,实际上对于ax+by=c都可以用同样的通解式子
乘法逆元
exgcd
求解逆元a≡1(modb)相当与解不定方程ax+by=1
a,b如果互质,exgcd()求解即可
费马小定理:
定理: 若p为素数,则有
ap−1≡1(modp)
ap−2∗a≡1(modp)
ap−2就是a在mod p意义下的逆元
递推求逆元
upd: 记不住怎么办,有个好记的方法,类似求阶乘逆元的方法,处理前缀积,然后费马求出总的逆元再乘回去,实际上这种做法可扩展性非常强
原理:p是模数,i是待求的逆元,我们求的是i−1在mod p意义下的值
p=k∗i+r令 r<i,则k=p/i,r=p%i
k∗i+r≡0(modp)
k∗r−1+i−1≡0(modp)(两边同乘 r−1 i−1 )
i−1≡−k∗r−1(mod;p)
i−1≡−p/i∗inv[p%i](modp)
所以inv[i]=−(p/i)∗inv[p%i]
边界inv[1]=1
inv[1]=1;
for(int i=2;i<=n;i++)
inv[i]=(p-p/i)*inv[p%i]%p;
//(p-p/i)处理了负数问题 因为p%p=0所以对结果无影响
递推求阶乘逆元
因为
1(n+1)!×(n+1)=1n!
所以处理出inv[n!]再逆推inv[(n−1)!]inv[(n−2)!]........
欧拉函数
定义
φ(n)表示∑n−1i=1gcd(i,n)==1?1:0
一些性质
-
n为质数时有φ(n)=n−1
-
φ(n)为积性函数,但不是完全积性函数
即,当gcd(a.b)=1时有φ(a∗b)=φ(a)×φ(b)
证明:
若gcd(x,n)=y,那么gcd(xy,ny)=1(x<n)
设fi表示gcd(x,n)=i的数的个数,那么有n=∑ni=1fi
有fi=φ(ni)
那么n=∑ni=1fi=∑d|nφ(nd)
d与nd具有对称性,所以可以化为n=∑d|nφ(d)
- p为质数,n=pk,那么φ(n)=pk−pk−1
因为1−pk除了p,2p,3p.....pk−1p共pk−1个p的倍数外都与pk互质
所以φ(pk)=pk−pk−1=pk−1×(p−1)
- 由唯一分解定理,设n=∏si=1pkii ,其中 pi是质数,有 φ(n)=n×∏si=1pi−1pi
证明:
因为积性
φ(n)=s∏i=1φ(pkii)
因为上一个性质
=s∏i=1(pi−1)×piki−1
整理
=s∏i=1piki×(1−1pi)
=n s∏i=1(1−1pi)
求值
求单个欧拉函数使用φ(n)=n×∏si=1pi−1pi,对n进行质因数分解即可
求1−n的欧拉函数,使用线性筛
对于质数,显然φ(n)=n−1
对于合数n=prime[j]×i,分两种情况,就是i%prime[j]是否为0
-
i%prime[j]!=0 那么 i与prime[j]互质phi[n]=phi[i]∗phi[prime[j]]
-
i%prime[j]=0那么i中有n的所有因子
phi[n]=n×∏sk=1pk−1pk=prime[j]×i×∏sk=1pk−1pk=prime[j]×phi[i]
欧拉定理
若gcd(a,m)=1,则aφ(m)≡1(modm)
特别的,当m为质数时,就是费马小定理
证明:
设r1,r2,⋯,rφ(m)为模m意义下的一个简化剩余系,则ar1,ar2,⋯,arφ(m)也为模 意义下的一个简化剩余系。所以r1r2⋯rφ(m)≡ar1⋅ar2⋯arφ(m)≡aφ(m)r1r2⋯rφ(m)(modm),可约去r1r2⋯rφ(m),即得aφ(m)≡1(modm)。
扩展欧拉定理
ab≡⎧⎪⎨⎪⎩abmodφ(p),gcd(a,p)=1ab,gcd(a,p)≠1,b<φ(p)abmodφ(p)+φ(p),gcd(a,p)≠1,b≥φ(p)(modp)
证明,转一下大佬的博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类