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

L'algorithme à l'aide d'un crible

On écrit tous les nombres de Hamming de 0 à n>0 et on barre les nombres qui sont de la forme 2a*3b*5c avec a, b, c variant de 0 à un nombre tel que 2a*3b*5c $ \leq$ n: les nombres barrés (excepté 1) sont les nombres de Hamming inférieurs à n>0.
Voici la fonction hamming(n) écrite en Xcas pour obtenir les nombres de Hamming inférieurs à n>0.
hamming(n):={
  local H,L,a,b,c,j,d;
  L:=makelist(x->x,0,n);
  //les nbres de Hamming sont 2^a*3^b*5^c
  c:=0; b:=0;a:=0;
  d:=1;
  while (d<=n) {	
    while (d<=n){	
      while (d<=n) {
	L[d]:=0;
	//d:=5*d
	c:=c+1;
	d:=2^a*3^b*5^c;	
      }
      c:=0;	
      b:=b+1;
      //d:=2^a*3^b*5^c
      d:=2^a*3^b;
    }
    //c:=0;
    b:=0;
    a:=a+1;
    //d:=2^a*3^b*5^c
    d:=2^a;
  }
  H:=[];
  for (j:=2;j<=n;j++) {
    if (L[j]==0) H:=append(H,j);
  }
  return H;
}
ou encore en supprimant la variable c :
hamming(n):={
  local H,L,a,b,j,d;
  L:=makelist(x->x,0,n);
  //les nbres de Hamming sont 2^a*3^b*5^c
 a:=0;
  d:=1;
  while (d<=n) { 
    b:=0;	
    while (d<=n){	
      while (d<=n) {
	L[d]:=0;
	d:=5*d;	
      }	
      b:=b+1;
      d:=2^a*3^b;
    }
    a:=a+1;
    d:=2^a;
  }
  H:=[];
  for (j:=2;j<=n;j++) {
    if (L[j]==0) H:=append(H,j);
  }
  return H;
}
ou encore en supprimant a,b,c et en preservant la valeur de d avant les while :
hamming(n):={
  local H,L,d,j,k;
  L:=makelist(x->x,0,n);
  //les nbres de Hamming sont 2^a*3^b*5^c
  d:=1;
  while (d<=n) { 
    j:=d;	
    while (j<=n){
      k:=j;	
      while (k<=n) {
	L[k]:=0;
	k:=5*k;	
      }	
      j:=3*j;
    }
    d:=2*d;
  }
  H:=[];
  for (j:=2;j<=n;j++) {
    if (L[j]==0) H:=append(H,j);
  }
  return H;
}
On tape :
hamming(20)
On obtient :
[2,3,4,5,6,8,9,10,12,15,16,18,20]
On tape :
hamming(40)
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