Les anniversaires simultanés

  On démontre facilement que la probabilité p ( n ) pour qu'au moins deux personnes dans un groupe de n personnes aient leur anniversaire le même jour est   p ( n ) = 1 - 365 ! ( 365 - n ) ! 365 n = 1 - 365 ! / ( 365 - n ) ! / 365 n .
  L'objet de ce TD est le calcul de cette probabilité p ( n ) et l'étude des problèmes (erreur d'overflow puis d'absoprption) qu'il peut poser.

Q1) Ecrire une fonction p1(n) (avec n ∈ N * ) calculant p(n) directement à partir des deux versions de la formule donnée. (utiliser factorial dans le module math).

Q2) Calculer p1(20), p1(40) et p1(60) : en quoi ces résutats contredisent l'intuition ?

Q3) Calculer p1(150) (avec les deux versions de p1()): que se passe-t-il et pourquoi ?

Q4) Sachant que le plus grand nombre flottant est MaxF = 2 1024 - 2 971 , calculer (théoriquement) le plus grand entier n 0 pour lequel le calcul de p1 ( n 0 ) ne provoque pas d'erreur d'overflow.
Contrôler en assayant de calculer p1 ( n 0 ) et p1 ( n 0 +1)

Q4) En remarquant que p ( n ) = 1 - Π k = 0 n - 1 365 - k 365 ,  ecrire une fonction p2(n:entier) calculant p ( n ) de cette façon.
Vérifier que l'on peut calculer ainsi p ( n ) pour n { 2 , ... , 365 } . Il n'y a plus d'erreur d'overflow.

  Pour terminer on contourne l'erreur d'absorption commise lorsque ε k = Π k = 0 n - 1 365 - k 365 est absorbé par 1 dans le calcul de p2(n).

Q5) Ecrire une fonction p2_egal_un() calculant l'entier n=n1  à partir duquel p2(n) = 1 pour l'ordinateur. Combien vaut n1 ?
On rappelle que plus grand flottant ε ] 0 , 1 [ tel que 1 - ε = 1 est ε = 2 - 54 . Vérifier que ε k < ε et que ε k - 1 > ε

Q6) En trichant un peu, écrire une fonction p_correct(n) (avec n ∈ N * ) calculant correctement p(n) pour n > n1 .
On aimerait par exemple savoir que p(180) = 1 - 3.7313631767028684e-24  

© 2015 - Eric Obermeyer      Powered by      Corrigé