static real ChiSquare(creal x, cint df) { real y; if( df <= 0 ) return -999; if( x <= 0 ) return 0; if( x > 1000*df ) return 1; if( df > 1000 ) { if( x < 2 ) return 0; y = 2./(9*df); y = (powx(x/df, 1/3.) - (1 - y))/sqrtx(y); if( y > 5 ) return 1; if( y < -18.8055 ) return 0; return Normal(y); } y = .5*x; if( df & 1 ) { creal sqrty = sqrtx(y); real h = Erf(sqrty); count i; if( df == 1 ) return h; y = sqrty*expx(-y)/.8862269254527579825931; for( i = 3; i < df; i += 2 ) { h -= y; y *= x/i; } y = h - y; } else { real term = expx(-y), sum = term; count i; for( i = 1; i < df/2; ++i ) sum += term *= y/i; y = 1 - sum; } return Max(0., y); }
float init (int x, int y) { int x1 = identity (identity (identity (identity (x)))); int y1 = identity (identity (identity (identity (y)))); int x2 = expx (x1, 2); int y2 = expx (y1, 2); return (x2 + y2); }