Constante de Pythagore, nombre d'or et autres racines par la méthode de Newton

mercredi 9 juillet 2025



en cours de rédaction


Avant toute chose voyons comment utiliser les nombres décimaux en Python, qui permettent (notamment) de disposer d'un grand nombre de chiffres significatifs. Par exemple choisissons d'en utiliser \(1\,000\). Les calculs vont entacher d'une erreur d'arrondi les dernières décimales : il faut donc en ajouter quelques uns si l'on veut en avoir \(1\,000\) justes.

from decimal import Decimal as Décimal, getcontext

# Nombre de chiffres significatifs
NB_CHIFFRES = 1_000
getcontext().prec = NB_CHIFFRES + 50


Écrivons un programme qui affiche un nombre décimal avec (au plus) le nombre indiqué de chiffres significatifs (donc en supprimant les quelques uns qu'on a ajouté pour les problèmes d'arrondis).

# Écriture scientifique des nombres décimaux
def Afficher(x) :
    (Signe, Mantisse, n) = x.as_tuple()
    n += len(Mantisse) - 1
    # S'il y a trop de chiffres, on tronque
    if len(Mantisse) > NB_CHIFFRES :
        Mantisse = Mantisse[ : NB_CHIFFRES]
    # Affichage du signe...
    if Signe != 0 :
        print("-", end = "")
    # ...du premier chiffre significatif...
    print(Mantisse[0], ".", sep = "", end = "")
    # ...puis des autres...
    print("".join(str(c) for c in Mantisse[1 : ]), end = "")
    # ...et enfin de l'exposant
    if n != 0 :
        print(" * 10 ** ", n, sep = "")


Voyons quelques exemples. Si le nombre a moins de chiffres significatifs que la précision maximale indiquée, on n'ajoute évidemment pas de zéros.

>>> Afficher(Décimal("4155008972.092017"))
4.155008972092017 * 10 ** 9
>>> Afficher(Décimal("-0.0000316879"))
-3.16879 * 10 ** -5


Passons maintenant au calcul des racines. Pour calculer \(\sqrt[d]{x}\), avec \(x\) un décimal strictement positif et \(d\) un entier au moins égal à \(2\), on applique la méthode de Newton à la fonction \(f(t) = t^d - x\). On a \(f'(t) = d \times t^{d - 1}\) et donc si on démarre à un certain réel \(u_0\), la formule d'itération s'écrit \[ u_{k+1} = u_k - \frac{f(u_k)}{f'(u_k)} = u_k - \frac{u_k^d - x}{d \times u_k^{d - 1}}. \] Soit \(n\) l'unique entier (relatif) tel que \(10^{n - 1} < \sqrt[d]{x} \leq 10^n\). On va donc calculer la racine à \(\epsilon = 10^{n - \texttt{NB_CHIFFRES}}\) près. On décide d'arrêter l'itération lorsque la fraction ci-dessus est (en valeur absolue) inférieure à \(\epsilon\) et renvoyer alors \(u_{k + 1}\) (lorsque \(\epsilon\) est petit devant \(1\), cela assure que \(\left|u_{k + 1} - \sqrt[d]{x}\right| \leq \epsilon\)). On choisit comme valeur initiale \(u_0 = 10^n\) : on a besoin d'un nombre supérieur ou égal à la valeur recherchée \(\sqrt[d]{x}\), et pas trop plus grande, or ce \(u_0\) est du même ordre de grandeur (dans la même « puissance de dix ») donc il convient très bien.

# Calcul des racines d-ièmes par la méthode de Newton
"""
Entrées :
 - le nombre x est un décimal strictement positif,
 - le nombre d est un entier au moins égal à 2.
Sortie :
 - la valeur de la racine d-ième de x avec le nombre de chiffres significatifs indiqué au tout début (qui peut donc être supérieur au nombre de chiffres significatifs de x).
"""
def Racine(x, d = 2) :
    # Valeur initiale
    if x <= Décimal(1) :
        Raison = Décimal(10) ** (-d)
        u = Décimal(1) ; n = 0 ; p = Raison
        while x <= p :
            u /= 10 ; n -= 1 ; p *= Raison
    else :
        Raison = Décimal(10) ** d
        u = Décimal(10) ; n = 1 ; p = Raison
        while p < x :
            u *= 10 ; n += 1 ; p *= Raison
    # Précision du calcul
    ε = Décimal(10) ** (n - NB_CHIFFRES)
    # Itération de Newton
    du = (u ** d - x) / (Décimal(d) * u ** (d - 1))
    while abs(du) > ε :
        u -= du
        du = (u ** d - x) / (Décimal(d) * u ** (d - 1))
    return u - du


Testons tout ceci. Voici pour commencer, comme promis, la constante de Pythagore \(\sqrt{2}\) : c'est la longueur de la diagonale d'un carré dont le côté vaut \(1\).

>>> x = Racine(Décimal(2))
>>> Afficher(x)
1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572735013846230912297024924836055850737212644121497099935831413222665927505592755799950501152782060571470109559971605970274534596862014728517418640889198609552329230484308714321450839762603627995251407989687253396546331808829640620615258352395054745750287759961729835575220337531857011354374603408498847160386899970699004815030544027790316454247823068492936918621580578463111596668713013015618568987237235288509264861249497715421833420428568606014682472077143585487415565706967765372022648544701585880162075847492265722600208558446652145839889394437092659180031138824646815708263010059485870400318648034219489727829064104507263688131373985525611732204024509122770022694112757362728049573810896750401836986836845072579936472906076299694138047565482372899718032680247442062926912485905218100445984215059112024944134172853147810580360337107730918286931471017111168391658172688941975871658215212822951848847


Puis \(\sqrt{3}\) : c'est la longueur de la diagonale d'un cube dont le côté vaut \(1\).

>>> x = Racine(Décimal(3))
>>> Afficher(x)
1.732050807568877293527446341505872366942805253810380628055806979451933016908800037081146186757248575675626141415406703029969945094998952478811655512094373648528093231902305582067974820101084674923265015312343266903322886650672254668921837971227047131660367861588019049986537379859389467650347506576050756618348129606100947602187190325083145829523959832997789824508288714463832917347224163984587855397667958063818353666110843173780894378316102088305524901670023520711144288695990956365797087168498072899493296484283020786408603988738697537582317317831395992983007838702877053913369563312103707264019249106768231199288375641141422016742752102372994270831059898459475987664288897796147837958390228854852903576033852808064381972344661059689722872865264153822664698420021195484155278441181286534507035191650016689294415480846071277143999762926834629577438361895110127148638746976545982451788550975379013880664961911962222957110555242923723192197738262561631468842032853716682938649611917049738836395495938


Essayons également une racine cubique : par exemple \(\sqrt[3]{2}\), qui est la longueur du côté d'un cube dont le volume est égal à \(2\).

>>> x = Racine(Décimal(2), 3)
>>> Afficher(x)
1.259921049894873164767210607278228350570251464701507980081975112155299676513959483729396562436255094154310256035615665259399024040613737228459110304269355246960642616625000977474526565480306867185405518689245872516764199373709695098382783161399155129313695366183947463448576570303119095895984741105981162907053590816478011473521325484771297880242208582053257972526662202669005665608199471562817640506066482677357267041948620762144296569420507931917244148092044823284012747032196428208120190571418899645999831750380188868959420205592202115472997384880260736369741788779215798467509953963007826095962420348323866013985736343390973712652799599196996837791316816815442885027965152927810767971400204060567480393856125171835700690798499634197629147404483454026971547622851317802064387804764932257905289846708580528625813000542938856072060974722304063135723493645840657591691691672706012440289670000106908103531385290270041508423233623988938649678219414983802707295717681287900144574622714770234835715190550


Et enfin le nombre d'or \(\displaystyle{\phi = \frac{1 + \sqrt{5}}{2}}\).

>>> φ = ((Décimal(1) + Racine(Décimal(5))) / Décimal(2))
>>> Afficher(φ)
1.618033988749894848204586834365638117720309179805762862135448622705260462818902449707207204189391137484754088075386891752126633862223536931793180060766726354433389086595939582905638322661319928290267880675208766892501711696207032221043216269548626296313614438149758701220340805887954454749246185695364864449241044320771344947049565846788509874339442212544877066478091588460749988712400765217057517978834166256249407589069704000281210427621771117778053153171410117046665991466979873176135600670874807101317952368942752194843530567830022878569978297783478458782289110976250030269615617002504643382437764861028383126833037242926752631165339247316711121158818638513316203840052221657912866752946549068113171599343235973494985090409476213222981017261070596116456299098162905552085247903524060201727997471753427775927786256194320827505131218156285512224809394712341451702237358057727861600868838295230459264787801788992199027077690389532196819861514378031499741106926088674296226757560523172777520353613936