next up previous contents index
suivant: Écriture d'un entier comme monter: Suite de Hamming précédent: L'algorithme sans faire un   Table des matières   Index

La traduction de l'algorithme avec Xcas

hamming(n) va renvoyer les n premiers éléments de la suite de Hamming.
L'indice j sert simplement à compter les éléments de H.
k est une suite qui contient les indices k0,k1,k2.
On peut initialiser H à [2,3,4,5] donc j à 4, et k à [1,0,0] (car H[0]=2 a été multiplié par 2, mais pas par 3, ni par 5) mais cela suppose n>3.
On peut aussi initialiser H à [1], k à [0,0,0] (H[0]=1 n'a pas été multiplié par 2, ni par 3, ni par 5) et j à 0 puis enlever 1 de H à la fin car 1 n'est pas un terme de la suite.

Voici la fonction hamming(n) écrite en Xcas pour n>3.

//pour n>3
hamming(n):={
  local H,j,k,m,p,q,mi;
  H:=[2,3,4,5];
  j:=4;
  k:=[1,0,0];
  while (j<n) {
  m:=2*H[k[0]];
  p:=3*H[k[1]];
  q:=5*H[k[2]];
  mi:=min(m,p,q);
  H:=append(H,mi);
  j:=j+1;
  if (mi==m) {k[0]:=k[0]+1};
  if (mi==p) {k[1]:=k[1]+1};
  if (mi==q) {k[2]:=k[2]+1};
  }
  return H;
}
Voici la fonction hamming(n) écrite en Xcas pour n>0.
//pour n>0
hamming(n):={
  local H,j,k,m,p,q,mi;
  H:=[1];
  j:=0;
  k:=[0,0,0];
  while (j<n) {
  m:=2*H[k[0]];
  p:=3*H[k[1]];
  q:=5*H[k[2]];
  mi:=min(m,p,q);
  H:=append(H,mi);
  j:=j+1;
  if (mi==m) {k[0]:=k[0]+1};
  if (mi==p) {k[1]:=k[1]+1};
  if (mi==q) {k[2]:=k[2]+1};
  }
  return tail(H);
}:;
On tape :
hamming(20)
On obtient :
[2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36,40]

Documentation de giac écrite par Renée De Graeve