A group G is a non-empty set upon which a binary operator * is defined with the following properties for all a,b,c in G:

  Closure:     G is closed under *,  a*b in G
  Associative: * is associative on G, (a*b)*c = a*(b*c)
  Identity:    There is an identity element  e  such that
	       a*e = e*a = a.
  Inverse:     Every element has a unique inverse a' such that
	       a * a' = a' * a = e.  The inverse is usually
	       written with a superscript -1.