On 01.11.14 03:29, Steven D'Aprano wrote:
There is an algorithm for calculating the integer square root of any
positive integer using only integer operations:

Here is my optimized implementation inspired by Christian's ideas.

import math, sys

C1 = sys.float_info.radix ** sys.float_info.mant_dig
C2 = int(sys.float_info.max)
C3 = C2.bit_length() - 2

def isqrt(n):
    if n < 0:
        raise ValueError
    if n == 0:
        return 0
    if n <= C1:
        return int(math.sqrt(n))
    if n <= C2:
        x = int(math.sqrt(n))
    else:
        b = (n.bit_length() - C3) // 2
        x = int(math.sqrt(n >> (2 * b))) << b
    y = (x + n // x) // 2
    if y == x:
        return x
    while True:
        x = y
        y = (x + n // x) // 2
        if y >= x:
            return x


--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to