Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    Problema determinazione numero primo LargeInteger

    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:

    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;
    }
    Ho testato il metodo sopra scritto così facendo:
    codice:
    LargeInteger temp = new LargeInteger ("2");
    while (true) {
    	if (isProbablePrime (temp))
    		System.out.println (temp);
    	temp = temp.add (uno);
    }
    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?

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Ho risolto , grazie al caro debug , cambiando la riga
    codice:
    LargeInteger half = li.divide (2) [0];
    con
    codice:
    LargeInteger half = li.divide (due) [0];
    dove "due" è
    codice:
    LargeInteger due = new LargeInteger ("2");
    evidentemente ho scovato un bug della libreria poichè lasciando come era prima mi dava , ad esempio 101/2 = 5000


  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Non so se usare quella libreria sia una buona idea..

    Dal sito che hai linkato leggo questo:
    Important Note: The software posted on this page is for demonstration purposes only. Although the author is unaware of any bugs, the software has undergone very little testing. In particular, the algorithms performing aribitrary-precision arithmetic in the LargeInteger class are quite complicated, and hence error-prone.
    Non so, non la userei in produzione
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.