@Landei , auf den ersten Blick performancetechnisch unterirdisch.
Wenn man aber Set und List jeweils in ein boolean[] tauscht, dann sieht es wieder ganz anders aus.
Ca. 33% Performanter als das letzte von CyborgBeta.
Hier die Version mit dem boolean array.
boolean[] crossed = new boolean[upperBound];
boolean[] primes = new boolean[upperBound];
if (upperBound < 2) return primes;
primes[2]=true;
if (upperBound < 3) return primes;
primes[3]=true;
if (upperBound < 5) return primes;
primes[5]=true;
if (upperBound < 7) return primes;
primes[7]=true;
for (int p = 11; p <= upperBound; p += 2) {
if (p % 3 > 0 && p % 5 > 0 && p % 7 > 0 && !crossed[p]) {
primes[p]=true;
if (p < 46340) { //int - Überlauf bei Multiplikation verhindern
for (int k = p * p; k < upperBound; k += 2 * p) {
crossed[k]=true;
}
}
}
}
return primes;
}```