57 lines
1.9 KiB
C++
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;
|
|
|
|
};
|
|
} |