#include <PiTable.hpp>
#include <SegmentedPiTable.hpp>
#include <imath.hpp>
#include <stdint.h>
#include <iostream>
#include <cstdlib>
#include <random>
using namespace primecount;
void check(bool OK)
{
std::cout << " " << (OK ? "OK" : "ERROR") << "\n";
if (!OK)
std::exit(1);
}
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(9000000, 10000000);
std::uniform_int_distribution<int> dist2(1, 1000);
int64_t limit = dist(gen);
int64_t segment_size = isqrt(limit);
segment_size += 240 - segment_size % 240;
int threads = 1;
PiTable pi(limit, threads);
SegmentedPiTable segmentedPi;
int64_t i = 0;
int64_t low = 0;
int64_t high = segment_size;
segmentedPi.init(low, high);
for (; i <= 1000; i++)
{
while (high <= i)
{
low = high;
high = low + segment_size;
segmentedPi.init(low, high);
}
std::cout << "segmentedPi(" << i << ") = " << segmentedPi[i];
check(segmentedPi[i] == pi[i]);
}
for (; i < limit; i += dist2(gen))
{
while (high <= i)
{
low = high;
high = low + segment_size;
segmentedPi.init(low, high);
}
std::cout << "segmentedPi(" << i << ") = " << segmentedPi[i];
check(segmentedPi[i] == pi[i]);
}
while (high < limit)
{
low = high;
high = low + segment_size;
segmentedPi.init(low, high);
}
std::cout << "segmentedPi(" << limit-1 << ") = " << segmentedPi[limit-1];
check(segmentedPi[limit-1] == pi[limit-1]);
std::cout << std::endl;
std::cout << "All tests passed successfully!" << std::endl;
return 0;
}