
var abbrechen=1==2;
var n_pz=0;
var zpn=32;
var zp=new Array(zpn+1);zp[0]=1;
for(var i=1;i<zpn+1;i++)zp[i]=zp[i-1]*2;

// Berechnet die Primzahlen von n0 bis n1, 
// Rückgabe als String mit Trennzeichen sep oder als Array, wenn sep="" oder sep=null;
// Statusmeldungen im Textfeld T

function primtab(n0,n1,sep,T)
{
	abbrechen=false;
	var i,j,k=3,l,aa,t="",bb,cc,bb0=0,s,bi,bii,biii,st;
	if(n0<3)n0=1;
	if(n1<n0)n1=n0;
	
	aa=Math.floor(Math.sqrt(n1)+1);
	if(aa<5)aa=5;
	var aaa=Math.floor(aa/10)*10;
	var a=new Array(Math.floor(aaa*0.4)+1);
	var al=a.length;
	a[0]=3;a[1]=5;a[2]=7;k=3;
//(1)
	status="(1) Fülle Array A (mögliche Primteiler): {2,3,...,"+aaa+"})";
	if(T!=null)T.value=status;
	for(j=10;j<=aaa;j+=10)
	{
		a[k++]=j+1;
		a[k++]=j+3;
		a[k++]=j+7;
		a[k++]=j+9;
	}
	al=k;

//(2)
	status="(2) Reduziere Array A";if(T!=null)T.value=status;
	for(i=0;(i<al);i++)
	{
		if(a[i]!=0)
		{
			for(j=i+1;j<al;j++)
			{
					if(a[j]>0)
					{
						if((a[j]%a[i])==0)a[j]=0;
					}
			}
		}
	}
	k=j=0;
	status="(2) Reduziere Array A - erstelle reduziertes Array";if(T!=null)T.value=status;
	for(i=0;(i<al)&&(a[i]<=aa);i++)if(a[i]!=0)j++;
	var c=new Array(j);
	for(i=0;(i<al)&&(a[i]<=aa);i++)if(a[i]!=0){c[k++]=a[i];}
	a=null;
	cc=c.length;
	
/*	status="(3) Erstelle Array B (für mögliche Primzahlen)";
	if(T!=null)T.value=status;
	n0=Math.floor(n0/2)*2+1;
	var b=new Array(Math.floor((n1-n0)/2+1));
	//for(i=0;i<b.length;i++)b[i]=0;
	j=0;

	st=status="(4) Streiche Vielfache von A in B";
	if(T!=null)T.value=status;
	for(i=0;i<cc;i++)
	{
		s=c[i]+c[i];
		k=n0-(n0%c[i]);
		if(k<n0)k+=c[i];
		if((k%2)==0)k+=c[i];
		if(k==c[i])k=c[i]+s;
		for(j=k;j<=n1;j+=s)b[Math.floor((j-n0)/2)]=1;
	}	

	bb = b.length;
	var sepp=((sep=="")||(sep==null))?" ":sep;
	status="(5) Formatiere Ausgabe";if(T!=null)T.value=status;
	j=(i-n1)/2;
	j=k=0;
	if(n0<2){bb0=1;t="2"+sepp;j=k=1;}
	for(i=bb0;(i<bb)&&(i*2+n0<=n1);i++)if((b[i]==0)||(b[i]==null))j++;
	a=new Array(j);n_pz=j;if(k==1)a[0]=2;
	for(i=bb0;i<bb;i++)
	{
		j=i*2+n0;
		if(j>n1)break;
		if((b[i]==0)||(b[i]==null))a[k++]=j;
	}
*/

	status="(3) Erstelle Array B (für mögliche Primzahlen)";
	if(T!=null)T.value=status;
	n0=Math.floor(n0/2)*2+1;
	var b=new Array(Math.floor((n1-n0)/2/zpn+1));
	for(i=0;i<b.length;i++)b[i]=0;
	j=0;

	st=status="(4) Streiche Vielfache von A in B";
	if(T!=null)T.value=status;
	for(i=0;i<cc;i++)
	{
		status=st+" - Vielfache von "+c[i];
		s=c[i]+c[i];
		k=n0-(n0%c[i]);
		if(k<n0)k+=c[i];
		if((k%2)==0)k+=c[i];
		if(k==c[i])k=c[i]+s;
		for(j=k;j<=n1;j+=s)
		{
			bi=Math.floor((j-n0)/2);bii=Math.floor(bi/zpn);biii=bi%zpn;
			b[bii]=b[bii]|zp[biii];
		}
	}	
	//alert(b);
	bb = b.length;
	var sepp=((sep=="")||(sep==null))?" ":sep;
	status="(5) Formatiere Ausgabe";if(T!=null)T.value=status;
	j=(i-n1)/2;
	j=k=0;
	if(n0<2){bb0=1;t="2"+sepp;j=k=1;}
	var bb1=bb*zpn;
	for(i=bb0;(i<bb1)&&(i*2+n0<=n1);i++)
	{
		bii=Math.floor(i/zpn);biii=i%zpn;
		if((b[bii]&zp[biii])==0){j++;/*alert(i*2+n0+"\n"+ j);*/}
	}
	a=new Array(j);n_pz=j;if(k==1)a[0]=2;
	for(i=bb0;i<bb1;i++)
	{
		j=i*2+n0;
		if(j>n1)break;
		bii=Math.floor(i/zpn);biii=i%zpn;
		if((b[bii]&zp[biii])==0)a[k++]=j;
	}

	if(a[0]==1)a[0]=2;
	status=n_pz+" Primzahl"+((n_pz==1)?"":"en")+" gefunden";
	if(T!=null)T.value=status;
	if((sep!="")&&(sep!=null))return a.join(sep);
	return a;
}	

