package com.thealgorithms.maths;

/*
 *To learn about the method, visit the link below :
 * https://en.wikipedia.org/wiki/Newton%27s_method
 *
 * To obtain the square root, no built-in functions should be used
 *
 * The formula to calculate the root is : root = 0.5(x + n/x),
 * here, n is the no. whose square root has to be calculated and
 * x has to be guessed such that, the calculation should result into
 * the square root of n.
 * And the root will be obtained when the error < 0.5 or the precision value can also
 * be changed according to the user preference.
 */

public final class SquareRootWithNewtonRaphsonMethod {
    private SquareRootWithNewtonRaphsonMethod() {
    }

    public static double squareRoot(int n) {
        double x = n; // initially taking a guess that x = n.
        double root = 0.5 * (x + n / x); // applying Newton-Raphson Method.

        while (Math.abs(root - x) > 0.0000001) { // root - x = error and error < 0.0000001, 0.0000001
                                                 // is the precision value taken over here.
            x = root; // decreasing the value of x to root, i.e. decreasing the guess.
            root = 0.5 * (x + n / x);
        }

        return root;
    }
}
