function WeightSwap(num)
{
  var layer = document.getElementById("weight" + num);
  var layer1 = document.getElementById("weight1");
  var layer2 = document.getElementById("weight2");
 

  layer1.style.visibility="hidden";
  layer2.style.visibility="hidden";
  layer.style.visibility="visible";
}

function TestingSwap(f,num)
{
  var layer = document.getElementById("testing" + num);
  var layer1 = document.getElementById("testing1");
  var layer2 = document.getElementById("testing2");
 

  layer1.style.visibility="hidden";
  layer2.style.visibility="hidden";
  layer.style.visibility="visible";
  
  if(num == 1)
  {
    f.means1.value = "";
    f.means2.value = "";
    f.stdev1.value = "";
    f.stdev2.value = "";
  }else
  {
    f.percent1.value = "";
    f.percent2.value = "";
  }
}

function winpop(target,h,w) 
{
  window.open(target,"StatTesting","height=" + h + ",width=" + w + ",left=30,top=10,toolbars=no,scrollbars=yes,location=no,statusbars=no,menubars=no");
}


// These next 3 routines change the border color of an input box upon focus so the user
// can tell easier where he's at on the form.

function ActiveSet(f,afield)
{
  f.ubase1.style.borderColor = "#444444";
  f.ubase2.style.borderColor = "#444444";
  f.wbase1.style.borderColor = "#444444";
  f.wbase2.style.borderColor = "#444444";
  f.ebase1.style.borderColor = "#444444";
  f.ebase2.style.borderColor = "#444444";
  f.percent1.style.borderColor = "#444444";
  f.percent2.style.borderColor = "#444444";
  f.means1.style.borderColor = "#444444";
  f.means2.style.borderColor = "#444444";
  f.stdev1.style.borderColor = "#444444";
  f.stdev2.style.borderColor = "#444444";
  afield.style.borderColor = "#FFFFFF";
}

function ActiveSet2(f,afield)
{
  f.base.style.borderColor = "#444444";
  f.conf.style.borderColor = "#444444";
  afield.style.borderColor = "#FFFFFF";
}

function ActiveSet3(f,afield)
{
  f.margin.style.borderColor = "#444444";
  f.conf.style.borderColor = "#444444";
  afield.style.borderColor = "#FFFFFF";
}

// This is the routine that does all the heavy lifting for this page.

function calculate( f )
{
  if(f.weights[1].checked && f.overlap[1].checked)
  {
//    alert("No weights, no overlap");
    ubase1 = parseInt(f.ubase1.value); 
    ubase2 = parseInt(f.ubase2.value); 
    perclen1 = f.percent1.value.length;
    perclen2 = f.percent2.value.length;
    percent1 = parseFloat(f.percent1.value)/100;
    percent2 = parseFloat(f.percent2.value)/100;
    meanlen1 = f.means1.value.length;
    meanlen2 = f.means2.value.length;
    mean1 = parseFloat(f.means1.value);
    mean2 = parseFloat(f.means2.value);
    stdev1 = parseFloat(f.stdev1.value);
    stdev2 = parseFloat(f.stdev2.value);

    group1perc = ubase1 * percent1;
    group2perc = ubase2 * percent2;
//    alert("group1perc " + group1perc + " group2perc " + group2perc);
    e0 = 0;
    wsq1 = ubase1 * ubase1 / ubase1;
    wsq2 = ubase2 * ubase2 / ubase2;
//    alert("wsq1 " + wsq1 + " wsq2 " + wsq2);
    r = 0;
    var1 = (stdev1 * stdev1) * (ubase1 - 1); 
    var2 = (stdev2 * stdev2) * (ubase2 - 1); 
//    alert(var1 + " " + var2);
    degfreedom = ubase1 + ubase2 - 1;
//    alert("degfreedom = " + degfreedom);

    if(meanlen1 == 0 && meanlen2 == 0)
    {
//    alert("percent1 = " + percent1);
      if(percent1 < 0 || percent1 > 1)
      {
        alert("Percentage for group 1 must be between 0 and 100");
        f.tval.value = "-";
        f.pval.value = "-";
        f.conf.value = "-";
        f.percent1.focus();
        return;
      }
      if(percent2 < 0 || percent2 > 1)
      {
        alert("Percentage for group 2 must be between 0 and 100");
        f.tval.value = "-";
        f.pval.value = "-";
        f.conf.value = "-";
        f.percent2.focus();
        return;
      }
      s2num = ((group1perc + group2perc)/(ubase1 + ubase2))*(1-((group1perc + group2perc)/(ubase1 + ubase2)));
      s2denom = (1 - (1/(ubase1 + ubase2)));
      tnum = Math.abs(percent1 - percent2);
      tnum1 = percent1 - percent2;
    }else
    {
      s2num = var1 + var2;
      s2denom = (ubase1 - (ubase1/wsq1)) + (ubase2 - (ubase2/wsq2));
      tnum = Math.abs(mean1-mean2);
      tnum1 = mean1 - mean2;
    }
    s2 = s2num/s2denom;
    tdenom = Math.sqrt(s2 * ((1/ubase1)+(1/ubase2)-(2 * r * e0 / (ubase1 * ubase2) )));
//    alert("tnum = " + tnum + " tdenom = " + tdenom + " s2num = " + s2num + " s2denom = " + s2denom);
    
    if(perclen1 == 0 && meanlen1 == 0)
    {
      var tval = "";
      f.tval.value = "-";
      f.pval.value = "-";
      f.conf.value = "-";
    }else
    {
      f.tval.value = Math.round((tnum1 / tdenom)*100)/100;
      var tval = Math.abs(tnum / tdenom);
      pval = forwardT(f,degfreedom,tval);
      if(Math.round(pval*1000)/1000 < .001)
      {
        f.pval.value = "<.001";
      }else
      {
        f.pval.value = Math.round(pval*1000)/1000;
      }
      
      if(pval <= 0.01)
      {
        f.conf.value = "99";
      }else if(pval <= 0.05)
      {
        f.conf.value = "95";
      }else if(pval <= 0.1)
      {
        f.conf.value = "90";
      }else if(pval <= 0.2)
      {
        f.conf.value = "80";
      }else
      {
        f.conf.value = "NOT SIG";
      }
    }
    
  }else if(f.weights[1].checked && f.overlap[0].checked)
  {
//    alert("No weights, with overlap");
    ubase1 = parseInt(f.ubase1.value); 
    ubase2 = parseInt(f.ubase2.value); 
    
    if(ubase1 == ubase2)
    {
      alert("The 2 overlapping bases must have different values (i.e. Total vs. subgroup)");
      f.tval.value = "-";
      f.pval.value = "-";
      f.conf.value = "-";
      f.ubase1.focus();
      return;
    }
    
    perclen1 = f.percent1.value.length;
    perclen2 = f.percent2.value.length;
    percent1 = parseFloat(f.percent1.value)/100;
    percent2 = parseFloat(f.percent2.value)/100;
    meanlen1 = f.means1.value.length;
    meanlen2 = f.means2.value.length;
    mean1 = parseFloat(f.means1.value);
    mean2 = parseFloat(f.means2.value);
    stdev1 = parseFloat(f.stdev1.value);
    stdev2 = parseFloat(f.stdev2.value);

    group1perc = ubase1 * percent1;
    group2perc = ubase2 * percent2;
//    alert("group1perc " + group1perc + " group2perc " + group2perc);
    e0 = Math.min(ubase1,ubase2);
    wsq1 = ubase1 * ubase1 / ubase1;
    wsq2 = ubase2 * ubase2 / ubase2;
//    alert("wsq1 " + wsq1 + " wsq2 " + wsq2);
    r = 1;
    var1 = (stdev1 * stdev1) * (ubase1 - 1); 
    var2 = (stdev2 * stdev2) * (ubase2 - 1); 
//    alert(var1 + " " + var2);
    degfreedom = ubase1 + ubase2 - e0 - 1;
//    alert("degfreedom = " + degfreedom);

    if(meanlen1 == 0 && meanlen2 == 0)
    {
      if(percent1 < 0 || percent1 > 1)
      {
        alert("Percentage for group 1 must be between 0 and 100");
        f.tval.value = "-";
        f.pval.value = "-";
        f.conf.value = "-";
        f.percent1.focus();
        return;
      }
      if(percent2 < 0 || percent2 > 1)
      {
        alert("Percentage for group 2 must be between 0 and 100");
        f.tval.value = "-";
        f.pval.value = "-";
        f.conf.value = "-";
        f.percent2.focus();
        return;
      }
      s2num = ((group1perc + group2perc)/(ubase1 + ubase2))*(1-((group1perc + group2perc)/(ubase1 + ubase2)));
      s2denom = (1 - (1/(ubase1 + ubase2)));
      tnum = Math.abs(percent1 - percent2);
      tnum1 = percent1 - percent2;
    }else
    {
      s2num = var1 + var2;
      s2denom = (ubase1 - (ubase1/wsq1)) + (ubase2 - (ubase2/wsq2));
      tnum = Math.abs(mean1-mean2);
      tnum1 = mean1 - mean2;
    }
    s2 = s2num/s2denom;
    tdenom = Math.sqrt(s2 * ((1/ubase1)+(1/ubase2)-(2 * r * e0 / (ubase1 * ubase2) )));
//    alert("tnum = " + tnum + " tdenom = " + tdenom + " s2num = " + s2num + " s2denom = " + s2denom);
    
    if(perclen1 == 0 && meanlen1 == 0)
    {
      var tval = "";
      f.tval.value = "-";
      f.pval.value = "-";
      f.conf.value = "-";
    }else
    {
      f.tval.value = Math.round((tnum1 / tdenom)*100)/100;
      var tval = Math.abs(tnum / tdenom);
      pval = forwardT(f,degfreedom,tval);
      if(Math.round(pval*1000)/1000 < .001)
      {
        f.pval.value = "<.001";
      }else
      {
        f.pval.value = Math.round(pval*1000)/1000;
      }
      
      if(pval <= 0.01)
      {
        f.conf.value = "99";
      }else if(pval <= 0.05)
      {
        f.conf.value = "95";
      }else if(pval <= 0.1)
      {
        f.conf.value = "90";
      }else if(pval <= 0.2)
      {
        f.conf.value = "80";
      }else
      {
        f.conf.value = "NOT SIG";
      }
    }
    
//    alert("tval = " + tval + " pval = " + pval);
    
  }else if(f.weights[0].checked && f.overlap[1].checked)
  {
//    alert("With weights, no overlap");
    wbase1 = parseFloat(f.wbase1.value); 
    wbase2 = parseFloat(f.wbase2.value); 
    ebase1 = parseFloat(f.ebase1.value); 
    ebase2 = parseFloat(f.ebase2.value); 
    perclen1 = f.percent1.value.length;
    perclen2 = f.percent2.value.length;
    percent1 = parseFloat(f.percent1.value)/100;
    percent2 = parseFloat(f.percent2.value)/100;
    meanlen1 = f.means1.value.length;
    meanlen2 = f.means2.value.length;
    mean1 = parseFloat(f.means1.value);
    mean2 = parseFloat(f.means2.value);
    stdev1 = parseFloat(f.stdev1.value);
    stdev2 = parseFloat(f.stdev2.value);

    group1perc = wbase1 * percent1;
    group2perc = wbase2 * percent2;
//    alert("group1perc " + group1perc + " group2perc " + group2perc);
    e0 = 0;
    wsq1 = wbase1 * wbase1 / ebase1;
    wsq2 = wbase2 * wbase2 / ebase2;
//    alert("wsq1 " + wsq1 + " wsq2 " + wsq2);
    r = 0;
    var1 = (stdev1 * stdev1) * (wbase1 - 1); 
    var2 = (stdev2 * stdev2) * (wbase2 - 1); 
//    alert(var1 + " " + var2);
    degfreedom = ebase1 + ebase2 - 1;
//    alert("degfreedom = " + degfreedom);

    if(meanlen1 == 0 && meanlen2 == 0)
    {
      if(percent1 < 0 || percent1 > 1)
      {
        alert("Percentage for group 1 must be between 0 and 100");
        f.tval.value = "-";
        f.pval.value = "-";
        f.conf.value = "-";
        f.percent1.focus();
        return;
      }
      if(percent2 < 0 || percent2 > 1)
      {
        alert("Percentage for group 2 must be between 0 and 100");
        f.tval.value = "-";
        f.pval.value = "-";
        f.conf.value = "-";
        f.percent2.focus();
        return;
      }
      s2num = ((group1perc + group2perc)/(wbase1 + wbase2))*(1-((group1perc + group2perc)/(wbase1 + wbase2)));
      s2denom = (1 - (1/(ebase1 + ebase2)));
      tnum = Math.abs(percent1 - percent2);
      tnum1 = percent1 - percent2;
    }else
    {
      s2num = var1 + var2;
      s2denom = (wbase1 - (wsq1/wbase1)) + (wbase2 - (wsq2/wbase2));
      tnum = Math.abs(mean1-mean2);
      tnum1 = mean1 - mean2;
    }
    s2 = s2num/s2denom;
    tdenom = Math.sqrt(s2 * ((1/ebase1)+(1/ebase2)-(2 * r * e0 / (ebase1 * ebase2) )));
//    alert(" s2num = " + s2num + " s2denom = " + s2denom + " tnum = " + tnum + " tdenom = " + tdenom);
    
    if(perclen1 == 0 && meanlen1 == 0)
    {
      var tval = "";
      f.tval.value = "-";
      f.pval.value = "-";
      f.conf.value = "-";
    }else
    {
      f.tval.value = Math.round((tnum1 / tdenom)*100)/100;
      var tval = Math.abs(tnum / tdenom);
      pval = forwardT(f,degfreedom,tval);
      if(Math.round(pval*1000)/1000 < .001)
      {
        f.pval.value = "<.001";
      }else
      {
        f.pval.value = Math.round(pval*1000)/1000;
      }
      
      if(pval <= 0.01)
      {
        f.conf.value = "99";
      }else if(pval <= 0.05)
      {
        f.conf.value = "95";
      }else if(pval <= 0.1)
      {
        f.conf.value = "90";
      }else if(pval <= 0.2)
      {
        f.conf.value = "80";
      }else
      {
        f.conf.value = "NOT SIG";
      }
    }
  }else if(f.weights[0].checked && f.overlap[0].checked)
  {
//    alert("With weights, with overlap");
    wbase1 = parseFloat(f.wbase1.value); 
    wbase2 = parseFloat(f.wbase2.value); 
    ebase1 = parseFloat(f.ebase1.value); 
    ebase2 = parseFloat(f.ebase2.value); 
    
    if(wbase1 == wbase2)
    {
      alert("The 2 overlapping bases must have different values (i.e. Total vs. subgroup)");
      f.tval.value = "-";
      f.pval.value = "-";
      f.conf.value = "-";
      f.ubase1.focus();
      return;
    }
    
    perclen1 = f.percent1.value.length;
    perclen2 = f.percent2.value.length;
    percent1 = parseFloat(f.percent1.value)/100;
    percent2 = parseFloat(f.percent2.value)/100;
    meanlen1 = f.means1.value.length;
    meanlen2 = f.means2.value.length;
    mean1 = parseFloat(f.means1.value);
    mean2 = parseFloat(f.means2.value);
    stdev1 = parseFloat(f.stdev1.value);
    stdev2 = parseFloat(f.stdev2.value);

    group1perc = wbase1 * percent1;
    group2perc = wbase2 * percent2;
//    alert("group1perc " + group1perc + " group2perc " + group2perc);
    e0 = Math.min(ebase1,ebase2);
    wsq1 = wbase1 * wbase1 / ebase1;
    wsq2 = wbase2 * wbase2 / ebase2;
//    alert("wsq1 " + wsq1 + " wsq2 " + wsq2);
    r = 1;
    var1 = (stdev1 * stdev1) * (wbase1 - 1); 
    var2 = (stdev2 * stdev2) * (wbase2 - 1); 
//    alert("r = " + r + " var1 = " + var1 + " var2 = " + var2);
    degfreedom = ebase1 + ebase2 - e0 - 1;
//    alert("degfreedom = " + degfreedom);

    if(meanlen1 == 0 && meanlen2 == 0)
    {
      if(percent1 < 0 || percent1 > 1)
      {
        alert("Percentage for group 1 must be between 0 and 100");
        f.tval.value = "-";
        f.pval.value = "-";
        f.conf.value = "-";
        f.percent1.focus();
        return;
      }
      if(percent2 < 0 || percent2 > 1)
      {
        alert("Percentage for group 2 must be between 0 and 100");
        f.tval.value = "-";
        f.pval.value = "-";
        f.conf.value = "-";
        f.percent2.focus();
        return;
      }
      s2num = ((group1perc + group2perc)/(wbase1 + wbase2))*(1-((group1perc + group2perc)/(wbase1 + wbase2)));
      s2denom = (1 - (1/(ebase1 + ebase2)));
      tnum = Math.abs(percent1 - percent2);
      tnum1 = percent1 - percent2;
    }else
    {
      s2num = var1 + var2;
      s2denom = (wbase1 - (wsq1/wbase1)) + (wbase2 - (wsq2/wbase2));
      tnum = Math.abs(mean1-mean2);
      tnum1 = mean1 - mean2;
    }
    s2 = s2num/s2denom;
    tdenom = Math.sqrt(s2 * ((1/ebase1)+(1/ebase2)-(2 * r * e0 / (ebase1 * ebase2) )));
//   alert("tnum = " + tnum + " tdenom = " + tdenom + " s2num = " + s2num + " s2denom = " + s2denom);
    
    if(perclen1 == 0 && meanlen1 == 0)
    {
      var tval = "";
      f.tval.value = "-";
      f.pval.value = "-";
      f.conf.value = "-";
    }else
    {
      f.tval.value = Math.round((tnum1 / tdenom)*100)/100;
      var tval = Math.abs(tnum / tdenom);
      pval = forwardT(f,degfreedom,tval);
      if(Math.round(pval*1000)/1000 < .001)
      {
        f.pval.value = "<.001";
      }else
      {
        f.pval.value = Math.round(pval*1000)/1000;
      }
      
      if(pval <= 0.01)
      {
        f.conf.value = "99";
      }else if(pval <= 0.05)
      {
        f.conf.value = "95";
      }else if(pval <= 0.1)
      {
        f.conf.value = "90";
      }else if(pval <= 0.2)
      {
        f.conf.value = "80";
      }else
      {
        f.conf.value = "NOT SIG";
      }
    }
    
//    alert("tval = " + tval + " pval = " + pval);
  }
}

function Reliability1(f)
{
  base = parseInt(f.base.value); 
  conf = parseFloat(f.conf.value)/100;

  p = conf+(1-conf)/2;
  z = backwardNormal(p);
  left = Math.round(z*1000)/1000;
  right = Math.sqrt(0.5*(1-0.5)/base);
  margin = left * right;
//  alert("p = " + p + " z = " + z + " left = " + left + " right = " + right);
  margin = Math.round(margin*1000)/10;
  f.margin.value = margin;

}

function Reliability2(f)
{
  margin = parseFloat(f.margin.value)/100; 
  conf = parseFloat(f.conf.value)/100;

  p = conf+(1-conf)/2;
  z = backwardNormal(p);
  left = Math.round(z*1000)/1000;
  right = Math.sqrt(0.5*(1-0.5))/margin;
  base = (left * right) * (left * right);
//  alert("p = " + p + " z = " + z + " left = " + left + " right = " + right);
  base = Math.round(base);
  f.base.value = base;

}



//------------- T-DISTRIBUTION FUNCTIONS -----------------------------------

function backwardNormal(p) {
// Beasley Springer approx. to inverse norm, Applied Stats. 26, 118-121.
// See: J.H.Maindonald "Statistical Computation" p.295, ISBN 0-471-86452-8.

    var normType = 'left';

    if (p<0 || p>1) zval=""
    else {
        var negative = checkneg(p, normType);
        p = diddle(p, normType, 'half', negative);
        var z = Norm_z(p);
        if (negative) z=-z;
        zval=RoundSF(z, 4);
    }
    return zval;
}

function Norm_p(z) {
// Returns the two-tailed standard normal prob. level given a z.
    var absz = Math.abs(z),
        a1 = 0.0000053830, a2 = 0.0000488906, a3 = 0.0000380036,
        a4 = 0.0032776263, a5 = 0.0211410061, a6 = 0.0498673470;
    var p = (((((a1*absz+a2)*absz+a3)*absz+a4)*absz+a5)*absz+a6)*absz+1;
    p = Math.pow(p, -16);
    return p
}

function RoundDP(x, dp) {
// Rounds x to dp decimal places.
    var powten = Math.pow(10, dp);
    return (Math.round(x*powten)/powten)
}

function forwardT(form, df,t) {
// Hill's approx. to cumulative t-dist, Commun. A.C.M. 13,alg. 396, 617-619.
// See: J.H.Maindonald, Computational Statistics, 295, ISBN 0-471-86452-8.
// Calculates p given t and tail type.
    var normType = 'twotail';
    var tType = 'twotail';

    if (!t || !df || df<1) pval = ""
    else {
        pval = T_p(t, df);
        pval = diddle(pval,'twotail', tType, t<0);
        pval = RoundDP(pval, 4)
        return pval;
    }
}

function T_p(t, df) {
// Returns two-tail probability level given t and df.
    with (Math) {
        var abst = abs(t), tsq = t*t, p;
        if      (df == 1) p = 1 - 2*atan(abst)/PI
        else if (df == 2) p = 1 - abst/sqrt(tsq + 2)
        else if (df == 3) p = 1 - 2*(atan(abst/sqrt(3)) + abst*sqrt(3)/(tsq + 3))/PI
        else if (df == 4) p = 1 - abst*(1 + 2/(tsq + 4))/sqrt(tsq + 4)
        else {
// finds the z equivalent of t and df st they yield same probs.
            var z = T_z(abst, df);
            if (df>4) p = Norm_p(z)
                 else p = Norm_p(z); // small non-integer df
        }
    }
    return p
}


function T_z(t, df) {
// Converts a t value to an approximate z value w.r.t the given df
// s.t. std.norm.(z) = t(z, df) at the two-tail probability level.
    var A9 = df - 0.5,
        B9 = 48*A9*A9,
        T9 = t*t/df, Z8, P7, B7, z;
    with (Math) {
        if (T9 >= 0.04) Z8 = A9*log(1+T9)
            else  Z8 = A9*(((1 - T9*0.75)*T9/3 - 0.5)*T9 + 1)*T9;
        P7 = ((0.4*Z8 + 3.3)*Z8 + 24)*Z8 + 85.5;
        B7 = 0.8*pow(Z8, 2) + 100 + B9;
        z = (1 + (-P7/B7 + Z8 + 3)/B9)*sqrt(Z8);
        return z
    }
}

function diddle(p, fromType, toType, negative) {
// converts p's tailType from fromType to toType via 'left'
// negative is logical, indicating a negative deviate: see checkneg
    var newp = any2left(p, fromType, negative);
        newp = left2any(newp, toType, negative);
    return newp
}

function any2left(p, from, negative) {
// converts any tailType to 'left'

   if (from=='left') return p;
   if (from=='right') return (1-p);     // no negative check for these

   if (from=='twotail')         p = 1 - p/2
   else if (from=='middle')     p = p/2 + 0.5
   else if (from=='half')       p = p + 0.5;

   if (negative) p = 1-p;
   return p
}

function left2any(p, to, negative) {
// converts p from tailType 'left' to any other

    if (to=='left')     return p;
    if (to=='right')    return (1-p);

    if (negative) p = 1-p;                      // corrects to p>0.5;

    if (to=='twotail')  return 2*(1-p);
    if (to=='middle')   return (2*p-1);
    if (to=='half')     return (p-0.5)
}

function RoundSF(x, sf) {
// Rounds x to sf significant figures, but max 6 decimal places.
    if (x==0) return 0;
    with (Math) {
        var magnitude = ceil(log(abs(x))/LN10); // digits before decimal point
        var dp = max(0, min(6, sf-magnitude));  // no rounding left of the .
        return RoundDP(x, dp)
    }
}


function checkneg(p, tailType) {
// determines whether this p implies a negative deviate
        var negative=false;
        if (tailType=='left' & p<0.5) negative=true;
        if (tailType=='right' & p>0.5) negative=true;
        return negative
}

function Norm_z(p) {
// Returns z given a half-middle tail type p.

    var a0= 2.5066282,  a1=-18.6150006,  a2= 41.3911977,   a3=-25.4410605,
        b1=-8.4735109,  b2= 23.0833674,  b3=-21.0622410,   b4=  3.1308291,
        c0=-2.7871893,  c1= -2.2979648,  c2=  4.8501413,   c3=  2.3212128,
        d1= 3.5438892,  d2=  1.6370678, r, z;

    if (p>0.42) {
        r=Math.sqrt(-Math.log(0.5-p));
        z=(((c3*r+c2)*r+c1)*r+c0)/((d2*r+d1)*r+1)
    }
    else {
        r=p*p;
        z=p*(((a3*r+a2)*r+a1)*r+a0)/((((b4*r+b3)*r+b2)*r+b1)*r+1)
    }
    return z
}
