/*
 * Binomial.java
 *
 * Created on March 10, 2006, 11:35 AM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package probabilitycalculator;

/**
 *
 * @author Rinaman
 */
public class Binomial extends Distributions{
    
    private double x, n, p;
    private int option;
    
    /** Creates a new instance of Binomial */
    public Binomial(double dx, double xn, double dp, int ioption) {
        x = dx;
        n = xn;
        p = dp;
        option = ioption;
    }
    
    public double BinomialCalc() {
        if(option == 1)return df(x, n, p);
        else if(option == 2) {
            if(((double)((int)x)) == x)return 1.0 - df(x-1.0, n, p);
            else return 1.0 - df(x,  n, p);
        }
        else if(option == 3)return invDFBinomial(x, n, p);
        else return invDFBinomialC(x, n, p);
    }
    
    public double df(double x, double n, double p) {
        double dx;
        int i;
        if(x < 0.0)return 0.0;
        if(x >= n)return 1.0;
        i = 0;
        while((double)i <= x)i++;
        dx = (double)i - 1.0;
        return 1.0 - betai(dx+1, n-dx, p);
    }
    
    public double invDFBinomial(double x, double n, double p) {
        int i;
        double xi;
        if(x < 0.0)return -5.0;
        if(x >= 1.0)return -2.0;
        i = 0;
        xi = 0.0;
        while(df(xi, n, p) <= x) {
            i++;
            xi = xi + 1.0;
        }
        return xi;
    }
    
    public double invDFBinomialC(double x, double n, double p) {
        double xi;
        int i;
        if(x < 0.0)return -5.0;
        if(x >= 1.0)return -2.0;
        i = 0;
        xi = 1.0;
        while((1.0 - df(xi-1.0, n, p)) > x) {
            i++;
            xi = xi + 1.0;
        }
        return xi-1.0;
    }
}
