The classical binary algorithm


/* 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;
       }
}