我发现很难计算二进制 GCD 算法(也称为 Stein 算法)的时间复杂度,该算法为 O(n^2),其中 n 是两个数字中较大者的位数。不应该是 O(n) 吗? 算法如下:
1.gcd(0, v) = v,因为一切都整除零,而v是整除v的最大数。同样,gcd(u, 0) = u。gcd(0, 0) 通常没有定义,但设置 gcd(0, 0) = 0 很方便。
2.如果u和v都是偶数,那么gcd(u, v) = 2·gcd(u/2, v/2),因为2是公约数。
3.如果u是偶数,v是奇数,则gcd(u, v) = gcd(u/2, v),因为2不是公约数。类似地,如果 u 是奇数而 v 是偶数,则 gcd(u, v) = gcd(u, v/2)。
4.如果 u 和 v 都是奇数,并且 u ≥ v,则 gcd(u, v) = gcd((u − v)/2, v)。如果两者都是奇数且 u < v,则 gcd(u, v) = gcd((v − u)/2, u)。这些是简单欧几里得算法的一个步骤的组合,该算法在每一步都使用减法,以及上述步骤 3 的应用。除以 2 得到一个整数,因为两个奇数的差是偶数。 [3]
5. 重复步骤 2-4 直到 u = v,或(多一步)直到 u = 0。在任何一种情况下,GCD 都是 2kv,其中 k 是在步骤 2 中找到的 2 的公因数的数量。