Pozri si nieco o malej Fermatovej vete. Plati ze ak a jelubovolne cele (nezaporne) cislo a p je prvocislo => a^(p-1) == 1 (mod p). Cize zapis pre javistu Math.pow(a, (p-1))%p == 1. Metoda podobna tejto sa v dnesnej dobe pouziva v RSA. Pozor na ten znak implikacie, to neplati opacne, ze ak ti z najkych takto zadanych cisel vyde 1 tak p je prvocislo. Prikl. a=1; p=4; 1^3 =1; 1%4=1 ale vieme ze p urcite nieje prvocislo. Cize je vyhodne to vypocitat pre viacero roznych a. A aby to fungovalo ako tak effektivne, je dobre za kazdym umocnennim urobit modulo (toto cele ma nieco docinenia z cyklickymy konecnymi grupami). Takto by som to riesil ja:
public int powMod(int a, int p) {
int out = 1;
int exp = p-1;
for(int k=0; k<32;k ++) {
if (exp %2 ==1 ) {
out = (out * a)%p;
}
exp= exp>>1; // exp/2
a = (a*a)%p; // umocnenie priamo z modulovanim
// inak by si dostal velke cisla
}
return out;
}
Inak som si vsimol ze ak zajdes do BigInteger classu taketo veci tam priamo su. A je tam aj metoda isProbablyPrime, ktora bude zrejem fungovat na tomto principe. Dokonca je tam aj metoda powMod() co som do pisania tejto metody nevedel :D.