# Chapitre 6 Pour s’amuser avec le graphique

## 6.1 Les polygones et les milieux de leurs côtés

### 6.1.1 Le triangle et le quadrilatère

#### Le triangle

Étant donné 3 points `A,B,C`, construire un triangle `E,F,G` tel que `A` soit le milieu de `EF`, `B` soit le milieu de `FG` et `C` soit le milieu de `GE`.
Avec `Xcas`, faisons des essais : On clique sur 4 points `A,B,C,E` puis on tape :

    F:=symetrie(A,E);
    G:=symetrie(B,F);
    H:=symetrie(C,G);
    polygone(A,B,C);
    polygone_ouvert(E,F,G,H);

On fait bouger ensuite le point `E` pour que `E` et `H` coincident. On analyse alors la figure : Lorsque `E` et `H` coincident `EG` est parallèle à `AB` et le vecteur `CE` est égal au vecteur `BA` (propriété des milieux d’un triangle).
On en déduit la construction avec `Xcas` : On clique sur 3 points `A,B,C` puis on tape :

    E:=translation(A-B,C);
    F:=symetrie(A,E);
    G:=symetrie(B,F);

#### Le quadrilatère

Étant donné 4 points `A,B,C,D`, construire un quadrilatère `E,F,G,H` tel que `A` soit le milieu de `EF`, `B` soit le milieu de `FG`, `C` soit le milieu de `GH`, `D` soit le milieu de `HE`.
Avec `Xcas`, faisons des essais :
On clique sur 5 points `A,B,C,D,E` (il faut renommer les points car `D` n’est pas attribué automatiquement car en Maple `D` désigne la dérivation).

    F:=symetrie(A,E);
    G:=symetrie(B,F);
    H:=symetrie(C,G);
    I:=symetrie(D,H);
    polygone(A,B,C,D);
    polygone_ouvert(E,F,G,H,I);

On fait bouger ensuite le point `E` pour que `E` et `I` coincident. Mais, cette fois on n’y arrive pas ....On modifie le point `A` pour que `E` et `I` coincident. On analyse alors la figure : Lorsque `E` et `I` coincident `ABCD` est un parallèlogramme (on a 2AB=EG et 2DC=IG donc si `E` et `I` coincident on a AB=DC).
Lorsque `ABCD` est un parallèlogramme, on remarque alors que si on fait bouger le point `E`, on a toujours `E` et `I` en coincidence. En effet on a :
2AB=EG et 2DC=IG donc si AB=DC, on a EG=IG donc `E` et `I` coincident.

#### Analyse

Dans le cas du triangle, lorsqu’on fait subir au point `E`, 3 symétries centrales successives S1,S2,S3 on veut retrouver `E` : cela signifie que `E` doit être un point fixe de S3 ∘ S2 ∘ S1.

Dans le cas du quadrilatère, lorsqu’on fait subir au point `E`, 4 symétries centrales successives S1,S2,S3,S4 on veut retrouver `E` : cela signifie que `E` doit être un point fixe de S4 ∘ S3 ∘ S2 ∘ S1. On est donc amené à comprendre comment on compse des symétries centrales.

### 6.1.2 Translation et composition de symétries centrales

On désigne par SO la symétrie de centre O et par TAB la translation de vecteur AB.
Théorème Soient deux points O1 et O2 et un vecteur V, on a :

1. SO2 ∘ SO1=T2O1O2,
2. TV∘ SO1=SK avec O1K=V/2,
3. SO1∘ TV=SH avec O1H=−V/2.

En effet,

1. Soit A un point. Posons B=SO1(A) et C=SO2(B).
   On a : AO1=O1B et, O2C=BO2 donc, AC=AO1+O1O2+ O2C=
   O1B+O1O2+BO2=
   2O1O2
   Comme A est quelconque on en déduit que :
   SO2 ∘ SO1=T2O1O2
2. Soit A un point, V un vecteur et K tel que O1K=V/2.
   Posons B=SO1(A) et C=TV(B).
   On a : AO1=O1B,
   BC=V et,
   O1K=V/2=BC/2.
   Donc
   AK=AO1+O1K=
   AO1+BC/2 et AC=AB+BC=
   2AO1+BC=2AK soit
   AC=AK+KC=2AK c’est à dire
   KC=AK
   donc C=SK(A) Comme A est quelconque on en déduit que :
   TV ∘ SO1=SK avec O1K=V/2
3. Soit A un point, V un vecteur et H tel que O1H=−V/2.
   Posons B=TV(A) et C=SO1(B).
   On a : O1H=−V/2, AB=V et BO1=O1C
   Donc
   AH=AB+BO1+O1H=
   V+O1C−V/2=O1C+V/2 et
   AC=AB+BC=
   V+BC=V+2O1C soit
   AC=AH+HC=2AH c’est à dire
   HC=AH
   donc C=SH(A) Comme A est quelconque on en déduit que :
   SO1 ∘ TV=SH avec O1H=−V/2

### 6.1.3 Le pentagone

Étant donné 5 points `A,B,C,D,E`, construire un pentagone `A1,A2,A3,A4,A5` tel que `A` soit le milieu de `A1A2`, `B` soit le milieu de `A2A3`,....,`E` soit le milieu de `A5A1`.
La construction du pentagone revient à déterminer A1 tel que :
SA1=SE∘ SD∘ SC∘ SB∘ SA, puis à construire les points
A2=SA(A1), A3=SB(A2)....
On a d’après le théorème précédent :
SB∘ SA=T2AB SD∘ SC=T2CD donc
SD∘ SC∘ SB∘ SA=T2(AB+CD) et
SE∘ SD∘ SC∘ SB∘ SA=SE∘T2(AB+CD)= SA1 avec EA1=BA+DC
La construction avec `Xcas` .
On clique sur 5 points `A,B,C,D,E` (il faut renommer les points car `D` n’est pas attribué automatiquement car en Maple `D` désigne la dérivation).

    polygone(A,B,C,D,E);
    A1:=translation(A-B+C-D,E);
    A2:=symetrie(A,A1);
    A3:=symetrie(B,A2);
    A4:=symetrie(C,A3);
    A5:=symetrie(D,A4);
    F:=symetrie(E,A5):;
    polygone_ouvert(A1,A2,A3,A4,A5,F);
    A1==F;

La réponse de `A1==F` est `1` ce qui signifie que la construction est correcte.

### 6.1.4 Le polygône ayant un nombre impair de côtés

La construction d’un polygône ayant un nombre impair de côtés à partir des milieux de ses côtés est possible puisque le produit d’un nombre impair de symétries centrales est une symétrie centrale.

## 6.2 Le théorème de Johnson

Soient 3 cercles CA,CB,CC de centre A,B,C de même rayon R et ayant un point commun O (on a donc les trois centres A,B,C sont sur un cercle de centre O et de rayon R).
Soient :

- M l’intersection autre que O de CA et CB,
- N l’intersection autre que O de CA et CC,
- P l’intersection autre que O de CC et CB

alors, les trois points M,N,P sont sur un cercle de rayon R.

Lemme
Si deux cercles de même rayon R et de centre O1 et O2 se coupent en A e B alors le quadrilatère O1,A,O2,B est un losange.
En effet on a O1A=O1B=O2A=O2B=R.
Démonstration
D’après le lemme les quadrilatères :
O,B,M,A,
O,A,N,C, et
O,C,P,B
sont des losanges.
La translation de vecteur OA transforme BC en MN.
La translation de vecteur OB transforme AC en MP.
La translation de vecteur OC transforme AB en NP.
Les triangles M,N,P et B,C,A sont donc égaux.
Donc le rayon R du cercle circonscrit à B,C,A est égal au rayon du cercle circonscrit à M,N,P.
On va aussi montrer que le centre I de ce cercle est tel que AI= OP et que
c’est aussi l’orthocentre du triangle ABC.
On a en effet :
Soit AI= OP
On a PI= OA= CN et PC=CN donc
PINC est un losange et donc IC est la médiatrice de PN.
de même PI= OA= BM et PB=BM donc
PIMB est un losange et donc IB est la médiatrice de PM.
Donc I est le point de concours des médiatrice de MNP c’est donc le centre du cercle circonscrit à MNP.
Puisque OP est la médiatrice de BC donc AI est la médiatrice de MN (car la translation de vecteur 0A transforme B en M, C en N P en I et O en A).
Donc la médiatrice de MN passe par A puisque MA=AN et elle est perpendiculaire à BC puisque BC et MN sont parallèles. donc la médiatrice de MN est la hauteur issue de A du triangle ABC.
De même la médiatrice de MP passe par B puisque MB=BP et elle est perpendiculaire à AC puisque AC et MP sont parallèles. donc la médiatrice de MP est la hauteur issue de B du triangle ABC.
donc le centre du cercle circonscrit à MNP est l’orthocenntre du triangle ABC.
Démonstration avec `Xcas`
On tape :

    O:=point(0);
    U:=cercle(O,1):;U;
    supposons(a=[0.3,-5,5,0.1]);
    A:=point(cos(a)+(i)*sin(a));
    supposons(b=[2.4,-5,5,0.1]);
    B:=point(cos(b)+i*sin(b));
    C1:=cercle(A,1):;C1;
    C2:=cercle(B,1):;C2;
    M:=normal(symetrie(droite(A,B),O));
    supposons(c=[-1.6,-5,5,0.1]);
    C:=point(cos(c)+(i)*sin(c));
    C3:=cercle(C,1):;C3;
    N:=normal(symetrie(droite(A,C),O));
    P:=normal(symetrie(droite(B,C),O));
    U1:=circonscrit(M,N,P):;
    affichage(U1,1);
    affichage(circonscrit(A,B,C),2);
    I:=orthocentre(A,B,C);
    U2:=cercle(I,1):; affichage(U2,4);

`Xcas` peut prouver que le cercle `U1` est le cercle `U2` de centre `I` (orthocentre de `ABC` ou point vérifiant AI= OP) et de rayon 1 car tous les calculs sont faits en utilisant les paramètre formels `a,b,c`.
On tape :
`tsimplify(centre(U1)-I)`
On obtient :
`0`
On tape :
`J:=translation(P-O,A)`
`tsimplify(centre(U1)-J)`
On obtient :
`0`
On tape :
`tsimplify(rayon(U1))`
On obtient :
`1` Remarque
On remarque que les calculs sont longs :
pour le cercle `U1:=circonscrit(M,N,P):;` (Evaluation time: 2.74)
pour `tsimplify(centre(U1)-I)` (Evaluation time: 0.54)
pour `ttsimplify(rayon(U1))` (Evaluation time: 1.12)
On peut amĺioer le temps de calcul !!!! En effet lorsque vous voulez faire faire une démonstration géométrique par `Xcas`, il est important de réduire au maximum les paramètres formels sans perte de généralités bien sûr !
Par exemple, ici, on peut supposer que `a` vaut 1 et donc que `A` se trouve sur `U` et sur l’axe des x (cette disposition n’est pas un cas particulier car on a le choix du repère). On tape :

    O:=point(0);
    U:=cercle(O,1):;U;
    A:=point(1);
    supposons(b=[2.4,-5,5,0.1]);
    B:=point(cos(b)+i*sin(b));
    C1:=cercle(A,1):;C1;
    C2:=cercle(B,1):;C2;
    M:=normal(symetrie(droite(A,B),O));
    supposons(c=[-1.6,-5,5,0.1]);
    C:=point(cos(c)+(i)*sin(c));
    C3:=cercle(C,1):;C3;
    N:=normal(symetrie(droite(A,C),O));
    P:=normal(symetrie(droite(B,C),O));
    U1:=circonscrit(M,N,P):;;
    affichage(U1,1);
    affichage(circonscrit(A,B,C),2);
    I:=orthocentre(A,B,C);
    U2:=cercle(I,1):; affichage(U2,4);

On a alors :
pour le cercle `U1:=circonscrit(M,N,P):;` (Evaluation time: 0.92)
et ensuite `tsimplify(centre(U1)-I)` et `ttsimplify(rayon(U1))` sont instantanés.

## 6.3 Une suite de symétrie

On se donne trois directions d1,d2,d3 et un cercle C de centre O et de rayon R et un point M0 sur ce cercle.
On consid‘ere la suite des points : M1 est le point de C tel que M0M1 a pour direction d1,
M2 est le point de C tel que M1M2 a pour direction d2,
M3 est le point de C tel que M2M3 a pour direction d3,
M4 est le point de C tel que M3M4 a pour direction d1,
M5 est le point de C tel que M4M5 a pour direction d2,
M6 est le point de C tel que M5M6 a pour direction d3,
Montrer que M6=M0.
Démonstration
Soient Δ1,Δ2,Δ3 3 droites passant par O et ayant comme directions, les directions perpendiculaires à d1,d2,d3. Soient S−1,S2,S3 les 3 symétries droites d’axe Δ1,Δ2,Δ3.
On a :
M1=S1(M0),
M2=S2(M1),
M3=S3(M2),
M4=S1(M3),
M5=S2(M4),
M6=S3(M5)=S3∘ S2∘ S1∘ S3∘ S2∘ S1(M0)
on sait que :
le produit des 2 symétries S2∘ S1 est une rotation de centre 0 et d’angle 2(Δ1,Δ2).
le produit des 2 symétries S1∘ S3 est une rotation de centre 0 et d’angle 2(Δ3,Δ1).
le produit des 2 symétries S3∘ S2 est une rotation de centre 0 et d’angle 2(Δ2,Δ3).
Donc S3∘ S2∘ S1∘ S3∘ S2∘ S1 est une rotation de centre O et d’angle :
2(Δ1,Δ2)+2(Δ3,Δ1)+2(Δ2,Δ3)=0 mod2π.
Donc S3∘ S2∘ S1∘ S3∘ S2∘ S1 est l’identité.
Démonstration avec `Xcas`
On tape :

    supposons(a=[0.6,-5,5,0.1]);
    supposons(b=[1.2,-5,5,0.1]);
    supposons(c=[2.0,-5,5,0.1]);
    d1:=droite(y=2+a*(x+2), affichage=1);;
    d2:=droite(y=2+b*(x+2), affichage=2);;
    d3:=droite(y=2+c*(x+2), affichage=4);;
    C:=cercle(0,1):;C;
    supposons(d=[0.6,-5,5,0.1]);
    M0:=point(exp((i)*d));
    M1:=symetrie(droite(y=-x/a), M0);
    M2:=symetrie(droite(y=-x/b), M1);
    M3:=symetrie(droite(y=-x/c), M2);
    M4:=symetrie(droite(y=-x/a), M3);
    M5:=symetrie(droite(y=-x/b), M4);
    M6:=symetrie(droite(y=-x/c), M5);
    segment(M0,M1,affichage=1);
    segment(M2,M1,affichage=2);
    segment(M2,M3,affichage=4);
    segment(M3,M4,affichage=1);
    segment(M4,M5,affichage=2);
    segment(M5,M6,affichage=4);

On obtient :
On tape :
`affixe(M0)==normal(affixe(M6))`
On obtient :
`1`

## 6.4 Une suite de projections

On considère un triangle équilatèral ABC et un point M1 sur AB.
M1 se projette orthogonalement en H1 sur BC,
H1 se projette orthogonalement en K1 sur AC et
K1 se projette orthogonalement en M2 sur AB etc....
On obtient ainsi sur AB une suite de points Mn.
On pose AMn=xnAB.
Calculer xn et étudier la suite x.
On commence par faire la figure.
On écrit pour cela la suite d’instructions dans un niveau de géométrie :

    A:=point(0);
    B:=point(1);
    C:=point(1/2+sqrt(3)*i/2);
    triangle(A,B,C);
    assume(a=[0.1,0,1]);
    M:=element(segment(A,B),a);
    L:=[normal(affixe(M))];
    for (k:=1;k<=30;k:=k+3) {
    L:=append(L,normal(affixe(projection(segment(B,C),L[k-1]))));
    L:=append(L,normal(affixe(projection(segment(A,C),L[k]))));
    L:=append(L,normal(affixe(projection(segment(B,A),L[k+1]))));
    };
    polygone_ouvert(L);

On obtient la figure dans l’écran de géométrie.
On rappelle que :
`M:=element(segment(A,B),a)` signifie que :
AM=a AB et 0 ≤ b ≤ 1. On rappelle aussi que :
`assume(a=[0.1,0,1])` signifie que :
la figure se fera avec `a=0.1` mais que les calculs se feront avec le paramètre formel `a` compris entre 0 et 1. On régle la fenêtre graphique :
`xyztrange(-0.1,2.0,-0.1,1.0,-10.0,10.0,-1.0,6.0,-0.1,2.0,
-0.146865136298,1.0,1,0.0,1.0)`
On tape L dans une entrée de commande et on pbtient :
`[a,((-i)*sqrt(3)+1)/4*a+((i)*sqrt(3)+3)/4,
((-i)*sqrt(3)-1)/8*a+((3*i)*sqrt(3)+3)/8,-a/8+3/8,....]`
ce qui signifie que :
`x``1``=a` et `x``2``=-a/8+3/8`
Pour avoir la suite xn on tape :
`Xn:=seq(L[k],k,0,30,3)` On trouve : x11=a/1073741824+357913941/1073741824
On tape :
`evalf(357913941/1073741824)`
On obtient:
`0.333333333023`
Il semble donc que cette suite converge vers N tel que AN=AB/3.

### 6.4.1 La démonstration

On calcule x2 en fonction de x1 : on a AM1=x1AB
BH1=(1−x1)/2BC et CK1=(1−(1−x1)/2)/2CA=(1+x1)/4CA
AM2=(1−(1+x1)/4)/2AB=(3−x1)/8AB
La relation de récurrence est :
xn+1=(3−xn)/8 On cherche la limite l possible :
l=(3−l)/8 donc 8l=3−l soit l=3/9=1/3
La suite un=xn−1/3 est une suite géométrique de raison −1/8 puisque un+1=xn+1−1/3=(3−xn)/8−(3−l)/8=−un/8.
La suite un=xn−1/3 converge vers 0 donc la suite xn converge vers 1/3

## 6.5 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!!!) en changeant 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≤ 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)`.

## 6.6 La suite des tas

On dispose k jetons en p tas.
On construit la suite des tas de la façon suivante :
on prend un jeton dans chaque tas et tous ces jetons forment un nouveau tas qui sera le dernier tas, et on recommence.
Ce qui est sûr c’est que cette suite de tas est pérodique puisque il n’y a qu’un nombre fini de façons de disposer k jetons en tas.
Il s’agit de voir comment se comporte cette suite.
On peut montre que lorsque k=n*(n+1)/2 cette suite stationne en :
1,2,3,...,n.

### 6.6.1 Une remarque

Lemme La suite débutant par 1,2,3,...,n non ordonnè stationne vers 1,2,3,...,n.
En effet, si on répartit les jetons en n tas 1,2,3,...,n de façon non ordonnée, on aura la suite ordonnée 1,2,3,...,n au bout d’au plus n−1 manipulations.
En effet à la première étape n se trouvera en dernier, à la deuxième étape n−1,n se trouveront à la fin, et à la (n−1)-ième étape 2, ...n−1,n se trouvera en dernier et on aura donc obtenu 1,2...n puisque le nombre k de jetons vaut n(n−1)/2.

### 6.6.2 Le programme de simulation

    //programme de simulation tas.cxx
    tas(l):={
    local s,j,k,lr;
    lr:=[l];
    while (1) {
    s:=size(l);
    for (j:=0;j<s;j++) {
    l[j]:=l[j]-1;
    }
    l:=concat(l,s);
    //on supprime les zeros de l
    k:=0;
    for (j:=0;j<s+1;j++){
    if (l[j]!=0){
    l[k]:=l[j];
    k:=k+1;
    }
    }
    l:=mid(l,0,k);
    if (member(l,lr)) return lr;
    lr:=append(lr,l);
    }
    }

On tape :
`tas([10])`
On obtient :
`[[10],[9,1],[8,2],[7,1,2],[6,1,3],[5,2,3],`
`[4,1,2,3],[3,1,2,4],[2,1,3,4],[1,2,3,4]]`