Sto provando a risolvere per diletto i problemi proposti da Project Euler in Java e mi sono fermato al problema numero 3 che dice:
The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143 ?
Io ho risolto il problema, ma dicono espressamente che il problema dev'essere risolto in al massimo un minuto di computazione. Io ho risolto il problema con un escamotage, facendo un break appena individuo il maggior numero primo dato che parto dal numero più alto e scendo, ma se non ci fosse il break la computazione andrebbe avanti per non so quanto tempo.
Qualcuno sa come si possono individuare i numeri primi in maniera più efficiente?
Vi posto il testo del programmino che ho fatto:
A me pare che abbia complessità n^2. Si può scendere oltre tale complessità?codice:String problema3(){ static long numero = 600851475143L; //il più grande fattore di numero sarà sicuramente inferiore alla sua metà long max_possible_factor = numero / 2; long max_prime = 0; for(int i = 2; i < max_possible_factor; i++){ long reminder = numero % i; long factor = numero / i; //se il numero individuato ha resto 0, è primo ed è più grande di tutti gli //altri numeri primi, allora diventerà il nuovo max_prime if((reminder == 0) && isPrime(factor) && (factor > max_prime)){ max_prime = factor; break; } } return "Il più grande numero primo che fattorizza "+numero+" è "+max_prime; } protected boolean isPrime(long num){ //Il numero piu' alto per cui ha senso dividere (se si parte da 2) e' //la radice quadrata del numero che stiamo testando. int posMax = (int)Math.ceil(Math.sqrt(num + 1)); //individuo i possibili divisori for(int divisor = 2; divisor <= posMax; divisor++) if (num % divisor == 0) return false; // se non ha divisori è un numero primo. return true; }