/* 	
	program: eric.js
	subject: Eric Angelini's numbers = Belgian numbers
	author: Jean-Paul Davalan (C) march 2009  jeux-et-mathematiques(AT)davalan.org
	web: http://jeux-et-mathematiques.davalan.org/mots/suites/belge/index.html
*/



function teste() {
        var n, N = parseInt(document.belge.N.value), x=N

        var t=[], cumul=[], rg=[]

        for(n=0; x>0; n++) {
                t[n] = x%10
                x = (x - t[n])/10
        }

        cumul[0]=0
        rg[0]=0
        for(var i=1; i<=n; i++) {
                cumul[i] = cumul[i-1] + t[n-i]
                rg[cumul[i]]=i
        }
        var sum = cumul[n], r = N % sum;
        if(rg[r] != null) {
                s = "<br />Le nombre " +  N + " est bien un nombre belge <br /><br />" 
		 + "(en effet " + N + " &equiv; " + r + " (mod. " + sum +") où " + sum
		 +" est la somme des chiffres de " + N + " et où "+ r 
		 + ((rg[r]==0)? " est nul " : " est la somme des " + rg[r] + " chiffres de gauche de " + N ) 
		 + ")<br />"
        } else {
                s = "<br />Le nombre "+N+" n'est pas un nombre belge d'Éric Angelini <br /><br />(en effet "+N+" &equiv; "+ r 
		 + " (mod. "+sum+") où "+r+" n'est pas la somme de plusieurs chiffres les plus à gauche de "+N+")<br />"
        }
        document.getElementById("Eric").innerHTML = s
}

function testeSimple(N, k) {
        var n, x=N, ret=false

        var t=[], cumul=[], rg=[]

        for(n=0; x>0; n++) {
                t[n] = x%10
                x = (x - t[n])/10
        }

        cumul[0]=0
        rg[0]=0
        for(var i=1; i<=n; i++) {
                cumul[i] = cumul[i-1] + t[n-i]
                if(i<n)rg[cumul[i]]=i
		
        }
        var sum = cumul[n], r = (N-k) % sum;
//alert(n+"\n"+cumul+"\n"+rg+"\n"+sum +"\n"+r)
	while(r<k) r += sum
	//if(r<0) r += sum
        if(N>=k && rg[r] != null) {
		ret = true
        } else {
		ret = false
        }
	delete(t); delete(rg); delete(cumul)
	return ret
}
function testeBis(N, k) {
        var n, x=N, ret=false

        var t=[], cumul=[], rg=[]

        for(n=0; x>0; n++) {
                t[n] = x%10
                x = (x - t[n])/10
        }
	// n : nbre de chiffres
        cumul[0]=0
        rg[0]=0
        for(var i=1; i<=n; i++) {
                cumul[i] = cumul[i-1] + t[n-i]
                if(i<n)rg[cumul[i]]=i
        }
        var sum = cumul[n], r = (N-k) % sum;
       // while(r<k) r += sum
        //if(r<0) r += sum
        if(N>=k && rg[r] != null) {
                ret = true
        } else {
                ret = false
        }
       // delete(t); delete(rg); delete(cumul)
        return ret
}

//alert(testeSimple(176)+" "+testeSimple(177))

function teste2(N, k) {
	var s0 = N+"", s2="", t=[]
	var l = s0.length
	for(var i=0; i< l; i++) {
		t[i] = parseInt(s0.charAt(i))
	}
	var a = t[0], s2=""+a
	for(var m=0; s2.length < l; m++) {
		a += t[m%l]
		s2 += ""+a
	}
//alert(s0+" "+s2)
	if(s2.indexOf(s0, 0)==0) return true
	else return false
}

function seqCalc() {
	var lim = parseInt(document.seq.lim.value)
	//alert(lim)
	var s=""
	for(var i=1; i<= lim; i++) {
		if(testeSimple(i, 0)==true)
			s += i+", "
	}
	document.getElementById("seqID").innerHTML = s
}

function hasard() {
        var N = 1+Math.floor(1000000000*Math.random());
        document.belge.N.value = N
        teste()
}

function efface() {
        document.belge.N.value = ""
        document.getElementById("Eric").innerHTML =""
}

function kseqCalc() {
	var esp=" "
        var lim = parseInt(document.kseq.lim.value)
	var k = parseInt(document.kseq.k.value)
        //alert(lim) 
        var s=k+","+esp
        for(var i=k+1; i<= lim; i++) {
                if(testeBis(i, k)==true)
                        s += i+","+esp
        }
        document.getElementById("kseqID").innerHTML = s
}

function selfCalc() {
        var lim = parseInt(document.self.lim.value)
        var s=""
        //alert(lim)
        
        for(var i=1; i<= lim; i++) {
		var st = i+" "
		var k = st.charAt(0)
		//alert(st+" "+k)
                if(testeBis(i, k)==true)
                        s += i+", "
        }
        document.getElementById("selfID").innerHTML = s
}

function self2Calc() {
        var lim = parseInt(document.self2.lim.value)
        var s=""

        for(var i=1; i<= lim; i++) {
                var st = i+" "
                var k = st.charAt(0)
                if(testeBis(i, k)==true && teste2(i, k) ==true)
                        s += i+", "
        }
        document.getElementById("self2ID").innerHTML = s
}

function assocCalc() {
	var N = parseInt(document.assoc.N.value)
	var m = parseInt(document.assoc.lim.value)
	if(isNaN(N)) {
		N=5081
		document.assoc.N.value= N
	}
	if(isNaN(m)) {
		m=10000
		document.assoc.lim.value = m
	}

	var i, t=[], s="", st = N+"", l =st.length, s=""
	var cumul = [], sum=0
	for(var i=0; i<l; i++) {
		t[i] = parseInt(st.charAt(i))
		cumul[i] = sum
		sum += t[i]
	}
	cumul[l]=sum
	var nb = t[0]
	s = ""+nb+", "
	for(var i=0; nb <= m; i++) {
		nb += t[i%l]
		s += nb+", "
	}
	
	document.getElementById("assocID").innerHTML = s
}

// self2Calc(100000000)
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 61, 71, 918, 3612, 5101, 8161, 12481, 51011, 248161, 361213, 5101111, 7141519, 8161723

function assocEfface() {
	document.getElementById("assocID").innerHTML =""
	document.assoc.N.value=""
	document.assoc.lim.value=""
}

function type2(c, m) {
	var curr=c+"", s=c+", ", l=0, deb=c+""
	var p=0, nb=0, st
	// construit la suite jusqu'à avoir plus de m chiffres en concaténant les premiers termes
	for(var i=0; l<= m || curr.length<=m; i++) {
		curr = add(curr, deb.charAt(i))   // addition longs entiers
		if(l<=m) deb += ""+curr
		l = deb.length
		if(i==100) alert(curr+"\n"+deb)

		if(deb.indexOf(curr,0)==0) {
			nb++
			s += curr+", "
			document.getElementById("partID").innerHTML =s
		}
	}
	return s
}
function partCalc() {
	var c = parseInt(document.part.C.value)
	var m = parseInt(document.part.m.value)
	var s = type2(c, m)
	document.getElementById("partID").innerHTML = s
}

function chiffreAt(s, t) {
        s += ""
        var l = s.length
        return  (t < l) ? parseInt(s.charAt(l-t-1)) : 0
}

function add(s0, s1) {
        var l0,l1,st,r,x,c
        l0 = s0.length
        l1 = s1.length
        st = ""
        r=0
        for(var i=0; i<l0 || i<l1 || r != 0; i++) {
                x = chiffreAt(s0,i) + chiffreAt(s1,i) + r
                c = x%10
                r = (x-c)/10
                st = c + st
        }
        return st
}


function chiffreAtLeft(s, t) {
        s += ""
        var l = s.length
        return  (t>=0 && t < l) ? parseInt(s.charAt(t)) : 0
}

function reste(s, d) {
        var r=0, l = s.length
        for(var i=0; i<l; i++) {
                r = (10*r+chiffreAtLeft(s, i))%d
        }
        return r
}

function testeBelge1(s) {
        var l = s.length, cumul=[], rg = []
        cumul[0]=0
        for(var i=0; i<l; i++) {
                cumul[i+1] = cumul[i]+chiffreAtLeft(s, i)
        }
        var sum = cumul[l]
        for(var i=0; i<l; i++) {
                rg[cumul[i]]=i
        }
        var v = sum - cumul[1]
        var u = add(s, v)
        var r = reste(u, sum)
        //alert(cumul+"\n"+rg+"\n"+sum+"\n"+r)
        if(rg[r]!=null) {
                return true
        } else {
                return false
        }
}

function testeBelge2(s) {
        if(testeBelge1(s) == false)
                return false
        var currt = chiffreAtLeft(s, 0), l = s.length, st="", tb = []
        for(var i=0; i<l; i++) {
                        tb[i] = chiffreAtLeft(s, i)
        }
        st += ""+currt
        for(var i=0; st.length <l; i++) {
                currt += tb[i%l]
                st += ""+currt
        }
        //alert(st+"\n"+s+"\n")
        if(st.lastIndexOf(s, 0)==0) {
                return true
        } else {
                return false
        }
}
function hasardBlg1() {
	var l = 1+Math.floor(100*Math.random())
	var s = ""+Math.floor(1+9*Math.random())
	for(var i=0; i<l; i++)
		s += ""+Math.floor(10*Math.random())
	document.blg1.N.value = s
	testeBlg1()
}

function hasardBlg2() {
        var l = 1+Math.floor(100*Math.random())
        var s = ""+Math.floor(1+9*Math.random())
        for(var i=0; i<l; i++)
                s += ""+Math.floor(10*Math.random())
        document.blg2.N.value = s
        testeBlg2()
}

function testeBlg1() {
        var s = document.blg1.N.value
        s = s.replace(/[^0-9]+/gi,"")
        document.blg1.N.value = s
        if(testeBelge1(s) == true) r = s+" est un nombre belge de type 1"
        else r = s+" n'est pas un nombre belge de type 1"
        document.getElementById("blg1ID").innerHTML = r
}

function testeBlg2() {
        var s = document.blg2.N.value
        s = s.replace(/[^0-9]+/gi,"")
        document.blg2.N.value = s
        if(testeBelge2(s) == true) r = s+" est un nombre belge de type 2"
        else r = s+" n'est pas un nombre belge de type 2"
        document.getElementById("blg2ID").innerHTML = r
}

function Effacet1() {
        document.getElementById("blg1ID").innerHTML = ""
        document.blg1.N.value=""
}

function Effacet2() {
        document.getElementById("blg2ID").innerHTML = ""
        document.blg2.N.value=""
}
		

function ChercheBlg2() {
	var b = document.cher2.ckb.checked
	var c = document.cher2.c.value
	c = c.replace(/^0-9/gi,"")
	if(c!=null && c.length>0) {
		c = c.charAt(0)
		document.cher2.c.value=c
	}
	var m = parseInt(document.cher2.m.value)
	 var s = cherche2(c, m, b)
	//var s = lb2(c, m, b)
	document.getElementById("cher2ID").innerHTML = s
}
function suivant2(s) {
	var l = s.length, u = chiffreAtLeft(s, 0)
	var st = u+""
	for(var i=0; st.length<l+1; i++) {
		u += chiffreAtLeft(s, i)
		st += ""+u
	}
	var strg = st.substr(0,l+1)
	return strg
}

function cherche2(c, m, b) {
	var st = "", s=c+""
	for(var i=1; i<m; i++) {
		if(testeBelge2(s)) {
			if(! b) st += '"'+s+'", '
			else st += s.length+", "
		}
		s = suivant2(s)
	}
	return st
}

function mot2(c, m) {
	var s=c+""
	for( ; s.length<m; ) {
		s = suivant2(s)
	}
	var st = ""
	var l=80
	for(var i=0; i< m; i+=l) {
		st += s.substr(i, l) + "<br />\n"
	}
	return st
}

function chermot2() {
        var c = document.cher2.c.value
        c = c.replace(/^0-9/gi,"")
        if(c!=null && c.length>0) {
                c = c.charAt(0)
                document.cher2.c.value=c
        }
        var m = parseInt(document.cher2.m.value)
        var s = mot2(c, m)
	//var s = lb2(c, m)
        document.getElementById("cher2ID").innerHTML = s
}

function EffaceC2() {
	document.getElementById("cher2ID").innerHTML = ""
	document.cher2.c.value=""
	document.cher2.m.value=""
}
/*
	essayée comme remplacement de la fonction "cherche2"
	mais ne semble pas plus rapide
*/

function lb2(c, m, b) {
	// cumul des chiffres
	var cumul=[], mot = c+"", current= c, ch, k, s="",rg=[]
	cumul[0] = 0
	rg[0] = 0
	for(k=0; mot.length <m; k++) {
		ch = chiffreAtLeft(mot,k)
		current = add(current,ch)
		cumul[k+1] = cumul[k] + ch
		rg[cumul[k+1]] = k+1
		mot += ""+current
	}
	for(var i=0; i<mot.length; i++) {
		st = mot.substr(0, i+1)
		var sum = cumul[i+1]
	        var v = sum - cumul[1]
        	var u = add(st, v)
	        var r = reste(u, sum)

		var v = cumul[i+1]-cumul[0]
		r =  reste(st,  v)
/*		// avant d'utiliser le tableau rg[] (rg est plus rapide)
		for(j=0; j<=i; j++) {
			if(cumul[j]==r) {
				if(b)
					s += st.length+", "
				else
					s = s+", "+st
				break;
			}
		}
*/
		if (rg[r] != null) {
                       if(b)
	                       s += st.length+", "
                       else
                               s = s+", "+st
		}
	}
	return s;
}

	
/*
for(var g = 1; g<=9; g++) {

	print(cherche2(g, 3000, false))
}
*/

function cherche2lg(m) {
	var st="", tb = new Array(m+1)
	for(var i=0; i<= m; i++) {
		tb[i]=0
	}
	for(var c=1; c<=9; c++) {
		var s=c+""
        	tb[1]++
	        for(var i=1; i<m; i++) {
        	        if(testeBelge2(s)) {
                        	tb[s.length]++
                	}
     		        s = suivant2(s)
        	}
	}
	for(var i=1; i<tb.length; i++) {
		st += tb[i]+", "
	}
	return st
        //return tb
}

//print(cherche2lg(3000))

