home *** CD-ROM | disk | FTP | other *** search
- sthygd(k,n,id,iix,df,cf)
-
- /* this function computes the probability function and cumulative */
- /* function for hypergeometric distribution of the form */
- /* df = c(id,iix)*c(k-id,n-iix)/c(k,n). */
-
- int id,iix,k,n;
- double *cf,*df;
-
- {
-
- int i,idx,ix,ix1,kd,kdnx,kn,n1,nx,nx1;
- double sd,sdx,fi,cd,ckd,sp,ckdlog,cklog,ck,
- skdlog,sknxlg,sklog,sknlog;
- extern double exp(),log();
-
- ix = 0;
- *cf = 0.;
- while((ix-iix) <= 0)
- {
- idx = id - ix;
- sd = 1.;
- sdx = 1.;
- ix1 = ix + 1;
-
- for(i = ix1; i <= id; i++)
- {
- fi = i;
- sd = sd * fi;
- }
-
- for(i = 1; i <= idx; i++)
- {
- fi = i;
- sdx = sdx * fi;
- }
- cd = sd / sdx;
- kd = k - id;
- nx = n - ix;
- nx1 = nx + 1;
- skdlog = 0.;
- sknxlg = 0.;
- kdnx = kd - nx;
-
- for(i = nx1; i <= kd; i++)
- {
- fi = i;
- skdlog = skdlog + log(fi);
- }
-
- for(i = 1; i <= kdnx; i++)
- {
- fi = i;
- sknxlg = sknxlg + log(fi);
- }
- ckdlog = skdlog - sknxlg;
- ckd = exp(ckdlog);
- sp = cd * ckd;
- *cf = *cf + sp;
- ix++;
- }
- sklog = 0.;
- sknlog = 0.;
- n1 = n + 1;
- kn = k - n;
- for(i = n1; i <= k; i++)
- {
- fi = i;
- sklog = sklog + log(fi);
- }
- for(i = 1; i <= kn; i++)
- {
- fi = i;
- sknlog = sknlog + log(fi);
- }
- cklog = sklog - sknlog;
- ck = exp(cklog);
- *cf = *cf / ck;
- *df = sp / ck;
- }