Contourner "Integer overflow" de choose

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Contourner "Integer overflow" de choose

Message non lu par maurice » mer. 8 mai 2013, 16:58

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
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Contourner "Integer overflow" de choose

Message non lu par GM » mer. 8 mai 2013, 17:45

Bonjour,

l'astuce, pour obtenir par exemple ceci :

Intervalle_de_fluctuation_asymptotique_In.pdf
(66.32 Kio) Téléchargé 527 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);

Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: Contourner "Integer overflow" de choose

Message non lu par maurice » mer. 8 mai 2013, 17:58

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
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: Contourner "Integer overflow" de choose

Message non lu par maurice » mer. 8 mai 2013, 17:59

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
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Contourner "Integer overflow" de choose

Message non lu par GM » mer. 8 mai 2013, 18:05

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.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Contourner "Integer overflow" de choose

Message non lu par GM » mer. 8 mai 2013, 18:11

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
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: Contourner "Integer overflow" de choose

Message non lu par maurice » mer. 8 mai 2013, 18:35

Ç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
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

Nico56
Messages : 58
Enregistré le : lun. 12 janv. 2015, 16:06

Re: Contourner "Integer overflow" de choose

Message non lu par Nico56 » mer. 20 mai 2015, 16:36

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...
Windows 10 - Asymptote(2.32)+texlive - Editeur: texmaker (4.5)

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Contourner "Integer overflow" de choose

Message non lu par GM » mer. 20 mai 2015, 16:59

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.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

Nico56
Messages : 58
Enregistré le : lun. 12 janv. 2015, 16:06

Re: Contourner "Integer overflow" de choose

Message non lu par Nico56 » mer. 20 mai 2015, 18:23

Merci beaucoup pour le code, c'est très sympa.
Bonne soirée.
Nico
Windows 10 - Asymptote(2.32)+texlive - Editeur: texmaker (4.5)

Répondre