1 条题解
-
4
普及一点小学数学知识。
辗转相减法
对于 ,。
令 ,则 。那么 。因此 。
同理,令 ,则 。那么 。因此 。
所以 。
辗转相除法
对于 ,有 。
令 ,则 。而 到 的过程即减去 个 。每一次减 都保证 相等。所以 。
那么
gcd就可以这么写:def gcd(a, b): if b == 0: return a else: return gcd(b, a % b)注意到
if语句中,若 ,则考虑上一轮的 一定满足 是 的倍数。此时应返回上一轮的 ,而这正好就是这轮的 。但是我们怎么保证一定会进入这个
if终止递归呢?我们考虑递推定义如下的二元组序列 :对于 ,。容易发现每个
gcd(a[i], b[i])会调用gcd(a[i + 1], b[i + 1])。称两个二元组 相等,当且仅当 且 。
我们断言:存在一个有限的 ,使得 。
证明这个结论还需要一个引理。
对于任意正整数 ,满足对于任意 ,。
若 $b\in \left[1,\left\lfloor\dfrac{a}{2}\right\rfloor+1\right]$,显然成立。否则,$a\bmod b=a-b\le \left\lfloor\dfrac{a}{2}\right\rfloor$。
考虑构造一个新的二元组序列 ,满足:;对于 ,$(u_i,v_i)=\left(v_{i-1},\left\lfloor\dfrac{u_{i-1}}{2}\right\rfloor\right)$。那么容易得知对于 有 。由此可以得知 。令 。
通过 ,不难把除以 下取整和取模联系在一起。
对于任意正整数 ,有 ,。
考虑使用归纳法。当 时显然成立。
若当 时成立。则对于 有 且 。当 时,,,因此 ;$b_i=a_m\bmod b_m\le \left\lfloor\dfrac{a_m}{2}\right\rfloor\le \left\lfloor\dfrac{u_m}{2}\right\rfloor$,,因此 。所以在 时仍然成立。
综上,对于任意正整数 ,有 ,。
由此得知 。而容易发现 恒非负。因此 。
所以我们可以断言:存在一个有限的 ,使得 。
而且我们还分析出来满足上述条件的最小的 满足 。因此,辗转相除法求两个数 最大公约数的时间复杂度为 ,其中认为 。
信息
- ID
- 240
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 19
- 已通过
- 5
- 上传者