from math import *

#L'utilisation de decimal permettra des calculs précis
#(27 chiffres après la virgule) sur les nombres
#en format décimal

from decimal import *

#Calcul du log d'un entier par la méthode de Briggs

#Idée: Si x est très petit alors log(1+x)= C*x
#La valeur de C est calculée avant: C=1/ln(10)

C=Decimal("0.434294481903251804")


#Méthode: Briggs sait extraire la racine carrée
#Il repète l'opération jusqu'à être proche de 1 puis
#exploite la règle de proportionnalité et celle du calcul
#du logarithme: log(a^m)=m*log(a)
#Attention, dans la fonction "Briggs_2", le réel x est supérieur à 1 et on utilise log(x) environ égal à x-1.

def Briggs_2(N):
    x=Decimal(N) #Conversion en Decimal pour garder la précision
    n=0
    m=1
    while x-1>10**(-20): #vérification de la proximité avec 1
        n=n+1 #nombre d'itération de la racine carrée
        m=m*2 #calcul du coefficient m de: log(a^m)=m*log(a)
        x=x.sqrt() #racine carrée extraite avec la bibliothèque decimal
    print(n) # affichage du nombre d'étape - peut être supprimé.
    return m*C*(x-1) #Briggs donnait un logarithme décimal. On peut retourner le logarithme népérien sans le produit par C.

# programme principal
N=float(input('choisir un nombre strictement supérieur à 1 : '))
if N<1 :
    print('le nombre demandé doit être plus grand que 1')
else :
    logN=Briggs_2(N)
    print (" le logarithme décimal de ",N," est :", logN) # affichage de log(N)
    print ( " le logarithme neperien de ", N,"est :", logN*Decimal(log(10))) #affichage de ln(N)





    
