欧几里得延申
发表于:2023-01-14 | 分类: 数论
字数统计: 820 | 阅读时长: 4分钟 | 阅读量:

md鼻塞真难受

欧几里得辗转相除法:求a,b的最大公约数

1
2
3
int gcd(int a, int b){
return a % b == 0 ? b : gcd(b, a % b);
}

几何证明:

问可以用最大边长为多少的正方形填满这个 20 * 56 的长方形 ?

我们首先必然可以使用20边长的去填,于是得到了余下的16*20的长方形

以此类推,我们可以得到这样子的填补,显而4是最大的正方形可以填补该最大长方形,所以4就是20和56的最大公约数。

1
2
3
56 ÷ 20 = 2 ······ 16
20 ÷ 16 = 1 ······ 4
16 ÷ 4 = 0

我们设余数是 rr,被除数是 aa,除数是 bb,商是 ccaba、b的最大公约数是 ss,得 r=abcr = a - b*c
又因为 sr,sbs|r, s|b
gcd(56,20)=gcd(20,16)=gcd(16,4)=4gcd(56,20) =gcd(20,16)=gcd(16,4)=4

gcd(a,b)=gcd(b,agcd(a,b) = gcd(b, a%$b) $

裴蜀定理: (我写的是狗屎 ,)

a,ba,b 是不全为零的整数,则存在整数 x,yx,y, 使得 ax+by=gcd(a,b)ax+by=gcd(a,b)

我们可以简单发现,如果 ax+by=dax+by=d, 则 d 一定为 gcd(a,b)gcd(a,b) 的倍数,

ax+by=ax+by= a1rx+a_1 r x+ b1ry=db_1ry=d,显得 dd 也是 rr 的倍数

同时我们可得若当 ax+by=1ax+by=1 有解,则 aba,b 互质。

扩展欧几里得求解

给定两个整数 aba、b,求得一组解 xyx、y 使得 ax+by=dax+by=d
b=0b=0ax+by=aax+by=a 故而 x=1,y=0x=1,y=0

b0b≠0
gcd(a,b)=gcd(b,agcd(a,b)=gcd(b,a%b)b)bx+(abx′+(a%b)y=gcd(b,ab)y′=gcd(b,a%b)b)

bx+(aa/b×b)y=gcd(b,abx′+(a−⌊a/b⌋×b)y′=gcd(b,a%$b)

ay+b(xa/b×y)=gcd(b,aay'+b(x'−⌊a/b⌋×y')=gcd(b,a%b)=gcd(a,b)b)=gcd(a,b)

x=y,y=xa/b×yx=y',y=x'−⌊a/b⌋×y'

然后我们可以采用递归求解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void ex_gcd(int a, int b, int &x, int &y){
if(b == 0){
x = 1, y = 0;
return ;
}
ex_gcd(b, a % b, y, x);
y = y - a / b * x;
}
void solve()
{
int a, b, x, y; cin >> a >> b;
ex_gcd(a, b, x, y);
cout << x << ' ' << y << '\n';
}

中国剩余定理:

给定 aa 数组和 nn 数组(其中 n1n_1, n2n_2,…, nkn_k两两互质),可用该定理求解如下方程组

其主要有三步:

1、计算每一个nin_i的乘积MM,同时计算

2、然后对于每一个 mim_imim_i cic_i =1(mod=1(mod nin_i),也就是mim_inin_i上的逆元,以为每个nin_i都是互质的,所以该逆元一定存在。
最后

3、求得

简单证明

我们易知 ,且

这意味着所有 aimitia_im_it_i 的和在模 MM 的情况下满足以上所有方程组。

上一篇:
点分治
下一篇:
快速幂的应用