gcd && ecgcd

exgcd还未更新!!

gcd

性质

gcd(ka,kb)=kgcd(a,b)gcd(k* a, k* b) = k*gcd(a,b)

gcd(a,b)=gcd(a,ab)gcd(a,b) = gcd(a,a-b)

性质②证明如下:

a=pca=p*c, b=qcb = q*c, 则 gcd(a,b)=cgcd(a,b) = c, 且 p,qp,q互质( gcd(p,q)=1gcd(p,q)=1 )。

由性质①可知,gcd(a,ab)=gcd(pc,(pq)c)=cgcd(p,pq)gcd(a, a-b)=gcd(p*c, (p-q)*c)=c*gcd(p,p-q)

现在转化为:在 gcd(p,q)=1gcd(p,q)=1 的情况下,证明 gcd(p,pq)=gcd(p,q)=1gcd(p,p-q)=gcd(p,q)=1 .

分类讨论:以下证明出处

p,qp,q 没有为2的情况,所以 ppqq 分别可以写成 p=2m+1,q=2n+1p=2m+1,q=2n+1,( mmnn 皆为素数), pq=2(mn)p-q=2(m-n) ,是一个偶数,该偶数显然与 qq 互素。

p,qp,q 有一个为2的情况,不妨假设 q=2p=2m+1,pq=2m1q=2,p=2m+1,p-q=2m-1 ,显然 p,qp,q 互素。

由此得证。

结论

gcd(a,b)=gcd(b,amodb)gcd(a,b)=gcd(b,a\bmod b)

实现代码
int gcd(int a, int b) {return (!b ? a : gcd(b, a % b));}

也可以使用<algorithm>库中的__gcd()函数

#include <algorithm>
int g = __gcd(a, b);

gcd && ecgcd
http://linyisu.github.io/2025/02/05/模板/gcd/
作者
linyisu
发布于
2025年2月5日
许可协议