只需研究着名论文PRIMES is in P
并感到困惑。
所提出的算法的第一步是If (n=a^b for nature number a and b>1), output COMPOSITE.
由于整个算法在多项式时间内运行,因此该步骤也必须在O((log n)^ c)中完成(给定输入大小为O(log n)。但是,在谷歌搜索后,我无法找出任何算法来击中目标。
问题:
是否有任何算法可用于测试多项式时间内某个其他数字的数字指数?
谢谢,最诚挚的问候!
答案 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;
}