Calculate square root of a BigInteger (System.Numerics.BigInteger)

前端 未结 6 786

.NET 4.0 provides the System.Numerics.BigInteger type for arbitrarily-large integers. I need to compute the square root (or a reasonable approximation -- e.g.,

6条回答
  •  感动是毒
    2020-11-29 06:27

    It has been almost 10 years but hopefully, this will help someone. Here is the one I have been using. It does not use any slow division.

        // Source: http://mjs5.com/2016/01/20/c-biginteger-square-root-function/  Michael Steiner, Jan 2016
        // Slightly modified to correct error below 6. (thank you M Ktsis D) 
        public static BigInteger Sqrt(BigInteger number)
        {
            if (number < 9)
            {
                if (number == 0)
                    return 0;
                if (number < 4)
                    return 1;
                else
                    return 2;
            }
    
            BigInteger n = 0, p = 0;
            var high = number >> 1;
            var low = BigInteger.Zero;
    
            while (high > low + 1)
            {
                n = (high + low) >> 1;
                p = n * n;
                if (number < p)
                {
                    high = n;
                }
                else if (number > p)
                {
                    low = n;
                }
                else
                {
                    break;
                }
            }
            return number == p ? n : low;
        }
    

    Update: Thank you to M Ktsis D for finding a bug in this. It has been corrected with a guard clause.

提交回复
热议问题