#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>

#define MAX_CISLO 100000000 // Hľadáme do 100 miliónov
#define MAX_GAP 500         // Maximálna veľkosť medzery, ktorú sledujeme

int main() {
    // Pole, kde index je veľkosť medzery a hodnota je počet výskytov
    long long int statistika[MAX_GAP] = {0};
    
    printf("Analyzujem medzery pomocou %d jadier...\n", omp_get_max_threads());

    // Musíme hľadať sekvenčne alebo v blokoch, aby sme vedeli určiť "predchádzajúce" prvočíslo
    // Pre štatistiku medzier je najlepšie nájsť prvočísla a porovnať susedov
    
    long long int posledne_prvocislo = 2;

    for (long long int n = 3; n <= MAX_CISLO; n += 2) {
        int je_prvo = 1;
        long long int odmocnina = (long long int)sqrt(n);
        
        // Tento vnútorný cyklus môžeme paralelizovať (ak je n dostatočne veľké)
        // Ale pre štatistiku medzier je lepšie použiť paralelizáciu na úrovni blokov
        for (long long int i = 3; i <= odmocnina; i += 2) {
            if (n % i == 0) {
                je_prvo = 0;
                break;
            }
        }

        if (je_prvo) {
            long long int medzera = n - posledne_prvocislo;
            if (medzera < MAX_GAP) {
                statistika[medzera]++;
            }
            posledne_prvocislo = n;
        }
        
        if (n % 1000000 == 1) printf("Spracované: %lld %%\r", (n*100)/MAX_CISLO);
    }

    // Uloženie výsledkov do súboru
    FILE *f = fopen("statistika_medzier.txt", "w");
    printf("\n\nVYSLEDKY:\n------------------\n");
    for (int g = 2; g < MAX_GAP; g += 2) {
        if (statistika[g] > 0) {
            printf("Medzera %d: %lldx\n", g, statistika[g]);
            fprintf(f, "%d;%lld\n", g, statistika[g]);
        }
    }
    fclose(f);

    return 0;
}
