square root Algorithm

The square root algorithm is a mathematical method used to find the square root of a number, which is a value that, when multiplied by itself, equals the given number. There are several different algorithms that can be used to calculate square roots, such as the Babylonian method, the Newton-Raphson method, and the digit-by-digit method. These algorithms have been used since ancient times to find the square root of a number, and they are still widely used in modern mathematics and computer programming for various calculations. One of the most well-known square root algorithms is the Babylonian method, also known as Heron's method. This iterative method involves making an initial guess for the square root and then refining that guess using a series of calculations. The basic idea is to take an average of the current guess and the quotient of the number divided by the current guess. This process is repeated until the difference between successive guesses is minimal or within a desired level of accuracy. The Newton-Raphson method is another popular algorithm that uses calculus to refine the estimate of the square root. The digit-by-digit method calculates the square root one digit at a time, starting from the leftmost digit, making it well-suited for manual calculations or in situations where only a few digits of the square root are needed.
import math


def fx(x: float, a: float) -> float:
    return math.pow(x, 2) - a


def fx_derivative(x: float) -> float:
    return 2 * x


def get_initial_point(a: float) -> float:
    start = 2.0

    while start <= a:
        start = math.pow(start, 2)

    return start


def square_root_iterative(
    a: float, max_iter: int = 9999, tolerance: float = 0.00000000000001
) -> float:
    """
    Square root is aproximated using Newtons method.
    https://en.wikipedia.org/wiki/Newton%27s_method

    >>> all(abs(square_root_iterative(i)-math.sqrt(i)) <= .00000000000001  for i in range(0, 500))
    True

    >>> square_root_iterative(-1)
    Traceback (most recent call last):
        ...
    ValueError: math domain error

    >>> square_root_iterative(4)
    2.0

    >>> square_root_iterative(3.2)
    1.788854381999832

    >>> square_root_iterative(140)
    11.832159566199232
    """

    if a < 0:
        raise ValueError("math domain error")

    value = get_initial_point(a)

    for i in range(max_iter):
        prev_value = value
        value = value - fx(value, a) / fx_derivative(value)
        if abs(prev_value - value) < tolerance:
            return value

    return value


if __name__ == "__main__":
    from doctest import testmod

    testmod()

LANGUAGE:

DARK MODE: