// Javascript zur Erzeugung einer HTML-Datei mit Visualisierung des 
// Heron-Algorithmus' zur Approximation von Quadratwurzeln
// Autor: Arndt Brünner, Gelnhausen, September 2001
// Version: 21.8.2003

h='<html>\n<head>\n<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">\n';
h+='<meta name="author" content="Arndt Brünner">\n<link rel=stylesheet type="text/css" href="standard1.css">\n';
h+='<style type="text/css">\n<!--\ntd.bruch{text-align:center;color:#002244; font-size:9pt; line-height:8px;font-family:Courier New;}\n//-->\n</style>\n';
h+='<meta name="generator" name="heron.js - JavaScript von Arndt Brünner">\n</head>\n';
h+='<body bgcolor="#FFFAEE" link="#000066" alink="#000066" vlink="#000066">\n';
f='</body>\n</html>\n';
var zaehler=0,nenner=1,o;

function heron()
{

o=parent.frames[1].document;

a=Number(document.f.a.value.replace(/\,/,"."));
b=Number(document.f.b.value.replace(/\,/,"."));
c=Math.sqrt(a);
if(a<0){alert('Es gibt keine reelle Quadratwurzel aus einer negativen Zahl!');return;}
if(b==0){alert('Da durch b geteilt wird, ist 0 als Startwert nicht möglich!');return;}
if((isNaN(a))||(isNaN(b))) {return;}
o.open();
p(h);
p('<center><p>Gesucht wird die Quadratwurzel von '+String(a).replace(/\./,",")+' \n(= ±'+String(Math.sqrt(a)).replace(/\./,",")+') mit dem Heron-Verfahren:<br>\n');
p('<small>Beachte, wie sich die Werte in den ersten beiden Spalten diesem Wert annähern!</small></p>\n');
p('<table border=1 bgcolor="#EEEEEE" cellpadding=5>\n<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n');
p('<td align=center><p align=center>Annäherung</p><img src="../bilder/b.gif" width="7" height="12"></td>\n<td align=center><p>Kehrwert&nbsp;·&nbsp;a</p><img src="../bilder/a_durch_b.gif" width="9" height="29"></td>\n');
p('<td><center>Mittelwert<br>(bessere Annäherung)<br><img src="../bilder/heron3.gif" width="62" height="59"></center></td>\n');
p('<td><center>&nbsp;&nbsp;&nbsp;b als Bruch&nbsp;&nbsp;&nbsp;</center></td>\n</tr>\n');
i=1;bb=0;zaehler=b;nenner=1;
if(b!=Math.floor(b))GetBruch2(b);
while((bb!=b)&&(i<200))   //Math.abs(Math.abs(b)-c)>0.0000000000001
{
tabrow(a,b,i);
bb=b;
b=(b+a/b)/2;
if(nenner!=0)
{
nn=nenner;
nenner=2*zaehler*nenner;
zaehler=zaehler*zaehler+nn*nn*a;
if((Math.abs(zaehler)<1e+18)&&(Math.abs(nenner)<1e+18)){g=ggT(nenner,zaehler);nenner/=g;zaehler/=g;}else nenner=0;
}
i++;
}
//tabrow(a,b,i);//tabrow(a,b,i+1);
p('</table></center>');
if(i==200) p('<p align="center">(Abbruch nach 200 Schritten)</p>');
p('<p align=center><small>&copy; <a href="mailto:arndt.bruenner@t-online.de">Arndt Brünner</a>, September 2001</small>');
p('\n<hr>\n<p style="margin-top:0;text-align:center"><small><a href="javascript:parent.location=\'../mathekurse.htm\'">Matheseitenüberblick</a></small></p>\n');

p(f);
o.close();
}

function tabrow(a,b,i)
{
t='<tr><td>'+i+'.</td><td>'+String(b).replace(/\./,",")+'</td><td>'+String(a/b).replace(/\./,",")+'</td>';
t+='<td>'+String((b+a/b)/2).replace(/\./,",")+'</td>';
if(nenner!=0){
t+='<td class="bruch">'+zaehler;
if(nenner!=1)
if(Math.abs(nenner)>Math.abs(zaehler))
t+='<br><font face="Courier New">'+"———————————————————————————————————————————".substr(0,(String(nenner).length)*1+1)+'</font><br>'+nenner;
else
t+='<br><font face="Courier New">'+"———————————————————————————————————————————".substr(0,(String(zaehler).length)*1+1)+'</font><br>'+nenner;
//t+='<br>'+"¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾".substr(0,(String(nenner).length)*0.5+1)+'<br>'+nenner;
//else
//t+='<br>'+"¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾".substr(0,(String(zaehler).length)*0.5+1)+'<br>'+nenner;
t+='</td>';
}
t+='</tr>\n';
p(t.replace(/>\,/g,">0,").replace(/\-\,/g,"-0,"));
}

function ggT(a,b)
{
    if (a*b == 0) return 0;
    do
    {
        c = a%b;
        a = b;
        b = c;
    }while (c != 0);
    return a;
}


function p(t)
{
o.write(t);
}

function GetBruch2(x)
{
var i=(t=String(x)).indexOf(".");
if(i==-1) return x;
if((t.length-i>10)||(t.length>15)) return "";
var z=Number(t.substring(0,i)+t.substring(i+1,t.length));
var n=Number(1+"00000000000000000000000000000000000000".substr(0,t.length-i-1));
ggt=ggT(z,n);
zaehler=z/ggt;nenner=n/ggt;
}

function heronn()
{

var n=Math.round(Number(document.f.n.value.replace(/,/,"."))*10000)/10000;if(isNaN(n))return;
if(n<0)return;

var o=parent.frames[1].document;

var a=Number(document.f.aa.value.replace(/\,/,"."));
var b=Number(document.f.bb.value.replace(/\,/,"."));
if((a<0)&&((n%2)==0)){alert('Es gibt keine reelle '+n+'. Wurzel aus einer negativen Zahl!');return;}
if(b==0){alert('Da durch b^'+n+' geteilt wird, ist 0 als Startwert nicht möglich!');return;}
var c=Math.pow(Math.abs(a),1/n)*((a<0)?-1:1),i=0;
var NN=String(Math.round((n-1)*10000)/10000).replace(/\./,","),B=String(b).replace(/\./,","),A=String(a).replace(/\./,","),
C=String(c).replace(/\./,","),N=String(n).replace(/\./,",");
if((isNaN(a))||(isNaN(b))) {return;}
o.open();
p(h);
p('<p>Gesucht wird die '+n+'. Wurzel von '+A+' mit dem verallgemeinerten Heron-Verfahren und der Rekursion:</p>\n');
p('<pre>       '+'                     '.substr(0,NN.length+16)+A+"\n");
p('                  '+NN+'x + '+'————————————————————————'.substr(0,A.length+2)+"\n");
p('                            '.substr(0,NN.length+23)+'x<sup>'+NN+'</sup>'+"\n");
p('        x &#9135;&rarr;    '+'—————————————————————————————————————'.substr(0,(A+NN).length+8)+"\n");
p('                 '+'                          '.substr(0,(A+NN).length/2+4)+N+'</pre>'+"\n");
p('<small>Beachte, wie sich die Werte dem direkt berechneten Wert '+C+' annähern!</small></p>\n');
p('<table align=center border=1 bgcolor="#EEEEEE" cellpadding=5>\n<tr><td>Nr.&nbsp;&nbsp;&nbsp;</td>\n');
p('<td align=center><p align=center>&nbsp;&nbsp;&nbsp;Annäherung&nbsp;&nbsp;&nbsp;</p></td>\n<td align=center><p>Abstand zu <sup>'+N+'</sup>&radic;'+A+'</p></td><tr>\n');
i=1;bb=0;zaehler=b;nenner=1;
if(b!=Math.floor(b))GetBruch2(b);
while((bb!=b)&&(i<200))   //Math.abs(Math.abs(b)-c)>0.0000000000001
{
p('<tr><td>&nbsp;'+i+'</td><td>&nbsp;&nbsp;'+String(b).replace(/\./,",")+'&nbsp;&nbsp;</td>\n<td>&nbsp;&nbsp;');
p(String(Math.abs(b-c)).replace(/\./,",")+'&nbsp;&nbsp;</td></tr>');
bb=b;
b=(b*(n-1)+a/Math.pow(b,n-1))/n;
i++;
}
p('</table>');
if(i==200) p('<p align="center">(Abbruch nach 200 Schritten)</p>');
p('<p align=center><small>&copy; <a href="mailto:arndt.bruenner@t-online.de">Arndt Brünner</a>, September 2001, Version: April 2011</small>');
p('\n<hr>\n<p style="margin-top:0;text-align:center"><small><a href="javascript:parent.location=\'../mathekurse.htm\'">Matheseitenüberblick</a></small></p>\n');

p(f);
o.close();
}

