#!/usr/bin/python3
# -*- coding: utf-8 -*-

import math


if __name__ == "__main__":
    """
    Resuelve una ecuacion cuadratica.

    Encuentra las dos raices que resuelven la ecuacion cuadratica:

            ax^2 + bx + c = 0.

    Utiliza la formula general (tambien conocida
    coloquialmente como el "chicharronera 1 y 2")
    y el metodo de Newton-Rapson.

    Parametros:
    a -- coeficiente cuadratico (debe ser distinto de 0)
    b -- coeficiente lineal
    c -- termino independiente

    Error:
    Si (a == 0)

    """
    A = 1.0
    B = 4.0
    C = 1.0

    if A == 0.0:
        print("No es una ecuacion cuadratica")
        exit(1)
    # Calculo del discriminante
    d = B * B - 4.0 * A * C

    # Raices reales
    if d >= 0.0:
        print("\nPolinomio (%f) X^2 + (%f )X + (%f) = 0\n" % (A, B, C))
        print("\nChicharronera 1")
        X1 = (-B + math.sqrt(d)) / (2.0 * A)
        X2 = (-B - math.sqrt(d)) / (2.0 * A)
        print(
            "Raiz (%1.16f), evaluacion raiz: %1.16e" % (X1, (A * X1 * X1 + B * X1 + C))
        )
        print(
            "Raiz (%1.16f), evaluacion raiz: %1.16e" % (X2, (A * X2 * X2 + B * X2 + C))
        )

        print("\nChicharronera 2")
        X1 = (-2.0 * C) / (B + math.sqrt(d))
        X2 = (-2.0 * C) / (B - math.sqrt(d))
        print(
            "Raiz (%1.16f), evaluacion raiz: %1.16e" % (X1, (A * X1 * X1 + B * X1 + C))
        )
        print(
            "Raiz (%1.16f), evaluacion raiz: %1.16e" % (X2, (A * X2 * X2 + B * X2 + C))
        )

        # Metodo Newton-Raphson
        print("\n\nMetodo Newton-Raphson")
        x = X1 - 1.0
        print("\nValor inicial aproximado de X1 =  %1.16f" % x)
        for i in range(6):
            x = x - (x * x * A + x * B + C) / (2.0 * x * A + B)
        print("Raiz (%1.16f), evaluacion raiz: %1.16e" % (x, (A * x * x + B * x + C)))
        x = X2 - 1.0
        print("\nValor inicial aproximado de X2 =  %1.16f" % x)
        for i in range(6):
            x = x - (x * x * A + x * B + C) / (2.0 * x * A + B)
        print("Raiz (%1.16f), evaluacion raiz: %1.16e" % (x, (A * x * x + B * x + C)))
        print("\n")
    else:
        # Raices complejas
        print("Raices Complejas ...")
