Probabilité de retenue.

plsryef
Modifié (23 Aug) dans Collège/Lycée
On additionne 2nombres  entiers à 3 chiffres au plus. 
Quelles sont les probabilités d'avoir, aucune, une , deux et 3 retenues ?

Réponses

  • Tu peux écrire un petit script en Python (ou autre) qui le fait.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Mais je sais, je me demande si on peux trouver sans faire de programme, la technique par force brute...
    On peut aussi poser la question avec une addition de n nombres à m chiffres (on enlève le "au plus").
  • plsryef
    Modifié (23 Aug)
    Pour la question initiale, avec un programme, sans ternir compte de la commutativité je trouve:
    [0.19448878 0.37781024 0.32018505 0.10751592] pour chacune des probabilités. Quelqu'un peut confirmer ?
    avec ce programme, qui je suis sûr contient une erreur (des retenue comptés trop de fois)

    import numpy as np
    n=999
    L=[]
    for i in range(n):
        for j in range(n):
            a=0
            if i%10+j%10>10:
                a=a+1
            if i%100+j%100>100:
                a=a+1
            if i+j>1000:
                a=a+1
            L.append(a)
            #print(i,j,a)



    RET=np.array([0,0,0,0])
    for i in range(len(L)):
        if L[i]==0:
            RET[0]=RET[0]+1
        if L[i]==1:
            RET[1]=RET[1]+1
        if L[i]==2:
            RET[2]=RET[2]+1
        if L[i]==3:
            RET[3]=RET[3]+1

    print(RET/len(L))


  • Bonjour,
    Je suppose que les deux entiers sont tirés uniformémément entre 0 et 999.
    Pas de retenue, facile à la main :
    Probabilité que la somme de deux entiers naturels $<10$ soit $<10$ :  $55/100 = 11/20$.
    Probabilité d'aucune retenue :  $$\left( \frac{11}{20}\right)^3=\frac{1331}{8000}=0,166375$$

  • GaBuZoMeu
    Modifié (23 Aug)
    Pour exactement une retenue :  
    $$\frac{45}{100}\times \frac{45}{100}\times \frac{55}{100} +\frac{55}{100}\times \frac{45}{100}\times \frac{45}{100}+ \frac{55}{100}\times \frac{55}{100}\times \frac{45}{100}$$



  • On est donc réellement obligé de faire par disjonction de cas... et au final c'est assez pénible, y compris à programmer (ce que je vais reprendre aussi).
  • Pour exactement deux retenues :
    $$\frac{55}{100}\times \frac{45}{100}\times \frac{55}{100} +\frac{45}{100}\times \frac{45}{100}\times \frac{45}{100}+ \frac{45}{100}\times \frac{55}{100}\times \frac{45}{100}$$
  • lourrran
    Modifié (23 Aug)
    Regardons le code Python
    n=999
    for i in range(n) :
     Ici, tu exécutes une boucle pour tous les entiers i entre 0 et 998 , tu ne traites pas le nombre 999.
    if i%10+j%10 > 10  
    Tu prends le chiffre des unités de $i$ et celui de $j$, tu les ajoutes, et tu regardes si ça dépasse $10$ (tu considères que 3+7, il n'y a pas de retenue )
    Corrigeons, en simplifiant la fin.

    n=1000
    Resu=[0,0,0,0]
    for i in range(n):
        for j in range(n):
            a=0
            if i%10+j%10>9:
                a=a+1
            if i%100+j%100>99:
                a=a+1
            if i+j>999:
                a=a+1
            Resu[a]=Resu[a]+1 
          
    print ( Resu )
    for i in range(4) :
        print ( i, Resu[i] , Resu[i]/1000/1000 )

    0 166375 0.166375
    1 358875 0.358875
    2 338625 0.338625
    3 136125 0.136125




    Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. Benjamin Franklin
    L'hypocrisie est pire qu'une vérité qui fait mal. Franck Ntasamara.
  • GaBuZoMeu
    Modifié (23 Aug)
    Pour exactement 3 retenues : 
    $$\frac{45}{100}\times \frac{55}{100}\times \frac{55}{100}$$
    Pas si pénible que ça.
  • plsryef
    Modifié (23 Aug)
    En effet pas si pénible mais il faut avoir l'esprit clair, je vais voir en base b et en ajoutant cette fois ci n nombres à m chiffres. désormais je pourrais dire aux élèves en ajoutant 2 nombres compris entre 0 et 1000, il n'y aura pas de retenue que dans  16% des cas, donc il faut faire attention.
  • Quand on ajoute deux nombres, la retenue ne peut être que de 1.
    Avec plus de nombres, ça va être la panique pour faire à la main.
  • plsryef
    Modifié (23 Aug)
    En fait je réalise que le problème est mal posé pour plus de deux nombres puisque la retenue peut avoir deux chiffres, et ça change complètement la question. (il faudra voir ça autrement si je peux).
  • Une ch'tite procédure python pour compter le nombre de retenues dans la somme d'une liste de nombres : 
    def nb_retenues(L) :
        nb_digits = max(len(str(n)) for n in L)
        return sum( sum(n%10**(k+1) for n in L) >= 10**(k+1) for k in range(nb_digits))

  • plsryef
    Modifié (23 Aug)
    Je ne suis pas d'accord, si on ajoute 1 et 999 il y a 3 retenues, c'est je genre de situations que je trouve difficile à programmer.
  • Essaie nb_retenues([999,1]) avant de dire que tu n'es pas d'accord !

  • plsryef
    Modifié (23 Aug)
    Oupss je n'avait pas testé avec la bonne liste, désolé.
  • Il me semble que la question initiale peut être abordée de manière statistique. Évidemment en sachant déterminer le nombre de retenues dans une addition de deux nombres à 3 chiffres en base 10.
  • Et pourquoi donc l'aborder de manière statistique, alors qu'un peu de réflexion donne la réponse exacte, comme je l'ai donnée plus haut ?
  • En fait j'ai testé avec une liste de chiffres et ça ne donnait qu'une retenue, cependant la somme de la liste c'est 1338049, dans ce cas le programme ne que une retenue mais 133804... et quelques, et ce que ça ne fait pas plutôt 6 retenues, car si la retenue est plus grande que 10 il ne faut pas répartir , (de toute façon je suis loin d'y être,mais je me pose la question).
  • @GaBuZoMeu La probabilité que tu annonces pour aucune retenue est différente de celle calculée par le dénombrement fait par Python programmé par ChatGPT, j’ignore quelle est la bonne réponse.
  • On s'en fout de ChatGPT !
    @plsryef : ça serait plus utile de donner la liste plutôt que la somme !
  • philou22
    Modifié (23 Aug)
    @GaBuZoMeu Mea Culpa je n’avais pas vu « au plus 3 chiffres » edit : https://chatgpt.com/share/1db7674b-c5e8-44e1-a243-b570b3a86073
  • j'ai posé la question a chat GPT pour 4 chiffres et là, surprise: il fait le calcul par combinaison aléatoire.
  • j’ignore quelle est la bonne réponse.

    C'est bien sûr la mienne ! :D


  • plsryef
    Modifié (23 Aug)
    C'était la liste du programme que j'avais tappé qui donnait le nb de retenue pour chaque addition, (le programme était faux, il y avait 99980001 nombres dans la liste puisque j'avais oublié que en python le dernier ne compte pas), mais que des additions à avec des nombres à 1 chiffre, après je ne connais pas le bon cadre pour ce problème, mais je sais que tu as eu la bonne réponse. (quelqu'un ma soufflé la réponse pour le problème initial, et c'est très intéressant).
  • @plsryef Effectivement avec 4 chiffres, l’exécution en ligne du programme Python écrit par ChatGPT est estimée trop longue et il passe en mode échantillonnage https://chatgpt.com/share/a66078f2-88f5-4547-aed5-f431a7481578
  • Il faut s'entendre sur ce qu'on appelle retenue, quand la retenue a plus d'un chiffre.
  • je me demande si ce genre d'ajustement, c'est sous le contrôle d'une main humaine, ou si chatGPt a fait ça directement...
    (je n'en sais rien).
  • GaBuZoMeu
    Modifié (23 Aug)
    Pfff ! Pour l'addition de deux nombres entre 0 et 9999, le plus difficile est le cas de 2 retenues. Un peu de réflexion montre que la probabilité est : 
    $$\frac{9^4+2\times9^3\times11+2\times9^2\times11^2+9\times11^3}{20^4}$$

  • GaBuZoMeu
    Modifié (24 Aug)
    Avec une procédure python pour ne pas se fatiguer, on peut vérifier que ChatGPT ne se trompe pas de beaucoup :

    Probas des retenues dans l'addition de deux entiers tirés uniformément et indépendamment entre 0 et 10^4-1
    0 retenues : 14641/20^4, soit environ 9.15%
    1 retenues : 41382/20^4, soit environ 25.86%
    2 retenues : 54180/20^4, soit environ 33.86%
    3 retenues : 37818/20^4, soit environ 23.64%
    4 retenues : 11979/20^4, soit environ 7.49%

    et on peut même pousser à 20 chiffres :

    Probas des retenues dans l'addition de deux entiers tirés uniformément et indépendamment entre 0 et 10^20-1
    0 retenues : 672749994932560009201/20^20, soit environ 0.00%
    1 retenues : 9107144559500275165878/20^20, soit environ 0.01%
    2 retenues : 61415122343214370372092/20^20, soit environ 0.06%
    3 retenues : 273515994103313771130618/20^20, soit environ 0.26%
    4 retenues : 900169196401234083330567/20^20, soit environ 0.86%
    5 retenues : 2323013351558849247546072/20^20, soit environ 2.22%
    6 retenues : 4870730455315951210500384/20^20, soit environ 4.65%
    7 retenues : 8487695944156221581978376/20^20, soit environ 8.09%
    8 retenues : 12474632241635698600373754/20^20, soit environ 11.90%
    9 retenues : 15607292621056557857976276/20^20, soit environ 14.88%
    10 retenues : 16707364743535315152671160/20^20, soit environ 15.93%
    11 retenues : 15327325712900504357179884/20^20, soit environ 14.62%
    12 retenues : 12029937358944052005249726/20^20, soit environ 11.47%
    13 retenues : 8035939189064173249238904/20^20, soit environ 7.66%
    14 retenues : 4526053542924411907670976/20^20, soit environ 4.32%
    15 retenues : 2117733837422458893738408/20^20, soit environ 2.02%
    16 retenues : 804623842353843993437253/20^20, soit environ 0.77%
    17 retenues : 239542938911144431515942/20^20, soit environ 0.23%
    18 retenues : 52650319980190385468268/20^20, soit environ 0.05%
    19 retenues : 7633261024396334529642/20^20, soit environ 0.01%
    20 retenues : 550431814035730916619/20^20, soit environ 0.00%

    CPU times: user 9.82 s, sys: 3.6 ms, total: 9.83 s Wall time: 9.83 s ​

    Si quelqu'un insiste, je peux donner mon code.
  • Moi j'insiste.
  • Alors voila :  
    import itertools as it
    
    def probas_retenues(n) :
        probs = (n+1)*[0]
        A = it.product('01',repeat=n)
        for a in A :
            r=0; p=1; s=0
            for k in range(n) :
                if int(a[k])==0 :
                    if r==0 : p *= 11
                    if r==1 : p *= 9
                    r = 0
                if int(a[k])==1 :
                    if r==0 : p *= 9
                    if r==1 : p *= 11
                    r=1 ; s+= 1
            probs[s] += p
        return probs
    
    def affiche_probas(n) :
        print("Probas des retenues dans l'addition de deux entiers tirés uniformément\n\
    et indépendamment entre 0 et 10^{}-1".format(n) )
        L = probas_retenues(n)
        for k in range(n+1) :
            print ("{} retenues : {}/20^{}, soit environ {:.2%}"\
                   .format(k,L[k],n,L[k]/20**n))


  • merci.
  • Un lien (asymptotique) avec une loi binomiale ? 
  • GaBuZoMeu
    Modifié (25 Aug)
    Intéressante question.
    Soit $X_k$ la variable aléatoire de Bernoulli qui vaut 1 si la $k$-ème colonne de l'addition donne une retenue, 0 sinon.
    $$p_k = P(X_k=1) = \frac12\left(1-\frac1{10^k}\right)$$
    Problème, les $X_k$ ne sont pas indépendantes : 
    $$ P(X_{k+1}=1\mid X_k=1) = \frac{11}{20}\qquad P(X_{k+1}=1\mid X_k=0) = \frac{9}{20}$$
    A-t-on une variante du Théorème Central Limite pour la moyenne des $X_k$ dans ce cas ?
    PS. Il semble que oui, en considérant la chaîne de Markov avec deux états "retenue" et "pas retenue". En tout cas, la fréquence des retenues tend presque sûrement vers 1/2.

  • plsryef
    Modifié (25 Aug)
    j'ai testé avec une base plus petite (3) ça donne ça:
    0 retenues : 1099511627776/6^20, soit environ 0.03%
    1 retenues : 5772436045824/6^20, soit environ 0.16%
    2 retenues : 18485539241984/6^20, soit environ 0.51%
    3 retenues : 44942537785344/6^20, soit environ 1.23%
    4 retenues : 90142773608448/6^20, soit environ 2.47%
    5 retenues : 155569084170240/6^20, soit environ 4.25%
    6 retenues : 236725444018176/6^20, soit environ 6.47%
    7 retenues : 322474466082816/6^20, soit environ 8.82%
    8 retenues : 397070246608896/6^20, soit environ 10.86%
    9 retenues : 444566834511872/6^20, soit environ 12.16%
    10 retenues : 454014387879936/6^20, soit environ 12.42%
    11 retenues : 423265520582656/6^20, soit environ 11.58%
    12 retenues : 359706673545216/6^20, soit environ 9.84%
    13 retenues : 277598768726016/6^20, soit environ 7.59%
    14 retenues : 193240510758912/6^20, soit environ 5.29%
    15 retenues : 120048630890496/6^20, soit environ 3.28%
    16 retenues : 65461744041984/6^20, soit environ 1.79%
    17 retenues : 30511447670784/6^20, soit environ 0.83%
    18 retenues : 11613591568384/6^20, soit environ 0.32%
    19 retenues : 3298534883328/6^20, soit environ 0.09%
    20 retenues : 549755813888/6^20, soit environ 0.02%

    @GaBuZoMeu ton code fait presque apparaître une loi binomiale
    (j'avais regardé itertools à un moment mais ça ne fonctionne bien pour le temps que sur de petites valeurs, va falloir revoir ça, dans le programme A est un itérable, revoir les itérables en python il va falloir le faire)

  • Ce n'est bien sûr pas une loi binomiale.
    @plsryef :  je ne comprends pas ton paragraphe sur itertools. La croissance exponentielle du temps est inévitable dans la mesure où la taille de A est 2^n et qu'on parcourt A. Ce n'est pas un problème avec les itérables.
  • plsryef
    Modifié (26 Aug)
    Au départ je pensais que ça serait vraiment plus rapide en temps d'exécution, et en faisant tout à a la main (sur des permutations pour résoudre le jeu de morpion, avant je l'avais fait en scratch et ça prenait une demi-journée) j'avais constaté que mon programme était juste 2 fois plus long, j'étais un peu déçu. mais c'est quand même utile pour ne pas avoir à faire tout ça à la main. En réalité c'est quand même bien d'investir dedans.
  • LOU16
    Modifié (29 Aug)
    Bonjour,
    En se cassant tout de même un peu la tête, il est possible d'expliciter la loi de probabilité du nombre $X_n$ de retenues  effectuées lorsque l'on additionne deux entiers pris aléatoirement et indépendamment dans $[\![0;10^n-1]\!].$
    $p: =\dfrac{11}{20},\:\:q:= 1-p.\quad\displaystyle  \binom ab =0 \:\text{ si }\:a,b\in\N,\:\:a<b.\quad \mathbb P(X_n=0)=p^n.$
    $$\boxed{\forall k \in [\![1;n]\!], \quad \mathbb P(X_n=k)= \displaystyle \sum_{i=0}^{k-1}\binom{k-1}i \binom{n-k}i p^{n-2i-1}q^{2i+1}+\binom{k-1}i \binom{n-k}{i +1}p^{n-2i-2}q^{2i+2}.}$$

    $\bullet\:\:$ On retrouve bien, par exemple, le fait que $\displaystyle \sum_{k=0}^n \mathbb P(X=k)=1,\:$ en observant que:
    $\forall i\leqslant \dfrac{n-1}2,\:\:\displaystyle \sum_{k=i+1}^n\binom{k-1}i\binom{n-k}i =\sum_{k=i+1}^n\#\Big\{(x_1,x_2,\dots x_{2i+1}) \in [\![1;n]\!]^{2i+1}\mid x_j<x_{j+1},\: x_{i+1}=k\Big\} =\binom n{2i+1},$
    $\forall i\leqslant \dfrac{n-2}2,\:\:\displaystyle \sum_{k=i+1}^n\binom{k-1}i\binom{n-k}{i +1} =\sum_{k=i+1}^n\#\Big\{(x_1,x_2,\dots x_{2i+2}) \in [\![1;n]\!]^{2i+2}\mid x_j<x_{j+1},\: x_{i+1}=k\Big\} =\binom n{2i+2},$

    de sorte que $\displaystyle \sum_{k=0}^n \mathbb P(X=k)=p^n+\sum_{j=1}^n\binom nj p^{n-j}q^j =(p+q)^n =1.$

    $\bullet\:\:$ Une autre remarque: si $p=\dfrac 12,\:$ alors $X_n$ obéit à la loi binomiale $\mathcal B(n,\frac 12).\:$(ce n'est pas tout-à-fait immédiat.)




Connectez-vous ou Inscrivez-vous pour répondre.