/*
	d sans facteur carré
	a = 1 lorsque d est impair
	a = 2               pair

	n = |{(x,y,z) / x^2 + 2ay^2 + 8z^2 = d/a}|
	m = |{(x,y,z) / x^2 + 2ay^2 + 32z^2 = d/a}|

	théorème de Tunnell (1983)
	Si n != 2m, alors d n'est pas congruent (n'est pas l'aire d'un triangle rectangle rationnel)
	conjecture :
	Si n = 2m, alors d est congruent

	Lorsque (x,y) est une solution non triviale de y^2 = x^3 - d^2 alors
	(a,b,c) est un triangle rectangle rationnel
	a = |(x^2-d^2)/y|   b = |2xd/y|  c=|(x^2+d^2)/y|

*/

function complete(a,b,c,N) {
	var tb=[]
	for(var i=0; i<=N; i++) tb[i]=0
	var u=0,v,w,x,y,z,kx,ky,kz,m
	for(x=0; u<=N; x++) {
		u=a*x*x
		v=0
		kx=(x==0)? 1 : 2
		for(y=0; u+v<=N; y++) {
			v=b*y*y
			w=0
			ky = (y==0) ? 1 : 2
			for(z=0;u+v+w<=N; z++) {
				w=c*z*z
				kz=(z==0)? 1 : 2
				m=u+v+w
				if(m<=N) tb[m]+=kx*ky*kz
			}
		}
	}
//alert(tb)
	return tb
}

function complete0(a,b,c,N) {
        var tb=[]
        for(var i=0; i<=N; i++) tb[i]=0
        var u=0,v,w,x,y,z,kx,ky,kz,m
	var p=Math.ceil(Math.sqrt(N/a)), q=Math.ceil(Math.sqrt(N/b)), r = Math.ceil(Math.sqrt(N/c))
        for(x=-p; x<=p; x++) {
                u=a*x*x
                v=0
                //kx=(x==0)? 1 : 2
                for(y=-q; y<=q; y++) {
                        v=b*y*y
                        w=0
                        //ky = (y==0) ? 1 : 2
                        for(z=-r;z<=r; z++) {
                                w=c*z*z
                                //kz=(z==0)? 1 : 2
                                m=u+v+w
                                if(m<=N) tb[m]+=1 //kx*ky*kz
                        }
                }
        }
//alert(tb)
        return tb
}

function tunnell(N) {
	var g=""
	var t = []
	var 	A = complete(1,2,32,N),
		B = complete(1,2,8,N),
		C = complete(2,8,64,N),
		D = complete(2,8,16,N)
//alert(A+"\n"+B+"\n\n"+C+"\n"+D)
	var j=0
	for(var i=1; i<=N; i++) {
		if( ! sansFacteurCarre(i)) continue
		if(i%2==0) {
			if(2*C[i]==D[i]) {
				t[j]=i
				g +=i+" "
				j++
			}
		} else {
			if(2*A[i]==B[i]) {
				t[j]=i
				j++
			}
		}
	}
//alert(g)
	return t
}

function cherchetunnell() {
	var N=parseInt(document.frm.N.value)
	document.frm.N.value=N
	var t = tunnell(N)
	var s = t[0]+""
	for(var i=1; i< t.length; i++) {
		s +=", "+t[i]
	}
	var s0 = "Sous r&eacute;serve que la conjecture de Birch et Swinnerton-Dyer s'applique aux courbes elliptiques de la forme <code>y<sup>2</sup> = x<sup>3</sup> - n<sup>2</sup>x</code>, les "+t.length+" nombres congruents inf&eacute;rieurs ou &eacute;gaux &agrave; "+N+" et sans facteurs carrés, sont :<br>"
	document.getElementById("idTunnell").innerHTML = s0 + s
}

function effacetunnell() {
	document.getElementById("idTunnell").innerHTML =""
	document.frm.N.value=""
}

function sansFacteurCarre(t) {
	var u= 0, x=t;
        for(var d=2; u<=x; d++) {
		u = d*d
                if(x%u==0)
			return false
		if(x%d==0) x/=d
        }
        return true
}
//alert(sansFacteurCarre(6))

