/* to compute x^n in a monoid (M,o,u) */ M power(x:M,n:int) { M y= x; M a = u; int p=n; while (p > 0) { /* a o (y^p) = x^n */ if even(p) { y=y^2 ; p = p div 2; } else { a = a o y; p = p-1; } }