rng/randomness_tests/frequency_block.cpp
2025-07-06 17:13:58 +01:00

57 lines
1.9 KiB
C++

//
// frequency_monobit.cpp
// rng
//
// Created by Asher Falcon on 21/06/2025.
//
#include "../rng.h"
#include "../math/incomplete_gamma.cpp"
#include "./rngtest.h"
namespace splat {
class frequency_block_test : public RNGTEST {
public:
frequency_block_test(std::vector<std::bitset<32>> &testData) : RNGTEST(testData) {
block_size = data.size() * 32 / 150;
testPValue = runTest(data);
testPassed = testPValue > 0.01;
}
std::string getName() override {
return std::format("Frequency Block [{}]", block_size);
}
double runTest(std::vector<std::bitset<32>> &data) override {
// std::cout << "DEBUG: "<<data.size() << "\n";
long long bitcount = data.size() * 32;
long long chunks = bitcount / block_size;
double x2stat = 0;
for(int chunkIndex = 0; chunkIndex < chunks; chunkIndex++){
// std::cout << "NEWCHUNK: ";
double onecount = 0;
for(int i=0; i<block_size; i++){
int dataIndex = (((chunkIndex * block_size)+i) / 32);
int bitIndex = (((chunkIndex * block_size)+i) % 32);
onecount += data[dataIndex][bitIndex];
// std::cout << data[dataIndex][bitIndex];
}
double oneproportion = onecount / (double)block_size;
x2stat += 4*block_size*std::pow((oneproportion - 0.5),2);
// std::cout << "\n";
}
// std::cout << "[debug] calling igamc with "<<(chunks/2) <<','<<(x2stat/2) << "\n";
double p = igam(chunks/2, x2stat/2);
return p;
}
private:
long long block_size;
};
}