Des programmes tres simples pour les Statistiques

# Chapitre 7 Des programmes tres simples pour les Statistiques

## 7.1 Simulation du lancer d’une pièce

On veut tirer au hasard 0 ou 1 (par exemple 0=pile et 1=face).
On utilise la fonction `rand(n)` qui renvoie un entier aléatoire uniformément distribué dans `0.. n-1`.
On tape :

    tirage_piece():=rand(2);

## 7.2 Simulation d’un dé

On veut tirer au hasard un nombre entier dans [1.. 6].
On utilise la fonction `rand(n)` qui renvoie un entier aléatoire uniformément distribué dans `0.. n-1`.
On tape :

    tirage_de():=1+rand(6);

## 7.3 Simulation d’une variable aléatoire

On tire au hasard un nombre entier n de [0,1,2,3].
On tire au hasard un nombre réel m de [0,1[.
On veut simuler une variable aléatoire X qui vaut la partie entière de m*n.
On utilise la fonction `rand(p,n)` qui renvoie un réel aléatoire uniformément distribué dans `[p.. n[`.
On tape :

    X():={
    local n;
    n:=rand(4);
    return floor(n*rand(0,1));
    }

Quelle est la fonction de répartition de X ? X vaut :
0 si ((n=0 ou n=1) et m ∈ [0,1[) ou (n=2 et m ∈ [0,0.5[) ou (n=3 et m ∈ [0,1/3[)
1 si (n=2 et m ∈ [0.5,1[) ou (n=3 et m ∈ [1/3,2/3[)
2 si n=3 et m ∈ [2/3,1[
On a donc :
Proba(X=0)=1/4+1/4+1/4*1/2+1/4*1/3=17/24
Proba(X=1)=1/4*1/2+1/4*1/3=5/24
Proba(X=2)=1/4*1/3=1/12
On vérifie que l’on a : 17/24+5/24+1/12=1

## 7.4 Simulation d’une variable aléatoire

On tire au hasard un nombre entier n de [1,2,3].
On veut simuler une variable aléatoire Y qui vaut ∑j=1nj.
On tape :

    Y():={
    local n,j,x;
    n:=1+rand(3);
    x:=0;
    pour j de 1 jusque n faire
    x:=x+j;
    fpour;
    return x;
    }:;

Quelle est la fonction de répartition de Y ? Y vaut :
1 si n=1
3 si n=2
6 si n=3
On a donc :
Proba(X=1))=1/3
Proba(X=3))=1/3
Proba(X=6))=1/3
On aurait pu aussi simuler cette loi en tapant :

    Z():={
    local n;
    n:=rand(3);
    si n==0 alors return 1 fsi;
    return 3*n;
    }:;

## 7.5 Comment simplifier √a+√b lorsque (a,b)∈ ℕ2

On veut écrire √a+√b sous la forme √x/2+√y/2 bien sur quand cela est possible.
Si √x/2+√y/2=√a+√b on a :
(√x/2+√y/2)2=a+√b=(x+y)/2+√xy
d’où x+y=2a et xy=b
donc x et y sont solutions de l’équation X−2aX+b=0
donc si a2−b est un carré parfait i.e. a2−b=c2 avec c entier on a :
x=a+c et y=a−c
Donc si a2−b est un carré parfait on a si a2−b=c2 :

√
a+ | √ |
b
| = |
√
a+c
2
| + |
√
a−c
2
| = |
√ |
2(a+c)
| + | √ |
2(a−c)
2

On tape la fonction `simply` qui doit avoir `r=sqrt(a+sqrt(b))` comme paramètre où `b` est sans facteur carré :

    simply(r):={
    local f,a,b,c,d;
    si sommet(r)=='^' alors
      f:=feuille(r);
      a,d:=feuille(f[0]);
      si type(a)==integer alors
      b:=feuille(d)[0];
      c:=sqrt(a^2-b);
      si (round(c))^2==a^2-b alors
        retourne sqrt((a+c)/2)+sqrt((a-c)/2)
      fsi;
      sinon
      d,a:=feuille(f[0]);
      b:=feuille(d)[0];
      c:=sqrt(a^2-b);
      si (round(c))^2==a^2-b alors
        retourne sqrt((a+c)/2)+sqrt((a-c)/2)
      fsi;
      fsi;
    fsi;
    retourne r;
    }:;

On tape :
`simply(sqrt(9+sqrt(17)))`
ou
`simply(sqrt(sqrt(17)+9))`
On obtient :
`(sqrt(34))/2+(sqrt(2))/2` on tape la fonction `simplyf` qui doit avoir comme paramètre `r` de la forme `sqrt(a+s*sqrt(b))` ou `sqrt(a+sqrt(b))`:

    simplyf(r):={
    local f,a,b,c,d,s,sb;
    si sommet(r)=='^' alors
      f:=feuille(r);
      a,d:=feuille(f[0]);
      si type(a)==integer alors
         f:=feuille(d);
        si f[1]==1/2 alors
          s:=1;
          b:=f[0];
        sinon
          s,sb:=f;
          si type(s)==integer alors
            b:=feuille(sb)[0];
          sinon
           sb,s:=f;
           b:=feuille(sb)[0];
          fsi;
        fsi;
        c:=sqrt(a^2-s^2*b);
        si (round(c))^2==a^2-s^2*b alors
          retourne sqrt((a+c)/2)+sqrt((a-c)/2);
        fsi;
      sinon
        d,a:=feuille(f[0]);
        f:=feuille(d);
        si f[1]==1/2 alors
          b:=f[0];
          s:=1;
        sinon
          s,sb:=f;
          si type(s)==integer alors
            b:=feuille(sb)[0];
          sinon
           sb,s:=f;
           b:=feuille(sb)[0];
          fsi;
        fsi;
        c:=sqrt(a^2-s^2*b);
        si (round(c))^2==a^2-s^2*b alors
          retourne sqrt((a+c)/2)+sqrt((a-c)/2);
        fsi;
      fsi;
    fsi;
    retourne r;
    }:;

On tape (car `Xcas` remplace `sqrt(128)` par `8*sqrt(2)` :
`simplyf(sqrt(18+sqrt(128)))`
ou
`simplyf(sqrt(sqrt(128)+18))`
ou
`simplyf(sqrt(8*sqrt(2)+18))`
ou
`simplyf(sqrt(18+8*sqrt(2)))`
ou
`simplyf(sqrt(sqrt(2)*8+18))`
ou
`simplyf(sqrt(18+sqrt(2)*8))`
On obtient :
`4+sqrt(2)` On tape :
`simplyf(sqrt(194320499737857776523212040+19713979797994*sqrt(97160249868928888261606031)))`
On obtient :
`sqrt(97160249868928888261606031)+9856989898997`