整数第n个根

时间:2011-09-13 20:02:40

标签: algorithm math nth-root

x'是y的第n个根,如果x'是最大整数,使得x ^ n <= y。 x,x'和y都是整数。有没有有效的方法来计算这样的第n个根?我知道这通常由nth root algorithm完成,但这里的难点是一切都是整数,因为我正在使用嵌入式系统。

BTW,我甚至尝试从1到y进行二进制搜索以识别最大x,使得x ^ n <= y,但是由于x ^ n容易溢出,尤其是当n很大时,它不起作用。

3 个答案:

答案 0 :(得分:8)

为最大x的给定y存储一个表,使得x ^ y不会溢出。使用这些值进行二分查找;这样,只要x和n具有相同(整数)类型,就不会有溢出和整齐的算法。正确?

注意:对于y&gt; 32,对于32位整数,x的最大值为2 ...换句话说,您的表的大小与系统理解的整数中的位数大致相同。

答案 1 :(得分:2)

您是否只在寻找整数根?或者你想知道34的第5个根是2.024 ......?或者是&#34; 2&#34;一个足够的答案?如果你想要小数位,你必须做某种浮点或定点数学。

你应该阅读Computing principal roots,并注意它对第一个牛顿近似的说法。如果大约0.03%的误差足够接近,我建议你继续这样做。您可能想要构建一个可用于执行初始近似的表。这张表并不像听起来那么大。 2 ^ 32的立方根只有大约1,626。您可以轻松计算平方,如果您可以生成x ^ 2和x ^ 3,则很容易生成x ^ n。所以做近似很容易。

另一种可能性是建立自己的根表并使用某种插值。同样,如果您将平方根视为特殊情况,那么该表不会非常大。 2 ^ 32的第5个根小于100,所以你要说一个非常小的表来获得相当大的根。

答案 2 :(得分:1)

我认为最好的方法是使用维基百科文章中的Newton-Raphson方法。

可以根据输入的位长除以n来计算良好的起始值。在每次迭代中,您使用向下舍入的整数除法。迭代,直到找到值为x的值x^n <= y < (x+1)^n

你必须小心避免溢出。正如另一个答案所说,您可以使用n < bit size的最大根表来执行此操作(对于更大的n,答案始终为1y = 0除外)