(* This uses Newton's general method to approximate a square root in Klein's wonderful world of integers. The generalized method can be used to compute the roots of any (real-valued) function. If we know that we are computing a square root, an even simpler form of Newton's method works: guess = (n/guess + guess) / 2. *) function ABS( n : integer ) : integer (* from the Klein library *) if n < 0 then -n else n function f( x : integer, n : integer ) : integer x * x - n function df( x : integer ) : integer 2 * x function newtonAux( guess : integer, previous : integer, epsilon : integer, n : integer ) : integer if epsilon < ABS(previous-guess) then newtonAux( guess - f(guess,n)/df(guess), guess, epsilon, n ) else guess function newton( guess : integer, epsilon : integer, n : integer ) : integer newtonAux( guess - f(guess,n)/df(guess), guess, epsilon, n ) function main(n : integer, epsilon : integer) : integer newton(n/2, epsilon, n)