52 lines
1.5 KiB
C++
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);
|
|
}
|
|
}
|