ho modificato un po' il codice velocizzandolo circa di 10 volte! però non è abbastanza: per fare tutto il processo ci metterebbe più di 2 settimane. forse anche 4, non so quanto tanto rallenta aumentando il numero.
Ho provato anche a trascrivere il tutto in C, ma è addirittura più lento di java!
codice:public class e521v2{ public static void main(String[] args){ int[] primi=new int[664579]; primi[0]=2; primi[1]=3; int y=2; long tot=500000000000L; for(int i=3;i<10000000;i+=2){ if(isPrimeint(i)) primi[y++]=i; } for(int n=3;n<=Integer.MAX_VALUE-1;n+=2){ boolean flag=true; if(isPrimeint(n)){ tot+=n; continue; } else{ for(int i=0;i<primi.length;i++){ if(n%primi[i]==0){ flag=false; tot+=primi[i]; break; } } if(flag) tot+=smpfint(n); } } for(long n=Integer.MAX_VALUE+1;n<=1000000000000L;n+=2){ boolean flag=true; if(isPrime(n)){ tot+=n; continue; } else{ for(int i=0;i<primi.length;i++){ if(n%primi[i]==0){ flag=false; tot+=primi[i]; break; } } if(flag) tot+=smpf(n); } } tot=tot%1000000000L; System.out.print(tot); } private static boolean isPrimeint(int n) { if(n%3 == 0) return false; int sqrtN = (int)Math.sqrt(n)+1; for(int i = 6; i <= sqrtN; i += 6) { if(n%(i-1) == 0 || n%(i+1) == 0) return false; } return true; } private static boolean isPrime(long n) { if(n%3 == 0) return false; long sqrtN = (long)Math.sqrt(n)+1; for(long i = 6L; i <= sqrtN; i += 6) { if(n%(i-1) == 0 || n%(i+1) == 0) return false; } return true; } private static int smpfint(int i){ //System.out.println(i); int p=99995; boolean f=true; int sqrtI=(int)Math.sqrt(i)+1; while(p<sqrtI){ if(isPrimeint(p)){ if(i%p==0){ return p; } } if(f) {p=p+2;} else{ p=p+4;} f=!f; } return i; } private static long smpf(long i){ //System.out.println(i); boolean f=true; long p=99995; long sqrtI=(long)Math.sqrt(i)+1; while(p<sqrtI){ if(isPrime(p)){ if(i%p==0){ return p; } } if(f) p+=2; else p+=4; f=!f; } return i; } }

Rispondi quotando