Sto usando la libreria "EDU.ksu.cis" (non so in che altro modo definirla , è reperibile qui ) , in particolare la sua classe LargeInteger per alcune operazioni su numeri MOLTO grandi.
Probabilmente vi chiederete perchè non usi le librerie standard (BigInteger) e la risposta è che la classe BigInteger è lentissima a confronto..basti pensare che per la sola determinazione del numero 2^57885161 - 1 i tempi di calcolo sono rispettivamente di 1395 s (BigInteger) vs 70 s (LargeInteger) ..ovviamente parlo del test effettuato sul mio pc (i7 2.4/3.4 GHz).
Sfortunatamente la libreria che sto usando non ha un metodo per determinare se un numero è primo o no , ho deciso così di implementarlo da me..il metodo da me scritto è il seguente:
Ho testato il metodo sopra scritto così facendo:codice:public static boolean isProbablePrime (LargeInteger li) { if (li.compareTo (uno) < 1) return false; if (li.compareTo (due) == 0) return true; if (li.divide (due) [1].compareTo (zero) == 0) return false; LargeInteger temp = new LargeInteger ("3"); LargeInteger half = li.divide (2) [0]; while (temp.compareTo (half) <= 0) { if (li.divide (temp) [1].compareTo (zero) == 0) return false; temp = temp.add (due); } return true; }
E guardando i numeri primi stampati ho notato una stranezza..fino a 97 vengono stampati i numeri primi correttamente , dopo 97 mi stampa 201 (che non è un numero primo e inoltre salta tutti i numeri primi tra 97 e 201)..perchè avviene ciò?Come posso rimediare?codice:LargeInteger temp = new LargeInteger ("2"); while (true) { if (isProbablePrime (temp)) System.out.println (temp); temp = temp.add (uno); }

Rispondi quotando
