// Vielfach verwendete Funktionen

//  cpik(zahl)
//  cut_nk(ptext)
//  suche_ersetze(suchtext,suche,ersetze)
//  k_f(k,wo,flag)
//  k_x(k,flag)
//  form_fkt_gl()
//  klammertest(t)
//  translate(t)
//  parsefind(t,i,r)
//  DezToBruch(d)  erwartet string
//  GetBruch2(x)
//  ggT(a,b)
//  dez_to_bruch_1(d) erwartet zahl
//  GetBruch2a(x)
//  und diverse trigonometrische Funktionen (am Ende)





// -------------------------------------------------------------
// globale Variablen
var trigo=0,grad_rad,rad_grad;
// -------------------------------------------------------------




// ---------------------------------------------------------------------- //
function cpik(zahl)
// wandelt Zahl in String und ersetzt Dezimalpunkt durch Komma
// Rückgabewert: Zahlenstring
// z.B. 4.15 -- 4,15
 {
   var zs="", p=0, k=",";
   zs = String(zahl);
   p = zs.indexOf('.');
   if ( p != -1)
      {
        zs = zs.substring(0,p)+k+zs.substring(p+1,zs.length);
      }
   return zs;
 }

// ---------------------------------------------------------------------- //

function cut_nk(ptext)
// entfernt aus einem String das Komma und alle Nullen danach
// z.B. 2,000 -- 2 aber 2,001 -- 2,001
 {
  var i, unfertig=true;
  for ( i=ptext.length-1; i >=ptext.indexOf(",") && unfertig; i-- )
   {
     if( ptext.substring(i,i+1) == "0" )
       {
        ptext=ptext.substring(0,i);
        //alert("text= "+i+"="+ptext);
       }
    else
      {
       unfertig=false;
       //alert("fertigtext= "+i+"="+ptext);
      }
    }

  if ( ptext.substring(ptext.length-1,ptext.length) == ",")
     {
       ptext=ptext.substring(0,ptext.length-1);
       //alert("fertigtext ohne komma= "+ptext);
     }
   return ptext;
 }

// ---------------------------------------------------------------------- //

// In einem String wird gesucht und ersetzt
function suche_ersetze(suchtext,suche,ersetze)
 {
  var re=new RegExp(suche,"g");
  return suchtext.replace(re,ersetze);
 }

// ---------------------------------------------------------------------- //

// formatiert Koeffizienten
function k_f(k,wo,flag)
 {
  var bruch=false;

  if (flag == "1")
     bruch = true;

  if(wo=="k")   // für koeffizienten und koordinaten
   {
     if ( k.toFixed(4) ==  1 ) return "1";
     if ( k.toFixed(4) == -1 ) return "-1";
     if ( k.toFixed(4) ==  0 ) return "0";
     if (bruch)
     {
     if ( k.toFixed(4) > 0 && k.toFixed(4) !=  1 ) return dez_to_bruch_1(k);
     if ( k.toFixed(4) < 0 && k.toFixed(4) != -1 ) return "-"+dez_to_bruch_1(Math.abs(k));
     }
    else
     {
      if ( k.toFixed(4) > 0 && k.toFixed(4) !=  1 ) return cut_nk(cpik(k.toFixed(3)));
      if ( k.toFixed(4) < 0 && k.toFixed(4) != -1 ) return "-"+cut_nk(cpik(Math.abs(k).toFixed(3)));
     }
   }

  if ( k.toFixed(4) ==  0 ) return "";

  if(wo=="a") // erster koeffizient für funktionsterm
   {
    if ( k.toFixed(4) ==  1 ) return "";
    if ( k.toFixed(4) == -1 ) return " - ";
    if (bruch)
     {
     if ( k.toFixed(4) < 0 && k.toFixed(4) != -1 ) return " -"+dez_to_bruch_1(Math.abs(k));
     if ( k.toFixed(4) > 0 && k.toFixed(4) !=  1 ) return dez_to_bruch_1(k);
     }
    else
     {
      if ( k.toFixed(4) < 0 && k.toFixed(4) != -1 ) return " -"+cut_nk(cpik(Math.abs(k).toFixed(3)));
      if ( k.toFixed(4) > 0 && k.toFixed(4) !=  1 ) return cut_nk(cpik(k.toFixed(3)));
     }
   }

  if(wo=="m")  // mittlerer koeffizient für funktionsterm
   {
    if ( k.toFixed(4) ==  1 ) return " + ";
    if ( k.toFixed(4) == -1 ) return " - ";
    if (bruch)
     {
     if ( k.toFixed(4) < 0 && k.toFixed(4) != -1 ) return " - "+dez_to_bruch_1(Math.abs(k));
     if ( k.toFixed(4) > 0 && k.toFixed(4) !=  1 ) return " + "+dez_to_bruch_1(k);
     }
    else
     {
      if ( k.toFixed(4) < 0 && k.toFixed(4) != -1 ) return " - "+cut_nk(cpik(Math.abs(k).toFixed(3)));
      if ( k.toFixed(4) > 0 && k.toFixed(4) !=  1 ) return " + "+cut_nk(cpik(k.toFixed(3)));
     }
   }

  if(wo=="e") // letzter koeffizient für funktionsterm
   {
    if ( k.toFixed(4) ==  1 ) return " + 1";
    if ( k.toFixed(4) == -1 ) return " - 1";
    if (bruch)
     {
     if ( k.toFixed(4) < 0 && k.toFixed(4) != -1 ) return " - "+dez_to_bruch_1(Math.abs(k));
     if ( k.toFixed(4) > 0 && k.toFixed(4) !=  1 ) return " + "+dez_to_bruch_1(k);
     }
    else
     {
      if ( k.toFixed(4) < 0 && k.toFixed(4) != -1 ) return " - "+cut_nk(cpik(Math.abs(k).toFixed(3)));
      if ( k.toFixed(4) > 0 && k.toFixed(4) !=  1 ) return " + "+cut_nk(cpik(k.toFixed(3)));
     }
   }

 }

// ---------------------------------------------------------------------- //

// formatiert alle Koeffizienten für form_fkt_gl()
function k_x(k,flag)
 {
  var bruch=false;

  if (flag == "1")
     bruch = true;

  if ( k.toFixed(4) ==  1 ) return " + ";
  if ( k.toFixed(4) == -1 ) return " - ";

  if(bruch)
   {
     if( k.toFixed(4) < 0 && k.toFixed(4) != -1 ) return " - "+dez_to_bruch_1(Math.abs(k));
     if( k.toFixed(4) > 0 && k.toFixed(4) !=  1 ) return " + "+dez_to_bruch_1(k);
     return "0";
   }
  else
   {
     if( k.toFixed(4) < 0 && k.toFixed(4) != -1 ) return " - "+cut_nk(cpik(Math.abs(k).toFixed(3)));
     if( k.toFixed(4) > 0 && k.toFixed(4) !=  1 ) return " + "+cut_nk(cpik(k.toFixed(3)));
     return "0";
   }
 }

// ---------------------------------------------------------------------- //

function form_fkt_gl(flag)  // formatiert die Funktionsgleichung
 {
   var text=new Array();
   var ptext="",nullenz=0;

   var bruch=false;

  if (flag == "1")
     bruch = true;

   var ai=new Array();
   var ttext="";

   for( i=0; i<=kmax; i++)
    {
     ai[i]="";
    }

   for( i=0; i<=kmax; i++)
    {
     ai[i]=k_x(a[i],flag);
    }

   for( i=0; i<=kmax; i++)  // zählt alle Nullkoeffizienten
    {
      if( a[i] == 0 )
        {
          nullenz=nullenz+1;
        }
    }

   //alert(nullenz);

  if( nullenz != kmax+1 )     // nicht alles ist Null
    {

     for( i=0; i<=kmax; i++)
      {
       if( ai[kmax-i] != "0")
         ttext=ttext+ai[kmax-i]+"x<sup>"+(kmax-i)+"</sup>";
      }
       //alert("ttext = "+ttext);

     //for( i=0; i<=kmax; i++)
      //{
        // 0x hoch... durch "" ersetzen
       //ttext=suche_ersetze(ttext,"</sup>0x<sup>"+i+"</sup>","</sup>");
      //}
      //alert("ttext = "+ttext);
      ttext=suche_ersetze(ttext,"x<sup>"+1+"</sup>","x");   // x hoch 1 durch x ersetzen
      ttext=suche_ersetze(ttext," x<sup>"+0+"</sup>"," 1");  // _x hoch Null durch _1 ersetzen
      ttext=suche_ersetze(ttext,"x<sup>"+0+"</sup>","");     //  ax hoch 0 durch a ersetzen

      //alert(ttext.indexOf("+"));
      if ( ttext.indexOf("+") == 1 )
        {
         ttext = ttext.slice(2);  // die ersten beiden Zeichen hier +_ entfernen
        //alert("ttext = "+ttext);
        }
    return ttext;
   }
   else
   {
     ttext = "0";
     return ttext;
   }
 }

 // ---------------------------------------------------------------------- //


 function klammertest(t)   // testet Klammerausdrücke
 {
   for( i = 0 ; i < t.length ; i++ )
    {
      if( (t.charAt(i) != "(") && (t.charAt(i) != ")") )

        {
         t = t.substr(0,i)+" "+t.substring(i+1,t.length);
        }
    }

      t = t.replace(/ /g,"");  // ersetzt nix durch ""

      do
       {
         t=t.replace(/\(\)/,"");  // ersetzt () durch ""
       }
      while(t.indexOf("()") > -1);

     return (t=="");
 }

 // ---------------------------------------------------------------------- //

function translate(t)
 {
  var d, i, ii, iii, j, j0, j1, k, n, ts, tt;

  var MultErg=new Array(/\d[a-z]/,/\d\(/,/\)\(/,/x\(/,/\)x/,/pi\(/,/e_\(/,/\dpi/,/\de_/,/\)[a-z]/);

  for(j=0;j<MultErg.length;j++)
    do{
       i=t.search(MultErg[j]);
       if(i==-1)
          break;
       t=t.substr(0,i+1)+"*"+t.substring(i+1,t.length);
       }
    while(true);

  t="("+t+")";
  n=0;
  j=0,k=0,i=0;
  t=t.replace(/'/g,"^");

  if(t.indexOf("^")>-1)
    for(i=0;i<t.length;i++)
      if (t.substr(i,1)=="^")
        {
         j=parsefind(t,i,-1);
         k=parsefind(t,i,1);
         t=t.substring(0,j+1)+ "Math.pow("+ t.substring(j+1,i)+ ","+t.substring(i+1,k)+")"+ t.substring(k,t.length);
         n++;
         if(n>15)
           break;
       }
    n=0;

  if(t.indexOf("!")>-1)
    for(i=0;i<t.length;i++)
      if (t.substr(i,1)=="!")
       {
        j=parsefind(t,i,-1);
        t=t.substring(0,j+1) + "fak(" + t.substring(j+1,i)+")"+ t.substring(i+1,t.length);
        n++;
        if(n>15)
          break;
       }

  if(t=="")
    return "(0)";

  if(t==null)
    return;

  tt=t;
  t=t.replace(/solve/g,"solvä");
  t=t.replace(/eile/g,"äilä");
  t=t.replace(/legendre/g,"lägändrä");
  t=t.replace(/factor_vec/g,"factor_väc");
  t=t.replace(/newton/g,"näwton");
  t=t.replace(/fresnelc/gi,"fräsnälc");
  t=t.replace(/fresnels/gi,"fräsnäls");
  t=t.replace(/\n/g,"").replace(/\r/g,"");
//        t=t.replace(/\+/g,"+");
  t=t.replace(/\-/g,"-");
  t=t.replace(/\—/g,"-");
  t=t.replace(/\–/g,"-");
  t=t.replace(/\·/g,"*");
  t=t.replace(/\*/g,"*");
  t=t.replace(/\//g,"/");
  t=t.replace(/modpow/gi,"m@dp@w");
  t=t.replace(/modmult/gi,"m@dmult");
  t=t.replace(/mod/gi,"%");
  t=t.replace(/ \^ /g,"^");
  t=t.replace(/Math\./g,"").replace(/sqrt/g,"sqr");
  t=t.replace(/pow/gi,"Math.pow");
  t=t.replace(/m\@dp\@w/g,"modpow");
  t=t.replace(/m\@dmult/g,"modmult");

  //if (trigo==0)
 // {
        t=t.replace(/atanh/gi,"at~anh");
        t=t.replace(/asinh/gi,"as~inh");
        t=t.replace(/acosh/gi,"ac~osh");
        t=t.replace(/sinh/gi,"sinh");
        t=t.replace(/cosh/gi,"cosh");
        t=t.replace(/tanh/gi,"tanh");
        t=t.replace(/coth/gi,"coth");
        t=t.replace(/acoth/gi,"cot");
        t=t.replace(/atan/gi,"at~an");
        t=t.replace(/asin/gi,"as~in");
        t=t.replace(/acos/gi,"ac~os");
        t=t.replace(/acot/gi,"cot");
        t=t.replace(/sin/gi,"sin");
        t=t.replace(/cos/gi,"cos");
        t=t.replace(/tan/gi,"tan");
        t=t.replace(/cot/gi,"cot");
        t=t.replace(/ascsh/gi,"ascsh");
        t=t.replace(/ascs/gi,"ascs");
        t=t.replace(/scsh/gi,"scsh");
        t=t.replace(/scs/gi,"scs");
        t=t.replace(/°/g,"*(pi)/180");
 // }

  if(trigo==1)   // Bogenmaß
    t=t.replace(/°/g,"");

  t=t.replace(/sqrt/gi,"sqr");
  t=t.replace(/sqr/gi,"Math.sqrt");
  t=t.replace(/abs/gi,"Math.abs");
  t=t.replace(/int/gi,"Math.floor");
  t=t.replace(/log\(/gi,"Math.log(");
  t=t.replace(/ln/gi,"Math.log");
  t=t.replace(/geoM/gi,"gäoM");
  t=t.replace(/asech/gi,"asäch");
  t=t.replace(/sech/gi,"säch");
  t=t.replace(/asec/gi,"asäc");
  t=t.replace(/sec/gi,"säc");
  t=t.replace(/exp/gi,"Math.ä@p");
  t=t.replace(/cent/gi,"cänt");
  t=t.replace(/sv\(/gi,"sv(");
  t=t.replace(/kgv/gi,"kgV");
  t=t.replace(/ggt/gi,"ggT");
  t=t.replace(/x/g,"X").replace(/y/g,"Y");
  t=t.replace(/pi/gi,"Math.PI");
  t=t.replace(/\de/gi,"ä");
  t=t.replace(/e/gi,"(Math.E)");
  t=t.replace(/ä/g,"e").replace(/@/g,"x");
  t=t.replace(/\~/g,"");
  t=t.replace(/\|/g,","); //alert(t);

  if(t.indexOf("solve(")>-1)
    {
     i=0;
     ii=0;
     ts=t;
     do
       {
        iii=ts.indexOf("solve(");
        if(iii==-1)
          break;
        ii=parsefind(ts,iii,1);
        t=t.substr(0,iii+i+6)+"'"+t.substring(iii+i+6,ii+i-1)+"'"+t.substring(ii+i-1,t.length);
        i+=iii+1;
        ts=ts.substring(ii+1,ts.length);
       }
     while(true);
    }

  while(t.search(/p\d/)>-1)
   {
    i=t.search(/p\d/);
    j0=parsefind(t,i,-1);
    j1=parsefind(t,i,1);
    d=DezToBruch(t.substring(j0+1,j1));
    t=t.substr(0,j0+1)+"("+d+")"+t.substring(j1,t.length);
   }

  if (t=="")
    t="0";
  //alert(t);
  return t.substr(1,t.length-2);
 }

// ------------------------------------------------------------------------------

function parsefind(t,i,r)
 {
  var j, k, L_, u;

  L_=t.length, k=0, j=0;
  for(j=i+r;(j<L_)&&(j>=0);j+=r)
   {
    u=t.substr(j,1);
    if(u=="(")
      k++;
    else if(u==")")
      k--;
   if(k*r<0)
     return j;
if((k==0)&&((u=="+")||(u=="-")||(u=="*")||(u=="/")||(u==";")||(u==",")||(u=="=")||(u=="\"")||(u=="'")||(u=="|")||(j+r==L_+1)||(j+r==-1)))
     return j;
   }
  return j;
 }

// ------------------------------------------------------------------------------


function DezToBruch(d)     // erwartet zahlenstring
 {
  var bruch;
  var g="", ggt;
  var ib, ik, ip;
  var n1, n2, nn;
  var p;
  var ub=false;    // unechter bruch
  var z1, zz;

  d=d.replace(/,/g,".").replace(/ +/g,"");
  if(Number(d)<0)
   {
    g="-";
    d=d.substring(2,d.length);
   }

  ik=d.indexOf(".");
  if(ub)
   {
    g+=d.substr(0,ik)+" ";
    d="0."+d.substring(ik+1,d.length);
    ik=1;
   }

  if(d=="")
    return "";

  ip=d.indexOf("p");

  if(ip<0)
    ip=d.length;

  bruch=GetBruch2(d.substr(0,ip));    // aufruf von GetBruch2

  if(ip==d.length)
    return g+bruch;

  if(ik==-1)
    return "";

  p=d.substr(ip+1,d.length-ip);
  if (p.length==0)
    return "";

  ib=bruch.indexOf("/");
  z1=Number(bruch.substr(0,ib));
  n1=Number(bruch.substr(ib+1,bruch.length-ib));
  n2=Number("999999999999999999999".substr(0,p.length)+"00000000000000000".substring(ik+1,ip));
  nn=n1*n2/ggT(n1,n2);
  zz=z1*nn/n1+p*nn/n2;
  ggt=ggT(nn,zz);
  nn/=ggt;
  zz/=ggt;
  if((ub)&&(g!=0))
    return g+zz+"/"+nn;
  else
    return zz+"/"+nn;      // rückgabe bruchstring
}

// ------------------------------------------------------------------------------

function GetBruch2(x)
 {
  var ggt, i, n, t, vorz="", z;

  if(String(x).indexOf("e")>-1)
    return x;

  if(x<0)
   {
    x=-x;
    vorz="-";
   }

  i=(t=String(x)).indexOf(".");
  if(i==-1)
    return vorz+x;

  if((t.length-i>10)||(t.length>15))
    return "";

  z=Number(t.substring(0,i)+t.substring(i+1,t.length));
  n=Number(1+"00000000000000000000000000000000000000".substr(0,t.length-i-1));
  ggt=ggT(z,n);
  return vorz+(z/ggt)+"/"+(n/ggt);
}

// ------------------------------------------------------------------------------

function ggT(a,b)
 {
  var c;
  if((isNaN(a))||(isNaN(b)))
    return 1;

  if(((a%1)!=0)||((b%1)!=0))
    return 1;

  a=Number(a);
  b=Number(b);

  if (a*b == 0)
    return 1;

  do
   {
    c = a%b;
    a = b;
    b = c;
   }
  while (c != 0);
  return a;
}

// ------------------------------------------------------------------------------

// verwandelt dezimalzahl in einen bruch
function dez_to_bruch_1(d)   // erwartet zahl
 {
  var a2, a1, a0, b2, b1, b0, aa;
  var b, bb, B;
  var c;
  var m=1;
  var neg=false, nm=1, nn = 1000 ;   // nn max nenner
  var q;
  var r, rr;
  var t="";
  var zm=1;

   if( d < 0 )
      {
      neg = true;
      d = Math.abs(d);
      }

  b=GetBruch2a(d);    // b ist ein string z.B. 1/5

  if(String(b).indexOf("/")==-1)
    {
     t+=b+"/1\t = "+b+"\r\n";
     nm=1;
     zm=b;
     m=0;

     if (neg)
       return "- "+zm;

     return zm;
    }

   B=b.split("/"), r=Number(B[1]),q=Number(B[0]);
   rr=q%r,c=r;
   q=Math.floor(q/r);
   r=rr;
   a2=0,a1=1,a0=q,b2=1,b1=0,b0=1;
   while(b0<=nn)
      {
        t+=a0+"/"+b0+"\t = "+(a0/b0)+"\r\n";
        q=Math.floor(c/r);
        rr=c%r;
        c=r;
        r=rr;
        aa=q*a0+a1;
        a2=a1;
        a1=a0;
        a0=aa;
        bb=q*b0+b1;
        b2=b1;
        b1=b0;
        b0=bb;
        //alert("a0="+a0+"\nb0="+b0+"\nb="+q+"\na1="+a1+"\nb1="+b1+"\na2="+a2+"\nb2="+b2);
      }
  nm=b1;
  zm=a1;
  m=Math.abs(d-zm/nm);

  if (neg)
     return "- "+zm+"/"+nm;

  return zm+"/"+nm;
 }

// --------------------------------------------------------------------------

function GetBruch2a(x)
{
  var ggt, i, n, t, z;

  x=x.toFixed(12);
  t=String(x);
  i=t.indexOf(".");
  //i=(t=String(x)).indexOf(".");
  if(i==-1) return x;
  if((t.length-i>20)||(t.length>25)) return "";

  z=Number(t.substring(0,i)+t.substring(i+1,t.length));
  n=Number(1+"00000000000000000000000000000000000000".substr(0,t.length-i-1));
  ggt=ggT(z,n);
  //alert("x = "+x+"\n t = "+t+"\n i = "+i+"\n z = "+z+"\n n = "+n+"\n ggt = "+ggt+"\n returnwert = "+z/ggt+"/"+n/ggt);

  if( n/ggt == 1 )
  return z/ggt;

  return z/ggt+"/"+n/ggt;

}

// ------------------------------------------------------------------------------
































function sin(x)
// global: grad_rad rad_grad
 {
  return Math.sin(x*grad_rad);
 }

function cos(x){return Math.cos(x*grad_rad);}
function tan(x){return Math.tan(x*grad_rad);}
function asin(x){return Math.asin(x)*rad_grad;}
function acos(x){return Math.acos(x)*rad_grad;}
function atn(x){return atan(x);}
function atan(x){return Math.atan(x)*rad_grad;}
function logY(x,y){return Math.log(x)/Math.log(y);}
function log2(x){return Math.log(x)/Math.log(2);}
function log10(x){return Math.log(x)/Math.log(10);}
function harM(x,y){return 2/(1/x+1/y);}
function geoM(x,y){return Math.sqrt(x*y);}
function sgn(x){return (x>0)?1:(x==0)?0:-1;}
function cent(x){return logY(x,2)*1200;}
function sv(x){return Math.pow(2,(x/1200));}
function frac(x){return Math.abs(x)-Math.floor(Math.abs(x));}
function ggT3(a,b,c){return ggT(ggT(a,b),c);}
function ggT4(a,b,c,d){return ggT(ggT(a,b),ggT(d,c));}
function ggT5(a,b,c,d,e){return ggT(ggT3(a,b,c),ggT(d,e));}
function ggT6(a,b,c,d,e,f){return ggT(ggT3(a,b,c),ggT(d,e,f));}
function kgV3(a,b,c){return kgV(kgV(a,b),c);}
function kgV4(a,b,c,d){return kgV(kgV(a,b),kgV(d,c));}
function kgV5(a,b,c,d,e){return kgV(kgV3(a,b,c),kgV(d,e));}
function kgV6(a,b,c,d,e,f){return kgV(kgV3(a,b,c),kgV3(d,e,f));}
function cot(z){return cos(z)/sin(z);}
function sec(z){return 1/cos(z);}
function csc(z){return 1/sin(z);}
function acot(z){return Math.PI/2*rad_grad-atan(z);}
function asec(z){return acos(1/z);}
function acsc(z){return asin(1/z);}
function sinh(x){x*=grad_rad; return (Math.exp(x)-Math.exp(-x))/2 ;}
function cosh(x){x*=grad_rad; return (Math.exp(x)+Math.exp(-x))/2 ;}
function tanh(x){x*=grad_rad; return (Math.exp(2*x)-1)/(Math.exp(2*x)+1) ;}
function coth(z){return 1/tanh(z) ;}
function sech(z){z*=grad_rad; return 2*Math.exp(z)/(Math.exp(2*z)+1) ;}
function csch(z){z*=grad_rad; return 2*Math.exp(z)/(Math.exp(2*z)-1) ;}
function asinh(x){return rad_grad*Math.log(Math.sqrt(x*x+1)+x) ;}
function acosh(x){return rad_grad*Math.log(Math.sqrt(x*x-1)+x) ;}
function atanh(x){return rad_grad*((Math.log(x+1)-Math.log(1-x))/2) ;}
function acoth(z){return rad_grad*Math.log((z+1)/(z-1))/2 ;}
function asech(z){return rad_grad*Math.log((Math.sqrt(-z*z+1)+1)/z) ;}
function acsch(z){return rad_grad*Math.log((sgn(z)*Math.sqrt(z*z+1)+1)/z) ;}
function fresnels(x){return FresnelS(x);}
function fresnelc(x)
 {
  return FresnelC(x);
 }

function FresnelS(x)
 {
  var x3=x*x*x,x4=x3*x;
  return -x3*(((((((3933*x4-948290)*x4+173660760)*x4-23124301200)*x4+2108936269440)*x4-120784531795200)*x4+3.796085284992E+15)*x4-5.3145193989888E+16)/1.59435581969664E+17;
 }


function FresnelC(x)
 {
  var x2=x*x,x4=x2*x2;
return x*((((((((x4/690452066304000-1/2528170444800)*x4+1/11975040000)*x4-1/76204800)*x4+1/685440)*x4-1/9360)*x4+1/216)*x4-1/10)*x4+1);
 }



















