rng/randomness_tests/frequency_block.cpp
2025-07-07 10:27:51 +01:00

52 lines
1.5 KiB
C++

//
// frequency_monobit.cpp
// rng
//
// Created by Asher Falcon on 21/06/2025.
//
#include "../rng.h"
#include "../math/incomplete_gamma.h"
#include "./frequency_block.h"
#include "./rngtest.h"
namespace splat {
frequency_block_test::frequency_block_test(std::vector<std::bitset<32>> &testData) : RNGTEST(testData) {
block_size = data.size() * 32 / 150;
testPValue = runTest(data);
testPassed = testPValue > 0.01;
}
double frequency_block_test::runTest(std::vector<std::bitset<32>> &data) {
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;
}
std::string frequency_block_test::getName() {
return std::format("Frequency Block [{}]", block_size);
}
}