线性时间内的完美功率检测

时间:2011-05-28 17:10:18

标签: c performance algebra computation

我正在尝试编写一个C程序,给定一个正整数n(> 1)检测是否存在数字x和r以便n = x ^ r

这是我到目前为止所做的:

while (c>=d) {
    double y = pow(sum, 1.0/d);
    if (floor(y) == y) {
        out = y;
        break;
    }

    d++;
}

在上面的程序中,“c”是指数(r)的最大值,“d”将从等于2开始.Y是要检查的值,变量“out”设置为输出那个价值以后。基本上,脚本的作用是检查y的平方根是否存在:如果不存在,他尝试使用方形立方体等等......当他找到它时,他将y的值存储在“out”中,以便:y = out ^ d

我的问题是,有没有更有效的方法来找到这些价值观?我在网上找到了一些文档,但这比我的高中代数要复杂得多。如何以更有效的方式实现这一点?

谢谢!

4 个答案:

答案 0 :(得分:3)

在您的一条评论中,您声明您希望它与巨大的数字兼容。在这种情况下,您可能需要引入GMP library,它支持对任意大数字的操作,其中一个操作为checking if it is a perfect power

它是开源的,所以如果你不想引入整个库,你可以查看源代码并看看它们是如何做的。

答案 1 :(得分:2)

如果n适合固定大小(例如32位)整数变量,则最佳解决方案可能只是对这些数字列表进行硬编码并对其进行二进制搜索。请注意,在int范围内,大致有

  • sqrt(INT_MAX)完美的正方形
  • cbrt(INT_MAX)完美的立方体

在32位中,大约为65536 + 2048 + 256 + 128 + 64 + ...< 70000

答案 2 :(得分:0)

你需要r-base logarithm,使用身份来计算natural log

所以:

log_r(x) = log(x)/log(r)

所以你需要计算:

x = log(n)/log(r)

(在我的脖子上,这个高中数学。这立刻解释了我不得不查看我是否正确地记住了这个身份:))

答案 3 :(得分:0)

中计算y之后
double y = pow(sum, 1.0/d);

你可以得到最近的int,你可以使用自己的电源功能检查 平等条件与总和。

int x = (int)(y+0.5);
int a = your_power_func(x,d);
if (a == sum)
     break;

我猜这种方式你可以确认一个数字是否是某个其他数字的整数幂。