Ja też ostatnio bawię się kryptografią i ja sprawdzam po prostu testem millera rabina i wynik dostaje natychmiast, a nie po 5 czy 10 sek. Nie wiem po co robisz te wstępne sprawdzania, wystarczy, że dasz odpowiednią liczbę testów millera-rabina i prawdopodobieństwo będzie równe 0,999999... a no i pytanie czy test millera rabina zrobiles zgodnie ze sztuka
Jak długie liczby pierwsze sprawdzasz? :)
Zauważ że te 5,10 sek trwa cały proces generowania losowej liczby pierwszej. Czyli średnio, dopiero po sprawdzeniu około 100-200 liczb 300-cyfrowych.
Jeśli robisz dokładnie co opisałem wyżej to czy mógłbyś się podzielić szczegółami? :) Będę wdzięczny za każdą wskazówkę :)
Tutaj mój algorytm w C++
bool testMillerRabin(const BigInt &liczba, size_t iloscCyfr, int k = 3)
{
BigInt s, d, a, x;
d = liczba - 1;
s.SetZero();
//zalaczamy maszyne losujaca - zwolnienie blokady :)
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distro_short(2, iloscCyfr);
int randomNumber = 0;
while ((d % 2).IsZero())
{
s.AddOne();
d.Div(two);
}
for (int i = 1; i <= k; i++)
{
randomNumber = distro_short(gen);
losujLiczbe(a, (iloscCyfr - 1));
GetPowerMod(a, d, liczba,x);
if (x.CmpEqual(1) || x.CmpEqual(liczba - 1)) continue;
for (BigInt j = 1; (j.CmpSmaller(s) && (x != (liczba - 1))); j++)
{
GetPowerMod(x, two, liczba,x);
if (x.CmpEqual(1)) return false;
}
if (x != (liczba - 1)) return false;
}
return true;
}