/*
	carres latins mutuellement orthogonaux 

	pour q = p^a   avec p premier

	GF(q) = { l1, l2, ..., l_q-1, lq=0 }

        matrices A_i A_2 ... A_k   A_q-1   1<= k <= q-1

		A_k(x_i,j) = ( li*lk+lj )
	(C) 2009 Jean-Paul Davalan
*/


function gcd(x, y) {
	var u=x, v=y, w;
	while(v!=0) {
		w = u%v
		u=v
                v=w
	}
	return u
}

		

//var Alpha ="A B C D E F G H I J K L M N O P Q R S T U V W X Y Z".split(/\s/g)
var alpha ="a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z".split(/\s/g)
var grec = "&alpha; &beta; &gamma; &delta; &epsilon; &zeta; &eta; &theta; &thetasym; &iota; &kappa; &lambda; &mu; &nu; &xi; &omicron; &pi; &piv; &rho; &sigmaf; &sigma; &tau; &upsilon; &upsih; &phi; &chi; &psi; &omega; &Alpha; &Beta; &Gamma; &Delta; &Epsilon; &Zeta; &Eta; &Theta; &Thetasym; &Iota; &Kappa; &Lambda; &Mu; &Nu; &Xi; &Omicron; &Pi; &Piv; &Rho; &Sigmaf; &Sigma; &Tau; &Upsilon; &Upsih; &Phi; &Chi; &Psi; &Omega;".split(/\s/g)
//alert(Alpha)
var gl=true;
function cgl(q, k0, k1) {
	var a, b, u,uu, tb=[]
	s = ""
        var r=0
        var premier=true, test=true
        if(isprime(q)==false) {
                premier = false
		//s += "<span class='divcomment'>"+q+" n'est pas un nombre premier. (Aucune garantie n'est donnée sur la nature du carré obtenu).</span><br>"
                s += "<span class='divcomment'>"+q+" n'est pas un nombre premier.</span><br>"
		if(gcd(q, k0) != 1) r++
                if(gcd(q, k1) != 1) r++
                if(r>0) {
			test = false
			s += "<span class='divcomment'>Le carré n'est pas gréco-latin. En effet "
                	if(r==1) s += "l'un des deux carrés utilisés n'est pas un carré latin.</span><br>"
			if(r==2) s += "aucun des deux carrés utilisés n'est un carré latin.</span><br>"
 		}
	}
	if(k0==k1) {
		s += "<span class='divcomment'>Les deux nombres fournis "+k0+" et "+k1+" sont identiques. Le carré obtenu n'est pas gréco-latin.</span><br>"
	}
        s += "<br>"
	for(var i=0; i<q; i++) {
		s += '<span class="carre">'
		for(var j=0; j<q; j++) {
			a = (i*k0+j)%q
			b = (i*k1+j)%q
			//A[i][j] = q*a+b
			//u = A[i][j]+" "
			//u = Alpha[a]+alpha[b]+"  "
			if(gl == false) {
				u = grec[a]+alpha[b]
				uu = "("+grec[a]+","+alpha[b]+")"
			} else {u = alpha[a]+alpha[b]
				uu = "("+alpha[a]+","+alpha[b]+")"
			}
			//while(u.length<4) u = " "+u
			s += u+"&nbsp;&nbsp;"
                        if(tb[uu]==null) tb[uu]=0
                        tb[uu]++
		}
		s += '</span><br>'
	}
	for(var v in tb) {
		if(tb[v] > 1 ) {
			s += "<br><span class='divcomment'>" + "Le carré obtenu n'est pas un carré gréco-latin, en effet l'élément "+v+ " est présent "+tb[v]+" fois dans le carré." + "</span><br>"
			test = false
			break;
		}		
        }
	if(premier==false && test==true) {
		s += "<br><span class='divcomment'>Il semble bien que le carré obtenu soit un carré gréco-latin.</span>"
	}
	return "<br>"+s+"<br>"
}

function isprime(n) {
	if(n<2 || (n>2 && n%2==0)) return false
	var a = Math.sqrt(n)
	for(var k=3; k<= a; k+= 2) {
		if(n%k==0) return false
	}
        return true;
}

        
//alert(cgl(7,3,5))

function calcule() {
	var q = parseInt(document.frm.p.value)
	var k0 = parseInt(document.frm.k0.value)
	var k1 = parseInt(document.frm.k1.value)
	gl = (document.frm.ck.checked)
//	alert(q+" "+k0+" "+k1)
	var s = cgl(q, k0, k1)
//	alert(s)
	document.getElementById("divCarre").innerHTML = s
}


var prm = [3,5,7,11,13,17,19]
function exmplegl() {
	gl=false
	var p = prm[Math.floor(prm.length*Math.random())]
	var k0 = Math.floor((p-1)*Math.random())
	var t = Math.floor((p-2)*Math.random())
	var k1 = (k0+t)%(p-1)
//alert(p+" "+k0+" "+k1)
	var s = cgl(p, 1+k0, 2+k1)
	document.getElementById("carre2").innerHTML = s
}


