Dopo aver cercato un algoritmo di primr veloce, mi sono imbattuto in questo:
public static boolean isP(long n) {
if (n==2 || n==3) return true;
if ((n&0x1)==0 || n%3==0 || n<2) return false;
long root=(long)Math.sqrt(n)+1L;
// we check just numbers of the form 6*k+1 and 6*k-1
for (long k=6;k<=root;k+=6) {
if (n%(k-1)==0) return false;
if (n%(k+1)==0) return false;
}
return true;
}
Le mie domande sono:
- Perché viene utilizzato da tempo ovunque anziché in int? Perché con un tipo lungo l'argomento potrebbe essere molto più grande di Integer.MAX rendendo così il metodo più flessibile?
- Nel secondo 'if', n & 0x1 è uguale a n% 2? Se è così, perché l'autore non ha usato n% 2? Per me è più leggibile.
- La linea che imposta la variabile 'root', perché aggiungere la 1L?
- Qual è la complessità del tempo di esecuzione? È O (sqrt (n / 6)) o O (sqrt (n) / 6)? O dovremmo semplicemente dire O (n)?