How can I find the Square Root of a Java BigInteger?

后端 未结 19 1134
[愿得一人]
[愿得一人] 2020-11-28 08:10

Is there a library that will find the square root of a BigInteger? I want it computed offline - only once, and not inside any loop. So even computationally expensive solutio

19条回答
  •  隐瞒了意图╮
    2020-11-28 08:35

    The C# language has similar syntax to Java. I wrote this recursive solution.

        static BigInteger fsqrt(BigInteger n)
        {
            string sn = n.ToString();
            return guess(n, BigInteger.Parse(sn.Substring(0, sn.Length >> 1)), 0);          
        }
        static BigInteger guess(BigInteger n, BigInteger g, BigInteger last)
        {
            if (last >= g - 1 && last <= g + 1) return g;
            else return guess(n, (g + (n / g)) >> 1, g);
        }
    

    Call this code like this (in Java I guess it would be "System.out.print").

    Console.WriteLine(fsqrt(BigInteger.Parse("783648276815623658365871365876257862874628734627835648726")));
    

    And the answer is: 27993718524262253829858552106

    Disclaimer: I understand this method doesn't work for numbers less than 10; this is a BigInteger square root method.

    This is easily remedied. Change the first method to the following to give the recursive portion some room to breathe.

        static BigInteger fsqrt(BigInteger n)
        {
            if (n > 999)
            {
               string sn = n.ToString();
               return guess(n, BigInteger.Parse(sn.Substring(0, sn.Length >> 1)), 0);
            }
            else return guess(n, n >> 1, 0);            
        }
    

提交回复
热议问题