ChronoMath, une chronologie des MATHÉMATIQUES
à l'usage des professeurs de mathématiques, des étudiants et des élèves des lycées & collèges

Racine carrée selon Théon de Smyrne    programme JavaScript "on line"

On se propose ici de programmer, en JavaScript, l'algorithme de Théon de Smyrne pour le calcul de la racine carrée d'un nombre positif A :

En posant : xo = yo = 1,  xn+1 = xn + yn ,  yn+1 =  yn + 2xn et rn = yn/xn, la suite (rn) vérifie :

ro = 1  ,

et converge vers √A. En posant vn = r2n , on a prouvé (cliquer sur la clé...) que :

Programmation de l'algorithme en JavaScript :

<SCRIPT LANGUAGE=JavaScript>
function rac()
{
a=2;k=6  
// par défaut A = 2 et on veut 6 décimales exactes
a=eval(prompt("Votre nombre A :",a))
k=eval(prompt("Nombre k de décimales voulu (1-10) :",k))
if(k<1 || k>10) {alert("Mauvais choix de k"+"\n"+"Vous avez entré k = "+k);return}
r=1;k=k+1;  
// k augmente de 1 pour assurer la k-ème décimale
if(a==1||a==0) {alert("Petit plaisantin !"+"\n"+"Si a = "+a+", sa racine carrée est "+a+".");return}
if(a<0) {alert("Vous avez entré A = "+a+" < 0 !"+"\n"+"On travaille ici dans les réels...");return}
x=1;y=1; p=1/Math.pow(10,k);n=0;logerr=1;   
// initialisation des suites rang 0
while(logerr>-k) 
// le log de l'erreur doit être inférieure à -k
{
n++;
xn=x+y;yn=y+a*x;rn=yn/xn;                    
// rang 1 , puis 3, 5, ..., 2n-1
x2n=xn+yn;y2n=yn+a*xn;r2n=y2n/x2n;  
// rang 2 , puis 4 , 6, ...,  2n
logerr=(2*n+1)*log10(Math.abs(1-a))-2*log10(x2n);  
// calcul du log de l'erreur max

if(a<1) {logerr=logerr-log10(2*a)} else {logerr=logerr-log10(2*r2n)}
x=x2n;y=y2n;
}
k=k-1;p=Math.pow(10,k);eps=1/p;
r=Math.floor(r2n*p)/p;
alert("racine approchée de "+a+" à "+eps+ " près :"+"\n"+r)
}
function log10(x)       
 // fonction logarithme décimal
{
return Math.log(x)/Math.log(10)
}

</SCRIPT>

» fonctions mathématiques usuelles



    Si l'on est trop gourmand en précision, le programme va "planter" par dépassement de capacité dans le calcul de (A - 1)2n+1 dans le cas A >1. On détourne ici "provisoirement" la difficulté en évaluant non pas l'erreur mais son logarithme décimal.

En vertu de l'égalité  log10(10k) = k, si l'utilisateur veut un calcul avec k décimales exactes, le logarithme décimal de l'erreur commise doit être inférieur à -(k + 1). Toutefois, xn et yn augmentant plus vite que (1 + A)n, au-delà de xn = 10300, le programme va également nous lâcher...

Exemple :  


© Serge Mehl - www.chronomath.com