Méthode de Briggs et de Héron avec MPFR via Haskell et Sage

Sage permet de travailler beaucoup plus convivialement avec la bibliothèque MPFR de C.

Complétez le script sage suivant qui permet d'utiliser les méthodes de Briggs et de Héron vues en cours.

Sage
#
# Exercice 2.2 : méthode de Briggs d'approximation de log a
# 
# Travail commode avec la bibliothèque MPFR de C  via sage
# On ouvre dans emacs un fichier d'extension sage qui met emacs en mode sage
# La syntaxe de programmation est celle de Python
#
 
# On travaille sur 128 bits (on donne la précision = taille de la mantisse)
RN = RealField(113)
 
# Algorithme de Héron pour calculer ?..
def racine(a,x,n):
    if n == 0:
        return RN(x)
    else:
        return racine(RN(a), ??? * RN(0.5), n - 1)
 
# quid ?
def racine_n(a,n):
    if n == 0:
        return RN(a)
    else:
        return racine_n(racine(RN(a),1.0,10), n - 1)
 
# Calcul de log 2
a = ???
b = ???
 
logDeux = RealField(53)(b / a) # résultat projeté sur 64 bits
diffLog = logDeux - (log(2.))/ log(10.) # On compare avec le log 2 de sage
 
# Calcul de log 3 et log 7 ? Généralisation ? log 0 ?  log (-10) ?

On peut aussi travailler avec MPFR via Haskell grâce à la bibliothèque hmpfr qu'on peut installer avec cabal.

Haskell
import qualified Data.Number.MPFR as M --importe les fonctions
import Data.Number.MPFR.Instances.Up   -- importe les  instances
 
racine :: (Eq a, Num a) => M.MPFR -> M.MPFR -> a -> M.MPFR
racine a x 0 = x 
racine a x n = 
  racine a (M.div M.Near 128 (M.add M.Near 128 x  (M.div M.Near 128 a  x))  2) (n - 1)
 
racine_n :: (Eq a, Num a) => M.MPFR -> a -> M.MPFR 
racine_n a 0 = a
racine_n a n = racine_n (racine a 1 7) (n - 1)
 
briggs :: M.MPFR -> M.MPFR
briggs x =
  let a = M.sub M.Near 128 (racine_n x  54) 1 in
  let b = M.sub M.Near 128 (racine_n 10 54) 1 in
  M.div M.Near 128 a b

Alors on obtient de même:

Haskell
*Main> briggs 2
3.010299956639812e-1
*Main> log(2) / log(10)
0.30102999566398114