5次方程式の解を動かすソースコード

<script src="http://cdnjs.cloudflare.com/ajax/libs/jsxgraph/0.99.3/jsxgraphcore.js" type="text/javascript"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/mathjs/2.4.2/math.min.js" type="text/javascript"></script>
<div id="jxgbox" class="jxgbox" style="width: 700px; height: 700px;"> </div>
<script type="text/javascript">// <![CDATA[
 var board = JXG.JSXGraph.initBoard('jxgbox', {boundingbox: [-2.5, 2.5, 2.5, -2.5], axis:true});
 var p = board.create('point',[0,0], {name:'a', size:3, color:'blue'});
 var roots = new Array(5);
 function func_x(x0) {
   var j = x0;
   return function(){return roots[j].re;}
  };
  function func_y(y0) {
   var j = y0;
   return function(){return roots[j].im;}
  };
 
 for(var i = 0; i < 5 ; i++) {
   roots[i] = math.complex( math.cos(2*math.pi*i/5), math.sin(2*math.pi*i/5) );                       
   board.create('point',[func_x(i), func_y(i)], {name:i, face:'[]', size:3});
 };
 function find_roots() {
  var i;
  for(var i = 0; i < 5 ; i++) {
    var z = roots[i];
    var a = math.complex(p.X(), p.Y());
    var cond = math.compile("z^5 + a*z - 1");
    var next_z = math.compile("z - (z^5 + a*z - 1)/(5*z^4 + a)");
    while( math.abs( cond.eval({z: z, a: a}) ) > 0.001 ) {
        z = next_z.eval({z: z, a: a});
    };
    roots[i] = z;
  };
 };
 function updFunc() {
   find_roots();
 };
 var hookid = board.addHook(updFunc);
// ]]>
</script>