Page 1 sur 1

Contourner "Integer overflow" de choose

Posté : mer. 8 mai 2013, 16:58
par maurice
Bonjour, me lançant dans l'échantillonnage, je veux affectuer des calculs avec la loi binomiale pour n grand.
Or,

Code : Tout sélectionner

int n=100;
for(int k=0; k<=100; ++k) {
  real p_k=choose(n,k);
  write(k);
  write(p_k);
}


provoque une erreur pour n > 15 :

Code : Tout sélectionner

14
4.41869426773236e+16
15
2.53338471349989e+17
echantillonnage-1-graphique.asy: 20.3: Integer overflow

Compilation exited abnormally with code 1 at Wed May  8 09:51:10


Comment contourner ce problème et/ou calculer autrement la loi binomiale.
j'ai vu ici qu'on pouvait monter assez haut !

Merci

Bruno

Re: Contourner "Integer overflow" de choose

Posté : mer. 8 mai 2013, 17:45
par GM
Bonjour,

l'astuce, pour obtenir par exemple ceci :

Intervalle_de_fluctuation_asymptotique_In.pdf
(66.32 Kio) Téléchargé 534 fois
(n=300 en page 16)

consiste à remplacer la formule avec choose par :

Code : Tout sélectionner

import gsl;
real p=.7, pX;
int  n=300, nbsucces=100;
...
 
   pX=pdf_binomial(nbsucces,p,n);


Re: Contourner "Integer overflow" de choose

Posté : mer. 8 mai 2013, 17:58
par maurice
GM a écrit : l'astuce consiste à remplacer la formule avec choose par :

Code : Tout sélectionner

import gsl;
real p=.7, pX;
int  n=300, nbsucces=100;
...
 
   pX=pdf_binomial(nbsucces,p,n);



Merci, je vais essayer ça.

Je n'ai rien trouvé dans la doc sur pdf_binomial (gsl page 68).

Bruno

Re: Contourner "Integer overflow" de choose

Posté : mer. 8 mai 2013, 17:59
par maurice
maurice a écrit :
Je n'ai rien trouvé dans la doc sur pdf_binomial (gsl page 68).



Y'a-t-il d'autres fonctions relatives aux probabilités ?

Bruno

Re: Contourner "Integer overflow" de choose

Posté : mer. 8 mai 2013, 18:05
par GM
maurice a écrit :Y'a-t-il d'autres fonctions relatives aux probabilités ?
Bruno


Il faut chercher des infos (externes à Asymptote) relatives à gsl... et tester sur Asymptote pour voir si les fonctions de gsl sont implémentées dans Asymptote.

D'ailleurs gsl permet ce que tu proposais avec de grandes valeurs de n !
Ajoute simplement

Code : Tout sélectionner

import gsl;

dans ton script initial et tu n'auras plus l'erreur.

Re: Contourner "Integer overflow" de choose

Posté : mer. 8 mai 2013, 18:11
par GM
GM a écrit :Il faut chercher des infos (externes à Asymptote) relatives à gsl... et tester sur Asymptote pour voir si les fonctions de gsl sont implémentées dans Asymptote.


Cela devrait t'aider :
http://fossies.org/dox/asymptote-2.21.src/gsl_8symbols_8h.html

Re: Contourner "Integer overflow" de choose

Posté : mer. 8 mai 2013, 18:35
par maurice
Ça marche,

Figure asymptote b13688617e8512ed90484a15d83db2ad
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph;
  2. import gsl;
  3. unitsize(.01cm, 100cm);
  4.  
  5. limits((0,.9350), (800, .9650));
  6. yaxis(LeftRight, gray, Ticks("%", Step=.005, step=0, extend=true, gray));
  7. yequals(.9350, RightTicks(NoZero, Step=100, step=0));
  8. xequals(0, .935, .965, LeftTicks(NoZero, Step=.005, step=0));
  9.  
  10. int nmin=100, nmax=800;
  11. real p=0.5;
  12.  
  13. for(int n=nmin; n<=nmax; ++n) {
  14. real s=sqrt(p*(1-p)/n);
  15. real borne_inf=p-1.96*s;
  16. real borne_sup=p+1.96*s;
  17. real p_n=0;
  18. for(int k=floor(borne_inf*n+1); k<=floor(borne_sup*n); ++k) {
  19. //real p_k=choose(n,k)*p^k*(1-p)^(n-k);
  20. real p_k=pdf_binomial(k,p,n);
  21. p_n=p_n+p_k;
  22. }
  23. dot((n, p_n));
  24. }


A noter que si on augmente les valeurs de nmim et nmax, la version avec choose ne marche qu'avec nmax \leqslant 1000 (environ) alors qu'avec pdf_binomial on peut monter beaucoup plus haut (je n'ai pas testé au-dessus de 5000).

Bruno

Re: Contourner "Integer overflow" de choose

Posté : mer. 20 mai 2015, 16:36
par Nico56
GM a écrit :Bonjour,

l'astuce, pour obtenir par exemple ceci :
Intervalle_de_fluctuation_asymptotique_In.pdf

Bonjour,serait-il possible d'avoir le code ce fichier?
Autrement, j'ai vu le post sur l'extension gm_stats, est-ce qu'il est possible d'avoir ce fichier aussi?
Merci d'avance!
Nico, qui bosse la loi binomiale pour ses 1ere S...

Re: Contourner "Integer overflow" de choose

Posté : mer. 20 mai 2015, 16:59
par GM
Nico56 a écrit :Bonjour,serait-il possible d'avoir le code ce fichier ?

J'ai retrouvé cela :

Code : Tout sélectionner

usepackage("siunitx","locale=DE");
usepackage("fourier","upright");
locale("FR_fr");
import gsl;
// import math;
import geometry;
import graph;
///////////////////////////////////////////////
void FnIn(picture pic=currentpicture, int n, real p, real ua){
  real pk,spk;
  real dp=ua*sqrt(p*(1-p))/sqrt(n);
  for(int k=0; k<=n; ++k){
    //pk=choose(n,k)*p^k*(1-p)^(n-k);
    pk=pdf_binomial(k,p,n);
    if((k/n>=p-dp)&&(k/n<=p+dp)) spk+=pk;
    draw(pic,rotate(90)*scale(.2)*Label(format((n>140)?"$\hphantom{\num{%.10f}}$":"$\num{%.10f}$",pk),EndPoint),
         (k/n,0)--(k/n,pk),
          blue+squarecap);
  }
  xaxis(pic,xmin=0,xmax=1,RightTicks(scale(.6)*Label(),step=1),above=true);
  
  // label(pic,format("$%.3f$",p+dp),(p+dp,-.5));
  distance(pic,"$I_{"+string(n)+"}$",(p-dp,0),(p+dp,0),7mm);
  distance(pic,scale(.3)*Label("Intervalle de fluctuation asymptotique au seuil de 95\% :",align=realEpsilon*E),(0,0),(.01,0),7mm,nullpen);
  distance(pic,scale(.5)*Label(format("$\approx\num{%.6f}$",p-dp),align=W),(p-dp-.1,0),(p-dp+.1,0),7mm,nullpen);
  distance(pic,scale(.5)*Label(format("$\approx\num{%.6f}$",p+dp),align=E),(p+dp-.1,0),(p+dp+.1,0),7mm,nullpen);
  distance(pic,format("$P\left(F_{"+string(n)+"}\in I_{"+string(n)+"}\right)\approx%.7f$",spk),(p-.1,0),(p+.1,0),1.2cm,nullpen);
  label(pic,"$F_{"+string(n)+"}=\frac{X_{"+string(n)+"}}{"+string(n)+"}$
             avec
             $X_{"+string(n)+"}\hookrightarrow \mathcal{B}("+string(n)+";\num{"+string(p)+"})$
            ",truepoint(pic,NW),SE);
  label(pic,scale(.5)*"GM",truepoint(pic,SW),NE,lightgray);          
}
///////////////////////////////////////////////

real p=.7;

int N[]={30,40,50,60,70,80,90,100,110,120,130,140,150,200,250,300};

picture pict;
size(pict,8cm,4.5cm,IgnoreAspect);
for(int n:N){
    FnIn(pict,n,p,1.96); 
    add(pict.fit());
    erase(pict);
    newpage();
}
Nico56 a écrit :Autrement, j'ai vu le post sur l'extension gm_stats, est-ce qu'il est possible d'avoir ce fichier aussi?
Merci d'avance!
Nico, qui bosse la loi binomiale pour ses 1ere S...
Je n'y ai plus mis le nez dedans depuis les messages que tu as pu lire... et donc, il faudra que je regarde le code avant... car je ne diffuse pas un fichier où je mets mon nom, s'il y a des problèmes ou s'il y a des bouts de code de test qui trainent dans un coin. Mais dans l'instant, je n'ai vraiment pas le temps de m'y re-plonger.

Re: Contourner "Integer overflow" de choose

Posté : mer. 20 mai 2015, 18:23
par Nico56
Merci beaucoup pour le code, c'est très sympa.
Bonne soirée.
Nico