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;
    }
}