function pr = proba_bin(n,p,inter)
//    Retourne la probabilite d'un intervalle
//    (bornes comprises) pour la loi binomiale de
//    parametres n et p.
//
ump = 1-p;
if inter(1)>=1,
   pr = cdfbin("PQ",inter(2),n,p,ump)..
       -cdfbin("PQ",inter(1)-1,n,p,ump);
else
   pr = cdfbin("PQ",inter(2),n,p,ump);
end;


function io=IDoptim_bin(n,p,alpha)
//    Retourne l'intervalle de dispersion optimal
//    de niveau 1-alpha pour la loi binomiale
//    de parametres n et p.
//
umalpha = 1-alpha;
intervalles = [];               // intervalles de niveau >= umalpha
for bi = 0:n,                   // borne inferieure
   for bs = bi:n,               // borne superieure
      pr = proba_bin(n,p,[bi,bs]);
      if pr>=umalpha then
           intervalles = [intervalles;[bi,bs]];
      end;
   end;
end;
amplitudes = intervalles(:,2)-intervalles(:,1);
ampmin = min(amplitudes);       // amplitude minimale
f = find(amplitudes==ampmin);   // indices correspondants
intervalles = intervalles(f,:); // intervalles d'amplitude minimale
prmax = 0;
for i=1:size(intervalles,"r"),
   inter = intervalles(i,:);
   pr = proba_bin(n,p,inter);
   if pr>=prmax then,
      prmax=pr; 
      io = inter;               // intervalle de niveau minimal
   end;
end;
  
function id=IDsym_bin(n,p,alpha)
//    Retourne l'intervalle de dispersion symetrique
//    de niveau 1-alpha pour la loi binomiale
//    de parametres n et p.
//
beta = alpha/2;
bi = 0;
if cdfbin("PQ",0,n,p,1-p)<beta,
   while proba_bin(n,p,[0,bi])<beta;
     bi = bi+1;
   end;
   bi = bi-1;
end;
bs = n;
if cdfbin("PQ",n,n,p,1-p)>1-beta,
   while proba_bin(n,p,[bs,n])<beta,
     bs = bs-1;
   end;
   bs = bs+1;
end;
id = [bi,bs];  

