Next, we look at the implementation of a new representation of existing objects. In most cases we want to implement this representation only for efficiency reasons while keeping all the existing functionality.
For example, assume we wanted (following wielandt69) to implement permutation groups defined by relations.
Next, we have to decide a few basics about the representation. All existing
permutation groups in the library are attribute storing and we probably want
to keep this for our new objects. Thus the representation must be a
subrepresentation of IsComponentObjectRep and IsAttributeStoringRep.
Furthermore we want each object to be a permutation group and we can imply
this directly in the representation.
We also decide that we store the degree (the largest point that might be
moved)
in a component degree and the defining relations in a component
relations (we do not specify the format of relations here. In an actual
implementation one would have to design this as well, but it does not affect
the declarations this chapter is about).
IsPermutationGroupByRelations:=NewRepresentation( "IsPermutationGroupByRelations", IsComponentObjectRep and IsAttributeStoringRep and IsPermGroup, ["degree","relations"]);(If we wanted to implement sparse matrices we might for example rather settle for a positional object in which we store a list of the nonzero entries.)
We can make the new representation a subrepresentation of an existion one. In such a case of course we have to provide all structure of this ``parent'' representation as well.
Next we need to check in which family our new objects will be. This will be
the same family as of every other permutation group, namely the
CollectionsFamily(PermutationsFamily) (where the family
PermutationsFamily=FamilyObj((1,2,3)) has been defined already in the
library).
Now we can write a function to create our new objects. Usually it is helpful
to look at functions from the library that are used in similar situations (for
example GroupByGenerators in our case) to make sure we have not forgotten
any further requirements in the declaration we might have to add here.
However in most cases the function is straightforward:
PermutationGroupByRelations:=function(degree,relations)
local g
g:=Objectify(NewType(CollectionsFamily(PermutationsFamily),
IsPermutationGroupByRelations),
rec(degree:=degree,relations:=relations));
end;
It also is a good idea to install a Print (possibly also a View) method
-- otherwise testing becomes quite hard:
InstallMethod(PrintObj,"for perm grps. given by relations",
[IsPermutationGroupByRelations],
function(G)
Print("PermutationGroupByRelations(", G!.degree,",",G!.relations,")");
end);
Next we have to write enough methods for the new representation so that the
existing algorithms can be used. In particular we will have to implement
methods for all operations for which library or kernel provides methods for
the existing (alternative) representations. In our particular case there are
no such methods. (If we would have implemented sparse matrices we
would have had to implement methods for the list access and assignment
functions, see Basic Operations for Lists in the reference manual.)
However the existing way permutation groups are represented is by
generators. To be able to use the existing machinery we want to be able to
obtain a generating set also for groups in our new representation. This can
be done (albeit not very effectively) by a stabilizer calculation in the
symmetric group given by the degree component. The operation function to
use is probably a bit complicated and will depend on the format of the
relations (we have not specified in this example). In the following
method we use operationfunction as a placeholder;
InstallMethod(GeneratorsOfGroup,"for perm grps. given by relations", [IsPermutationGroupByRelations], function(G) local S,U; S:=SymmetricGroup(G!.degree); U:=Stabilizer(S,G!.relations, operationfunction ); return GeneratorsOfGroup(U); end);This is all we must do. Of course for performance reasons one might want to install methods for further operations as well.
[Top] [Previous] [Up] [Next] [Index]
GAP 4 manual