检查一个整数是否是另一个的整数幂?

问题描述

这与Check if one integer is an integer power of another上的问题相同,但是我想知道解决此问题的方法的复杂性。

给定一个整数n,给一个整数m和另一个整数n = m^pp。请注意,^是幂运算,而不是xor

一个简单的O(log_m n)解决方案,该解决方案基于将n反复除以m直到其为1或存在非零余数。

我正在考虑一种受二进制搜索启发的方法,我不清楚在这种情况下应如何计算复杂度。

基本上,您从m开始,然后转到m^2,然后依次到m^4m^8m^16等。 找到m^{2^k} > n时,检查由m^{2^{k-1}}m^{2^k}界定的范围。这个解决方案是O(log_2 (log_m(n)))吗?

如果我做类似的事情,与此有关

m^2 * m^2

vs。

m * m * m * m

这两个是否具有相同的复杂性?如果他们这样做,那么我认为我想出的算法仍然是O(log_m (n))

解决方法

不完全是。首先,让我们假设乘法是O(1),乘幂a^bO(log b)(使用平方运算)。

现在,使用将指数p_candidate加倍然后进行二进制搜索的方法,您可以在p个步骤中找到真实的log(p)(或者观察到p不存在)。但是在二进制搜索中,每次尝试都需要您计算m^p_candidate,它受m^p的限制,假设O(log(p))。因此,总体时间复杂度为O(log^2(p))

但是我们要用输入nm来表示时间复杂度。从关系n = m^p中,我们得到p = log(n)/log(m),因此得到log(p) = log(log(n)/log(m))。因此,总体时间复杂度为

O(log^2(log(n)/log(m)))

如果您想摆脱m,则可以使用来提供更宽松的上限

O(log^2(log(n)))

,它与O(log(log(n)))接近,但不完全相同。 (请注意,由于所有对数函数仅相差一个常数,因此您始终可以省略O表示形式的对数底数。)

现在,有趣的问题是:此算法是否优于O(log(n))的算法?我还没有证明,但是我可以肯定O(log^2(log(n)))O(log(n))中是这种情况,反之亦然。有人愿意证明吗?