
var trichtig="",richtig=new Array(3);Richtig=new Array();
var pz=new Array(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97);
var eingabestil='style="border-width:1;border-color:#FFFFFF;border-style:solid;text-align:center;font-family:Verdana"';
var zw=new Array('keins','eins','zwei','drei','vier','fünf','sechs','sieben','acht','neun','zehn','elf','zwölf','dreizehn','vierzehn','fünfzehn','sechszehn','siebzehn','achtzehn','neunzehn','zwanzig');
var zuletzt0,zuletzt1,zuletzt2,zuletzt3,zuletzt4,zuletzt5,zuletzt6;
var az=0,ngz=0,level=4;

function pfz(a)
{
	var i,pf=new Array();
	for(i=0;i<pz.length;i++)while((a%pz[i])==0){pf[pf.length]=pz[i];a/=pz[i];}
	if(a!=1)pf[pf.length]=a;
	return pf;
}
function ggt(a,b)
{
	a=Math.abs(a);b=Math.abs(b);
	if(a*b==0)return Math.max(a,b);
	if(isNaN(a)||isNaN(b))return 1;
	var r;while(r!=0){r=a%b;a=b;b=r;}
	return a;
}
function kgv(a,b){return a*b/ggt(a,b);}
function zz(min,max){if(max<min)max=min;return Math.floor(Math.random()*(max-min+1)+min);}
function wahrfalsch(n){return '<nobr><input type="radio" name="'+n+'" value="wahr"> wahr&nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="'+n+'" value="falsch"> falsch</nobr>';}
function eingabe(s,id,linksb){var t='<input type="text" size="'+s+'" name="'+id+'" '+eingabestil+'">';if(linksb)t=t.replace(/center/,"left");return t;}
function teilermenge(n){var i,t=new Array();for(i=1;i<=n/2;i++)if((n%i)==0)t[t.length]=i;t[t.length]=n;return t;}
function vielfache(a,n){var i,t=new Array(n);for(i=1;i<=n;i++)t[i-1]=a*i;return t;}
function prim(n){for(i=0;i<pz.length;i++){if(n==pz[i])return true;}return false;}
function primteiler(n){var i,t=new Array();for(i=0;i<pz.length;i++)if((n%pz[i])==0)t[t.length]=pz[i];return t;}
function fette(a,n){var i;for(i=0;i<a.length;i++)if(a[i]==n)a[i]="<b>"+a[i]+"</b>";return a;}
function incipias()
{
	az=0;Richtig=new Array();
	aufgaben1(10,10);
	aufgaben2(10,100);
	aufgaben3(10,25);
	aufgaben4(10,100);
	aufgaben5(10,100);
	aufgaben6(10,100);
	aussagen1(10,0.5,10);
	
}
function prot(z,r,f){Richtig[z]=new Array(f,r[0],r[1],r[2]);}
function aussagen1(n,p,m)
{
	var i,t="<table border=0 cellpadding=8>\n";
	for(i=0;i<n;i++)
	{
		t+="<tr><td>"+aussage1(Math.random()<p,m)+"</td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+wahrfalsch("ant"+az)+"</td>";
		t+="<td><span id='loes"+az+"'></span></td></tr>\n";	
		prot(az,richtig,"ant"+az);az++;
	}
	return t+"</table>";
}
function aufgaben1(n,m)
{
	var i,t="<table border=0 cellpadding=5>\n";
	for(i=0;i<n;i++)
	{
		t+="<tr><td>"+aufgabe1(m,"ant"+az)+"</td><td><span id='loes"+az+"'></span></td></tr>\n";
		prot(az,richtig,"ant"+az);az++;
	}
	return t+"</table>";
}
function aufgaben2(n,m)
{
	var i,t="<table border=0 cellpadding=5>\n",a=new Array();
	for(i=0;i<n;i++)
	{
		t+="<tr><td>"+aufgabe2(m*(i+1+n)/(n+n),"ant"+az,a)+"</td><td><span id='loes"+az+"'></span></td></tr>\n";
		a[a.length]=richtig[1];
		prot(az,richtig,"ant"+az);az++;
	}
	return t+"</table>";
}
function aufgaben3(n,m)
{
	var i,t="<table border=0 cellpadding=5>\n",a=new Array();
	for(i=0;i<n;i++)
	{
		t+="<tr><td>"+aufgabe3(m*(i+1+n)/(n+n),"ant"+az,a)+"</td><td><span id='loes"+az+"'></span></td></tr>\n";
		a[a.length]=richtig[1];
		prot(az,richtig,"ant"+az);az++;
	}
	return t+"</table>";
}
function aufgaben4(n,m)
{
	var i,t="<table border=0 cellpadding=5>\n",a=new Array();
	for(i=0;i<n;i++)
	{
		t+="<tr><td>"+aufgabe4(m*(i+1+n)/(2*n),"ant"+az,a)+"</td><td><span id='loes"+az+"'></span></td></tr>\n";
		a[a.length]=richtig[1];
		prot(az,richtig,"ant"+az);az++;
	}
	return t+"</table>";
}
function aufgaben5(n,m)
{
	var i,t="<table border=0 cellpadding=5>\n",a=new Array();
	for(i=0;i<n;i++)
	{
		t+="<tr><td>"+aufgabe5(m*(i+n+1)/(2*n),"ant"+az)+"</td><td><span id='loes"+az+"'></span></td></tr>\n";
		prot(az,richtig,"ant"+az);az++;
	}
	return t+"</table>";
}
function aufgaben6(n,m)
{
	var i,t="<table border=0 cellpadding=5>\n",a=new Array();
	for(i=0;i<n;i++)
	{
		t+="<tr><td>"+aufgabe6(m*(i+n+1)/(2*n),"ant"+az)+"</td><td><span id='loes"+az+"'></span></td></tr>\n";
		prot(az,richtig,"ant"+az);az++;
	}
	return t+"</table>";
}

function aussage1(w,m)
{
	if(Math.random()<level*.8)return aussage1a(w,m);
	var a,b,t,c,r,u;
	do{
	a=zz(1,m);b=zz(1,m);t="";c=zz(0,4);r=new Array(1,w,"");u=1==0;
	richtig[0]=0;richtig[1]=w;richtig[2]="";
	if(w)b*=a;else{if((Math.random()>.6)&&(b!=1)){a*=b;u=true;}else{if(a==1)a=3;b=a*b+zz(1,a-1);}}
	switch(c)
	{
		case 0:t=a+" ist ein Teiler von "+b+".";
			richtig[2]=w?"":(u?b+" ist ein Teiler von "+a+", bzw.: "+b+" ist ein <i>Vielfaches</i> von "+a+".":t.replace(/ein/,"kein"));
			break;
		case 1:t=String(b)+" ist ein Vielfaches von "+a+".";
			richtig[2]=w?"":(u?a+" ist ein Vielfaches von "+b+", bzw.: "+b+" ist ein <i>Teiler</i> von "+a+".":t.replace(/ein/,"kein"));
			break;
		case 2:t=a+" teilt "+b+".";
			richtig[2]=w?"":(u?b+" teilt "+a+".":t.replace(/\./," <i>nicht</i>."));
			break;
		case 3:t=a+" <big>|</big> "+b;
			richtig[2]=w?"":(u?b+" <big>|</big> "+a:a+" <big><s>|</s></big> "+b);
			break;
		case 4:if(w){do{a=pz[zz(0,pz.length-1)];}while(a>m);}else {do{a=zz(1,m)}while(prim(a));}
			t=a+" ist eine Primzahl.";if(!w)richtig[2]="Die Teiler von "+a+" sind <big>{</big>"+teilermenge(a)+"<big>}</big>.";
			if(a==1)richtig[2]="1 ist keine Primzahl, weil sonst die Primfaktorzerlegungen nicht eindeutig wären."; 
	}
	}while(zuletzt0.indexOf(t)>-1);
	zuletzt0+=t+"\n";
	if(w)richtig[2]=t+" (Die Aussage ist wahr!)";
	return "<nobr>"+t+"</nobr>";
}

function aussage1a(w,m)
{
	var a,b,t,c,u,bb;
	do{
	a=zz(1,m);b=zz(1,m);t="";c=zz(0,4);u=1==0;bb=a*b;
	richtig[0]=0;richtig[1]=w;richtig[2]="";
	if(!w)b*=a;else{if((Math.random()>.6)&&(b!=1)){a*=b;u=true;}else{if(a==1)a=3;b=a*b+zz(1,a-1);}}
	switch(c)
	{
		case 0:t=a+" ist <i>kein</i> Teiler von "+b+".";
			richtig[2]=w?(u?"("+a+" ist ein <i>Vielfaches</i> von "+b+".)":"("+a+" ist z.B. Teiler von "+bb+" und "+(bb+a)+".)"):a+" <i>ist</i> ein Teiler von "+b+".";
			break;
		case 1:t=b+" ist <i>kein</i> Vielfaches von "+a+".";
			richtig[2]=w?(u?"("+a+" ist ein <i>Teiler</i> von "+b+".)":"("+bb+" und "+(bb+a)+" sind Vielfache von "+a+".)"):b+" <i>ist</i> Vielfaches von "+a+".";
			break;
		case 2:t=a+" teilt "+b+" <i>nicht</i>.";
			richtig[2]=w?(u?"("+a+" teilt "+b+".)":"("+a+" teilt z.B. "+bb+" und "+(bb+a)+".)"):a+" <i>teilt</i> "+b+".";
		case 3:t=a+" <big><s>|</s></big> "+b;
			richtig[2]=w?(u?"("+a+" <big><s>|</s></big> "+b+".)":"("+a+" <big>|</big> "+bb+" oder "+a+" <big>|</big> "+(bb+a)+".)"):a+"  <big><b>|</b></big>  "+b+".";
			break;
		case 4:if(!w){do{a=pz[zz(0,pz.length-1)];}while(a>m);}else {do{a=zz(1,m)}while(prim(a));}
			t=a+" ist keine Primzahl.";
			if(w)richtig[2]="Die Teiler von "+a+" sind <big>{</big>"+teilermenge(a)+"<big>}</big>.";
			else richtig[2]=a+" ist nur durch sich selbst und 1 teilbar, <i>ist</i> also eine Primzahl.";
			if(a==1)richtig[2]="1 ist keine Primzahl, weil sonst die Primfaktorzerlegungen nicht eindeutig wären.";
	}
	}while(zuletzt0.indexOf(t)>-1);
	zuletzt0+=t+"\n";
	return "<nobr>"+t+"</nobr>";
}

function aufgabe1(m,id)
{
	var a,b,t,tt,ttt,c,d,nnz=0;
	do{
	a=zz(1,m);b=a*zz(3,m);t="";tt;c;
	c=zz(0,3);if((a==1)&&(c==3))c=1;
	richtig[0]=1;richtig[1]=null;
	switch(c)
	{
		case 0:t=a+" ist ein "+eingabe(12,id)+" von "+b+".";richtig[2]="Teiler";tt=a+"T"+b;
			ttt=a+" ist ein <b>Teiler</b> von "+b+".";break;
		case 1:t=b+" ist ein "+eingabe(12,id)+" von "+a+".";richtig[2]="Vielfaches";tt=b+"V"+a;
			ttt=b+" ist ein <b>Vielfaches</b> von "+a+".";break;
		case 2:t=a+" "+eingabe(12,id)+" "+b+".";richtig[2]="teilt";tt=a+"t"+b;
			ttt=a+" <b>teilt</b> "+b+".";break;
		case 3:t=a+" "+eingabe(12,id)+" "+(d=(b+zz(1,a-1)))+".";richtig[2]="teilt nicht";tt=a+"tn"+d;
			ttt=a+" <b>teilt</b> "+d+" <b>nicht</b>.";break;
	}
	nnz++;
	}while((zuletzt1.indexOf(tt)>-1)&&(nnz<30));
	zuletzt1+=tt+"\n";
	richtig[1]=ttt;
	return "<nobr>"+t+"</nobr>";
}

function aufgabe2(m,id,nicht)
{
	var a,t,i,nz,nnz=0;
	do{
	nz=0;
	do{do{a=zz(2,m)}while((prim(a))||(Math.random()>0.5));for(i=0;i<nicht.length;i++){if(nicht[i]==a)break;}nz++;}while((i<nicht.length)&&(nz<10));
	t="Finde die Teilermenge (die Menge aller Teiler) von "+a+".<br>";
	nnz++;
	}while((zuletzt2.indexOf(t)>-1)&&(nnz<20));
	t+="<nobr>&nbsp;&nbsp;&nbsp;T<sub>"+a+"</sub> = <big>{</big>"+eingabe(30,id,true)+"<big>}</big></nobr>\n";
	richtig[0]=2;richtig[1]=a;richtig[2]=teilermenge(a);
	zuletzt2+=t+"\n";
	return t;
}
function aufgabe3(m,id,nicht)
{
	var a,t,i,n,nz,nnz=0;
	do{
	nz=0;
	do{a=zz(2,m);for(i=0;i<nicht.length;i++){if(nicht[i]==a)break;}nz++;}while((i<nicht.length)&&(nz<10));
	if(nnz==49){while(zuletzt3.indexOf("von "+a+" ")>-1)a++;}
	n=Math.min(10,Math.max(5,Math.floor(100/a)));
	t="Schreibe die ersten "+zw[n]+" Vielfachen von "+a+" auf:<br>";
	nnz++;
	}while((zuletzt3.indexOf(t)>-1)&&(nnz<50));
	t+="<nobr>&nbsp;&nbsp;&nbsp;V<sub>"+a+"</sub> = <big>{</big>"+eingabe(40,id,true)+"<big>}</big></nobr>\n";
	richtig[0]=3;richtig[1]=a;richtig[2]=vielfache(a,n);
	zuletzt3+=t+"\n";
	return t;
}
function aufgabe4(m,id,nicht)
{
	var a,t,i,nz,nnz=0;
	do{
	nz=0;
	do{do{a=zz(2,m)}while((prim(a))||(Math.random()>0.8));for(i=0;i<nicht.length;i++){if(nicht[i]==a)break;}nz++;}while((i<nicht.length)&&(nz<10));
	t="Schreibe alle Primfaktoren von "+a+" auf (alle Primzahlen, durch die man "+a+" teilen kann):<br>";
	nnz++;
	}while((zuletzt4.indexOf(t)>-1)&&(nnz<30));
	t+="<nobr>&nbsp;&nbsp;&nbsp;P<sub>"+a+"</sub> = <big>{</big>"+eingabe(30,id,true)+"<big>}</big></nobr>\n";
	richtig[0]=4;richtig[1]=a;richtig[2]=primteiler(a);
	zuletzt4+=t+"\n";
	return t;
}
function aufgabe5(m,id)
{
	var a,b,g,t,i,nz;
	do{
	nz=0;
	g=zz(2,m);if(Math.random()<.3)g=1;else if(Math.random()<.5)g=zz(2,5);
	do{a=zz(1,m/g)*g;b=zz(2,m/g)*g;nz++;}while(((a==b))&&(nz<50));g=ggt(a,b);
	t="<nobr>Finde den größten gemeinsamen Teiler (ggT) von "+a+" und "+b+":</nobr><br>";
	}while(zuletzt5.indexOf(t)>-1);
	t+="<nobr>&nbsp;&nbsp;&nbsp;&nbsp;ggT("+a+"; "+b+") = "+eingabe(5,id,true)+"</nobr>\n";
	richtig[0]=5;richtig[1]=g;
	richtig[2]="ggT("+a+"; "+b+") = "+g+",<br>denn T<sub>"+a+"</sub> = {"+fette(teilermenge(a),g).join(", ")+"} <br>und T<sub>"+b+"</sub> = {"+fette(teilermenge(b),g).join(", ")+"}.";
	richtig[2]+="<br>Die größte Zahl, die in <i>beiden</i> Mengen vorkommt, ist die "+g+".";
	zuletzt5+=t+"\n";
	return t;
}
function aufgabe6(m,id)
{
	var a,b,g,k,t,tm,i,aa,bb,nz,nnz=0;
	do{
	nz=0;
	if(m<8)m=8;
	do{
	do{a=zz(2,m);b=zz(2,m);}while((a==b)||(((a%b)==0)&&(Math.random()>.2))||(((b%a)==0)&&(Math.random()>.2))||((ggt(a,b)==1)&&(Math.random()>.2)));k=kgv(a,b);
	}while((k>m*4)||(k>100));
	aa=k/a;bb=k/b;
	t="<nobr>Finde das kleinste gemeinsame Vielfache (kgV) von "+a+" und "+b+":</nobr><br>";
	nnz++;
	}while((zuletzt6.indexOf(t)>-1)&&(nnz<50));
	t+="<nobr>&nbsp;&nbsp;&nbsp;&nbsp;kgV("+a+"; "+b+") = "+eingabe(5,id,true)+"</nobr>\n";
	richtig[0]=6;richtig[1]=k;
	richtig[2]="kgV("+a+"; "+b+") = "+k+",<br>denn V<sub>"+a+"</sub> = {"+fette(vielfache(a,aa),k).join(", ")+", ...} <br>und V<sub>"+b+"</sub> = {"+fette(vielfache(b,bb),k).join(", ")+", ...}.";
	richtig[2]+="<br>Die erste (also auch kleinste) Zahl, die in <i>beiden</i> Mengen vorkommt, ist die "+k+".";
	zuletzt6+=t+"\n";
	return t;
}

function sortierfunktion(a,b){return a-b;}
function liste(t)
{
	var a=new Array(),i;
	t=t.replace(/\D/g," ").replace(/ +/g," ");
	while(t.charAt(0)==" ")t=t.substring(1,t.length);
	while(t.charAt(t.length-1)==" ")t=t.substr(0,t.length-1);
	a=t.split(" ");
	a=a.sort(sortierfunktion);
	return a;
}
function listenvergleich(L,r,vb)
{
	var a=liste(L),i,j,t="",v=new Array(),z=new Array(),zz=1==0;
	if(L.replace(/\D/g,"")=="")return nichtgemacht();
	for(i=0;i<a.length-1;i++){if(a[i]==a[i+1])t+=a[i]+" ist doppelt. ";}
	for(i=0;i<r.length;i++){for(j=0;j<a.length;j++){if(a[j]==r[i])break;}if(j==a.length)v[v.length]=r[i];}
	for(i=0;i<a.length;i++){for(j=0;j<r.length;j++){if(a[i]==r[j])break;}if(j==r.length){if(vb!=null){if((a[i]%vb)==0)continue;}z[z.length]=a[i];}}
	if(v.length==1)t+="Du hast nur die "+v[0]+" vergessen.<br>";
	if(v.length>1)t+="Du hast diese Zahlen vergessen: {"+v.join("; ")+"}. ";
	if(z.length==1)t+="Nur die "+z[0]+" ist falsch.";
	if(z.length>1)t+="Diese Zahlen sind falsch: {"+z.join("; ")+"}";
	return t;
}
function nichtgemacht()
{
	ngz++;//alert(ngz);
	t=new Array("Du hast diese Aufgabe leider nicht bearbeitet.",
			"Leider hast Du nicht probiert, diese Aufgabe zu lösen.",
			"Du hast hier nichts hingeschrieben. Zu schwer?",
			"Hast Du diese Aufgabe übersehen?",
			"Hier hast Du keine Lösung hingeschrieben.",
			"Die Aufgabe wurde nicht bearbeitet.")
	return "<nobr>"+t[zz(0,t.length-1)]+"</nobr>\n";
}

function korrektur()
{
	var i,j,a=new Array(),b,t,r;
	ngz=0;
	for(i=0;i<az;i++)
	{
		r=Richtig[i][1];
		a[i]=new Array(null,"Richtig ist: "+(((r>1)&&(r<5))?"{"+Richtig[i][3].join("; ")+"}":Richtig[i][3]));
		b=frames[1].document.getElementsByName(Richtig[i][0])[0].value;
		switch(r)
		{
		case 0:
			b=-1;for(j=0;j<2;j++)if(frames[1].document.getElementsByName(Richtig[i][0])[j].checked)b=1-j;
			a[i][0]=(((b==1)&&(Richtig[i][2]))||((b==0)&&(!Richtig[i][2])));
			if(b==-1)a[i][1]=nichtgemacht().replace(/hingeschrieben/,"angekreuzt")+"<br>"+a[i][1];
			break;
		case 1:a[i][0]=(b==Richtig[i][3]);if(b=="")a[i][1]=nichtgemacht()+"<br>"+a[i][1];
			if(b.toLowerCase()==Richtig[i][3].toLowerCase())a[i][1]+=" (Rechtschreibfehler!)";
			a[i][1]+=", denn "+Richtig[i][2];
			break;
		case 2:t=listenvergleich(b,Richtig[i][3]);a[i][0]=(t=="");a[i][1]+="<br>"+t;break;
		case 3:t=listenvergleich(b,Richtig[i][3],Richtig[i][3][0]);a[i][0]=(t=="");a[i][1]+="<br>"+t;
			break;
		case 4:t=listenvergleich(b,Richtig[i][3]);a[i][0]=(t=="");a[i][1]=a[i][1].replace(/}/,"}, denn "+Richtig[i][2]+" = "+pfz(Richtig[i][2]).join("·"))+"<br>"+t;break;
		case 5:a[i][0]=(Number(b)==(Richtig[i][2]));if(b.replace(/\D/g,"")=="")a[i][1]=nichtgemacht()+"<br>"+a[i][1];
			break;
		case 6:a[i][0]=(Number(b)==(Richtig[i][2]));if(b.replace(/\D/g,"")=="")a[i][1]=nichtgemacht()+"<br>"+a[i][1];
			if(((b%Richtig[i][2])==0)&&(Number(b)!=0))a[i][1]=b+" ist zwar ein gemeinsames Vielfaches, aber nicht das <i>kleinste</i>.<br>"+a[i][1];
			break;
		}
	}
	//alert(a.join("\n"));
	return a;
}
