from decimal import Decimal, getcontext

# On regle la precision interne (doit etre nettement superieure a 100)
getcontext().prec = 250

# Valeur exacte haute precision de sqrt(3)
sqrt3 = Decimal(3).sqrt()

# Precision demandee : 100 decimales correctes
eps = Decimal("1e-100")


# ------------------------------------------------------------
# a) Methode de Newton : x_{n+1} = g(x_n)
# ------------------------------------------------------------

def newton_sqrt3(eps):
    x0= ... # Valeur de x_0
    x = Decimal(x0)
    n=0
    while abs(x - sqrt3) >= eps:
        x = ... # Calcul du terme suivant : x_{n+1}=g(x_n)
        n+=1
    return n, x


# ------------------------------------------------------------
# b) Methode de dichotomie sur [1,2]
# ------------------------------------------------------------

def dicho_sqrt3(eps):
    a=Decimal(1)
    b=Decimal(2)
    fa = ... # Calcul de f(a)
    n=0
    while abs(a - sqrt3) >= eps:
        m = ... # Milieu de [a,b]
        fm = ... # Calcul de f(m)
        if fa * fm <= 0:
            b = ...
        else:
            a = ...
            fa = ...
        n+=1
    return n, a


# ------------------------------------------------------------
# c) Comparaison et affichage des resultats
# ------------------------------------------------------------

newton_iters, newton_approx = newton_sqrt3(eps)
dicho_iters, dicho_approx = dicho_sqrt3(eps)

print("Methode de Newton :")
print("  - Iterations necessaires :", newton_iters)
print("  - Erreur =", abs(newton_approx - sqrt3))
print("\n")
print("Methode de dichotomie :")
print("  - Iterations necessaires :", dicho_iters)
print("  - Erreur =", abs(dicho_approx - sqrt3))
