static inline uint32_t ex4_sym2prob(double sym) { // sym -= .5; const long double fac = TOTALPROB - EX4_MAX_VALUE; #ifdef EX4_HISTOS double cd = 0; for(int i = EX4_MIN; i < sym; i++) cd+=ex4_histo[i]; // return (ld)TOTALPROB * cd / ex4_histo_sum; return EX4_MIN_PROB*(sym-EX4_MIN) + fac * cd / ex4_histo_sum; #elif !defined(EX4_GG) ld g = (1-EX4_BOX_MIX)*cdf(sym/gdevs[curBlock]); if (sym >= -EX4_BOX_RADIUS) { if (sym > EX4_BOX_RADIUS) g+=EX4_BOX_MIX; else g += EX4_BOX_BONUS*(sym+EX4_BOX_RADIUS); } return EX4_MIN_PROB*(sym-EX4_MIN) + fac * g; #else double alpha = alphas[curBlock], beta = betas[curBlock]; ld g = cdf(sym/EX4_GAUSS_VAR); double gg = gcdf(sym/alpha, beta); // printf("gg %Lf %Lf %f\n", sym/alpha, beta, gg); // assert(gg>=0); // printf("diff %f\n", sym-mid); double r = EX4_GAUSS_RATIO; return EX4_MIN_PROB*(sym-EX4_MIN) + fac * (r*g + (1-r)*gg); #endif }
static int lcmf2(int a, int b) { return a * b / gcdf(a,b); }
/* vx と vy の最大公約数を返す(vx >= vy) */ int gcdf(int vx, int vy) { return (vy == 0)? vx: gcdf(vy, vx % vy); }
static int gcdf(int a, int b) { if (b==0) return a; return gcdf(b, a % b); }
/* va と vb の最大公約数を求める */ int gcd(int va, int vb) { return (va > vb)? gcdf(va, vb): gcdf(vb, va); }