next up previous contents index
suivant: Exercices de combinatoire monter: Les nombres heureux précédent: L'énoncé   Table des matières   Index

La solution

Ce programme ressemble au crible d'Eratosthène, mais si m est le nombre que l'on vient d'entourer et qu'il est d'indice p, on supprime les nombres d'indices p + m,p + 2m...p + km mais dans la liste tab modifiée et non les multiples du nombre m.
On tape avec les instructions françaises :
heureux(n):={
  local tab,heur,m,j,p,k;
  tab:=j$(j=2..n);
  tab:=concat([0,0],[tab]);
  heur:=[];
  p:=2;
  tantque (p<=n) faire
    m:=p;
    k:=0;
    pour j de p+1 jusque n faire
      si tab[j]!=0 alors k:=k+1; fsi;
      si irem(k,m)==0 alors tab[j]:=0 fsi;
    fpour;
    p:=p+1;
    si p<=n alors 
      tantque tab[p]==0 and p<n faire p:=p+1 ftantque;
      si p==n and tab[p]==0 alors p:=n+1;fsi;
    fsi;
  ftantque; 
  pour p de 2 jusque n faire
    si (tab[p]!=0) alors 
      heur:=append(heur,p);
    fsi;
  fpour;
  retourne(heur);
}:;
Dans ce programme on peut se passer de la liste heur : il suffit de supprimer la dernière instruction pour et de mettre :
retourne remove(x->x==0,tab); à la place de retourne heur On tape : heureux(100)
On obtient :
[2,3,5,7,11,13,17,23,25,29,37,41,43,47,53,61,67,71,77,83,89,91,97]

On peut aussi et ce sera plus rapide, modifier la liste tab au fur et à mesure en supprimant à chaque étape les valeurs barrées c'est à dire les valeurs mises à 0 en utilisant l'instruction remove et en mettant au fur et à mesure les nombres heureux dans heur.
On tape avec les instructions françaises :

//renvoie la liste des nombres heureux<=n
heureux2(n):={
  local tab,heur,m,j,k,s;
  tab:=[j$(j=2..n)];
  heur:=[];
  s:=dim(tab);
  k:=0;
  tantque (s>0) faire
    j:=0;
    m:=tab[0];
    heur[k]:=m;
    tantque j<s faire
      tab[j]:=0;
      j:=j+m;
    ftantque;
      tab:=remove(x->x==0,tab);
      s:=dim(tab);
      k:=k+1;
  ftantque;
  retourne(heur);
}:;
On tape : heureux2(100)
On obtient :
[2,3,5,7,11,13,17,23,25,29,37,41,43,47,53,61,67,71,77,
83,89,91,97]


Documentation de giac écrite par Renée De Graeve