(from Paulson)
fun gcd( m, n ) =
if m = 0 then n
else gcd( n mod m, m );
fun power( x, k ) =
if k = 1 then x
else if k mod 2 = 0 then power( x * x, k div 2 )
else x * power( x * x, k div 2 );