----- 17/03/19 ----- > Volevo chiedere un chiarimento su questo codice caricato online: // Test di primalita' public static boolean isPrime( int n ) { // n >= 2 if ( n % 2 == 0 ) { return ( n == 2 ); } for ( int p = 3; p*p <= n; p = p+2 ) { if ( n % p == 0 ) { return false; }} return true; } > Un dubbio riguarda il valore dell'espressione restituita dal primo return; > Inoltre come si devono interpretare le condizioni p*p <= n e p = p+2 ? ----- Il programma per il test di primalita', nella forma pubblicata, e' il risultato di una serie di trasformazioni a partire da una versione piu' semplice. In sintesi, la condizione del primo "if" verifica se l'argomento e' pari, nel qual caso solo il valore 2 e' primo. Quindi viene restituito il valore booleano del confronto di n con 2 (e il "return" conclude l'esecuzione della procedura). Se invece la condizione del primo "if" non e' verificata, si procede con l'iterazione "for", che cerca un divisore p di n fra i numeri dispari (a partire da 3 e procedendo con passo 2). Se a un certo punto si individua un valore di p che divide n, allora n non e' primo e l'esecuzione della procedura si conclude restituendo "false". Altrimenti, se un divisore di n non viene trovato, alla fine si restituisce "true". Resta da capire perche' il "for" si conclude quando p*p > n e non quando p > n. Il punto e' che per ogni divisore p di n, ci deve essere anche un divisore q tale che n = pq. Ora, se p*p > n, allora il corrispondente q e' necessariamente minore di p e dovrebbe essere gia' stato trovato in un passo precedente, per cui e' inutile procedere oltre. ----- * -----