#import des bibliothèques, notamment la bibliothèque decimal.
#la bilbiothèque décimal est basé sur un modèle en virgule flottante conçu pour les humains.

import math 
from decimal import *

def ln2_Brouncker(iteration) :
    s = Decimal(1)/(Decimal(1)*Decimal(2)) # initialisation de la valeur de "ln(2)" à 1/2 - approximation très large au début.
    for i in range(1,iteration) :
        k=(2*i+1)*(2*i+2)
        s = s + Decimal(1)/Decimal(k) # on ajoute à s la valeur 1/((2i+1)(2i+2))       
        Decimal(s)
    return s # on retourne la somme calculée 


# à partir de la formule de wallis
def ln2(iteration) :
    s = Decimal(1) - Decimal(1)/Decimal(2) # initialisation de la valeur de "ln(2)" à 1/2=1-1/2
    for i in range(1,iteration) :
        k = 2*i+1 
        p = 2*i+2
        s = s + Decimal(1)/Decimal(k) - Decimal(1)/Decimal(p) # on ajoute à s la valeur 1/(2i+1)-1/(2i+2)        
        Decimal(s)
    return s # on retourne la somme calculée 

def ln2_compar(precision):
    s= Decimal(1) - Decimal(1)/Decimal(2)
    N=1 # initialisation du nombre d'étapes
    while abs(s-Decimal(math.log(2)))>Decimal(1)/Decimal(precision):
        k = 2*N+1
        p = 2*N+2
        s = s + Decimal(1)/Decimal(k) - Decimal('1')/Decimal(p)        
        Decimal(s)
        N=N+1
    return s,N # on renvoie deux valeurs : la somme s et le nombre d'étapes nécessaire pour la précision.

# programme principal
print("valeur de ln(2)stockée dans la bibliothèque maths :",math.log(2)) # valeur de ln(2) de la bibliothèque math
print("valeur de ln(2) donnée par la méthode de Brounckner : ",ln2_Brouncker(1001))
print("valeur de ln(2) donnée par la méthode de Wallis : ",ln2(1001)) # valeur de ln(2) par la méthode de Brouncker après 1000 itérations.
print("Nombre d'itérations nécessaires pour atteindre par la méthode de Brounckner, une valeur approchée au millième de ln(2) :",ln2_compar(1000)) # approximation de ln(2) au millième.
print(Decimal(1)/(Decimal(1)*Decimal(2)))
