类欧几里得算法推导

本文主要介绍了类欧算法的两种经典应用场景:一是通过几何意义求解特定形式的离散数学问题;二是寻找满足特定条件的最小分数u/v。文章详细解释了如何通过递归和转化的方法降低问题的复杂度。

由于博主很菜,在这里只想简单推导两个最经典的问题模型用类欧的做法。
这两个模型的扩展等哪天有梦想了再补吧。。。

Part 1

i=0nai+bc

设答案为函数f(a,b,c,n)
当a>=c或b>=c的时候,我们可以提出一个acbc,从而转移到f(a%c,b%c,c,n)
考虑这条式子的几何意义,我们可以发现它表示一条直线下面的整点的数目
m=an+bc即顶点,我们可以转化一下式子
i=0nj=1m[ai+bcj]

i=0nj=1m[ai+bcj]

i=0nj=0m1[ai+bcj+1]

考虑真值表达式里面的值
ai+bcj+1

ai+bcj+c

ai>cj+cb1

i>cj+cb1a

代回原式
i=0nj=0m1[i>cj+cb1a]

重新考虑它的几何意义,可以发现这表示这条直线之上的点数
j=0m1ncj+cb1a

nmj=0m1cj+cb1a

nmf(c,cb1,a,m1)

观察f的第一个和第三个参数,发现这样转移的复杂度是等于欧几里得算法的复杂度的。

Part 2

求一个最小的u和v,满足

a/b<u/v<c/d

其实最小化分子和分母是一样的
那么我们可以这样考虑,如果a>=b,那么我们把不等式左右同时减去ab
那么就得到了一个新的不等式a′/b < u′/v < c′/d
如果这时候c’>d了那么u’,v就可以等于1了
如果不行那么我们就把不等式翻过来变成d/c′ < v/u′ < b/a′
这样递归下去进行就可以了
边界还有一个是a=0
这样每次左右减就相当于a%=b,所以复杂度也是log n
### 三、扩展欧几里得算法的原理与推导 扩展欧几里得算法欧几里得算法的扩展,不仅能够计算两个整数 $ a $ 和 $ b $ 的最大公约数 $ \gcd(a, b) $,还能同时找到满足贝祖等式 $ ax + by = \gcd(a, b) $ 的整数解 $ x $ 和 $ y $。该算法基于递归思想,通过不断将问题简化,最终求得解。 #### 3.1 算法核心原理 扩展欧几里得算法的核心在于递归地将原问题转化为更小的子问题。假设我们已知 $ b $ 和 $ a \mod b $ 的一组解 $ x_1 $ 和 $ y_1 $,使得: $$ b \cdot x_1 + (a \mod b) \cdot y_1 = \gcd(b, a \mod b) $$ 由于 $ \gcd(b, a \mod b) = \gcd(a, b) $,我们可以将上式转换为关于 $ a $ 和 $ b $ 的表达式: $$ a \cdot x + b \cdot y = \gcd(a, b) $$ 通过数学推导,可以得出: $$ x = y_1, \quad y = x_1 - \left\lfloor \frac{a}{b} \right\rfloor \cdot y_1 $$ 这一关系使得我们能够在递归回溯过程中逐步求出原问题的解 $ x $ 和 $ y $。 #### 3.2 递归终止条件 当递归到 $ b = 0 $ 时,此时 $ \gcd(a, 0) = a $,可以直接令 $ x = 1 $,$ y = 0 $,满足: $$ a \cdot 1 + 0 \cdot 0 = a $$ 然后通过回溯逐步计算出原问题的解。 #### 3.3 数学推导示例 以 $ a = 25 $,$ b = 18 $ 为例,扩展欧几里得算法可计算出最大公约数为 1,并找到一组整数解 $ x = -7 $,$ y = 10 $,满足: $$ 25 \cdot (-7) + 18 \cdot 10 = 1 $$ 这一过程体现了算法在每一步递归中如何调整解的值,从而最终得到满足贝祖等式的整数解[^1]。 #### 3.4 C语言实现 以下是一个基于上述原理的C语言实现示例: ```c #include <stdio.h> // 扩展欧几里得算法实现 int extended_gcd(int a, int b, int *x, int *y) { if (b == 0) { *x = 1; *y = 0; return a; } else { int x1, y1; int g = extended_gcd(b, a % b, &x1, &y1); *x = y1; *y = x1 - (a / b) * y1; return g; } } int main() { int a, b, x, y; printf("请输入 a 和 b 的值: "); scanf("%d %d", &a, &b); int g = extended_gcd(a, b, &x, &y); printf("gcd(%d, %d) = %d\n", a, b, g); printf("解为 x = %d, y = %d\n", x, y); return 0; } ``` 该程序通过递归方式实现扩展欧几里得算法,输出两个整数的最大公约数及其对应的贝祖等式解。 #### 3.5 应用场景 扩展欧几里得算法在数论和密码学中有广泛应用,例如: - **求解线性同余方程**:如 $ ax \equiv 1 \ (\text{mod} \ m) $,即求模逆元。 - **公钥密码学**:在RSA算法中用于生成密钥对。 - **数论分析**:用于求解丢番图方程等问题。 当 $ a $ 和 $ m $ 不互质时,模逆元不存在,此时需要通过其他方式处理,如引入模线性方程的通解形式或使用中国剩余定理[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值