/* element of (projective) order */ ElementOfOrder := function (P, RequiredOrder, Limit : Fct := Order) if Type (RequiredOrder) eq RngIntElt then RequiredOrder := {RequiredOrder}; end if; NmrTries := Limit; repeat g, w := Random (P); o := Fct (g); NmrTries -:= 1; rem := exists (x) {x : x in RequiredOrder | (o mod x eq 0)}; until rem or (NmrTries eq 0); if rem then return g^(o div x), w^(o div x); else return false, _; end if; end function;