InstallGlobalFunction( SignedPerm, function(args...) if Length(args) = 1then
return NewSignedPerm(IsSignedPermListRep, args[1]); elif Length(args) = 2then
return NewSignedPerm(args[1], args[2]); else
Error("usage: SignedPerm takes either 1 or 2 arguments"); fi; end);
# for an int and a signed perm
InstallGlobalFunction(OnPosPoints,
{ pnt, elm } -> AbsInt(pnt ^ elm));
# # Signed permutations in (perm, sign) representation #
BindGlobal( "TrimSignedPerm", function(p)
local ls;
ls := Length(p![2]); while ls > 0 and IsZero(p![2][ls]) do ls := ls - 1; od;
p![3] := Maximum(LargestMovedPoint(p![1]), ls);
p![2] := (p![2]){[1..p![3]]} + ListWithIdenticalEntries(p![3], Z(2) * 0);
return p; end);
BindGlobal( "SignedPermList", function(l)
local sp, s, ts;
l := ShallowCopy(l);
sp := [];
# Signs
s := PositionsProperty(l, x -> x < 0);
l{s} := -l{s};
sp![1] := PermList(l); if sp![1] = fail then
ErrorNoReturn("l does not define a permutation"); fi;
InstallMethod(IsOne, "for signed permutations",
[ IsSignedPermRep ], function(sp)
return IsOne(sp![1]) and IsZero(sp![2]); end);
InstallMethod(\^, "for an integer and a signed permutation",
[ IsInt, IsSignedPermRep ], function(pt, sp)
local sign;
sign := SignInt(pt);
pt := AbsInt(pt);
pt := pt ^ sp![1]; if IsBound(sp![2][pt]) and IsOne(sp![2][pt]) then
sign := -sign; fi;
return sign * pt; end);
InstallMethod( \=, "for a signed permutation and a signed permutation",
[ IsSignedPermRep, IsSignedPermRep ], function(l,r) # Trim? if l![1] = r![1] then
return l![2] = r![2]; fi;
return false; end);
InstallMethod( \<, "for a signed permutation and a signed permutation",
[ IsSignedPermRep, IsSignedPermRep ], function(l,r) # Trim? if l![1] < r![1] then
return true; elif l![1] = r![1] then
return l![2] < r![2]; fi;
return false; end);
InstallMethod( LargestMovedPoint, "for a signed permutation",
[ IsSignedPermRep ],
sp -> Length(sp![2]) );
# # Signed permutations in list representation #
BindGlobal( "TrimSignedPermList", function(p)
local ls;
ls := Length(p); while ls > 0 and p[ls] = ls do
Unbind(p[ls]);
ls := ls - 1;
od;
return p; end);
InstallMethod( ListSignedPerm, "for signed permutations in list rep",
[ IsSignedPermListRep ],
p -> p![1]);
InstallMethod( ListSignedPerm, "for signed permutations in list rep, and a positive int",
[ IsSignedPermListRep, IsPosInt ], function(p, len)
local i, res;
res := ShallowCopy(p![1]); for i in [Length(res)+1..len] do
res[i] := i;
od;
return res; end);
InstallMethod(ViewObj, "for signed permutations in list rep",
[ IsSignedPermListRep ], function(sp)
Print("<signed permutation in list rep>"); end);
InstallMethod(PrintObj, "for signed permutations in list rep",
[ IsSignedPermListRep ], function(sp)
Print("<signed permutation in list rep>"); end);
InstallMethod(\*, "for signed permutations in list rep",
[ IsSignedPermListRep, IsSignedPermListRep ], function(l, r)
local degree, res, i, ll, rr;
degree := Maximum(Length(l![1]), Length(r![1]));
res := [1..degree];
ll := [1..degree];
ll{[1..Length(l![1])]} := l![1];
rr := [1..degree];
rr{[1..Length(r![1])]} := r![1]; for i in [1..degree] do
res[i] := SignInt(ll[i]) * rr[AbsInt(ll[i])];
od;
return Objectify(SignedPermListType, [ TrimSignedPermList( res ) ] ); end);
InstallMethod(InverseOp, "for signed permutations in list rep",
[ IsSignedPermListRep ], function(sp)
local id, rhs, i;
id := [1..Length(sp![1])];
rhs := ShallowCopy(sp![1]);
for i in [1..Length(id)] do
id[i] := SignInt(rhs[i]) * i;
rhs[i] := AbsInt(rhs[i]);
od;
SortParallel(rhs, id);
return Objectify(SignedPermListType, [ TrimSignedPermList( id ) ] ); end);
InstallMethod(OneImmutable, "for signed permutations in list rep",
[ IsSignedPermListRep ], function(sp)
return Objectify(SignedPermListType, [ [] ]); end);
InstallMethod(OneMutable, "for signed permutations in list rep",
[ IsSignedPermListRep ], function(sp)
return Objectify(SignedPermListType, [ [] ]); end);
InstallMethod(IsOne, "for signed permutations in list rep",
[ IsSignedPermListRep ], function(sp)
return IsEmpty(sp![1]); end);
InstallMethod(\^, "for an integer and a signed permutation in list rep",
[ IsInt, IsSignedPermListRep ], function(pt, sp)
local apt;
apt := AbsInt(pt); if IsBound(sp![1][apt]) then
return SignInt(pt) * sp![1][apt]; else
return pt; fi; end);
InstallMethod( \=, "for a signed permutation and a signed permutation in list rep",
[ IsSignedPermListRep, IsSignedPermListRep ], function(l,r) # Trim?
return l![1] = r![1]; end);
InstallMethod( \<, "for a signed permutation and a signed permutation in list rep",
[ IsSignedPermListRep, IsSignedPermListRep ], function(l,r)
return l![1] < r![1]; end);
InstallMethod( LargestMovedPoint, "for a signed permutation in list rep",
[ IsSignedPermListRep ],
sp -> Length(sp![1]) );
InstallMethod( NewSignedPerm, "for list rep",
[ IsSignedPermListRep, IsList ], function(filt, list) if PermList(List(list, AbsInt)) = fail then
Error("list does not define a signed permutation"); fi;
return Objectify(SignedPermListType, [ TrimSignedPermList( ShallowCopy(list) ) ] ); end);
InstallGlobalFunction(RandomSignedPermList, function(degree)
local res, i;
res := Permuted([1..degree], Random(SymmetricGroup(degree)));
res := List(res, x -> Random([-1,1]) * x);
BindGlobal("TestSomeRandomPerms", function(n, k, l)
local perms, i, p, q, r, t1, t2, t3, t4, t;
t1 := 0;
t2 := 0;
t3 := 0;
t4 := 0;
for i in [1..n] do
perms := List([1..Random([1..k])], x->RandomSignedPermList(l));
t := NanosecondsSinceEpoch();
p := ListSignedPerm(Product(perms, x -> NewSignedPerm(IsSignedPermRep, x)));
t1 := t1 + (NanosecondsSinceEpoch() - t);
t := NanosecondsSinceEpoch();
q := Product(perms, x->NewSignedPerm(IsSignedPermListRep, x))![1];
t2 := t2 + (NanosecondsSinceEpoch() - t); if p <> q then
Error("Products do not match\n"); fi; for p in perms do
q := NewSignedPerm(IsSignedPermRep, p);
t := NanosecondsSinceEpoch();
r := Inverse(q);
t3 := t3 + (NanosecondsSinceEpoch() - t); if not IsOne(r * q) then
Error("inverse is not inverse"); fi;
q := NewSignedPerm(IsSignedPermListRep, p);
t := NanosecondsSinceEpoch();
r := Inverse(q);
t4 := t4 + (NanosecondsSinceEpoch() - t); if not IsOne(r * q) then
Error("inverse is not inverse"); fi;
od;
od;
return [t1,t2,t3,t4]; end);
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-10-12)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.