Hallo, ich hab ein problem, ich brauche sehr viele primzahlen, hab den aktin implimentiert und die klasse smallboolean geschreiben, da ich sonst speicherprobleme hatte ... nun geht alles gut, bis ich ne gewisse anzahl hab, dann kommen fehler rein (zahlen, die keine primzahlen sind).
Atkin:
SmallBoolean:
Hoffe jemand findet den fehler
Atkin:
Java:
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class Atkin
{
private ArrayList<Long> primes;
private long limit;
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
protected boolean tmp;
public Atkin(long limit)
{
this.limit = limit;
primes = new ArrayList<Long>();
System.out.println("Startzeit: " + sdf.format(new Date()));
FindPrimes();
}
public ArrayList<Long> getPrimes(){
return primes;
}
private void FindPrimes()
{
SmallBoolean isPrime = new SmallBoolean((limit +1));
double sqrt = Math.sqrt(limit);
for (long x = 1; x <= sqrt; x++){
for (long y = 1; y <= sqrt; y++)
{
int n = (int) (4 * x * x + y * y);
if (n <= limit && (n % 12 == 1 || n % 12 == 5)){
tmp = isPrime.get(n)^true;
isPrime.set(n, tmp);
}
n = (int) (3 * x * x + y * y);
if (n <= limit && n % 12 == 7){
tmp = isPrime.get(n)^true;
isPrime.set(n, tmp);
}
n = (int) (3 * x * x - y * y);
if (x > y && n <= limit && n % 12 == 11){
tmp = isPrime.get(n)^true;
isPrime.set(n, tmp);
}
}
}
for (long n = 5; n <= sqrt; n++)
if (isPrime.get(n))
{
int s = (int) (n * n);
for (long k = s; k <= limit; k += s)
isPrime.set(k, false);
}
primes.add((long)2);
primes.add((long)3);
for (long n = 5; n <= limit; n++)
if (isPrime.get(n)){
primes.add(n);
}
}
public static void main(String[] args) {
new Atkin(10000000);
}
}
SmallBoolean:
Java:
public class SmallBoolean {
int[] puffer;
SmallBoolean(long limit){
int kit=0;
if(limit <32){
kit = 1;
}else if((limit%32) == 0){
kit = (int)limit/32;
}else if((limit%32)>0){
kit = (int) (limit/32)+1;
}else{
System.out.println("Inizialisierung fehlgeschlagen: "+limit+" => "+(limit%32));
}
puffer = new int[kit];
}
public boolean get(long pos){
int kit=0;
if(pos <32){
kit = 0;
}else if((pos%32) == 0){
kit = (int)pos/32;
kit--;
}else if((pos%32)>0){
kit = (int) (pos/32)+1;
kit--;
}else{
System.out.println("Ungültige get-Position: "+pos+" => "+(pos%32));
}
int getter = (puffer[kit] >> (pos % 32))&1;
//System.out.println(getter+" gefragete Possition: "+pos%32+" Wert: "+puffer[kit]);
if( getter == 1){
return true;
}else{
return false;
}
}
public void set(long pos, boolean status){
int kit=0;
if(pos <32){
kit = 0;
}else if((pos%32) == 0){
kit = (int)pos/32;
kit--;
}else if((pos%32)>0){
kit = (int) (pos/32)+1;
kit--;
}else{
System.out.println("Ungültige set-Position: "+pos+" => "+(pos%32));
}
//System.out.println(puffer[kit]);
int setter = (puffer[kit] >> (pos % 32))&1;
//System.out.println(setter+" "+status+" gefragete Possition: "+pos%32+" Wert: "+puffer[kit]);
if(!status && setter ==1) {
// 0
puffer[kit] = puffer[kit] & ~(1 << (pos % 32));
} else if(status) {
// 1
puffer[kit] = puffer[kit] | (1 << (pos % 32));
}
//System.out.println(puffer[kit] & (1 << (pos % 32)));
}
}
Hoffe jemand findet den fehler