【发布时间】:2018-06-06 03:20:47
【问题描述】:
CLRS 状态练习 31.2-7 的一部分
展示如何求整数 x0, x1...xn 使得 gcd(a0, a1...an) = a0x0 + a1x1..an xn。证明您的算法执行的除法次数为 O(n + lg(max{a0, a1...an})
我不知道那个复杂性表达式可能来自哪里。
可以在扩展 Euclid 的 Wikipedia 页面中的“超过两个数字的情况”部分下找到想到的算法。特别是,我们有 gcd(a0, a1...an) = gcd(a0, gcd(a1...gcd(a_n-1, an)))...)。因此,重复应用二变量扩展欧几里得来获得所有 n+1 个参数的系数。对双变量扩展欧几里德的每次调用都需要 O(lg(b)) 除法,其中 b 是两个参数中较小的一个。
因此,它的上限是 O(n * lg(max{a0, a1...an}):n 次调用双变量扩展 Euclid,每个调用最多 lg(max{a0, a1. ..an}) 递归步骤。那么在世界上哪里可以得到一个 n plus lg(max{a0, a1...an} 运行时?是因为在对扩展欧几里德的调用中,无论 b 的值是什么,两者中较小的一个,都会非常迅速地衰减,因此对于大多数调用而言,b 基本上是 O(1)?
另外,有趣的是,Knuth TAOCP 第 2 卷,第 4.5.3 节(第 364 页)问题 45 给出了这个问题:
开发用于计算三个或更多整数的最大公约数的算法分析。
该问题的难度等级为“HM48”(其中 HM 的意思是“需要书中未讨论的更高水平的数学,48 是满分 50 分,其中 50 是在“证明费马大定理”之类的水平上)。
【问题讨论】:
标签: algorithm time-complexity number-theory modular-arithmetic