%xpmfBar.bgnoname@Pmf
\documentclass{article}
\usepackage[fleqn]{amsmath}
\usepackage[designiv,forcolorpaper,tight]{web}
\usepackage{grayhints}
\usepackage[dynamic]{bargraph-js}

 % \previewOn\pmcaOn


\parindent0pt

\def\maxN{72}
\begin{insDLJS*}{binomialDistr}
\begin{newsegment}{The Binomial Distribution}
var to=app.setTimeOut('this.layout="TwoColumnLeft"',5);
var maxN=\maxN;
var pmfBinKNP=[0,0,0];
var cdfBinKNP=[0,0,0];
var aBinCoeff=new Array();
aBinCoeff[1]=[1];
var aPmfCdf=new Array();
aBinCoeff[2]=[1,2,1];
for (var i=3; i<= maxN; i++) {
  aBinCoeff[i]=new Array();
  aBinCoeff[i][0]=1;
  for (var j=1; j < i; j++)
    aBinCoeff[i][j]=aBinCoeff[i-1][j-1]+aBinCoeff[i-1][j];
  aBinCoeff[i][i]=1;
}
function BinPMF(k,n,p){
  if (n==0) return null;
  var q = 1 - p, r=n-k;
  return aBinCoeff[n][k]*Math.pow(p,k)*Math.pow(q,r);
}
function BinCDF(k,n,p){
  var cdf=0;
  for (var i=0; i <= Math.floor(k); i++ )
    cdf += (BinPMF(i,n,p));
  return cdf;
}
function updateNPValues(suffix,ext,event) {
    /* suffix="pmf"|"cdf",ext="n"|"p" */
  var index=(ext=="n")?1:2;
  if (suffix=="pmf")
    pmfBinKNP[index]=event.value;
  else
    cdfBinKNP[index]=event.value;
}
function pmfValidate(suffix,event) {
  var n = this.getField(suffix+"n");
  var p = this.getField(suffix+"p");
  if (n.value=="") {
    app.alert("First, enter a value for \"n\" between 1 and "+maxN+", inclusive");
    event.rc=false;
    return;
  } else  {
    if (suffix=="pmf")
      pmfBinKNP[1]=n.value;
    else
      cdfBinKNP[1]=n.value;
    if (p.value=="") {
      app.alert("First, enter a decimal number for \"p\" between 0 and 1, inclusive");
      event.rc=false;
      return;
    } else
      if (suffix=="pmf")
        pmfBinKNP[2]=p.value;
      else
        cdfBinKNP[2]=p.value;
  }
  var k = 1*event.value;
  if ( (suffix=="pmf")&&(k < 0) ) {
    event.rc=false;
    app.alert("\"k\" must be a nonnegative integer");
    return;
  }
  if ( (suffix=="pmf")&&(k > n.value) ) {
    event.rc=false;
    app.alert("\"k\" must be a nonnegative integer no larger than "+ n.value);
    return;
  }
  if ( (suffix=="pmf")&&(!Number.isInteger(k)) ) {
    event.rc=false;
    app.alert("\"k\" must be a nonnegative integer");
    return;
  }
  if (suffix=="pmf")
    pmfBinKNP[0]=k;
  else
    cdfBinKNP[0]=k;
}
function ValidateBinParams(fld) {
  var k=this.getField(fld+"k");
  var n=this.getField(fld+"n");
  var p=this.getField(fld+"p");
  var bOK=( (k.valueAsString!="") && (n.valueAsString!="") && (p.valueAsString!="") );
  return bOK;
}
function pmfCalculate(fld) { % dps
  var bOk=ValidateBinParams(fld);
  if (!bOk) app.alert("Some of the parameters have no value, please fix.");
  if (bOk) {
    if ( pmfBinKNP[0] > pmfBinKNP[1] ) {
      app.alert("The \"k\" parameter is larger than the \"n\" parmater, fix it");
    } else {
      var f = this.getField(fld);
      var Pr=BinPMF(pmfBinKNP[0],pmfBinKNP[1],pmfBinKNP[2]);
      if (Pr!=null) f.value=util.printf("\%.6f",Pr);
    }
  }
}
function cdfCalculate(fld) {
  var bOk=ValidateBinParams(fld);
  if (!bOk) app.alert("Some of the parameters have no value, please fix.");
  if (bOk) {
    var f = this.getField(fld);
    if ( cdfBinKNP[0]> cdfBinKNP[1]) {
        f.value=util.printf("\%.6f",1);
    } else {
      if (cdfBinKNP[0] < 0 ) {
        f.value=util.printf("\%.6f",0);
      } else {
        var Pr=BinCDF(cdfBinKNP[0],cdfBinKNP[1],cdfBinKNP[2]);
        f.value=util.printf("\%.6f",Pr);
      }
    }
  }
}
function tableCalc(tableN,tableP,cFld,cTableN,cTableP) {
  var f1=this.getField(cFld+".1");
  var f2=this.getField(cFld+".2");
  var f3=this.getField(cFld+".3");
  var N=this.getField(cTableN);
  var P=this.getField(cTableP);
  aPmfCdf=new Array(); // initialize array (declared above)
  if ( N.valueAsString=="" || P.valueAsString=="") {
    f1.value="At least one of the parameters, \"n\" or \"p\", does not have a value, please correct this."
    return;
  }
  var pmfPr=0; cdfPr=0, rowStr="",tableStr1="",tableStr2="",tableStr3="";
  var tableHead=util.printf("   \%s  ","k")
    +util.printf("    \%s      ","pmf")
    +util.printf("    \%s","cdf")+"\r";
  if ( tableN > 24 ) var col1=24;
  else var col1=tableN;
  for (var k=0; k<=Math.min(24,tableN); k++) {
    pmfPr=BinPMF(k,tableN,tableP);
    cdfPr=BinCDF(k,tableN,tableP);
    rowStr=((k<10)?util.printf("\%4d",k):util.printf("\%3d",k))
      +util.printf("\%10.6f", pmfPr)
      +util.printf("\%10.6f", cdfPr)
      +"\r";
    tableStr1+=rowStr;
    aPmfCdf.push([k,pmfPr,cdfPr]);
  }
  if ( tableN <= 24 ) f1.value=tableHead+tableStr1;
  else {
    for (var k=25; k<=Math.min(48,tableN); k++) {
      pmfPr=BinPMF(k,tableN,tableP);
      cdfPr=BinCDF(k,tableN,tableP);
      rowStr=((k<10)?util.printf("\%4d",k):util.printf("\%3d",k))
        +util.printf("\%10.6f", pmfPr)
        +util.printf("\%10.6f", cdfPr)
        +"\r";
      tableStr2+=rowStr;
      aPmfCdf.push([k,pmfPr,cdfPr]);
    }
    if ( tableN <= 48 ) {
      f1.value=tableHead+tableStr1;
      f2.value=tableHead+tableStr2;
    } else {
      for (var k=49; k<=tableN; k++) {
        pmfPr=BinPMF(k,tableN,tableP);
        cdfPr=BinCDF(k,tableN,tableP);
        rowStr=((k<10)?util.printf("\%4d",k):util.printf("\%3d",k))
            +util.printf("\%10.6f", pmfPr)
            +util.printf("\%10.6f", cdfPr)
            +"\r";
        tableStr3+=rowStr;
        aPmfCdf.push([k,pmfPr,cdfPr]);
      }
      f1.value=tableHead+tableStr1;
      f2.value=tableHead+tableStr2;
      f3.value=tableHead+tableStr3;
    }
  }
}
\end{newsegment}
\end{insDLJS*}
%
% Special formatting macros
%
\def\binPresets{\autoCenter{y}\Q{1}\S{U}\BC{gray}\textColor{0.75 g}\textSize{6}}
\def\ValidateInt{%
    if ( !Number.isInteger(1*event.value) ) {\r\t
        event.rc=false;\r\t
        app.alert("\\"n\\" must be an integer");\r
    }%
}
%
% Begin PMF macros
%
\def\pmfk{\textField[\presets{\binPresets}
    \TU{Enter the number of successes "k". Must be less than "n", the second parameter}
    \AA{\AAKeystroke{AFNumber_Keystroke(0,1,0,0,"",true);\r\KeyToGray}
    \AAFormat{AFNumber_Format(0,1,0,0,"",true);\FmtToGray{k}}
    \AAValidate{pmfValidate("pmf",event);}
    \AAOnFocus{\JS{\FocusToBlack}}
    \AAOnBlur{\JS{\BlurToBlack}}
}]{pmfk}{10bp}{8bp}}
\def\pmfn{\textField[\presets{\binPresets}
    \TU{Enter "n", the number of trials, must be no greater than \maxN}
    \AA{\AAKeystroke{AFNumber_Keystroke(0,1,0,0,"",true);\r\KeyToGray}
    \AAFormat{AFNumber_Format(0,1,0,0,"",true);\FmtToGray{n}}
    \AAValidate{EFRange_Validate(true,1,true,\maxN);\r % dps
    if (event.rc) updateNPValues("pmf","n",event);}
    \AAOnFocus{\JS{\FocusToBlack}}
    \AAOnBlur{\JS{\BlurToBlack}}
}]{pmfn}{10bp}{8bp}}
\def\pmfp{\textField[\presets{\binPresets}
    \TU{Enter "p", the probability of success, a decimal number between
    0 and 1 inclusive}\AA{%
    \AAKeystroke{AFNumber_Keystroke(3,1,0,0,"",true);\r\KeyToGray}
    \AAFormat{AFNumber_Format(3,1,0,0,"",true);\FmtToGray{p}}
    \AAValidate{EFRange_Validate(true,0,true,1);\r % dps
    if (event.rc) updateNPValues("pmf","p",event);}
    \AAOnFocus{\JS{\FocusToBlack}}
    \AAOnBlur{\JS{\BlurToBlack}}
}]{pmfp}{18bp}{8bp}}
\def\pmf{\textField[\textSize{6}\S{U}\BC{gray}]{pmf}{1in}{8bp}}
\def\calcPMF#1{\pushButton[\textSize{6}\CA{Calc}\A{\JS{%
    pmfCalculate("#1");}}
]{calcPMF}{}{8bp}}
%
% Begin CDF macros
%
\def\cdfk{\textField[\presets{\binPresets}
    \TU{Enter any number for "k"}
    \AA{\AAKeystroke{AFNumber_Keystroke(0,1,0,0,"",true);\r\KeyToGray}
    \AAFormat{AFNumber_Format(0,1,0,0,"",true);\FmtToGray{k}}
    \AAValidate{pmfValidate("cdf",event);}
    \AAOnFocus{\JS{\FocusToBlack}}
    \AAOnBlur{\JS{\BlurToBlack}}
}]{cdfk}{10bp}{8bp}}
\def\cdfn{\textField[\presets{\binPresets}
    \TU{Enter "n", the number of trials, must be no greater than \maxN}
    \AA{\AAKeystroke{AFNumber_Keystroke(0,1,0,0,"",true);\r\KeyToGray}
    \AAFormat{AFNumber_Format(0,1,0,0,"",true);\FmtToGray{n}}
    \AAValidate{EFRange_Validate(true,1,true,\maxN);\r\ValidateInt\r
        if (event.rc) updateNPValues("cdf","n",event);} % dps
    \AAOnFocus{\JS{\FocusToBlack}}
    \AAOnBlur{\JS{\BlurToBlack}}
}]{cdfn}{10bp}{8bp}}
\def\cdfp{\textField[\presets{\binPresets}
    \TU{Enter "p", the probability of success, a decimal number between
    0 and 1 inclusive}\AA{%
    \AAKeystroke{AFNumber_Keystroke(3,1,0,0,"",true);\r\KeyToGray}
    \AAFormat{AFNumber_Format(3,1,0,0,"",true);\FmtToGray{p}}
    \AAValidate{EFRange_Validate(true,0,true,1);\r % dps
        if (event.rc) updateNPValues("cdf","p",event);}
    \AAOnFocus{\JS{\FocusToBlack}}
    \AAOnBlur{\JS{\BlurToBlack}}
}]{cdfp}{18bp}{8bp}}
\def\cdf{\textField[\textSize{6}\S{U}\BC{gray}]{cdf}{1in}{8bp}}
\def\calcCDF#1{\pushButton[\textSize{6}\CA{Calc}\A{\JS{%
    cdfCalculate("#1");}}
]{calcCDF}{}{8bp}}



\begin{document}

%\previewOff

\section*{Tables of Binomial Probabilities}

\def\binTablePresets{\autoCenter{y}\Q{1}\S{U}}

\(
 n=\textField[\presets{\binTablePresets}\textColor{0.75 g}\BC{gray}
    \TU{Enter "n", the number of trials, must be no greater than \maxN}
    \AA{\AAKeystroke{AFNumber_Keystroke(0,1,0,0,"",true);\r\KeyToGray}
        \AAFormat{AFNumber_Format(0,1,0,0,"",true);\FmtToGray{n}}
        \AAValidate{AFRange_Validate(true,1,true,\maxN);\r\ValidateInt }
        \AAOnFocus{\JS{\FocusToBlack}}
        \AAOnBlur{\JS{\BlurToBlack}}
 }]{tableN}{16bp}{11bp}\cgBdry\quad
 p=\textField[\presets{\binTablePresets}\textColor{0.75 g}\BC{gray}
    \TU{Enter "p", the probability of success, a decimal number between 0 and 1 inclusive}
    \AA{\AAKeystroke{AFNumber_Keystroke(3,1,0,0,"",true);\r\KeyToGray}
    \AAFormat{AFNumber_Format(3,1,0,0,"",true);\FmtToGray{p}}
    \AAValidate{AFRange_Validate(true,0,true,1);}
    \AAOnFocus{\JS{\FocusToBlack}}
    \AAOnBlur{\JS{\BlurToBlack}}
 }]{tableP}{25bp}{11bp}\cgBdry\,
\pushButton[\CA{Calc}\AAmouseup{%
    var tableN=this.getField("tableN").value;\r
    var tableP=this.getField("tableP").value;\r
    tableCalc(tableN,tableP,"TableOfBinPrs","tableN","tableP");\r
    displayDyBargraph("Pmf",aPmfCdf,true,false,{bc:color.red,fc:color.blue});\r
    displayDyBargraph("Cdf",aPmfCdf,false,false,{bc:color.red,fc:color.blue});
    }]{tableCalc}{}{11bp}\olBdry
\pushButton[\CA{Reset}
    \TU{Press to clear the fields of this page, and shift-press to clear all fields.}
    \A{\JS{%
    this.calculate=true;\r
    if (event.shift)\r\t
        this.resetForm();\r
    else\r\t
    this.resetForm(["TableOfBinPrs","tableN","tableP"]);\r
    this.removeField("pmfBar");\r
    this.removeField("cdfBar");
}}]{reset}{}{11bp}
\)
    \vcgBdry[12pt]
In the table, $\operatorname{\textsf{pmf}}=f(k;n,p)=\operatorname{Pr}(X=k)$,
$\operatorname{\textsf{cdf}}=F(k;n,p)=\operatorname{Pr}(X\le k)$.
    \vcgBdry[12pt]{\setlength{\fboxsep}{0pt}\fbox{%
    \textField[\BC{}\Ff{\FfMultiline}]{TableOfBinPrs.1}{105bp}{11bp*26}\olBdry
    \textField[\BC{}\Ff{\FfMultiline}]{TableOfBinPrs.2}{105bp}{11bp*26}\olBdry
    \textField[\BC{}\Ff{\FfMultiline}]{TableOfBinPrs.3}{105bp}{11bp*26}}\bigskip

\newpage

%\setlength{\fboxsep}{3pt}

%\previewOn
\begin{center}\bfseries
   The bar graph for the probability mass function (pmf)
\end{center}
\fbox{\begin{bargraphenv}[width=\linewidth,height=2in,o=vert]{Pmf} %[width=.67\linewidth,height=2in,o=vert]{kaf}
\begin{bargraph}{pmfBar}\isdynamic %\relax
\end{bargraph}
\end{bargraphenv}}\vcgBdry[\medskipamount]\pushButton[\TU{This button re-scales the bar graph so that the tallest bar
takes the entire height of the region; shift-click reverts bar graph to its original scaling.}\CA{Optimize}\A{\JS{%
displayDyBargraph("Pmf",aPmfCdf,true,!event.shift);}}]{optimize}{}{11bp}\quad{Under normal scaling, the height of this region is 1 unit, when the bar graph is optimized, the height is the height of the tallest bar.}

\bigskip
\begin{center}\bfseries
   The bar graph for the cumulative distribution function (cdf)
\end{center}
\fbox{\begin{bargraphenv}[width=\linewidth,height=2in,o=vert]{Cdf}
\begin{bargraph}{cdfBar}\isdynamic %\relax
\end{bargraph}
\end{bargraphenv}}\vcgBdry[\medskipamount] The height of the region above is 1~unit.\vcgBdry[\bigskipamount]
\(
 n=\textField[\presets{\binTablePresets}\textColor{0.75 g}\BC{gray}
    \TU{Enter "n", the number of trials, must be no greater than \maxN}
    \AA{\AAKeystroke{AFNumber_Keystroke(0,1,0,0,"",true);\r\KeyToGray}
      \AAFormat{AFNumber_Format(0,1,0,0,"",true);\FmtToGray{n}}
      \AAValidate{AFRange_Validate(true,1,true,\maxN);\r\ValidateInt }
      \AAOnFocus{\JS{\FocusToBlack}}
      \AAOnBlur{\JS{\BlurToBlack}}
 }]{tableN}{16bp}{11bp}\cgBdry\quad
 p=\textField[\presets{\binTablePresets}\textColor{0.75 g}\BC{gray}
    \TU{Enter "p", the probability of success, a decimal number between 0 and 1 inclusive}
    \AA{\AAKeystroke{AFNumber_Keystroke(3,1,0,0,"",true);\r\KeyToGray}
    \AAFormat{AFNumber_Format(3,1,0,0,"",true);\FmtToGray{p}}
    \AAValidate{AFRange_Validate(true,0,true,1);}
    \AAOnFocus{\JS{\FocusToBlack}}
    \AAOnBlur{\JS{\BlurToBlack}}
 }]{tableP}{25bp}{11bp}\cgBdry\,
\pushButton[\CA{Calc}\AAmouseup{%
    var tableN=this.getField("tableN").value;\r
    var tableP=this.getField("tableP").value;\r
    tableCalc(tableN,tableP,"TableOfBinPrs","tableN","tableP");\r
    displayDyBargraph("Pmf",aPmfCdf,true,false,{bc:color.blue,fc:color.red});\r
    displayDyBargraph("Cdf",aPmfCdf,false,false,{bc:color.blue,fc:color.red});
    }]{tableCalc}{}{11bp}\olBdry
\pushButton[\CA{Reset}
    \TU{Press to clear the fields of this page, and shift-press to clear all fields.}
    \A{\JS{%
    this.calculate=true;\r
    if (event.shift)\r\t
      this.resetForm();\r
    else\r\t
    this.resetForm(["TableOfBinPrs","tableN","tableP"]);\r
    this.removeField("Pmf@pmfBar");\r
    this.removeField("Cdf@cdfBar");
}}]{reset}{}{11bp}\cgBdry[2em]
\pushButton[\CA{Toggle Border}\A{\JS{%
  var f=this.getField("Pmf@pmfBar");\r
  if ( f!=null ) {\r\t
    var a=f.getArray();\r\t\t
    if (f.saveStrokeColor==undefined) f.saveStrokeColor=color.red;\r\t
    if (!color.equal(a[0].strokeColor,color.transparent))\r\t\t
      f.saveStrokeColor=a[0].strokeColor;\r\t
    var g=getField("Cdf@cdfBar");\r\t
    if (color.equal(a[0].strokeColor,color.transparent)) {\r\t\t
      f.strokeColor=f.saveStrokeColor;\r\t\t
      g.strokeColor=f.saveStrokeColor;\r\t
    } else {\r\t\t
      f.strokeColor=color.transparent;\r\t\t
      g.strokeColor=color.transparent;\r\t
    }\r
  }
}}]{toggleBdry}{}{11bp}
\)

\end{document}