如果x'是最大的整数,使得x^n <= y,则x'是y的第n个根。其中x、x'和y都是整数。是否有一种高效的方法来计算这样的n次根?我知道通常使用nth root algorithm来完成此操作,但问题在于我正在使用嵌入式系统,其中所有内容都是整数。顺便说一句,我甚至尝试了从1到y的二进制搜索,以识别最大的x,使得x^n <= y,但是它不起作用,因为当n很大时,x^n很容易溢出。
存储给定 y 的最大 x 表,使得 x^y 不会溢出。使用这些值进行二分查找;这样,不会再有溢出问题,并且可以得到一个漂亮的算法,只要 x 和 n 具有相同的(整数)类型即可工作。对吗?
注意:对于 y > 32,32 位整数的最大值为 2... 换句话说,您的表的大小将与您的系统所理解的整数位数相同,约为。
我认为最好的方法是使用维基百科文章中的牛顿-拉弗森方法。
一个好的起始值可以从输入的位长度除以n
计算得出。在每次迭代中,您使用整数除法向下取整。迭代直到找到一个值x
,使得x^n <= y < (x+1)^n
。
您必须小心避免溢出。正如其他答案所说,您可以使用n < bit size
的最大根表来解决这个问题(对于更大的n
,答案总是1
,除非y = 0
)。