#include "axiom" CyclicGroup(n:PositiveInteger,g:Symbol): Group with { 1: %; coerce : % -> OutputForm; one?: % -> Boolean; coerce:Symbol -> %; genrtr: %; } == add { Rep == Integer; import from Integer; 1:% == per 0; genrtr: % == per (address@hidden); coerce(x:%):OutputForm == { zero? rep x => outputForm(address@hidden); z where {import from Fraction Polynomial Integer; import from Polynomial Integer; z:OutputForm := ((g::Polynomial Integer)::Fraction Polynomial Integer^(rep x))::OutputForm; } }; coerce(x:Symbol):% == { x ~= g => error "wrong symbol"; per (address@hidden); } (x:%) * (y:%): % == per addmod(rep x,rep y,n::Integer); (x:%) = (y:%): Boolean == rep x = rep y; one?(x:%):Boolean == zero? rep x; inv(x:%):% == { one? x => 1; per( n::Integer - rep x)}; }