/* bij_Nn2N.js

   bijections de N^n sur N

   Jean-Paul Davalan © 2003 jpdvl@wanadoo.fr
   m. à j. le 18/11/2003




On veut résoudre f(x,y) = k pour retrouver la position de k dans la table

     y= 0     1     2     3     4    5    6    7 = y   et aussi total T
x
0       0     1     3     6    10   15    ...   ->   ligne U = T*(T+1)/2
1       2     4     7    11    16    
2       5     8    12    17 <----- l'exemple k = 17
3       9    13    18                 
4      14    19  
5      20
   
Les éléments dont les deux coordonnées (x, y) ont même somme T = x+y se trouvent 
sur une même diagonale, le plus petit élément de cette diagonale est  U = T*(T+1)/2

Pour retrouver les coordonnées (x, y) de l'élément k, dans la table, on calcule 
d'abord T en prenant la valeur entière de la solution positive de l'équation
du second degré T*(T+1)/2 = k  ou encore T^2 + T - 2k = 0
de discriminant Delta = 1+8k, de racine positive (-1+sqrt(Delta))/2
donc T = [(-1+sqrt(1+8*k))/2] où les crochets [...] désignent la partie entière

On calcule ensuite U = T*(T+1)/2 puis x = k-U   et y= T-x

exemple k = 17 :
----------------
équation Z^2 + Z - 2*17 = 0,    
Delta = 137,  
racine positive  Z" = (-1+sqrt(137))/2 = 5.352349955359812554551049137
T = [Z"] = 5
U = 5*(5+1)/2=15
x = 17-15 = 2
y = 5-2 = 3

*/

function fbij(x,y) {
  return ((x+y)*(x+y)+3*x+y)/2;
}

function wtable0(N) {
var i, a;
document.writeln("<center>");
document.writeln("<table border=1 cellpadding=2 cellspacing=2>");
document.write("<tr align=right><td><i><font color=\"#3300aa\">x</font></i> \\ <i><font color=\"#3300aa\">y</font></i></td>");
for(i=0;i<N;i++) {
   document.write("<td><i><font color=\"#3300aa\">"+i+"</font></i></td>");
}
document.writeln("</tr>");
for(i=0;i<N;i++) {
  document.write("<tr align=right><td><i><font color=\"#3300aa\">"+i+"</font></i></td>");
  for(j=0;j<N;j++) {
     a=fbij(i,j);
     document.write("<td>"+a+"</td>");
  }
  document.writeln("</tr>");
}
document.writeln("</table>")
document.writeln("</center>");
}

function wtable(N) {
var s = "<center><table><tr><th>x \\ y</th>"
	for(var i= 0; i<N; i++) s += "<th>"+i+"</th>"
	s += "</tr>"
	for(var i= 0; i<N; i++) {
		s += "<tr><th>"+i+"</th>"
		for(var j=0; j<N; j++) {
			var a=fbij(i,j);
			s += "<td>"+a+"</td>"
		}
		s += "</tr>"
	}
	s += "</table></center>"
	document.getElementById("idPoly").innerHTML=s
}

function calcule() {
 var x=parseInt(document.frm.x.value),
     y=parseInt(document.frm.y.value);
 document.frm.xy.value=fbij(x,y);
}


function diag() {
 var p=0, n, u = parseInt(document.frm.xy.value);
 n=Math.floor(Math.sqrt(2*u));
 if(n*(n+1)/2>u) 
   n--;
 p = (n*(n+1))/2;

  x=u-p;
  y=n-x;
  document.frm.x.value=x;
  document.frm.y.value=y;
}


function efface() {
document.frm.x.value="";
document.frm.y.value="";
document.frm.xy.value="";
}


function ndiag(u) {

  var n=Math.floor(Math.sqrt(2*u));
  if(n*(n+1)/2>u)  n--;
  return(n);
/*
  return Math.floor((-1+Math.sqrt(8*u))/2);
 */
}


function ycoord(u, n) {
  var p = (n*(n+1))/2;
  var x=u-p;
  var y=n-x;
  return y;
}


function efface2() {
document.frm.xyzt.value="";
document.frm.n.value="";
document.frm.Fc.value="";
}


function effect2() {
  var i,k=0, x,y,n,s;
  s = document.frm.xyzt.value;
  s.replace(/^[,;\ \s]*/g,"");
  s.replace(/[,;\ \s]+$/gi,"");
  s.replace(/[,;\ \s]+/gi," ");
  document.frm.xyzt.value=s;
  var a = s.split(/[\s]+/);
  n = a.length;
  for(i=0;i<n && a[i]!=void(0) && a[i]!="";i++) 
    k++;
  n = k;
  if(n >=1) {
    document.frm.n.value=n;
    for(i=0;i<n;i++) {
      k++;
      y=parseInt(a[i]);
      if(i==0) x=y;
      else 
        x=fbij(x,y);
    }
    document.frm.Fc.value=x;
  } else {
    document.n.value="";
    document.frm.Fc.value="";
  }
}

function retr() {
  var i, u, y, z, r,s="";
  u=parseInt(document.frm.Fc.value);
  k=parseInt(document.frm.n.value);
  if(k<=1) {
    document.frm.n.value=1;
    document.frm.xyzt.value=u;
  } else {
    for(i=0;i<k-1;i++) {
      r = ndiag(u);
      y= ycoord(u, r) 
      z = r-y;
      s = y+" "+s;
      u=z;
    }
    s=z+" "+s;
    document.frm.xyzt.value=s;
  }
}

function itonat() {
  var k;
  k=parseInt(document.f2.imp.value);
  document.f2.nat.value="";
  if(k%2!=0)
    document.f2.nat.value = Math.floor((k-1)/2);
}

function nattoi() {
  var k=parseInt(document.f2.nat.value);

  document.f2.imp.value = 2*k+1;
}

function efface3() {
  document.f2.nat.value="";
  document.f2.imp.value="";
}


