Afin de m'entraîner un peu à programmer avec XCas,
j'ai voulu essayé de simuler l'exercice de dénombrement suivant:
Pour modéliser cette situation, je souhaitais donc créer une liste de tous les jurys possibles c'est à dire de 10 personnes prises sans ordre et sans remise parmi 17.Un jury est composé de 10 membres tirés au sort parmi 8 hommes et 9 femmes.
- Combien de jurys différents peut-on former?
- Combien de jurys avec 5 femmes et 5 hommes peut-on former?
- Monsieur X refuse de siéger avec Madame Y. Combien de jurys peut-on former dans ces conditions?
Je dois avouer que le seul procédé que j'ai trouvé est le suivant:
L'ensemble de départ est composé de 17 personnes, il est donc formé de 2^17 parties.
Chaque partie peut être représentée par un nombre en binaire compris entre 0 et 2^17-1
un "1" en ième position indique qu'on prend la personne n°i
un "0" en ième position indique qu'on ne prend pas la personne n°i
Je fais donc varier un entier entre 0 et 2^17-1.
Pour chaque décomposition en binaire, je garde l'élément si la somme des chiffres vaut 10.
Ma question est juste de savoir s'il y a plus simple où s'il existe une fonction intégrée permettant de réaliser cette simulation.
Je vous joins quand même mon programme: (Temps d'exécution: environ 2 min )
Code : Tout sélectionner
denJurys():=
  {
    local jurys,binaire,j;
   // Nombre de Jurys avec parités.
    local parite:=0;
   // Monsieur X:"m1"
   // Madame Y: "f1"
   // Nombre de Jurys où M. X ne siège pas avec Mme Y
    local jurysXY:=0;
    // Liste des membres (8 hommes, 9 femmes)
    local membres:=["m1","m2","m3","m4","m5","m6","m7","m8","f1","f2","f3","f4","f5","f6","f7","f8","f9"];
    jurys:=[];
    // Création de l'ensemble des jurys possibles.
    for (j:=0;j<2^17;j++){
      binaire:=enBinaire(j);
      if(sum(binaire)==10){
        local k,tmpList:=[];
        for(k:=0;k<size(binaire);k++){
          if (binaire[k]==1) tmpList:=append(tmpList,membres[k+17-size(binaire)]);
        }
        jurys:=append(jurys,tmpList);
      }
    }
    print("Nombre de Jurys possibles:",size(jurys));
    // Parcours de l'ensemble des jurys pour trouver:
    // - le nombre de jurys avec parité hommes-femmes
    // - le nombre de jurys où M. X ne siègent pas avec Mme Y
    for(j:=0;j<size(jurys);j++){
      local k,c:=0;
      local bX:=false;
      local bY:=false;
      for(k:=0;k<size(jurys[j]);k++){
        local mot:=jurys[j][k];
        local initiale;        
        initiale:=mot[0];
          if (initiale=="m") c++;
          if (mot=="m1") bX:=true;
          if (mot=="f1") bY:=true;
      }
      if (c==5) parite++;
      if (bX==false or bY==false) jurysXY++;
    }
    print("Nombre de Jurys avec parité hommes-femmes:",parite);
    print("Nombre de Jurys où M. X ne siège pas avec Mme Y:",jurysXY);
}:;
// Renvoie une liste représentant l'écriture en binaire du nombre n
// Exemple enBinaire(12) retourne [1,1,0,0]
enBinaire(n):=
  {
    if (n<2) return [n];
    else {
      local divEucl;
      divEucl:=iquorem(n,2);
      return concat(enBinaire(divEucl[0]),divEucl[1]);
    }
 }:;

