// Zahlenfaktorisierer

function clearform () {
	document.forms.ausgabe.faktoren.value = '';
	document.forms.ausgabe.laufzeit.value = '';
}

var StartTime;

function showtime () {
	var usedtime = Math.ceil (new Date() - StartTime + 0.0001);
	if (usedtime >= 1000) {
		document.forms.ausgabe.laufzeit.value = usedtime/1000 + " Sekunden";
	} else {
		document.forms.ausgabe.laufzeit.value = usedtime + " Millisekunden";
	}
}

function dofactor() {

	clearform();

	var raw = document.forms.eingabe.zahl.value;

	var cooked = '';

	for (var i=0; i<raw.length; i++) {
		var ch= raw.charAt(i);
		if (ch>='1' && ch <='9' || ch=='0' && cooked!='') cooked+=ch;
		if (cooked.length >= 16) break;
	}

	document.forms.eingabe.zahl.value = cooked;

	var zahl = parseInt (document.forms.eingabe.zahl.value);

	if (!isFinite(zahl) || zahl<2) {
		alert ("'" + document.forms.eingabe.zahl.value + "' ist keine positive ganze Zahl größer 1");
		return false;
	}

	if (!confirm("Soll wirklich Ihr Rechner " + zahl + " zerlegen?")) return true;

	document.forms.ausgabe.faktoren.value = "Geduld, ich zerlege '" + zahl + "'.";

	StartTime = new Date();

	var Factors   = new Array ();

	var rest = zahl;

	if (rest%2==0) {
		var exp = 0;
		while (rest%2==0) {
			exp++;
			rest /= 2;
		}
		Factors  [Factors.length] = exp>1 ? "2" + "^" + exp : "2";
	}

	var limit = Math.sqrt(rest);

	var show=0;

	for (factor=3; factor <= limit; factor += 2) {
		if (!(show=(show+1)%10000)) showtime();
		if (rest%factor!=0) continue;
		var exp = 0;
		while (rest%factor==0) {
			exp++;
			rest /= factor;
		}
		Factors [Factors.length] = exp>1 ? factor + "^" + exp : factor;
		limit = Math.sqrt(rest);
	}

	if (rest>1) {
		Factors  [Factors.length] = rest;
	}

	showtime ();

	if (Factors.length<2 && isFinite(Factors[0])) {
		document.forms.ausgabe.faktoren.value = zahl + " ist eine Primzahl";
	} else {
		document.forms.ausgabe.faktoren.value = zahl + " = " + Factors.join (' * ');
	}
	return false;
}
