Algorithme d'Héron

La racine carrée d'un nombre positif A est la solution de l'équation x2 = A.

Aujourd'hui tout le monde utilise la calculatrice pour déterminer la racine carrée d'un nombre. On tape simplemement le nombre, par exemple 7453, puis le symbole  , et sans tarder l'appareil donne le résultat 86,330759292. Dans le temps on utilisait divers procédés pratiques ou même les tables numériques. Pour un nombre comme celui de l'exemple, c'était déjà un petit exploit que de trouver le nombre à 0,001 près. Avec la règle de calcul la précision laissait encore plus à désirer. Par contre, sous les contraintes des moyens limités, l'esprit mathématique souffrait moins qu'aujourd'hui. Les étudiants devaient connaître leurs règles, bien savoir les appliquer et, ce qui est plus important, ils devaient comprendre ce qu'ils exerçaient. Parfois il fallait de l'astuce pour arriver au bon résultat, comme dans nos casse-tête.

Peut-être un élève intéressé désire-t-il connaître un des procédés de calcul qu'utilisent les calculatrices.

Le mathématicien grec Héron d'Alexandrie élabora l'algorithme suivant:

Notre exemple donne:
x0= 90 q0= 7453 / 90 = 82,810
x1= (90+82,810)/2 = 86,405 q1= 7453 / 86,405 = 86,256
x2= (86,405+86,256)/2 = 86,330 q2= 7453 / 86,330 = 86,331
==> abs ( x2 - q2 ) < p
 
Pour les amateurs de la robotique RCX, voici une procédure en code RCX. A remarquer que le module calcule uniquement avec des nombres entiers compris dans l'intervalle [-32768,32767]. En plus, il n'est pas équipé d'une procédure de calcul de la racine carrée:

{constants}
    #define(P,2)
{variables}
    #define(A,0)
    #define(x,1)
    #define(q,2)
    #define(local_h,3)
{subroutines}
    #define(SQRT,1)
{===================}
beginoftask(Main)
  setvar(A,con,7453)  {exemple}
  gosub(SQRT)
endoftask()
{===================}
BeginOfSub(SQRT)
    setvar(x,var,A)      {première valeur approchée x := A/2}
    divvar(x,con,2)
    setvar(local_h,con,10000)  {initialisation}
    while(var,local_h,GT,con,P)  {faire l'itération d'Héron jusqu'à ce que local_h <= P}
       setvar(q,var,A)  {q = A/x}
       Divvar(q,var,x)

       setvar(local_h,var,q)   {local_h := abs(q-x)}
       subvar(local_h,var,x)
       absvar(local_h,var,local_h)

       sumvar(x,var,q)    {nouvelle valeur de x := (x+q)/2}
       divvar(x,con,2)
     endwhile()
       {le résultat 86 se trouve maintenant dans la variable x}
EndOfSub()