/* per.js
   fraction associée à une écriture décimale illimitée périodique

   Jean-Paul Davalan 2003 jpdvl@wanadoo.fr
*/
var current="",ncurrent=0, tcurrent=[];

function savecurrent(s) {
	position = ncurrent
	tcurrent[ncurrent++]=s
}

var position=0;
function suivant(r) {
	if(ncurrent==0) return;
	position =(position+r+ncurrent)%ncurrent;
	document.frm.nb.value=tcurrent[position]
	effectue1();
}

function gcd(a, b) {
  var u=a, v=b, w;
  if(u<v) {
    w=u;
    u=v;
    v=w;
  }
  while(v != 0) {
    w=u%v;
    u=v;
    v=w;
  }
  return u;
}

function puiss(k) {
	var a=1;
	for(var i=0; i<k; i++)
		a *=10;
	return a;
}

var reg = new RegExp( "([\+-]*)" + "([0-9]+)" + "[\.,]" + "([0-9]*)" + "(\[[0-9]+\])", "g");

function neuf(d) {
	return puiss(d)-1
}
function z(d) {
	var s=""
	for(var i=0;i<d;i++)
              s +="0"
	return s;
}

function nettoie(expr) {
        var s=expr, sa;
        s = s.replace(/\s+/g,"")
	if(s=="") s="0"
        do {
                sa=s;
		s = s.replace(/\s+/g,"")	// " " gauche
                s = s.replace(/\++/g,"") 	// + de gauche
		s = s.replace(/\s*\+\s*/g,"")
		s = s.replace(/\s*\-\s*/g,"-")
                s = s.replace(/\-\-/g,"")	// --
                s = s.replace(/\[\]$/,"[0]")
                s = s.replace(/\[.*\[/,"[")
                s = s.replace(/\].*\]/,"]")
                s = s.replace(/\].+$/,"]")
		//if(s.indexOf("]")<0) s = s+"[0]"
        } while(sa != s);
	s = s.replace(/\,/g,".");
        if(s.indexOf(".")<0) {
		if(s.indexOf("]")<0)
			s = s+".[0]"
		else {
			s = "0."+s
		}
	}

	if(s.indexOf("]")<0 && s.indexOf("[")<0) 
		s = s+"[0]"

	else if(s.indexOf("]")<0 )
		s = s+"]"

	else if(s.indexOf("[")<0 )
		s = s.replace(/\]$/,"[0]")

	s = s.replace(/\[\]$/,"[0]")
       
        return s;
}

/*
	35.3[074]   = 35.3074074074074074074074074074074074074074074074
	(353+74/999)/0
	35.307[407] = 35.307407407407407407407407407407407407407407407407
	(35307+407/999)/1000
	35.307[407407]
	(35307+407407/999999)/1000
*/
      
function effectue1() {
	var expr=document.frm.nb.value;
	var a, t="", s = nettoie(expr);
	document.frm.nb.value=s
	var str = "Le nombre à écriture décimale illimitée est n = "+ s + "\n"

	a = reg.exec(s); 	
	reg.exec("")
	if(a==null) return;
	if(a[1]=="-")
		str += "Le nombre n est négatif\n"
	a[4] = a[4].replace(/^\[+/,"")
	a[4] = a[4].replace(/\]+$/,"")
	
	var r = a[3].length
	var d = a[4].length
	var rs = a[4].replace(/^0+/,"");
	if(rs=="") rs="0"
	a[2] = a[2].replace(/^0+/,"");
	if(a[2]=="") a[2]="0"
	
	var nf=neuf(d), pr=puiss(r);
	str +="La période "+ a[4] +" est de "+ d +" chiffres\n\n"
	str += "Le nombre n est bien un rationnel\n"
	
	if(a[2]+a[3]!="") {
		str += "n = "+a[1]+"("+a[2]+a[3]+" + " + a[4] + "/" + nf +")/"+pr+"\n"
		x=toInt(a[2]+a[3]) * nf + toInt(rs)
	} else  {
		str += "n = 0\n"
		x=toInt(rs);
	}
	
	y = neuf(d) * pr;
	str +=  "n = "+a[1]+"(("+a[2]+a[3]+")*"+nf +" + "+ a[4]+")/("+nf+""+z(r)+")\n\n"
	
	str += "Le nombre n a pour écriture fractionnaire\n"
	str +=  "n = "+a[1]+x+"/"+y+"\n"
	g = gcd(x,y)
	if(g>1) {
		str += "La fraction peut se simplifier par "+g+"\n"
		x = x/g
		y=y/g
		str += "n = "+a[1]+x+"/"+y+"\n"
	} else {
		str += "La fraction est irréductible\n"
	}

	if(y==1) {
		str += "Le fraction est égale à l'entier n = "+ a[1]+x+"\n"
	}

	document.getElementById("result").innerHTML="<pre>"+str+"</pre>"
	return {"sgn": a[1], "num":x, "den": y, "lper":d, "per": a[4]}
}

function effectue() {
	savecurrent(document.frm.nb.value);
	var tb = effectue1()
	if(tb["den"]>1) {
		var u = 2*tb["lper"]
		u = (u>20)? u : 20
		affdivision(tb["num"], tb["den"], u)
	}
}

function efface() {

document.frm.nb.value="";
document.getElementById("result").innerHTML=""
}

var cherche = function() {
	document.getElementById("result").innerHTML=""
	effectue();
}

function exple(s) {
	document.getElementById("result").innerHTML=""
	document.frm.nb.value=s;
	effectue();
}

function kmaxchiffres(k) {
	var b=1+Math.floor((k)*Math.random()), s=""
	for(var i=0;i<b;i++) 
		s += ""+Math.floor(10*Math.random())
	return s
}

function hasard() {
	var a = Math.floor(1000*Math.random()),
		b = kmaxchiffres(3),
		c = kmaxchiffres(4),
		ch=((Math.random()<0.2)?"-":""),
		s = ch+a+","+b+"["+c+"]";
	efface();
	document.frm.nb.value=s;
	effectue();
}
this.toInt = function(s) {
        var u=s.replace(/^0+/,"");
        if(u=="") u="0"
        return parseInt(u);
}



