#include <cstdlib>
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
int seqToIndex(vector<double>::iterator it, int r, int d)
{
int index = 0;
for(int i = 0; i < d; ++i)
{
int index_i = int(*it * r);
index += index_i * pow(r, i);
++it;
}
return index;
}
double chi2(const vector<int>& freqTable, int N, int s, int d)
{
double ans = 0;
double temp = double(N) / double(s * d);
for(int i = 0; i < s; ++i)
ans += pow(freqTable [i] - temp, 2);
ans /= temp;
return ans;
}
double P(double calc_chi2, double s)
{
double l = s - 1.0;
int N = 1000;
double h = calc_chi2 / N;
double intSum = 0.0;
auto f = [] (double x) { return pow(x, l / 2.0 - 1.0) * exp(-x / 2.0); };
for(int i = 1; i < N - 1; i += 2)
intSum += f((i - 1) * h) + 4 * f(i * h) + f((i + 1) * h);
intSum *= h / 3.0;
double ans = (1.0 - intSum) / (pow(2.0, l / 2.0) * tgamma(l / 2.0));
return ans;
}
int main()
{
int r = 4;
int d = 6;
int s = pow(r, d);
int N = d * 1000000;
vector<double> alpha;
vector<int> freqTable(s, 0);
srand(42);
for(int i = 0; i < N; ++i)
{
double a = double(rand()) / double(RAND_MAX);
alpha.push_back(a);
}
int i = 0;
while(i < N)
{
int index = seqToIndex(alpha.begin() + i, r, d);
++freqTable [index];
i += d;
}
double calc_chi2 = chi2(freqTable, N, s, d);
cout << calc_chi2 << endl;
cout << P(calc_chi2, s) << endl;
return 0;
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjbWF0aD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IHNlcVRvSW5kZXgodmVjdG9yPGRvdWJsZT46Oml0ZXJhdG9yIGl0LCBpbnQgciwgaW50IGQpCnsKICAgIGludCBpbmRleCA9IDA7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgZDsgKytpKQogICAgewogICAgICAgIGludCBpbmRleF9pID0gaW50KCppdCAqIHIpOwogICAgICAgIGluZGV4ICs9IGluZGV4X2kgKiBwb3cociwgaSk7CiAgICAgICAgKytpdDsKICAgIH0KICAgIHJldHVybiBpbmRleDsKfQoKZG91YmxlIGNoaTIoY29uc3QgdmVjdG9yPGludD4mIGZyZXFUYWJsZSwgaW50IE4sIGludCBzLCBpbnQgZCkKewogICAgZG91YmxlIGFucyA9IDA7CiAgICBkb3VibGUgdGVtcCA9IGRvdWJsZShOKSAvIGRvdWJsZShzICogZCk7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgczsgKytpKQogICAgICAgIGFucyArPSBwb3coZnJlcVRhYmxlIFtpXSAtIHRlbXAsIDIpOwogICAgYW5zIC89IHRlbXA7CiAgICByZXR1cm4gYW5zOwp9Cgpkb3VibGUgUChkb3VibGUgY2FsY19jaGkyLCBkb3VibGUgcykKewogICAgZG91YmxlIGwgPSBzIC0gMS4wOwogICAgaW50IE4gPSAxMDAwOwogICAgZG91YmxlIGggPSBjYWxjX2NoaTIgLyBOOwogICAgZG91YmxlIGludFN1bSA9IDAuMDsKICAgIGF1dG8gZiA9IFtdIChkb3VibGUgeCkgeyByZXR1cm4gcG93KHgsIGwgLyAyLjAgLSAxLjApICogZXhwKC14IC8gMi4wKTsgfTsKICAgIGZvcihpbnQgaSA9IDE7IGkgPCBOIC0gMTsgaSArPSAyKQogICAgICAgIGludFN1bSArPSBmKChpIC0gMSkgKiBoKSArIDQgKiBmKGkgKiBoKSArIGYoKGkgKyAxKSAqIGgpOwogICAgaW50U3VtICo9IGggLyAzLjA7CiAgICBkb3VibGUgYW5zID0gKDEuMCAtIGludFN1bSkgLyAocG93KDIuMCwgbCAvIDIuMCkgKiB0Z2FtbWEobCAvIDIuMCkpOwogICAgcmV0dXJuIGFuczsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgciA9IDQ7CiAgICBpbnQgZCA9IDY7CiAgICBpbnQgcyA9IHBvdyhyLCBkKTsKICAgIGludCBOID0gZCAqIDEwMDAwMDA7CiAgICB2ZWN0b3I8ZG91YmxlPiBhbHBoYTsKICAgIHZlY3RvcjxpbnQ+IGZyZXFUYWJsZShzLCAwKTsKICAgIHNyYW5kKDQyKTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBOOyArK2kpCiAgICB7CiAgICAgICAgZG91YmxlIGEgPSBkb3VibGUocmFuZCgpKSAvIGRvdWJsZShSQU5EX01BWCk7CiAgICAgICAgYWxwaGEucHVzaF9iYWNrKGEpOwogICAgfQogICAgaW50IGkgPSAwOwogICAgd2hpbGUoaSA8IE4pCiAgICB7CiAgICAgICAgaW50IGluZGV4ID0gc2VxVG9JbmRleChhbHBoYS5iZWdpbigpICsgaSwgciwgZCk7CiAgICAgICAgKytmcmVxVGFibGUgW2luZGV4XTsKICAgICAgICBpICs9IGQ7CiAgICB9CiAgICBkb3VibGUgY2FsY19jaGkyID0gY2hpMihmcmVxVGFibGUsIE4sIHMsIGQpOwogICAgY291dCA8PCBjYWxjX2NoaTIgPDwgZW5kbDsKICAgIGNvdXQgPDwgUChjYWxjX2NoaTIsIHMpIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==
prog.cpp: In lambda function:
prog.cpp:35:44: error: 'l' is not captured
auto f = [] (double x) { return pow(x, l / 2.0 - 1.0) * exp(-x / 2.0); };
^
prog.cpp: In function 'double P(double, double)':
prog.cpp:37:47: error: invalid operands of types 'int' and 'void' to binary 'operator*'
intSum += f((i - 1) * h) + 4 * f(i * h) + f((i + 1) * h);
^