Algorithm 如何处理整数平方根法中的大输入?

Algorithm 如何处理整数平方根法中的大输入?,algorithm,binary-search,fixed-point,square-root,Algorithm,Binary Search,Fixed Point,Square Root,我需要实现一个查找整数平方根的方法 我的平台是Solidity语言,它只支持整数运算,iput大小是256位uint256 典型的解决方案是二进制搜索,我很容易实现 问题是我的方法仅限于小于2^129的输入 下面是我用Python实现的方法: def sqrt(x): assert(x < 0x200000000000000000000000000000000); lo = 0; hi = x; while (True): mid = (lo

我需要实现一个查找整数平方根的方法

我的平台是Solidity语言,它只支持整数运算,iput大小是256位uint256

典型的解决方案是二进制搜索,我很容易实现

问题是我的方法仅限于小于2^129的输入

下面是我用Python实现的方法:

def sqrt(x):
    assert(x < 0x200000000000000000000000000000000);
    lo = 0;
    hi = x;
    while (True):
        mid = (lo+hi)//2;
        if (mid == lo or mid**2 == x):
            return mid;
        elif (mid**2 < x):
            lo = mid;
        else: # (mid**2 > x)
            hi = mid;
请注意,我用Python而不是Solidity发布了它,因为这里的大多数用户都不熟悉Solidity,所以我认为Python是一个很好的选择,以便其他人可以轻松地对我的方法应用更改


不过,我通常对算法解决方案感兴趣。

这是用Java编写的,而不是Python,纯粹是因为我已经有了这个解决方案。代码非常简单,可以进行转换,因为所有变量都是整数,所以都是整数算术

/**
 * Finds the integer square root of a positive number.
 * Crandall and Pomerance algorithm 9.2.11 (Newton-Raphson).
 *
 * @param num int Number to find root of.
 * @return int Integer square root of given number.
 */
public static int iSqrt(int num) {
    if (0 == num) {
        // Avoid zero divide crash
        return 0;
    }
    int x = (num / 2) + 1;
    int y = (x + (num / x)) / 2;
    while (y < x) {
        x = y;
        y = (x + (num / x)) / 2;
    } // end while
    return x;
} // end iSqrt(int)

与您已经拥有的非常相似,但我认为稍微简单一些。

啊,牛顿·拉弗森很棒,我不知道它可以用整数算法实现。现在就来测试一下,谢谢!!!好的,在2**n-1、2**n-0和2**n+1上对0和256之间的每n测试您的方法,它似乎工作正常。非常感谢。谢谢它来自我的Java数学库,我还没有测试到这个深度。很明显,使用Java的原生int,甚至是unsigned int,它在这个深度上不起作用,顺便说一句,你也可以在你的库中使用它。