<?php
/****************************/
/* 二項分布の計算 */
/* coded by Y.Suganuma */
/****************************/
/**************/
/* 組合せ nCr */
/**************/
function comb($n, $r)
{
$c = 1.0;
$x = 1.0;
$y = 1.0;
if ($r > 0) {
if ($r > $n-$r)
$r = $n - $r;
for ($i1 = $n; $i1 >= $n-$r+1; $i1--)
$x *= $i1;
for ($i1 = 2; $i1 <= $r; $i1++)
$y *= $i1;
$c = $x / $y;
}
return $c;
}
/****************************************/
/* 二項分布の計算(P(X = x), P(X < x)) */
/* x : データ */
/* n,p : パラメータ */
/* pr : P(X = x) */
/* return : P(X < x) */
/****************************************/
function binomial($x, $n, $p, &$pr)
{
$f = 0.0;
$q = 1.0 - $p;
$pr = comb($n, $x) * pow($p, $x) * pow($q, $n-$x);
$f = $pr;
for ($i1 = 0; $i1 < $x; $i1++)
$f += comb($n, $i1) * pow($p, $i1) * pow($q, $n-$i1);
return $f;
}
/********/
/* main */
/********/
printf("n は? ");
fscanf(STDIN, "%d", $n);
printf("p は? ");
fscanf(STDIN, "%lf", $p);
printf("グラフ出力?(=1: yes, =0: no) ");
fscanf(STDIN, "%d", $sw);
// 密度関数と分布関数の値
if ($sw == 0) {
printf(" データは? ");
fscanf(STDIN, "%d", $x);
$f = binomial($x, $n, $p, $pr);
printf("P(X = %d) = %f, P( X < %d) = %f (n = %d, p = %f)\n", $x, $pr, $x, $f, $n, $p);
}
// グラフ出力
else {
printf(" 密度関数のファイル名は? ");
fscanf(STDIN, "%s", $file1);
printf(" 分布関数のファイル名は? ");
fscanf(STDIN, "%s", $file2);
$out1 = fopen($file1,"w");
$out2 = fopen($file2,"w");
for ($x = 0; $x <= $n; $x++) {
$f = binomial($x, $n, $p, $pr);
fwrite($out1, $x." ".$pr."\n");
fwrite($out2, $x." ".$f."\n");
}
}
?>