next up previous contents index
suivant: La suite des tas monter: Pour s'amuser avec le précédent: La démonstration   Table des matières   Index

La suite de Syracuse

Soit a un entier positif. On veut étudier avec des graphiques la suite de Syracuse définie par :
u0 = a
un = un-1/2 si un-1 est pair et
un = 3*un-1 + 1 si un-1 est impair.
Cette suite se termine toujours (?) par 1,4,2,1,4,2,1... mais on ne sait pas le montrer.
Pour étudier cette suite on peut :
- utiliser le tableur en mettant dans A0 la valeur a de départ et dans A1 la formule :
=ifte(irem(A0,2)==0,iquo(A0,2),3*A0+1) ou encore
=if ((irem(A0,2))==0) iquo(A0,2); else 1+3*A0;;
- utiliser un programme syracuse qui renvoie le maximum de cette suite et le nombre d'éléments de cette suite et syracuse0 qui écrit en plus les termes de la suite ou encore syracuse100 qui renvoie le maximum, le nombre de termes et la valeur de départ de la plus longue suite démarrant par un nombre entre 2 et 100.
  syracuse(a):={
    local k,m;
    k:=0;
    m:=a;
    while (a!=1) {
      if (irem(a,2)==0) a:=iquo(a,2); 
      else {
	a:=a*3+1;
	if (a>m){m:=a};
      }
      k:=k+1;
    }
  };
  
  syracuse0(a):={
    local m,k;
    m:=a;
    k:=0;
    print(a);
    while (irem(a,2)==0){
      a:=iquo(a,2);
      k:=k+1;
      print(a);
    }
    while(a!=1){
      a:=3*a+1;
      k:=k+1;
      print(a);
      if (m<a) {m:=a;}
      while (irem(a,2)==0){
	a:=iquo(a,2);
	k:=k+1;
    print(a);
      }
    }
    return(m,k);
  };
  
  syracuse100():={
    local k,kn,kt,l,lt,m,mt;
    lt:=0;
    for (k:=2;k<101;k:=k+1){
      kn:=k;
      m:=k;
      l:=0;
      while (kn!=1) {
	if (irem(kn,2)==0) kn:=iquo(kn,2); 
	else {
	  kn:=kn*3+1;
	  if (m<kn) {
	    m:=kn;
	  }
	}
	l:=l+1;
      }
      if (l>lt) {
	mt:=m;lt:=l;kt:=k;
      }
    }
    return(mt,lt,kt);
  };
On ouvre un éditeur de programme, on recopie la procédure, puis grâce au bouton OK le programme est validé.
On tape syracuse100(), on trouve :
9232,118,97 ce qui veut dire que c'est en démarrant avec 97 que la suite a le plus de termes (ici 118 termes) et le maximum de cette suite est 9232.
On peut bien sûr modifier les paramètres de la boucle for en mettant par exemple :
for (k:=101;k<200;k:=k+1)
On tape syracuse100(), on trouve alors :
250504,124,177
ou encore :
for (k:=901;k<1000;k:=k+1)
On tape syracuse100(), on trouve alors :
250504,173,937
On peut encore modifier facilement pour savoir si un plus grand nombre de terme donne la plus grande valeur atteinte (cela semble vrai!!!) (modifier pour cela :
if (l>lt) {mt:=m;lt:=l;kt:=k;} en
if (m>mt) {mt:=m;lt:=l;kt:=k;} et rajouter au début kt:=2;.
- utiliser un programme qui dessine les points (n, un) lorsqu'on donne en entrée u0 = a
- lorsqu'on donne en entrée u0 = a et en notant n la première valeur de k pour laquelle uk = 1 et m le maximum des uk pour k $ \leq$ n, dessiner les points a, m ou encore dessiner les points a, uk pour k = 0..n.
On écrit la procédure syracuse1 (resp syracuse2 qui dessine les points (k, uk) (resp les segments reliant les points (k, uk)) dans l'écran de géométrie et la procédure syracuse3 qui dessine les points a, uk pour k allant de 0 à n et cela pour a allant de 2 à 100 :
  syracuse1(a):={
    local m,k;
    m:=a;
    k:=0;
    point(0,a);
    while (irem(a,2)==0){
      a:=iquo(a,2);
      k:=k+1;
      point(k,a);
    }
    while(a!=1){
      a:=3*a+1;
      k:=k+1;
      point(k,a);
      if (m<a) {m:=a;}
      while (irem(a,2)==0){
	a:=iquo(a,2);
	k:=k+1;
	point(k,a);
      }
    }
    return(m,k);
  };
  
  
  syracuse2(a):={
    local m,k,k0,a0;
    m:=a;
    k:=0;
    point(k,a);
    while (irem(a,2)==0){
      k0:=k;
      a0:=a;
      a:=iquo(a,2); 
      k:=k+1;
      segment(k0+i*a0,k+i*a);
    }
    while(a!=1){
      k0:=k;
      a0:=a;
      a:=3*a+1;
      k:=k+1;
      segment(k0+i*a0,k+i*a);
      if (m<a) {m:=a;}
      while (irem(a,2)==0){
	k0:=k;
	a0:=a;
	a:=iquo(a,2);
	k:=k+1;
	segment(k0+i*a0,k+i*a);
      }
    }
    return(m,k);
  };
  
  syracuse3():={
    local k,kn;
    for(k:=2;k<101;k:=k+1){
      point(k,k);
      kn:=k;
      while (kn!=1) {
	if (irem(kn,2)==0) kn:=iquo(kn,2); else kn:=kn*3+1;
	point(k,kn);
      }
    }
  };
Ne pas oubler de régler la fenêtre graphique en mettant par exemple : X-=Y-=WX-=WY-=0, X+=WX+=100 et Y+=WY+=1000.
puis on tape par exemple syracuse1(123).


next up previous contents index
suivant: La suite des tas monter: Pour s'amuser avec le précédent: La démonstration   Table des matières   Index
Documentation de giac écrite par Renée De Graeve