是否有多项式时间算法来测试某个数字的指数是否为?

时间:2012-04-18 17:49:59

标签: algorithm analysis computation-theory

只需研究着名论文PRIMES is in P并感到困惑。

所提出的算法的第一步是If (n=a^b for nature number a and b>1), output COMPOSITE.由于整个算法在多项式时间内运行,因此该步骤也必须在O((log n)^ c)中完成(给定输入大小为O(log n)。但是,在谷歌搜索后,我无法找出任何算法来击中目标。

问题:

是否有任何算法可用于测试多项式时间内某个其他数字的数字指数?

谢谢,最诚挚的问候!

3 个答案:

答案 0 :(得分:4)

如果n=a^b(对于> 1)则b≤log 2 n,我们可以检查小于b的所有log n测试一下,我们可以迭代从2找到b到log n,为了找到a,我们应该在1..sqrt(n)之间进行二进制搜索。但二进制搜索需要O(logn)次迭代,最后在搜索的每一步(对于任何找到的a进行检查)我们应该检查是否 b == n,这需要O(log n),因此总搜索时间将为O(log 3 n)。可能有一种更快的方法但是通过知道AKS是O(log 6 n),这个O(log 3 n)不会对任何东西造成伤害。

答案 1 :(得分:2)

如果b和e存在b ^ e = n,则数n是完美的幂。例如216 = 6 ^ 3 = 2 ^ 3 * 3 ^ 3是完美的功率,但是72 = 2 ^ 3 * 3 ^ 2不是。确定数字是否是完美幂的技巧是要知道,如果数是一个完美的幂,那么指数e必须小于log2 n,因为如果e大于那么2 ^ e将大于n。此外,只需要测试素数e,因为如果数字是复合指数的完美幂,它也将是复合分量的素因子的完美幂;例如,2 ^ 15 = 32768 = 32 ^ 3 = 8 ^ 5是一个完美的立方根,也是一个完美的第五根。因此,该算法是制作小于log2 n的素数列表并测试每一个素数。由于log2 n很小,并且素数列表甚至更小,因此即使对于大n也没有太多工作。

您可以看到实施here

答案 2 :(得分:1)

public boolean isPerfectPower(int a) {
    if(a == 1) return true;
    for(int i = 2; i <= (int)Math.sqrt(a); i++){
        double pow = Math.log10(a)/Math.log10(i);
        if(pow == Math.floor(pow) && pow > 1) return true;
    }
    return false;
}