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.
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}}\).