Generating digits of square root of 2

后端 未结 9 1178
后悔当初
后悔当初 2020-12-29 08:36

I want to generate the digits of the square root of two to 3 million digits.

I am aware of Newton-Raphson but I don\'t have much clue how to impleme

9条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-29 09:15

    The nicest way is probably using the continued fraction expansion [1; 2, 2, ...] the square root of two.

    def root_two_cf_expansion():
        yield 1
        while True:
            yield 2
    
    def z(a,b,c,d, contfrac):
        for x in contfrac:
            while a > 0 and b > 0 and c > 0 and d > 0:
                t = a // c
                t2 = b // d
                if not t == t2:
                    break
                yield t
                a = (10 * (a - c*t))
                b = (10 * (b - d*t))
                # continue with same fraction, don't pull new x
            a, b = x*a+b, a
            c, d = x*c+d, c
        for digit in rdigits(a, c):
            yield digit
    
    def rdigits(p, q):
        while p > 0:
            if p > q:
               d = p // q
               p = p - q * d
            else:
               d = (10 * p) // q
               p = 10 * p - q * d
            yield d
    
    def decimal(contfrac):
        return z(1,0,0,1,contfrac)
    

    decimal((root_two_cf_expansion()) returns an iterator of all the decimal digits. t1 and t2 in the algorithm are minimum and maximum values of the next digit. When they are equal, we output that digit.

    Note that this does not handle certain exceptional cases such as negative numbers in the continued fraction.

    (This code is an adaptation of Haskell code for handling continued fractions that has been floating around.)

提交回复
热议问题