Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/tst/testinstall/   (GAP Algebra Version 4.15.1©)  Datei vom 18.9.2025 mit Größe 123 kB image not shown  

Quelle  pperm.tst   Sprache: unbekannt

 
Spracherkennung für: .tst vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

#@local display,e,f,g,h,i,notationpp,notationt,p,x,PPerm4,Perm4,im,coll,p1,p2
##
## takes around 4 seconds to run

#
gap> START_TEST("pperm.tst");
gap> display:=UserPreference("PartialPermDisplayLimit");;
gap> notationpp:=UserPreference("NotationForPartialPerms");;
gap> notationt:=UserPreference("NotationForTransformations");;
gap> SetUserPreference("PartialPermDisplayLimit", 100);;
gap> SetUserPreference("NotationForPartialPerms", "component");;
gap> SetUserPreference("NotationForTransformations", "fr");;

# Some helper functions
gap> PPerm4 := function(arg)
>   local out, e;
>   if Length(arg) = 1 then 
>     e := LeftOne(PartialPerm(arg[1]));
>     Add(arg[1], 65536);
>     return e * PartialPerm(arg[1]);
>   else 
>     Add(arg[2], 65536 + Length(arg[1]));
>     out := PartialPerm(arg[1], [65536 .. 65536 + Length(arg[1]) - 1]) * 
>            PartialPerm([65536 .. 65536 + Length(arg[1])], arg[2]);
>     DomainOfPartialPerm(out);
>     return out;
>   fi;
> end;;
gap> Perm4 := function(p)
> return p * ((165537) * (165537));
> end;;

# GAP-level functions
#
gap> f:=PartialPerm( [ 4578 ], [ 5416 ] );
[7,1][8,6](4,5)
gap> g:=PartialPerm([2]);;
gap> NaturalLeqPartialPerm(g, f);
false
gap> g:=PartialPerm([0,0,0,0,4]);;
gap> NaturalLeqPartialPerm(g, f);
true

#
gap> f:=EmptyPartialPerm();;
gap> ImageSetOfPartialPerm(f);
[  ]
gap> ImageListOfPartialPerm(f);
[  ]
gap> f:=EmptyPartialPerm()^-1;;
gap> ImageSetOfPartialPerm(f);
[  ]
gap> ImageListOfPartialPerm(f);
[  ]
gap> IMAGE_SET_PPERM(fail);
Error, IMAGE_SET_PPERM: <f> must be a partial permutation (not the value 'fail\
')

# test input validation
gap> DegreeOfPartialPerm(fail);
Error, DegreeOfPartialPerm: <f> must be a partial permutation (not the value '\
fail')
gap> CoDegreeOfPartialPerm(fail);
Error, CoDegreeOfPartialPerm: <f> must be a partial permutation (not the value\
 'fail')
gap> RankOfPartialPerm(fail);
Error, RankOfPartialPerm: <f> must be a partial permutation (not the value 'fa\
il')
gap> 

# SmallestIdempotentPower, IndexPeriodOfPartialPerm, IsIdempotent
gap> f:=PartialPerm([1100000], [1000002]);;
gap> IsIdempotent(f^SmallestIdempotentPower(f));
true
gap> x:=IndexPeriodOfPartialPerm(f);;
gap> f^x[1]=f^(x[1]+x[2]);
true
gap> RankOfPartialPerm(f^(x[1]-1))>RankOfPartialPerm(f^x[1]);
true
gap> f:=PartialPerm([1100000], [1000002]);;
gap> IsIdempotent(f^SmallestIdempotentPower(f));
true
gap> x:=IndexPeriodOfPartialPerm(f);;
gap> f^x[1]=f^(x[1]+x[2]);
true
gap> RankOfPartialPerm(f^(x[1]-1))>RankOfPartialPerm(f^x[1]);
true
gap> f:=PartialPerm([11000], [10002]);;
gap> IsIdempotent(f^SmallestIdempotentPower(f));
true
gap> x:=IndexPeriodOfPartialPerm(f);;
gap> f^x[1]=f^(x[1]+x[2]);
true
gap> RankOfPartialPerm(f^(x[1]-1))>RankOfPartialPerm(f^x[1]);
true
gap> f:=PartialPermNC( [ 1234678101214 ], 
> [ 151158936241 ] );;
gap> IndexPeriodOfPartialPerm(f);
51 ]
gap> f^5=f^6;
true
gap> f^5;
<empty partial perm>
gap> f^6;
<empty partial perm>
gap> f^4;                                                    
[12,9]
gap> f := PartialPerm( [ 123 ], [ 7000034 ] );
[1,70000][2,3,4]
gap> IsIdempotent(f);
false
gap> f:=PartialPermNC([1..10]);;   
gap> IsIdempotent(f);
true
gap> f:=PartialPermNC([1..10]); 
<identity partial perm on [ 12345678910 ]>
gap> IsIdempotent(f);
true
gap> f:=PartialPerm( [ 12 ], [ 31 ] );;
gap> IsIdempotent(f);
false
gap> f:=PartialPermNC([1..100000]); 
<partial perm on 100000 pts with degree 100000, codegree 100000>
gap> IsIdempotent(f);
true
gap> f:=PartialPermNC([1..100000]);;
gap> IsIdempotent(f);
true
gap> f := PartialPerm([], []);
<empty partial perm>
gap> IndexPeriodOfPartialPerm(f);
11 ]
gap> SmallestIdempotentPower(f);
1
gap> f:=PartialPerm([2,3,1,5,6,7,8,4,10]);
[9,10](1,2,3)(4,5,6,7,8)
gap> SmallestIdempotentPower(f);
15
gap> IndexPeriodOfPartialPerm(f);
215 ]
gap> IsIdempotent(f);
false
gap> IndexPeriodOfPartialPerm(PartialPerm([1210 ^ 5], [210 ^ 51]));
13 ]
gap> IsIdempotent(PartialPerm([2,3,1,5,6,7,8,4,10]));
false
gap> IsIdempotent(PartialPermNC([1 .. 70000] + 1));
false

# ComponentsOfPartialPerm, NrComponentsOfPartialPerm, 
# ComponentRepsOfPartialPerm and ComponentPartialPermInt
gap> f:=PartialPerm([1100000], [1000002]);;
gap> NrComponentsOfPartialPerm(f)=Length(ComponentsOfPartialPerm(f));
true
gap> Union(ComponentsOfPartialPerm(f))=Union(DomainOfPartialPerm(f), 
> ImageSetOfPartialPerm(f));
true
gap> List(ComponentRepsOfPartialPerm(f), i-> ComponentPartialPermInt(f, i))
> =ComponentsOfPartialPerm(f);
true
gap> f:=PartialPerm([1100], [1002]);;
gap> NrComponentsOfPartialPerm(f)=Length(ComponentsOfPartialPerm(f));
true
gap> Union(ComponentsOfPartialPerm(f))=Union(DomainOfPartialPerm(f), 
> ImageSetOfPartialPerm(f));
true
gap> List(ComponentRepsOfPartialPerm(f), i-> ComponentPartialPermInt(f, i))
> =ComponentsOfPartialPerm(f);
true
gap> f := PartialPerm([], []);
<empty partial perm>
gap> ComponentsOfPartialPerm(f);
[  ]
gap> ComponentRepsOfPartialPerm(f);
[  ]
gap> NrComponentsOfPartialPerm(f);
0
gap> f:=PartialPerm([2,3,1,5,6,7,8,4,10]);
[9,10](1,2,3)(4,5,6,7,8)
gap> ComponentsOfPartialPerm(f);
[ [ 910 ], [ 123 ], [ 45678 ] ]
gap> ComponentRepsOfPartialPerm(f);
914 ]
gap> NrComponentsOfPartialPerm(f);
3
gap> ComponentRepsOfPartialPerm(PartialPerm([1210 ^ 5], [210 ^ 51]));
1 ]
gap> NrComponentsOfPartialPerm(PartialPerm([1210 ^ 5], [210 ^ 51]));
1
gap> ComponentsOfPartialPerm(PartialPerm([1210 ^ 5], [210 ^ 51]));
[ [ 12100000 ] ]
gap> ComponentPartialPermInt(PartialPerm([1210 ^ 5], [210 ^ 51]),
>                              100000);
10000012 ]
gap> ComponentPartialPermInt(PartialPerm([1210 ^ 5], [210 ^ 51]),
>                              1000);
[  ]
gap> ComponentPartialPermInt(PartialPerm([13], [31]),
>                              1000);
[  ]
gap> ComponentPartialPermInt(PartialPerm([12], [21]),
>                              2);
21 ]

# FixedPointsOfPartialPerm, MovedPoints, 
# NrFixedPoints, NrMovedPoints
gap> f:=PartialPerm([1100000], [1000002]);;
gap> FixedPointsOfPartialPerm(f)=
> Filtered([1..DegreeOfPartialPerm(f)], i-> i^f=i);
true
gap> f:=PartialPermNC([1..100000]);
<partial perm on 100000 pts with degree 100000, codegree 100000>
gap> FixedPointsOfPartialPerm(f)=[1..100000];
true
gap> f:=PartialPerm( [ 123456791112151619 ],
> [ 2411120101516536129 ] );;
gap> FixedPointsOfPartialPerm(f)=
> Filtered([1..DegreeOfPartialPerm(f)], i-> i^f=i);
true
gap> f:=PartialPerm( [ 123456791112151619 ],
> [ 2411120101516536129 ] );;
gap> DomainOfPartialPerm(f);;
gap> FixedPointsOfPartialPerm(f)=
> Filtered([1..DegreeOfPartialPerm(f)], i-> i^f=i);
true
gap> NrFixedPoints(f);
0
gap> f:=PartialPerm([1100000], [1000002]);;
gap> NrMovedPoints(f)+NrFixedPoints(f)=
> RankOfPartialPerm(f);
true
gap> Union(MovedPoints(f), FixedPointsOfPartialPerm(f))=
> DomainOfPartialPerm(f);
true
gap> Intersection(MovedPoints(f), FixedPointsOfPartialPerm(f));
[  ]
gap> f:=PartialPerm([1100], [1002]);;
gap> NrMovedPoints(f)+NrFixedPoints(f)=
> RankOfPartialPerm(f);
true
gap> Union(MovedPoints(f), FixedPointsOfPartialPerm(f))=
> DomainOfPartialPerm(f);
true
gap> Intersection(MovedPoints(f), FixedPointsOfPartialPerm(f));
[  ]
gap> f := PartialPerm(List([69950 .. 70000], function(x) 
>   if IsEvenInt(x) then 
>     return 0;
>   else
>     return x;
>   fi;
> end));;
gap> FixedPointsOfPartialPerm(f);
[  ]
gap> NrFixedPoints(f);
0
gap> MovedPoints(f);
246810121416182022242628303234363840
  4244464850 ]
gap> NrMovedPoints(f);
25
gap> im := ListWithIdenticalEntries(700000);;
gap> im[65536] := 65536;
65536
gap> f := PartialPerm(im);;
gap> FixedPointsOfPartialPerm(f);
65536 ]
gap> NrFixedPoints(f);
1
gap> MovedPoints(f);
[  ]
gap> NrMovedPoints(f);
0
gap> f := PartialPerm(List([7950 .. 8000], function(x) 
>   if IsEvenInt(x) then 
>     return 0;
>   else
>     return x;
>   fi;
> end));;
gap> FixedPointsOfPartialPerm(f);
[  ]
gap> NrFixedPoints(f);
0
gap> MovedPoints(f);
246810121416182022242628303234363840
  4244464850 ]
gap> NrMovedPoints(f);
25
gap> f := PartialPerm(List([1 .. 100], function(x) 
>   if IsEvenInt(x) then 
>     return 0;
>   else
>     return x;
>   fi;
> end));;
gap> FixedPointsOfPartialPerm(f);
13579111315171921232527293133353739
  41434547495153555759616365676971737577
  7981838587899193959799 ]
gap> NrFixedPoints(f);
50
gap> MovedPoints(f);
[  ]
gap> NrMovedPoints(f);
0
gap> f := PartialPerm([13 .. 99], [13 .. 99]);;
gap> FixedPointsOfPartialPerm(f);
13579111315171921232527293133353739
  41434547495153555759616365676971737577
  7981838587899193959799 ]
gap> NrFixedPoints(f);
50
gap> MovedPoints(f);
[  ]
gap> NrMovedPoints(f);
0
gap> f := PartialPerm([7000170003 .. 70099], [7000170003 .. 70099]);;
gap> FixedPointsOfPartialPerm(f);
70001700037000570007700097001170013700157001770019
  70021700237002570027700297003170033700357003770039
  70041700437004570047700497005170053700557005770059
  70061700637006570067700697007170073700757007770079
  70081700837008570087700897009170093700957009770099 ]
gap> NrFixedPoints(f);
50
gap> MovedPoints(f);
[  ]

# LargestMovedPoint, SmallestMovedPoint
gap> f:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(f);;
gap> i:=LargestMovedPoint(f);;
gap> i^f<>i;
true
gap> f:=PartialPerm([1100000], [1000002]);;
gap> i:=LargestMovedPoint(f);;
gap> i^f<>i;
true
gap> f:=PartialPerm([1100], [1002]);;   DomainOfPartialPerm(f);;
gap> i:=LargestMovedPoint(f);;
gap> i^f<>i;
true
gap> f:=PartialPerm([1100], [1002]);;
gap> i:=LargestMovedPoint(f);;
gap> i^f<>i;
true
gap> f:=PartialPermNC([1..100]);;
gap> LargestMovedPoint(f);
0
gap> f:=PartialPermNC([1..100]); 
<partial perm on 100 pts with degree 100, codegree 100>
gap> LargestMovedPoint(f);
0
gap> f:=PartialPermNC([4,2,3]);; DomainOfPartialPerm(f);;
gap> LargestMovedPoint(f);
1
gap> f:=PartialPermNC([4,2,3]);; 
gap> LargestMovedPoint(f);
1
gap> f:=PartialPermNC(Concatenation([100001], [2..100000]));
<partial perm on 100000 pts with degree 100000, codegree 100001>
gap> LargestMovedPoint(f);
1
gap> f:=PartialPermNC(Concatenation([100001], [2..100000]));;
gap> LargestMovedPoint(f);
1
gap> f:=PartialPermNC([1..100000]);                          
<partial perm on 100000 pts with degree 100000, codegree 100000>
gap> LargestMovedPoint(f);
0
gap> f:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(f);;
gap> i:=SmallestMovedPoint(f);;
gap> i^f<>i;
true
gap> f:=PartialPerm([1100000], [1000002]);;
gap> i:=SmallestMovedPoint(f);;
gap> i^f<>i;
true
gap> f:=PartialPerm([1100], [1002]);;   DomainOfPartialPerm(f);;
gap> i:=SmallestMovedPoint(f);;
gap> i^f<>i;
true
gap> f:=PartialPerm([1100], [1002]);;
gap> i:=SmallestMovedPoint(f);;
gap> i^f<>i;
true
gap> f:=PartialPermNC([1..100]);;
gap> SmallestMovedPoint(f);
infinity
gap> f:=PartialPermNC([1..100]); 
<partial perm on 100 pts with degree 100, codegree 100>
gap> SmallestMovedPoint(f);
infinity
gap> f:=PartialPermNC([4,2,3]);; DomainOfPartialPerm(f);;
gap> SmallestMovedPoint(f);
1
gap> f:=PartialPermNC([4,2,3]);; 
gap> SmallestMovedPoint(f);
1
gap> f:=PartialPermNC(Concatenation([100001], [2..100000]));
<partial perm on 100000 pts with degree 100000, codegree 100001>
gap> SmallestMovedPoint(f);
1
gap> f:=PartialPermNC(Concatenation([100001], [2..100000]));;
gap> SmallestMovedPoint(f);
1
gap> f:=PartialPermNC([1..70000]);;
gap> SmallestMovedPoint(f);
infinity
gap> LargestMovedPoint(f);
0
gap> f := PartialPermNC([1 .. 10]);;
gap> SmallestMovedPoint(f);
infinity
gap> f := PartialPermNC([1 .. 10], [1 .. 10]);;
gap> SmallestMovedPoint(f);
infinity
gap> SmallestMovedPoint(PartialPerm([6999970001], [6999970001]));
infinity

# TRIM_PPERM
gap> f:=PartialPermNC([65536]); 
[1,65536]
gap> TRIM_PPERM(f);
[1,65536]
gap> g:=PartialPermNC([2,65536], [70000,1]);           
[2,70000][65536,1]
gap> h:=f*g;
<identity partial perm on [ 1 ]>
gap> IsPPerm4Rep(h);
true
gap> TRIM_PPERM(h); h;
<identity partial perm on [ 1 ]>
gap> IsPPerm2Rep(h);
true
gap> h:=f*g;;
gap> IsPPerm4Rep(h);
true
gap> TRIM_PPERM(h); h;
<identity partial perm on [ 1 ]>
gap> IsPPerm2Rep(h);
true

# HashFuncForPPerm and HASH_FUNC_FOR_PPERM
gap> f := PartialPerm([65536]);;
#@if GAPInfo.BytesPerVariable = 8
gap> HASH_FUNC_FOR_PPERM(f, 10 ^ 6) in [260581402746];
true
#@else
gap> HASH_FUNC_FOR_PPERM(f, 10 ^ 6);
953600
#@fi
gap> f := PartialPermNC([65535]);;
#@if GAPInfo.BytesPerVariable = 8
gap> HASH_FUNC_FOR_PPERM(f, 10 ^ 6);
354405
#@else
gap> HASH_FUNC_FOR_PPERM(f, 10 ^ 6);
287798
#@fi
gap> f := PartialPerm([123456791112151619],
>                     [2411120101516536129]);;
#@if GAPInfo.BytesPerVariable = 8
gap> HASH_FUNC_FOR_PPERM(f, 10 ^ 6) in [773594109657];
true
#@else
gap> HASH_FUNC_FOR_PPERM(f, 10 ^ 6) in [982764570602];
true
#@fi
gap> f := PartialPermNC([65536]);;
gap> g := PartialPermNC([265536], [700001]);;
gap> h := f * g;
<identity partial perm on [ 1 ]>
gap> IsPPerm4Rep(h);
true
#@if GAPInfo.BytesPerVariable = 8
gap> HASH_FUNC_FOR_PPERM(h, 10 ^ 6) in [567548351540];
true
#@else
gap> HASH_FUNC_FOR_PPERM(h, 10 ^ 6) in [464636754304];
true
#@fi
gap> IsPPerm2Rep(h);
true

# LeftOne
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );;
> DomainOfPartialPerm(f);;
gap> e:=LeftOne(f);;
gap> IsIdempotent(e);
true
gap> e*f=f;
true
gap> DomainOfPartialPerm(e)=DomainOfPartialPerm(f);
true
gap> ImageListOfPartialPerm(e)=DomainOfPartialPerm(f);
true
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );;
gap> e:=LeftOne(f);;
gap> IsIdempotent(e);
true
gap> e*f=f;         
true
gap> DomainOfPartialPerm(e)=DomainOfPartialPerm(f);
true
gap> ImageListOfPartialPerm(e)=DomainOfPartialPerm(f);
true
gap> f:=PartialPerm([1100000], [1000002]);;
gap> e:=LeftOne(f);;
gap> IsIdempotent(e);
true
gap> e*f=f;         
true
gap> DomainOfPartialPerm(e)=DomainOfPartialPerm(f);
true
gap> ImageListOfPartialPerm(e)=DomainOfPartialPerm(f);
true
gap> f:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(f);;
gap> e:=LeftOne(f);;
gap> IsIdempotent(e);
true
gap> e*f=f;
true
gap> DomainOfPartialPerm(e)=DomainOfPartialPerm(f);
true
gap> ImageListOfPartialPerm(e)=DomainOfPartialPerm(f);
true
gap> f:=PartialPermNC([65536], [1]);
[65536,1]
gap> e:=LeftOne(f);
<identity partial perm on [ 65536 ]>
gap> e*f=f;
true
gap> f:=PartialPermNC([1], [65536]);
[1,65536]
gap> e:=LeftOne(f);
<identity partial perm on [ 1 ]>
gap> e*f=f;
true

#RightOne
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );; ImageSetOfPartialPerm(f);;
gap> e:=RightOne(f);;
gap> IsIdempotent(e);
true
gap> f*e=f;
true
gap> ImageListOfPartialPerm(e)=ImageSetOfPartialPerm(f);
true
gap> DomainOfPartialPerm(e)=ImageSetOfPartialPerm(f);
true
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );; 
gap> e:=RightOne(f);;
gap> IsIdempotent(e);
true
gap> f*e=f;
true
gap> ImageListOfPartialPerm(e)=ImageSetOfPartialPerm(f);
true
gap> DomainOfPartialPerm(e)=ImageSetOfPartialPerm(f);
true
gap> f:=PartialPerm([1100000], [1000002]);; ImageSetOfPartialPerm(f);;
gap> e:=RightOne(f);;
gap> IsIdempotent(e);
true
gap> f*e=f;
true
gap> ImageListOfPartialPerm(e)=ImageSetOfPartialPerm(f);
true
gap> DomainOfPartialPerm(e)=ImageSetOfPartialPerm(f);
true
gap> f:=PartialPerm([1100000], [1000002]);; 
gap> e:=RightOne(f);;
gap> IsIdempotent(e);
true
gap> f*e=f;
true
gap> ImageListOfPartialPerm(e)=ImageSetOfPartialPerm(f);
true
gap> DomainOfPartialPerm(e)=ImageSetOfPartialPerm(f);
true
gap> f:=PartialPermNC([65536], [1]);
[65536,1]
gap> e:=RightOne(f);
<identity partial perm on [ 1 ]>
gap> f*e=f;
true
gap> f:=PartialPermNC([1], [65536]);
[1,65536]
gap> e:=RightOne(f);
<identity partial perm on [ 65536 ]>
gap> f*e=f;
true

# NaturalLeqPartialPerm
gap> f:=PartialPermNC([1], [65536]);
[1,65536]
gap> NaturalLeqPartialPerm(f,f);
true
gap> g:=PartialPermNC([1,2], [65536,4]);
[1,65536][2,4]
gap> NaturalLeqPartialPerm(f,g);
true
gap> NaturalLeqPartialPerm(g,f);
false
gap> f:=PartialPermNC([1], [10]);                               
[1,10]
gap> g:=PartialPermNC([1,2], [10,4]);   
[1,10][2,4]
gap> NaturalLeqPartialPerm(f,g);
true
gap> g:=PartialPerm( [ 123467810 ], 
> [ 381941056 ] );; 
gap> DomainOfPartialPerm(g);;
gap> NaturalLeqPartialPerm(f,g);
false
gap> g:=PartialPermNC([1,2], [10,100000]);
[1,10][2,100000]
gap> NaturalLeqPartialPerm(f,g);
true
gap> g:=       
> PartialPerm( [ 124689 ], 
> [ 427606419733426573091778069833 ] );
[1,42760][2,64197][4,33426][6,57309][8,17780][9,69833]
gap> NaturalLeqPartialPerm(f,g);
false
gap> f:=PartialPermNC([1,0,0,0,0,10]);;
gap> NaturalLeqPartialPerm(f,g);
false
gap> g:=PartialPermNC([1,5,6], [1,10,100000]);
[5,10][6,100000](1)
gap> NaturalLeqPartialPerm(f,g);
false
gap> g:=PartialPermNC([1,6,7], [1,10,100000]);
[6,10][7,100000](1)
gap> NaturalLeqPartialPerm(f,g);
true
gap> g:=PartialPermNC([1,6,7], [1,10,1000]);  
[6,10][7,1000](1)
gap> NaturalLeqPartialPerm(f,g);
true
gap> g:= 
> PartialPerm( [ 123456789101112131415161718
>    192021222325262729303233343537404247
>    484950515253565759626366676970757678
>    80848788899396 ], 
> [ 6652456249978641482826069779647671
>    88100321671636494294622513319388130
>    879817828590338974508035362754732040
>    57923489925 ] );;
gap> NaturalLeqPartialPerm(f,g);
false
gap> f:=PartialPermNC([1],[100000]);;  
gap> f:=PartialPermNC([1],[100000]); 
[1,100000]
gap> f:=PartialPermNC([1],[100000])*PartialPermNC([100000], [2]);
[1,2]
gap> IsPPerm4Rep(f);
false
gap> f:=PartialPermNC([1],[100000])*PartialPermNC([1,100000], [100000,2]);
[1,2]
gap> IsPPerm4Rep(f);
true
gap> g:=PartialPermNC([1,2],[2,3]);
[1,2,3]
gap> NaturalLeqPartialPerm(f,g);
true
gap> g:=
> PartialPerm( [ 123456789101112131415161819
>     202122232728293031323334353839404142
>     454649525354565859606671727374757779
>     808586929396 ], 
>  [ 263818894154855924953564253221239428
>     79314622752742207337371465781761557
>     664916197452717228680404446247815850
>     9614310 ] );;
gap> NaturalLeqPartialPerm(f,g);
false
gap> f:=PartialPermNC([1],[100000]);                                      
[1,100000]
gap> g:=PartialPermNC([1,2,3], [100000,4,5]);;;
gap> g;
[1,100000][2,4][3,5]
gap> NaturalLeqPartialPerm(f,g);
true
gap> g:=
> PartialPerm( [ 123456789101112131415161718
>     202122252627282931323435374043444648
>     505152545556575960616364656667697176
>     78798081838586888990929395969799 ], 
>  [ 1267526996433858729987332273589154277
>     37039342581838830976436171426515511
>     10159757193447445633132855366944627
>     6810086890654748452957829224 ] );;
gap> NaturalLeqPartialPerm(f,g);   
false
gap> f:=PartialPermNC([100000]);;   
gap> g:=PartialPermNC([1,2,3], [100000,4,5]);;;
gap> NaturalLeqPartialPerm(f,g);
true
gap> g:=
> PartialPerm( [ 123456789101113141516171819
>     212224252627282931343637383941444647
>     485155565758616263646667686971727374
>     757677818283949698 ], 
>  [ 86243240199247344160938922263039783613999928831825
>     6025046007667424575470971505521177642805374763362
>     965176666336844212338956878589258747753845095306
>     48164846935917065070243143129454766394017671486853
>     8050361282908732355406416225986547680533645015562
>     44576378966264655753212325627532817523576498582822
>     784126557768433 ] );;
gap> NaturalLeqPartialPerm(f,g);    
false
gap> f:=PartialPermNC([1],[100000])*PartialPermNC([1,100000], [100000,2]);
[1,2]
gap> IsPPerm4Rep(f);
true
gap> g:=PartialPermNC([1,2],[2,3]);            
[1,2,3]
gap> f:=PartialPermNC([100000])*PartialPermNC([1,100000], [100000,2]);;     
gap> IsPPerm4Rep(f);
true
gap> NaturalLeqPartialPerm(f,g);
true
gap> g:=PartialPerm( [ 13 ], [ 31 ] );;     
gap> NaturalLeqPartialPerm(f,g);
false
gap> NaturalLeqPartialPerm(fail, f);
Error, NaturalLeqPartialPerm: <f> must be a partial permutation (not the value\
 'fail')
gap> NaturalLeqPartialPerm(EmptyPartialPerm(), f);
true

# AsPartialPerm
gap> p:=(1,2,7,5)(3,9)(6,10,8);;
gap> f:=AsPartialPerm(p);       
(1,2,7,5)(3,9)(4)(6,10,8)
gap> f:=AsPartialPerm(p,11);
(1,2,7,5)(3,9)(4)(6,10,8)(11)
gap> f:=AsPartialPerm(p,12);
(1,2,7,5)(3,9)(4)(6,10,8)(11)(12)
gap> f:=AsPartialPerm(p,70000);
<partial perm on 70000 pts with degree 70000, codegree 70000>
gap> OnTuples([1..10], f)=OnTuples([1..10], p);
true
gap> f:=AsPartialPerm(p,[1,3,6]);
[1,2][3,9][6,10]
gap> f:=AsPartialPerm(p,[1,3,6,11]);
[1,2][3,9][6,10](11)
gap> f:=AsPartialPerm(p,[1,3,6,70000]);
[1,2][3,9][6,10](70000)
gap> p:=(1,100000);;
gap> f:=AsPartialPerm(p,100001);
<partial perm on 100001 pts with degree 100001, codegree 100001>
gap> OnTuples([1,100000100001], f);
1000001100001 ]
gap> f:=AsPartialPerm(p,10);     
[1,100000](2)(3)(4)(5)(6)(7)(8)(9)(10)
gap> IsPPerm4Rep(f);
true
gap> p:=(1,19)(10,100000);;
gap> AsPartialPerm(p,9); 
[1,19](2)(3)(4)(5)(6)(7)(8)(9)
gap> p:=(1,9)(10,100000);;
gap> AsPartialPerm(p,9);
(1,9)(2)(3)(4)(5)(6)(7)(8)
gap> AsPartialPerm((1,2), [122 ^ 61]);
Error, usage: the second argument must be a set of positive integers,
gap> AsPartialPerm((1,2), [132]);
Error, usage: the second argument must be a set of positive integers,
gap> AsPartialPerm((1,2), [1, "a", 2]);
Error, usage: the second argument must be a set of positive integers,
gap> AsPartialPerm((1,2), 0);
<empty partial perm>
gap> AsPartialPerm(Transformation([10846453882]), [1 .. 4]);
[1,10][2,8][3,4,6]
gap> AsPartialPerm(Transformation([10846453882]), [1 .. 5]);
Error, usage: the first argument must be injective on the second,
gap> AsPartialPerm(Transformation([10846453882]), [1223]);
Error, usage: the second argument must be a set of positive integers,
gap> AsPartialPerm(Transformation([10846453882]), 4);
[1,10][2,8][3,4,6]
gap> AsPartialPerm((), []);
<empty partial perm>

# JoinOfPartialPerms
gap> f := PartialPermNC([1], [2]);;
gap> g := PartialPermNC([123], [241]);;
gap> JoinOfPartialPerms(f, g);
[3,1,2,4]
gap> JoinOfPartialPerms(g, f);
[3,1,2,4]
gap> f := PartialPermNC([1], [2]);
[1,2]
gap> g := PartialPermNC([2], [3]);    
[2,3]
gap> JoinOfPartialPerms(f, g);
[1,2,3]
gap> JoinOfPartialPerms(g, f);
[1,2,3]
gap> g := PartialPermNC([2], [1]);
[2,1]
gap> JoinOfPartialPerms(f, g);
(1,2)
gap> JoinOfPartialPerms(g, f);
(1,2)
gap> g := PartialPermNC([1], [3]);
[1,3]
gap> JoinOfPartialPerms(f, g);
fail
gap> JoinOfPartialPerms(g, f);
fail
gap> f := PartialPermNC([2]);;
gap> g := PartialPermNC([3]);;
gap> JoinOfPartialPerms(f, g);
fail
gap> JoinOfPartialPerms(g, f);
fail
gap> f := PartialPermNC([2]);;
gap> g := PartialPermNC([03]);;
gap> JoinOfPartialPerms(f, g);
[1,2,3]
gap> JoinOfPartialPerms(g, f);
[1,2,3]
gap> f := PartialPermNC([2]); 
[1,2]
gap> g := PartialPermNC([03]);;
gap> JoinOfPartialPerms(f, g);
[1,2,3]
gap> JoinOfPartialPerms(g, f);
[1,2,3]
gap> f := PartialPermNC([2]);;
gap> g := PartialPermNC([03]); 
[2,3]
gap> JoinOfPartialPerms(f, g);
[1,2,3]
gap> JoinOfPartialPerms(g, f);
[1,2,3]
gap> f := PartialPermNC([2]); 
[1,2]
gap> g := PartialPermNC([0100000]);
[2,100000]
gap> JoinOfPartialPerms(f, g);
[1,2,100000]
gap> JoinOfPartialPerms(g, f);
[1,2,100000]
gap> JoinOfPartialPerms([f, g]);
[1,2,100000]
gap> JoinOfPartialPerms([g, f]);
[1,2,100000]
gap> JoinOfPartialPerms(12);
Error, usage: the argument should be a collection of partial perms,
gap> JoinOfPartialPerms(last, PartialPermNC([100000], [1]));
(1,2,100000)
gap> JoinOfPartialPerms(PartialPermNC([100000], [1]), JoinOfPartialPerms([g, f]));
(1,2,100000)
gap> g := PartialPermNC([0100000]);;
gap> JoinOfPartialPerms(f, g);                              
[1,2,100000]
gap> f := PartialPermNC([2]);;
gap> g := PartialPermNC([0100000]); 
[2,100000]
gap> JoinOfPartialPerms(f, g);
[1,2,100000]
gap> JoinOfPartialPerms(g, f);
[1,2,100000]
gap> f := PartialPermNC([2]);;
gap> g := PartialPermNC([0100000]);;
gap> JoinOfPartialPerms(f, g);
[1,2,100000]
gap> JoinOfPartialPerms(g, f);
[1,2,100000]
gap> last ^ 2;
[1,100000]
gap> f := PartialPermNC([0100000]);;
gap> g := PartialPermNC([2]);;       
gap> JoinOfPartialPerms(f, g);
[1,2,100000]
gap> JoinOfPartialPerms(g, f);
[1,2,100000]
gap> f := PartialPermNC([0100000]);;
gap> g := PartialPermNC([01000004]);;
gap> JoinOfPartialPerms(f, g);
[2,100000][3,4]
gap> JoinOfPartialPerms(g, f);
[2,100000][3,4]
gap> g := PartialPermNC([004]);;     
gap> JoinOfPartialPerms(f, g);
[2,100000][3,4]
gap> JoinOfPartialPerms(g, f);
[2,100000][3,4]
gap> g := PartialPermNC([004]); 
[3,4]
gap> JoinOfPartialPerms(f, g);
[2,100000][3,4]
gap> JoinOfPartialPerms(g, f);
[2,100000][3,4]
gap> f := PartialPermNC([0100000]); 
[2,100000]
gap> JoinOfPartialPerms(f, g);
[2,100000][3,4]
gap> JoinOfPartialPerms(g, f);
[2,100000][3,4]
gap> g := PartialPermNC([004]);;
gap> JoinOfPartialPerms(f, g);
[2,100000][3,4]
gap> JoinOfPartialPerms(g, f);
[2,100000][3,4]
gap> f := PartialPermNC([124567], [51000007314])
>  * PartialPermNC([1 .. 99999]);
[6,1,5,3](4,7)
gap> IsPPerm4Rep(f);
true
gap> g := PartialPermNC([8100000], [1000001]);
[8,100000,1]
gap> JoinOfPartialPerms(f, g);
fail
gap> JoinOfPartialPerms(g, f);
fail
gap> g := PartialPermNC([8], [100000]);         
[8,100000]
gap> JoinOfPartialPerms(f, g);
[6,1,5,3][8,100000](4,7)
gap> JoinOfPartialPerms(g, f);
[6,1,5,3][8,100000](4,7)
gap> JoinOfPartialPerms(f, f);
[6,1,5,3](4,7)

# JOIN_IDEM_PPERMS
gap> JOIN_IDEM_PPERMS(PartialPerm([1 .. 5]), 
>                     PartialPerm([3 .. 10], [3 .. 10]));
<identity partial perm on [ 12345678910 ]>
gap> JOIN_IDEM_PPERMS(PartialPerm([3 .. 10], [3 .. 10]),
>                     PartialPerm([1 .. 5]));
<identity partial perm on [ 12345678910 ]>
gap> JOIN_IDEM_PPERMS(PartialPerm([3 .. 10], [3 .. 10]),
>                     PartialPerm([65536 .. 65538], [65536 .. 65538]));
<identity partial perm on [ 345678910655366553765538 ]>
gap> JOIN_IDEM_PPERMS(PartialPerm([70000 .. 70010], [70000 .. 70010]),
>                     PartialPerm([65536 .. 65538], [65536 .. 65538]));
<identity partial perm on 
6553665537655387000070001700027000370004700057000670007,\
 700087000970010 ]>
gap> JoinOfIdempotentPartialPermsNC(12);
Error, usage: the argument should be a collection of partial perms,

# MeetOfPartialPerms
gap> f:=PartialPermNC([2]);;
gap> g:=PartialPermNC([3]);;
gap> MeetOfPartialPerms(f,g);
<empty partial perm>
gap> f:=PartialPermNC( [ 12345810 ], [ 7143265 ] );;
gap> g:=PartialPermNC( [ 12345810 ], [ 3142567 ] );;
gap> MeetOfPartialPerms(f,g);
[2,1][3,4][8,6]
gap> f:=PartialPerm([11000], [10002]);;
gap> g:=JoinOfPartialPerms(f, PartialPermNC([1001..2000], [1001..2000]));;
gap> f=MeetOfPartialPerms(f, g);
true
gap> g:=JoinOfPartialPerms(f, PartialPermNC([1001..100000], [1001..100000]));;
gap> f=MeetOfPartialPerms(f, g);
true
gap> g:=PartialPerm([11000], [10002]);;
gap> f:=JoinOfPartialPerms(g, PartialPermNC([1001..100000], [1001..100000]));;
gap> g=MeetOfPartialPerms(f, g);
true
gap> f:=PartialPermNC([100000,2,3,4,5]); 
[1,100000](2)(3)(4)(5)
gap> g:=PartialPermNC([100001,2,3,4,5]);                                       
[1,100001](2)(3)(4)(5)
gap> MeetOfPartialPerms(f,g);
<identity partial perm on [ 2345 ]>
gap> MeetOfPartialPerms(PartialPerm([1]));
<identity partial perm on [ 1 ]>
gap> MeetOfPartialPerms(PartialPerm([1]), PartialPerm([2]));
<empty partial perm>
gap> MeetOfPartialPerms(PartialPerm([1]), PartialPerm([12]));
<identity partial perm on [ 1 ]>
gap> MeetOfPartialPerms([]);
Error, usage: the argument should be a collection of partial perms,
gap> MeetOfPartialPerms([PartialPerm([1]), PartialPerm([12])]);
<identity partial perm on [ 1 ]>
gap> MeetOfPartialPerms(SymmetricInverseMonoid(3));
<empty partial perm>

# RestrictedPartialPerm
gap> f:=PartialPermNC([100000,2,3,4,5]);
[1,100000](2)(3)(4)(5)
gap> RestrictedPartialPerm(f, [2..5]);
<identity partial perm on [ 2345 ]>
gap> g:=last;
<identity partial perm on [ 2345 ]>
gap> DegreeOfPartialPerm(g);
5
gap> g:=RestrictedPartialPerm(f, [100000]);
<empty partial perm>
gap> g:=RestrictedPartialPerm(f, [1]);
[1,100000]
gap> f:=PartialPermNC([10,2,3,4,5]);    
[1,10](2)(3)(4)(5)
gap> RestrictedPartialPerm(f, [2..5]);
<identity partial perm on [ 2345 ]>
gap> g:=RestrictedPartialPerm(f, [1]);
[1,10]
gap> g:=RestrictedPartialPerm(f, [100]);
<empty partial perm>
gap> g:=RestrictedPartialPerm(f, [10]); 
<empty partial perm>
gap> g:=RestrictedPartialPerm(f, [5]); 
<identity partial perm on [ 5 ]>
gap> RestrictedPartialPerm(f, [213]);
Error, usage: the second argument must be a set of positive integers,
gap> RestrictedPartialPerm(f, [122 ^ 61]);
Error, usage: the second argument must be a set of positive integers,
gap> RESTRICTED_PPERM("a", [123]);
fail

# AsPermutation
gap> f:=PartialPermNC([10,2,3,4,5]);      
[1,10](2)(3)(4)(5)
gap> AsPermutation(f);
fail
gap> f:=RestrictedPartialPerm(f, [2..10]);
<identity partial perm on [ 2345 ]>
gap> AsPermutation(f);
()
gap> f:=PartialPerm([11000], [10002]);;
gap> x:=IndexPeriodOfPartialPerm(f);;
gap> g:=f^x[1];;
gap> OnTuples(DomainOfPartialPerm(g),AsPermutation(g))=
> OnTuples(DomainOfPartialPerm(g), g);
true
gap> f:=PartialPerm([1100000], [1000002]);;
gap> x:=IndexPeriodOfPartialPerm(f);;
gap> g:=f^x[1];;
gap> OnTuples(DomainOfPartialPerm(g),AsPermutation(g))=
> OnTuples(DomainOfPartialPerm(g), g);
true
gap> AsPermutation(f);
fail
gap> f := PartialPerm([170000], [700001]);;
gap> AsPermutation(f);
(1,70000)

# PermLeftQuoPartialPerm
gap> f := PartialPerm([1100], [1002]);;
gap> p := (2100);;
gap> g:=f*p;
[1,2](100)
gap> PermLeftQuoPartialPerm(f, g)=p;
true
gap> h := PartialPerm([200300400190010 ^ 6], 
>                     [10111313145010 ^ 6]);;
gap> h:=JoinOfPartialPerms(h, PartialPermNC([1..100], [1..100]));;
gap> g=g*h;
true
gap> g:=g*h;;
gap> IsPPerm4Rep(g);
true
gap> p=PermLeftQuoPartialPerm(f, g);
true
gap> f:=
> PartialPerm(
>  [ 12346789101112131516171819202123
>     242526282930313233343637383940414346
>     485051565759636668707174767778798384
>     858790929497100 ], 
>  [ 81741475358954376476928971887518975720166561980959830
>     16417728828217979601831541750984845470648383671322
>     16135203417627583899310527444562658898227730851562
>     3989331166286667142160942853563775873004859007741
>     60975671122136884588648991309233817850632284898767
>     360158275949511085831285492086094633562446752041
>     7596083945 ] );;
gap> PermLeftQuoPartialPerm(f, f);
()
gap> IsPerm4Rep(last);
true
gap> PermLeftQuoPartialPerm(f, f);
()
gap> f:=PartialPermNC([1,2], [100000,100001])*
> PartialPermNC([100000100001100002], [2,1,100002]); 
(1,2)
gap> g:=PartialPermNC([1,2]);     
<identity partial perm on [ 12 ]>
gap> IsPPerm2Rep(g);
true
gap> IsPPerm4Rep(f);
true
gap> PermLeftQuoPartialPerm(f, g);
(1,2)
gap> PermLeftQuoPartialPerm(g, f);
(1,2)
gap> PermLeftQuoPartialPerm(PartialPerm([1]), PartialPerm([2]));
Error, usage: the arguments must be partial perms with equal image sets,

# Kernel level functions
#
# OnePPerm
gap> f:=PartialPerm([1100000], [1000002]);;
gap> e:=One(f);;
gap> e*f=f;
true
gap> f*e=f;
true
gap> Union(DomainOfPartialPerm(f), ImageSetOfPartialPerm(f))=
> DomainOfPartialPerm(e);
true
gap> Union(DomainOfPartialPerm(f), ImageSetOfPartialPerm(f))=
> ImageSetOfPartialPerm(e);
true
gap> f:=PartialPerm([110000], [100002]);;
gap> e:=One(f);;
gap> e*f=f;    
true
gap> f*e=f;
true
gap> Union(DomainOfPartialPerm(f), ImageSetOfPartialPerm(f))=      
> DomainOfPartialPerm(e);
true
gap> Union(DomainOfPartialPerm(f), ImageSetOfPartialPerm(f))=
> ImageSetOfPartialPerm(e);
true
gap> f:=PartialPermNC([1,2], [100000,100001])*                                 
> PartialPermNC([100000100001100002], [2,1,100002]);
(1,2)
gap> One(f);
<identity partial perm on [ 12 ]>
gap> IsPPerm2Rep(last);
true
gap> IsPPerm4Rep(f);
true

# EqPPerm22
gap> PartialPerm([12]) = PartialPerm([21]);
false
gap> PartialPerm([12], [21]) = PartialPerm([12], [12]);
false
gap> PartialPerm([2], [2]) = PartialPermNC([1 .. 2], [1 .. 2]);
false
gap> PartialPerm([12]) = PartialPerm([12]);
true
gap> PartialPerm([12], [12]) = PartialPerm([12], [12]);
true

# EqPPerm24
gap> PartialPerm([12]) = PPerm4([21]);
false
gap> PartialPerm([12], [21]) = PPerm4([12], [12]);
false
gap> PartialPerm([2], [2]) = PPerm4([1 .. 2], [1 .. 2]);
false
gap> PartialPerm([12]) = PPerm4([12]);
true
gap> PartialPerm([12], [12]) = PPerm4([12], [12]);
true

# EqPPerm42
gap> PPerm4([12]) = PartialPerm([21]);
false
gap> PPerm4([12], [21]) = PartialPerm([12], [12]);
false
gap> PPerm4([2], [2]) = PartialPermNC([1 .. 2], [1 .. 2]);
false
gap> PPerm4([12]) = PartialPerm([12]);
true
gap> PPerm4([12], [12]) = PartialPerm([12], [12]);
true

# EqPPerm44
gap> PartialPerm([170000]) = PartialPerm([700001]);
false
gap> PartialPerm([170000], [700001]) = PartialPerm([170000], [170000]);
false
gap> PartialPerm([70000], [70000]) = PartialPermNC([1 .. 70000], [1 .. 70000]);
false
gap> PartialPerm([170000]) = PartialPerm([170000]);
true
gap> PartialPerm([170000], [170000]) = PartialPerm([170000], [170000]);
true

# LtPPerm22
gap> PartialPerm([120]) < PartialPerm([201]);
true
gap> PartialPerm([120], [201]) < PartialPerm([120], [120]);
false
gap> PartialPerm([20], [20]) < PartialPermNC([1 .. 20], [1 .. 20]);
true
gap> PartialPerm([120]) < PartialPerm([120]);
false
gap> PartialPerm([120], [120]) < PartialPerm([120], [120]);
false
gap> PartialPerm([121], [121]) < PartialPerm([120], [120]);
false
gap> PartialPerm([121], [121]) < PartialPerm([122], [122]);
true

# LtPPerm24
gap> PartialPerm([120]) < PPerm4([201]);
true
gap> PartialPerm([120], [201]) < PPerm4([120], [120]);
false
gap> PartialPerm([20], [20]) < PPerm4([1 .. 20], [1 .. 20]);
true
gap> PartialPerm([120]) < PPerm4([120]);
false
gap> PartialPerm([120], [120]) < PPerm4([120], [120]);
false
gap> PartialPerm([121], [121]) < PPerm4([120], [120]);
false
gap> PartialPerm([121], [121]) < PPerm4([122], [122]);
true

# LtPPerm42
gap> PPerm4([120]) < PartialPerm([201]);
true
gap> PPerm4([120], [201]) < PartialPerm([120], [120]);
false
gap> PPerm4([20], [20]) < PartialPerm([1 .. 20], [1 .. 20]);
true
gap> PPerm4([120]) < PartialPerm([120]);
false
gap> PPerm4([120], [120]) < PartialPerm([120], [120]);
false
gap> PPerm4([121], [121]) < PartialPerm([120], [120]);
false
gap> PPerm4([121], [121]) < PartialPerm([122], [122]);
true

# LtPPerm44
gap> PartialPerm([170000]) < PartialPerm([700001]);
true
gap> PartialPerm([170000], [700001]) < PartialPerm([170000], [170000]);
false
gap> PartialPerm([70000], [70000]) < PartialPermNC([1 .. 70000], [1 .. 70000]);
true
gap> PartialPerm([170000]) < PartialPerm([170000]);
false
gap> PartialPerm([170000], [170000]) < PartialPerm([170000], [170000]);
false
gap> PartialPerm([170001], [170001]) < PartialPerm([170000], [170000]);
false
gap> PartialPerm([170001], [170001]) < PartialPerm([170002], [170002]);
true

# ProdPPerm2Perm2, Case 1 of 6: codeg(f)<=deg(p), domain known
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );;
> DomainOfPartialPerm(f);;
gap> p:=(7100);;
gap> g:=f*p;
[1,2,100][3,8](6,10)
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f := PartialPerm([123610]);;
gap> p := (765536);;
gap> f * p;
[4,6][5,10](1)(2)(3)

# ProdPPerm2Perm2, Case 2 of 6: codeg(f)<=deg(p), domain not known
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );;
gap> p:=(7100);;
gap> g:=f*p;
[1,2,100][3,8](6,10)
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );;
gap> p:=(7100);;
gap> g:=f*p;
[1,2,100][3,8](6,10)
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# ProdPPerm2Perm2, Case 3 of 6: codeg(f)>deg(p), domain known
gap> f:=PartialPerm([1100], [1002]);; DomainOfPartialPerm(f);;
gap> p:=(710);;
gap> g:=f*p;
[1,100,2]
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f:=PartialPerm([165535], [655352]);;
gap> p:=(1710000);;
gap> g:=f*p;
[1,65535,2]
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# ProdPPerm2Perm2, Case 4 of 6: codeg(f)>deg(p), domain not known
gap> f:=PartialPerm([1100], [1002]);;
gap> p:=(710);;
gap> g:=f*p;
[1,100,2]
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f:=PartialPerm([110000], [100002]);;
gap> p:=(131000);;
gap> g:=f*p;
[1,10000,2]
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# ProdPPerm2Perm2, Case 5 of 6: deg(p)=65536, domain not known
gap> p:=(1,65536);;
gap> f:=PartialPerm([110000], [100002]);;
gap> g:=f*p;
[1,10000,2]
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# ProdPPerm2Perm2, Case 6 of 6: deg(p)=65536, domain known
gap> f:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(f);;
gap> p:=(1,65536);;
gap> g:=f*p;
[1,10000,2]
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# ProdPPerm2Perm4, Case 1 of 2: domain known
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );; DomainOfPartialPerm(f);;
gap> p:=(1,100000);;
gap> g:=f*p;
[1,2,7][3,8](6,10)
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# ProdPPerm2Perm4, Case 2 of 2: domain not known
gap> f:=PartialPerm([11000], [10002]);;
gap> p:=(1,100000);;
gap> g:=f*p;
[1,1000,2]
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true

# ProdPPerm4Perm4, Case 1 of 4: deg(p)>codeg(f) domain not known
gap> p:=(1,100000);;
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,70000]));;
gap> g:=f*p;                  
[65536,100000][65537,70000]
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true

# ProdPPerm4Perm4, Case 2 of 4: deg(p)>codeg(f) domain known
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,70000]));
[65536,1][65537,70000]
gap> p:=(1,100000);;
gap> g:=f*p;
[65536,100000][65537,70000]
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true

# QuoPPerm4Perm4, Case 1 of 4: deg(p)>codeg(f) domain not known
gap> p:=(1,100000,123);;
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,70000]));;
gap> g:=f/p;                  
[65536,123][65537,70000]
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> f/p=f*p^-1;
true

# QuoPPerm4Perm4, Case 2 of 4: deg(p)>codeg(f) domain known
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,70000]));
[65536,1][65537,70000]
gap> p:=(1,100000,123);;
gap> g:=f/p;
[65536,123][65537,70000]
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> f/p=f*p^-1;
true

# QuoPPerm4Perm4, Case 3 of 4: deg(p)<=codeg(f) domain not known
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,100001]));;
gap> p:=(1,100000,123);;
gap> g:=f/p;
[65536,123][65537,100001]
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> f/p=f*p^-1;
true

# QuoPPerm4Perm4, Case 4 of 4: deg(p)<=codeg(f) domain known
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,100001]));
[65536,1][65537,100001]
gap> p:=(1,100000,123);;
gap> g:=f/p;
[65536,123][65537,100001]
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);  
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> f/p=f*p^-1;
true

# QuoPPerm4Perm4: Corner cases
gap> EMPTY_PPERM4 / ((165537) * (165537));
<empty partial perm>
gap> PPerm4([1]) / ((165537) * (165537));
<identity partial perm on [ 1 ]>

# QuoPPerm2Perm2, Case 1 of 4: deg(p) > codeg(f) domain not known
gap> p := (11012);;
gap> f := PartialPermNC(Concatenation(List([1 .. 65], x -> 0), [170]));;
gap> g := f / p;                  
[66,12][67,70]
gap> OnTuples(ImageListOfPartialPerm(f), p ^ -1) = ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g) = Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g) = DomainOfPartialPerm(f);
true
gap> f / p = f * p ^ -1;
true

# QuoPPerm2Perm2, Case 2 of 4: deg(p) > codeg(f) domain known
gap> p := (11012);;
gap> f := PartialPermNC(Concatenation(List([1 .. 65], x -> 0), [170]));;
gap> DomainOfPartialPerm(f);
6667 ]
gap> g := f / p;
[66,12][67,70]
gap> OnTuples(ImageListOfPartialPerm(f), p ^ -1) = ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g) = Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g) = DomainOfPartialPerm(f);
true
gap> f / p = f * p ^ -1;
true

# QuoPPerm2Perm2, Case 3 of 4: deg(p) <= codeg(f) domain not known
gap> p := (11012);;
gap> f := PartialPermNC(Concatenation(List([1 .. 65], x -> 0), [170]));;
gap> g := f / p;
[66,12][67,70]
gap> OnTuples(ImageListOfPartialPerm(f), p ^ -1) = ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g) = Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g) = DomainOfPartialPerm(f);
true
gap> f / p = f * p ^ -1;
true

# QuoPPerm2Perm2, Case 4 of 4: deg(p) <= codeg(f) domain known
gap> p := (11012);;
gap> f := PartialPermNC(Concatenation(List([1 .. 65], x -> 0), [170]));;
gap> DomainOfPartialPerm(f);;
gap> g := f / p;
[66,12][67,70]
gap> OnTuples(ImageListOfPartialPerm(f), p ^ -1) = ImageListOfPartialPerm(g);  
true
gap> CodegreeOfPartialPerm(g) = Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g) = DomainOfPartialPerm(f);
true
gap> f / p = f * p ^ -1;
true

# QuoPPerm2Perm2: Corner cases
gap> EmptyPartialPerm() / ((110) * (110));
<empty partial perm>
gap> PartialPerm([1]) / ((110) * (110));
<identity partial perm on [ 1 ]>
gap> p := (165535);;
gap> f := PartialPermNC(Concatenation(List([1 .. 65], x -> 0), [170]));;
gap> f / p;
[66,65535][67,70]

# QuoPPerm4Perm2, Case 1 of 4: deg(p) > codeg(f) domain not known
gap> p := (11012);;
gap> f := PPerm4(Concatenation(List([1 .. 65], x -> 0), [170]));;
gap> g := f / p;                  
[66,12][67,70]
gap> OnTuples(ImageListOfPartialPerm(f), p ^ -1) = ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g) = Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g) = DomainOfPartialPerm(f);
true
gap> f / p = f * p ^ -1;
true

# QuoPPerm4Perm2, Case 2 of 4: deg(p) > codeg(f) domain known
gap> p := (11012);;
gap> f := PPerm4(Concatenation(List([1 .. 65], x -> 0), [170]));;
gap> DomainOfPartialPerm(f);
6667 ]
gap> g := f / p;
[66,12][67,70]
gap> OnTuples(ImageListOfPartialPerm(f), p ^ -1) = ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g) = Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g) = DomainOfPartialPerm(f);
true
gap> f / p = f * p ^ -1;
true

# QuoPPerm4Perm2, Case 3 of 4: deg(p) <= codeg(f) domain not known
gap> p := (11012);;
gap> f := PPerm4(Concatenation(List([1 .. 65], x -> 0), [170]));;
gap> g := f / p;
[66,12][67,70]
gap> OnTuples(ImageListOfPartialPerm(f), p ^ -1) = ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g) = Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g) = DomainOfPartialPerm(f);
true
gap> f / p = f * p ^ -1;
true

# QuoPPerm4Perm2, Case 4 of 4: deg(p) <= codeg(f) domain known
gap> p := (11012);;
gap> f := PPerm4(Concatenation(List([1 .. 65], x -> 0), [170]));;
gap> DomainOfPartialPerm(f);;
gap> g := f / p;
[66,12][67,70]
gap> OnTuples(ImageListOfPartialPerm(f), p ^ -1) = ImageListOfPartialPerm(g);  
true
gap> CodegreeOfPartialPerm(g) = Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g) = DomainOfPartialPerm(f);
true
gap> f / p = f * p ^ -1;
true

# QuoPPerm4Perm2: Corner cases
gap> EMPTY_PPERM4 / ((110) * (110));
<empty partial perm>
gap> PPerm4([1]) / ((110) * (110));
<identity partial perm on [ 1 ]>
gap> p := (165536);;
gap> f := PPerm4(Concatenation(List([1 .. 65], x -> 0), [170]));;
gap> f / p;
[66,65536][67,70]

# QuoPPerm2Perm4
gap> EmptyPartialPerm() / (165537);
<empty partial perm>
gap> PartialPerm([1]) / ((165537) * (165537));
<identity partial perm on [ 1 ]>
gap> PartialPerm([1]) / (165537);
[1,65537]

# ProdPPerm4Perm4, Case 3 of 4: deg(p)<=codeg(f) domain not known
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,100001]));;
gap> p:=(1,100000);;
gap> g:=f*p;
[65536,100000][65537,100001]
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true

# ProdPPerm4Perm4, Case 4 of 4: deg(p)<=codeg(f) domain known
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,100001]));
[65536,1][65537,100001]
gap> p:=(1,100000);;
gap> g:=f*p;
[65536,100000][65537,100001]
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);  
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true

# ProdPPerm4Perm2, Case 1 of 2: domain not known
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,100001]));;
gap> p:=(1,2);;
gap> g:=f*p;
[65536,2][65537,100001]
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);  
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true

# ProdPPerm4Perm2, Case 2 of 2: domain known
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,100001])); 
[65536,1][65537,100001]
gap> p:=(1,2);;
gap> g:=f*p;
[65536,2][65537,100001]
gap> OnTuples(ImageListOfPartialPerm(f), p)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true

# ProdPerm2PPerm2, Case 1 of 2: deg(p)<=deg(f)
gap> f:=PartialPermNC([ 1236810 ], [ 267915 ]);;
gap> p:=(1,2,5,3);;
gap> g:=p*f;                                                          
[3,2][8,1,6,9][10,5,7]
gap> OnSets(DomainOfPartialPerm(f), p^-1)=DomainOfPartialPerm(g);
true
gap> OnTuples(OnTuples(DomainOfPartialPerm(g), p), f)=
> ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> ImageSetOfPartialPerm(f)=ImageSetOfPartialPerm(g);
true
gap> f:=PartialPerm([110000], [100002]);;
gap> p:=(139000);;
gap> g:=p*f;;
gap> OnSets(DomainOfPartialPerm(f), p^-1)=DomainOfPartialPerm(g);
true
gap> OnTuples(OnTuples(DomainOfPartialPerm(g), p), f)=
> ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> ImageSetOfPartialPerm(f)=ImageSetOfPartialPerm(g);
true
gap> f:=PartialPermNC( [ 1236100000 ], [ 26715 ] );;
gap> p:=(1,3)(2,9,7,8,6,10,5,4);;
gap> p*f;
[3,2][4,6][8,1,7][100000,5]

# ProdPerm2PPerm2, Case 2 of 2: deg(p)>deg(f)
gap> f:=PartialPermNC([ 1236810 ], [ 267915 ]);;
gap> p:=(1,5,12,8)(2,16,10,15,13,7)(3,4,20,14,6,19,9,18,11,17);;
gap> g:=p*f;
[8,2][12,1][14,9][16,5][17,7,6]
gap> OnSets(DomainOfPartialPerm(f), p^-1);
7812141617 ]
gap> OnTuples(OnTuples(last, p), f)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> ImageSetOfPartialPerm(f)=ImageSetOfPartialPerm(g);
true
gap> f:=PartialPerm([11000], [10002]);;
gap> p:=(132000);;
gap> g:=p*f;;
gap> OnSets(DomainOfPartialPerm(f), p^-1)=DomainOfPartialPerm(g);
true
gap> OnTuples(OnTuples(DomainOfPartialPerm(g), p), f)=
> ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> ImageSetOfPartialPerm(f)=ImageSetOfPartialPerm(g);          
true

# ProdPerm4PPerm4, Case 1 of 2: deg(p)<=deg(f)
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,100001]));
[65536,1][65537,100001]
gap> p:=(1,65537);; 
gap> g:=p*f;
[65536,1,100001]
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# ProdPerm4PPerm4, Case 2 of 2: deg(p)>deg(f)
gap> f:=PartialPermNC([1,65536], [1,65536]);;
gap> p:=(1,100000);;
gap> g:=p*f;
[100000,1](65536)
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# ProdPerm4PPerm2, Case 1 of 2: deg(p)<=deg(f)
gap> p:=(1,100000);;
gap> f:=PartialPermNC([ 1236810 ], [ 267915 ]);;
gap> g:=p*f;
[3,7][8,1][10,5][100000,2,6,9]
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# ProdPerm4PPerm2, Case 2 of 2: deg(p)>deg(f)
gap> f:=PartialPermNC([65537],[1]);;
gap> IsPPerm2Rep(f);
true
gap> p:=(6553765538);;
gap> g:=p*f;
[65538,1]
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> (165537) * EmptyPartialPerm();
<empty partial perm>

# ProdPerm2PPerm4, Case 1 of 2: deg(p)<=deg(f)
gap> p:=(1,10000);;
gap> f:=PartialPermNC([ 10000 ], [ 70000 ] );;
gap> g:=p*f;
[1,70000]
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# ProdPerm2PPerm4, Case 2 of 2: deg(p)>deg(f)
gap> f:=PartialPermNC([ 1 ], [ 70000 ] );;    
gap> p:=(1,10000);;
gap> g:=p*f;
[10000,70000]
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true

# InvPPerm2, Case 1 of 4, deg>65535 and domain not known
gap> f:=PartialPerm([100000],[1])*PartialPermNC([1]);;
gap> f^-1;
[1,100000]
gap> f*f^-1=LeftOne(f);
true
gap> f^-1*f=RightOne(f);
true

# InvPPerm2, Case 2 of 4, deg>65535 and domain known
gap> f:=PartialPerm([100000], [1]);
[100000,1]
gap> f^-1;
[1,100000]
gap> f*f^-1=LeftOne(f);
true
gap> f^-1*f=RightOne(f);
true

# InvPPerm2, Case 3 of 4, deg<65536 and domain not known
gap> f:=PartialPermNC( [ 1234567810111216171819 ], 
> [ 312144111817295158201019 ] );;
gap> f:=f*RightOne(f);;
gap> f^-1;
[9,10,18,6][14,3,1][15,12,2,8,16][20,17,7](4)(5,11)(19)
gap> f*f^-1=LeftOne(f);
true
gap> f^-1*f=RightOne(f);
true

# InvPPerm2, Case 4 of 4, deg<65536 and domain known
gap> f:=PartialPermNC( [ 1234568910121416181920 ], 
> [ 1318541411129202187319 ] );;
gap> f^-1;
[7,18,16][11,8,3,19,20,12,9,10][13,1,2,14,6](4,5)
gap> f*f^-1=LeftOne(f);
true
gap> f^-1*f=RightOne(f);
true

# InvPPerm4, Case 1 of 4, deg>65535 and domain not known
gap> f:=PartialPerm([100000],[100001]);;
gap> f:=f*RightOne(f);;
gap> f^-1;
[100001,100000]
gap> f*f^-1=LeftOne(f);
true
gap> f^-1*f=RightOne(f);
true

# InvPPerm4, Case 2 of 4, deg>65535 and domain known
gap> f:=PartialPerm([100000],[100001]);
[100000,100001]
gap> f^-1;
[100001,100000]
gap> f*f^-1=LeftOne(f);
true
gap> f^-1*f=RightOne(f);
true

# InvPPerm4, Case 3 of 4, deg<65536 and domain not known
gap> f:=PartialPerm([1],[100001]);;
gap> f:=f*RightOne(f);;
gap> f^-1;
[100001,1]
gap> f*f^-1=LeftOne(f);
true
gap> f^-1*f=RightOne(f);
true

# InvPPerm4, Case 4 of 4, deg<65536 and domain known
gap> f:=PartialPerm([1],[100001]);;
gap> f^-1;
[100001,1]
gap> f*f^-1=LeftOne(f);
true
gap> f^-1*f=RightOne(f);
true

# PowPPerm2Perm2, Case 1 of 4, deg(f)>deg(p) and codeg(f)>deg(p)
gap> f:=PartialPermNC( [ 1234567810111216171819 ], 
> [ 312144111817295158201019 ] );;
gap> p:=(1,7,10,4,9,8)(3,6,5);;
gap> f^p;
[5,18,4,8][7,6,14][10,17,20][16,1,2,12,15](3,11)(9)(19)
gap> p^-1*f*p;                     
[5,18,4,8][7,6,14][10,17,20][16,1,2,12,15](3,11)(9)(19)
gap> f^p=p^-1*f*p;
true
gap> EmptyPartialPerm() ^ ();
<empty partial perm>

# PowPPerm2Perm2, Case 2 of 4, deg(f)>deg(p) and codeg(f)<=deg(p)
gap> f:=PartialPermNC( [ 1112131415181920 ], 
> [ 421059638 ] );;
gap> CodegreeOfPartialPerm(f);
10
gap> DegreeOfPartialPerm(f);
20
gap> p:=(1,4,8,3,2,7,6,10,9,5);;
gap> f^p;
[11,8][12,7][13,9][14,1][15,5][18,10][19,2][20,3]
gap> p^-1*f*p;
[11,8][12,7][13,9][14,1][15,5][18,10][19,2][20,3]

# PowPPerm2Perm2, Case 3 of 4, deg(f)<=deg(p) and codeg(f)>deg(p)
gap> f:=f^-1;;
gap> DegreeOfPartialPerm(f);
10
gap> CodegreeOfPartialPerm(f);     
20
gap> p:=(1,7,4,8)(2,6,5)(9,10);;
gap> f^p;
[1,20][2,14][3,19][5,18][6,12][8,11][9,13][10,15]
gap> p^-1*f*p;                     
[1,20][2,14][3,19][5,18][6,12][8,11][9,13][10,15]

# PowPPerm2Perm2, Case 4 of 4, deg(f)<=deg(p) and codeg(f)<=deg(p)
gap> f:=PartialPermNC( 
> [ 12357910121314161719202122
>   2326272829303132353639404143474849 ], 
> [ 54452443282131134920461117292272732
>   3042644391516343711240478 ] );;
gap> p:=(1,76,65,52,5,59,75,64,37,12,78,41,57,48,94,32,9,3,99,17,89)
> (2,35,33,63,43,28,
22,15,100,66,45,4,80,58,51,67,55,24,56,86,49,38,42,93,88,18,77,62,79,19,92,50,
83,91,44,95,14,72,60,85,34)(6,16,31,11,97,46,47,73,7,39,27,70,61,71,74,10,
96,98,87,53,81)(8,54,20,36,23,26,40,68,25,90,13,30,84,29,21,69,82);;
gap> DegreeOfPartialPerm(f);
49
gap> CodegreeOfPartialPerm(f);
49
gap> f^p;
[3,22,84,16][23,31,36,89,47][26,39,28,78,11,95][33,100][35,80][40,70,9,27,2]
[57,76,59,56][72,38,54][92,97][94,73,68,12][96,69,21,93][99,4](15)(30)
gap> p^-1*f*p;                      
[3,22,84,16][23,31,36,89,47][26,39,28,78,11,95][33,100][35,80][40,70,9,27,2]
[57,76,59,56][72,38,54][92,97][94,73,68,12][96,69,21,93][99,4](15)(30)
gap> f^p=p^-1*f*p;
true

# PowPPerm2Perm4, Case 1 of 2, deg(f)>deg(p) and codeg(f)<=deg(p)
gap> f:=PartialPermNC([100000], [1]);
[100000,1]
gap> IsPPerm2Rep(f);
true
gap> p := (17100000);;
gap> f^p=p^-1*f*p;
true
gap> EmptyPartialPerm() ^ (165537);
<empty partial perm>
gap> PartialPerm([1103]) ^ ((165537) * (165537));
[2,10](1)(3)

# PowPPerm2Perm4, Case 2 of 2, deg(f)<=deg(p) and codeg(f)<=deg(p)
gap> f := PartialPermNC([123456], [258134]);;
gap> p := (17100000);;
gap> f^p=p^-1*f*p;               
true

# PowPPerm4Perm2, Case 1 of 4, deg(f)>deg(p) and codeg(f)>deg(p)
gap> f:=PartialPermNC([100000], [100000]);
<identity partial perm on [ 100000 ]>
gap> p:=(1,3,2,10)(5,7)(6,9,8);;
gap> f^p;
<identity partial perm on [ 100000 ]>
gap> f:=PartialPerm([1100000], [1000002]);;        
gap> p:=(1750000);;
gap> f^p=p^-1*f*p;
true

# PowPPerm4Perm2, Case 2 of 4, deg(f)>deg(p) and codeg(f)<=deg(p)
gap> f:=PartialPermNC([100000], [1]);     
[100000,1]
gap> p:=(1,10)(3,8)(4,7,5,9);;
gap> f^p;
[100000,10]
gap> p^-1*f*p;
[100000,10]
gap> f:=PartialPermNC( [ 124567 ], [ 51000007314 ] );;
gap> f:=f*PartialPermNC([1..99999]);                                        
[6,1,5,3](4,7)
gap> IsPPerm4Rep(f);
true
gap> f:=JoinOfPartialPerms(f, PartialPermNC([100000],[8]));
[6,1,5,3][100000,8](4,7)
gap> IsPPerm4Rep(f);
true
gap> p:=(1,10,4,5,3,8,2,6,7,9);;
gap> f^p;
[7,10,3,8][100000,2](5,9)
gap> p^-1*f*p;
[7,10,3,8][100000,2](5,9)

# PowPPerm4Perm2, Case 3 of 4, deg(f)<=deg(p) and codeg(f)>deg(p)
gap> p:=(1,6,7,9,4,3,10,2,5,8);;
gap> f:=PartialPermNC( [ 1 ], [100000] );;
gap> IsPPerm4Rep(f);
true
gap> f^p;
[6,100000]
gap> p^-1*f*p;
[6,100000]

# PowPPerm4Perm2, Case 4 of 4, deg(f)<=deg(p) and codeg(f)<=deg(p)
gap> f:=PartialPermNC( [ 124567 ], [ 51000007314 ] );;
gap> f:=f*PartialPermNC([1..99999]);
[6,1,5,3](4,7)
gap> IsPPerm4Rep(f);
true
gap> p:=(1,3,5,4,6)(7,10,8,9);;
gap> f^p;
[1,3,4,5](6,10)
gap> p^-1*f*p;
[1,3,4,5](6,10)

# PowPPerm4Perm2
gap> EMPTY_PPERM4 ^ ();
<empty partial perm>
gap> EMPTY_PPERM4 ^ (165537);
<empty partial perm>
gap> () * EMPTY_PPERM4;
<empty partial perm>

#

# PowPPerm4Perm4, Case 1 of 4, deg(f)>deg(p) and codeg(f)>deg(p)
gap> f:=PartialPerm([1100000], [1000002]);; 
gap> p:=(1765538);;
gap> IsPPerm4Rep(f); IsPerm4Rep(p);
true
true
gap> f^p=p^-1*f*p;
true

# PowPPerm4Perm4, Case 2 of 4, deg(f)>deg(p) and codeg(f)<=deg(p)
gap> f:=PartialPermNC([100000], [65536]);;
gap> p:=(1770000);;
gap> f^p=p^-1*f*p;
true

# PowPPerm4Perm4, Case 3 of 4, deg(f)<=deg(p) and codeg(f)>deg(p)
gap> f:=f^-1;
[65536,100000]
gap> f^p=p^-1*f*p;
true

# PowPPerm4Perm4, Case 4 of 4, deg(f)<=deg(p) and codeg(f)<=deg(p)
gap> f:=PartialPerm([166000], [660002]);; 
gap> p:=(1770000);;
gap> f^p=p^-1*f*p;
true

# QuoPPerm22, Case 1 of 4, dom(g) known,   dom(f) known
gap> f:=PartialPermNC( [ 12456910 ], [ 87951061 ] );;
gap> g:=PartialPermNC( [ 123456910 ], 
> [ 59742361 ] );
[10,1,5,2,9,6,3,7](4)
gap> f/g;
[4,2,3][5,1](9)(10)
gap> f*g^-1;
[4,2,3][5,1](9)(10)
gap> f*g^-1=f/g;
true
gap> f:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true
gap> f:=PartialPermNC([100000], [1]);
[100000,1]
gap> f/f;
<identity partial perm on [ 100000 ]>

# QuoPPerm22, Case 2 of 4, dom(g) known,   dom(f) unknown
gap> f:=PartialPermNC([5,9,4,2,0,3,7,6,0,10]);;
gap> g:=PartialPermNC( [ 12356710 ], [ 18104372 ] );
[5,4][6,3,10,2,8](1)(7)
gap> f/g;
[4,10,3,5](6)(7)
gap> f*g^-1;
[4,10,3,5](6)(7)
gap> f/g=f*g^-1;
true
gap> f:=PartialPerm([110000], [100002]);;
gap> g:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true

# QuoPPerm22, Case 3 of 4, dom(g) unknown, dom(f) known
gap> g:=PartialPermNC([5,9,4,2,0,3,7,6,0,10]);;
gap> f:=PartialPermNC( [ 12356710 ], [ 18104372 ] );
[5,4][6,3,10,2,8](1)(7)
gap> f/g;
[5,3,10,4](6)(7)
gap> f*g^-1;
[5,3,10,4](6)(7)
gap> f:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g:=PartialPerm([110000], [100002]);;
gap> f/g=f*g^-1;
true

# QuoPPerm22, Case 4 of 4, dom(g) unknown, dom(f) unknown
gap> f:=PartialPermNC([ 18100437002 ]);;
gap> g:=PartialPermNC([5,9,4,2,0,3,7,6,0,10]);;
gap> f/g=f*g^-1;
true
gap> f:=PartialPerm([110000], [100002]);;                          
gap> g:=PartialPerm([110000], [100002]);;
gap> f/g=f*g^-1;
true

# QuoPPerm22: corner cases
gap> PartialPermNC([18100437002]) / EmptyPartialPerm();
<empty partial perm>
gap> EmptyPartialPerm() / PartialPermNC([18100437002]);
<empty partial perm>
gap> PartialPerm([123]) / PartialPerm([456]);
<empty partial perm>

# QuoPPerm42, Case 1 of 4, dom(g) known,   dom(f) known
gap> f:=PPerm4( [ 12456910 ], [ 87951061 ] );;
gap> g:=PartialPermNC( [ 123456910 ], 
> [ 59742361 ] );
[10,1,5,2,9,6,3,7](4)
gap> f/g;
[4,2,3][5,1](9)(10)
gap> f*g^-1;
[4,2,3][5,1](9)(10)
gap> f*g^-1=f/g;
true
gap> f:=PPerm4([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true
gap> f:=PPerm4([100000], [1]);
[100000,1]
gap> f/f;
<identity partial perm on [ 100000 ]>

# QuoPPerm42, Case 2 of 4, dom(g) known,   dom(f) unknown
gap> f:=PPerm4([5,9,4,2,0,3,7,6,0,10]);;
gap> g:=PartialPermNC( [ 12356710 ], [ 18104372 ] );
[5,4][6,3,10,2,8](1)(7)
gap> f/g;
[4,10,3,5](6)(7)
gap> f*g^-1;
[4,10,3,5](6)(7)
gap> f/g=f*g^-1;
true
gap> f:=PPerm4([110000], [100002]);;
gap> g:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true

# QuoPPerm42, Case 3 of 4, dom(g) unknown, dom(f) known
gap> g:=PartialPermNC([5,9,4,2,0,3,7,6,0,10]);;
gap> f:=PPerm4( [ 12356710 ], [ 18104372 ] );
[5,4][6,3,10,2,8](1)(7)
gap> f/g;
[5,3,10,4](6)(7)
gap> f*g^-1;
[5,3,10,4](6)(7)
gap> f:=PPerm4([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g:=PartialPerm([110000], [100002]);;
gap> f/g=f*g^-1;
true

# QuoPPerm42, Case 4 of 4, dom(g) unknown, dom(f) unknown
gap> f:=PPerm4([ 18100437002 ]);;
gap> g:=PartialPermNC([5,9,4,2,0,3,7,6,0,10]);;
gap> f/g=f*g^-1;
true
gap> f:=PPerm4([110000], [100002]);;                          
gap> g:=PartialPerm([110000], [100002]);;
gap> f/g=f*g^-1;
true

# QuoPPerm42: corner cases
gap> PPerm4([18100437002]) / EmptyPartialPerm();
<empty partial perm>
gap> EMPTY_PPERM4 / PartialPermNC([18100437002]);
<empty partial perm>
gap> PPerm4([123]) / PartialPerm([456]);
<empty partial perm>

# QuoPPerm24, Case 1 of 4, dom(g) known,   dom(f) known
gap> f:=PartialPerm( [ 12456910 ], [ 87951061 ] );;
gap> g:=PPerm4( [ 123456910 ], 
> [ 59742361 ] );
[10,1,5,2,9,6,3,7](4)
gap> f/g;
[4,2,3][5,1](9)(10)
gap> f*g^-1;
[4,2,3][5,1](9)(10)
gap> f*g^-1=f/g;
true
gap> f:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g:=PPerm4([110000], [100002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true
gap> f:=PartialPerm([100000], [1]);
[100000,1]
gap> f/f;
<identity partial perm on [ 100000 ]>

# QuoPPerm24, Case 2 of 4, dom(g) known,   dom(f) unknown
gap> f:=PartialPerm([5,9,4,2,0,3,7,6,0,10]);;
gap> g:=PPerm4( [ 12356710 ], [ 18104372 ] );
[5,4][6,3,10,2,8](1)(7)
gap> f/g;
[4,10,3,5](6)(7)
gap> f*g^-1;
[4,10,3,5](6)(7)
gap> f/g=f*g^-1;
true
gap> f:=PartialPerm([110000], [100002]);;
gap> g:=PPerm4([110000], [100002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true

# QuoPPerm24, Case 3 of 4, dom(g) unknown, dom(f) known
gap> g:=PPerm4([5,9,4,2,0,3,7,6,0,10]);;
gap> f:=PartialPerm( [ 12356710 ], [ 18104372 ] );
[5,4][6,3,10,2,8](1)(7)
gap> f/g;
[5,3,10,4](6)(7)
gap> f*g^-1;
[5,3,10,4](6)(7)
gap> f:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g:=PPerm4([110000], [100002]);;
gap> f/g=f*g^-1;
true

# QuoPPerm24, Case 4 of 4, dom(g) unknown, dom(f) unknown
gap> f:=PartialPerm([ 18100437002 ]);;
gap> g:=PPerm4([5,9,4,2,0,3,7,6,0,10]);;
gap> f/g=f*g^-1;
true
gap> f:=PartialPerm([110000], [100002]);;                          
gap> g:=PPerm4([110000], [100002]);;
gap> f/g=f*g^-1;
true

# QuoPPerm24: corner cases
gap> PartialPerm([18100437002]) / EMPTY_PPERM4;
<empty partial perm>
gap> EMPTY_PPERM4 / PPerm4([18100437002]);
<empty partial perm>
gap> PartialPerm([123]) / PPerm4([456]);
<empty partial perm>

# QuoPPerm44, Case 1 of 4, dom(g) known,   dom(f) known
gap> f:=PPerm4( [ 12456910 ], [ 87951061 ] );;
gap> g:=PPerm4( [ 123456910 ], 
> [ 59742361 ] );
[10,1,5,2,9,6,3,7](4)
gap> f/g;
[4,2,3][5,1](9)(10)
gap> f*g^-1;
[4,2,3][5,1](9)(10)
gap> f*g^-1=f/g;
true
gap> f:=PPerm4([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g:=PPerm4([110000], [100002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true
gap> f:=PPerm4([100000], [1]);
[100000,1]
gap> f/f;
<identity partial perm on [ 100000 ]>

# QuoPPerm44, Case 2 of 4, dom(g) known,   dom(f) unknown
gap> f:=PPerm4([5,9,4,2,0,3,7,6,0,10]);;
gap> g:=PPerm4( [ 12356710 ], [ 18104372 ] );
[5,4][6,3,10,2,8](1)(7)
gap> f/g;
[4,10,3,5](6)(7)
gap> f*g^-1;
[4,10,3,5](6)(7)
gap> f/g=f*g^-1;
true
gap> f:=PPerm4([110000], [100002]);;
gap> g:=PPerm4([110000], [100002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true

# QuoPPerm44, Case 3 of 4, dom(g) unknown, dom(f) known
gap> g:=PPerm4([5,9,4,2,0,3,7,6,0,10]);;
gap> f:=PPerm4( [ 12356710 ], [ 18104372 ] );
[5,4][6,3,10,2,8](1)(7)
gap> f/g;
[5,3,10,4](6)(7)
gap> f*g^-1;
[5,3,10,4](6)(7)
gap> f:=PPerm4([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g:=PPerm4([110000], [100002]);;
gap> f/g=f*g^-1;
true

# QuoPPerm44, Case 4 of 4, dom(g) unknown, dom(f) unknown
gap> f:=PPerm4([ 18100437002 ]);;
gap> g:=PPerm4([5,9,4,2,0,3,7,6,0,10]);;
gap> f/g=f*g^-1;
true
gap> f:=PPerm4([110000], [100002]);;                          
gap> g:=PPerm4([110000], [100002]);;
gap> f/g=f*g^-1;
true

# QuoPPerm44: corner cases
gap> PPerm4([18100437002]) / EMPTY_PPERM4;
<empty partial perm>
gap> EMPTY_PPERM4 / PPerm4([18100437002]);
<empty partial perm>
gap> PPerm4([123]) / PPerm4([456]);
<empty partial perm>

# LQuoPerm2PPerm2, Case 1 of 4, deg(p)<deg(f),  dom(f) unknown
gap> f:=PartialPermNC(
> [ 1112913200214180731900000516 ]);;
gap> p:=(1,7,10,4,9,8)(3,6,5);;
gap> LQUO(p, f);
[1,14][6,9,13,19,5][8,18][10,2,12,3,20,16](7,11)
gap> p^-1*f;
[1,14][6,9,13,19,5][8,18][10,2,12,3,20,16](7,11)
gap> last=last2;
true

# LQuoPerm2PPerm2, Case 2 of 4, deg(p)<deg(f),  dom(f) known
gap> f:=PartialPermNC( [ 1234689101213151618 ], 
> [ 13918157310212141116 ] );;
gap> p:=(1,5,8,4,6,3)(2,9,10);;
gap> LQUO(p, f);
[4,7][6,1,18,16,11][15,14](2,10,3,5,13,12)(9)
gap> p^-1*f;
[4,7][6,1,18,16,11][15,14](2,10,3,5,13,12)(9)
gap> last=last2;
true

# LQuoPerm2PPerm2, Case 3 of 4, deg(p)>=deg(f), dom(f) unknown
gap> f:=PartialPermNC([ 70100489006 ]);;
gap> p:=(1,16,4,12,6,20,13,9,19,3,7,17,10,14,11,15,2);;
gap> LQUO(p, f);
[5,4][14,6][16,7,10][17,9][20,8]
gap> p^-1*f;
[5,4][14,6][16,7,10][17,9][20,8]
gap> last=last2;
true

# LQuoPerm2PPerm2, Case 4 of 4, deg(p)>=deg(f), dom(f) known
gap> f:=PartialPermNC( [ 123456710 ], 
> [ 238910614 ] );;
gap> p:=(1,13,15,3,5,7,17)(2,16,12,11,19,18,14,8,10,9,20)(4,6);;
gap> LQUO(p, f);
[5,8][7,10][13,2][16,3][17,1](4,6,9)
gap> p^-1*f;                       
[5,8][7,10][13,2][16,3][17,1](4,6,9)
gap> last=last2;
true
gap> f:=PartialPerm([165535], [655352]);;
gap> p:=(1765536);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm2PPerm2, corner cases
gap> LQUO(p, EmptyPartialPerm());
<empty partial perm>

# LQuoPerm2PPerm4, Case 1 of 4, deg(p) < deg(f), dom(f) unknown
gap> f := PPerm4(
> [1112913200214180731900000516]);;
gap> p:=(1,7,10,4,9,8)(3,6,5);;
gap> LQUO(p, f);
[1,14][6,9,13,19,5][8,18][10,2,12,3,20,16](7,11)
gap> p ^ -1 * f;
[1,14][6,9,13,19,5][8,18][10,2,12,3,20,16](7,11)
gap> last = last2;
true

# LQuoPerm2PPerm4, Case 2 of 4, deg(p)<deg(f),  dom(f) known
gap> f:=PPerm4( [ 1234689101213151618 ], 
> [ 13918157310212141116 ] );;
gap> p:=(1,5,8,4,6,3)(2,9,10);;
gap> LQUO(p, f);
[4,7][6,1,18,16,11][15,14](2,10,3,5,13,12)(9)
gap> p^-1*f;
[4,7][6,1,18,16,11][15,14](2,10,3,5,13,12)(9)
gap> last=last2;
true

# LQuoPerm2PPerm4, Case 3 of 4, deg(p)>=deg(f), dom(f) unknown
gap> f:=PPerm4([ 70100489006 ]);;
gap> p:=(1,16,4,12,6,20,13,9,19,3,7,17,10,14,11,15,2);;
gap> LQUO(p, f);
[5,4][14,6][16,7,10][17,9][20,8]
gap> p^-1*f;
[5,4][14,6][16,7,10][17,9][20,8]
gap> last=last2;
true

# LQuoPerm2PPerm4, Case 4 of 4, deg(p)>=deg(f), dom(f) known
gap> f := PPerm4([123456710], 
>                [238910614]);;
gap> p:=(1,13,15,3,5,7,17)(2,16,12,11,19,18,14,8,10,9,20)(4,6);;
gap> LQUO(p, f);
[5,8][7,10][13,2][16,3][17,1](4,6,9)
gap> p^-1*f;                       
[5,8][7,10][13,2][16,3][17,1](4,6,9)
gap> last=last2;
true
gap> f:=PartialPerm([165535], [655352]);;
gap> p:=(1765536);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm2PPerm4, corner cases
gap> p:=(217);;
gap> LQUO(p, EMPTY_PPERM4);
<empty partial perm>

# LQuoPerm4PPerm2
gap> p:=(1765537);;
gap> LQUO(p, EmptyPartialPerm());
<empty partial perm>
gap> LQUO(p, EMPTY_PPERM4);
<empty partial perm>

# LQuoPerm4PPerm4, Case 1 of 4, deg(p) < deg(f), dom(f) unknown
gap> f := PPerm4(
> [1112913200214180731900000516]);;
gap> p := Perm4((1710498)(365));;
gap> LQUO(p, f);
[1,14][6,9,13,19,5][8,18][10,2,12,3,20,16](7,11)
gap> p ^ -1 * f;
[1,14][6,9,13,19,5][8,18][10,2,12,3,20,16](7,11)
gap> last = last2;
true
gap> f := PartialPermNC([1 .. 70000]);;
gap> p := (165537);;
gap> LQUO(p, f);
<partial perm on 70000 pts with degree 70000, codegree 70000>

# LQuoPerm4PPerm4, Case 2 of 4, deg(p)<deg(f),  dom(f) known
gap> f := PPerm4([1234689101213151618], 
> [13918157310212141116]);;
gap> p := Perm4((158463)(2910));;
gap> LQUO(p, f);
[4,7][6,1,18,16,11][15,14](2,10,3,5,13,12)(9)
gap> p^-1*f;
[4,7][6,1,18,16,11][15,14](2,10,3,5,13,12)(9)
gap> last=last2;
true

# LQuoPerm4PPerm4, Case 3 of 4, deg(p)>=deg(f), dom(f) unknown
gap> f:=PPerm4([ 70100489006 ]);;
gap> p:=Perm4((1,16,4,12,6,20,13,9,19,3,7,17,10,14,11,15,2));;
gap> LQUO(p, f);
[5,4][14,6][16,7,10][17,9][20,8]
gap> p^-1*f;
[5,4][14,6][16,7,10][17,9][20,8]
gap> last=last2;
true

# LQuoPerm4PPerm4, Case 4 of 4, deg(p)>=deg(f), dom(f) known
gap> f := PPerm4([123456710], 
>                [238910614]);;
gap> p:=Perm4((1,13,15,3,5,7,17)(2,16,12,11,19,18,14,8,10,9,20)(4,6));;
gap> LQUO(p, f);
[5,8][7,10][13,2][16,3][17,1](4,6,9)
gap> p^-1*f;                       
[5,8][7,10][13,2][16,3][17,1](4,6,9)
gap> last=last2;
true
gap> f:=PartialPerm([165535], [655352]);;
gap> p:=(1765536);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm4PPerm4, corner cases
gap> p:=(1765536);;
gap> LQUO(p, EMPTY_PPERM4);
<empty partial perm>

# LQuoPPerm22, Case 1 of 3, dom(g) unknown
gap> f:=PartialPermNC( [ 1234567810111216171819 ], 
> [ 312144111817295158201019 ] );;
gap> g:=PartialPermNC(
> [ 131854140111290200201807319 ]);;
gap> LQUO(f, g);
[2,11,4,5][10,7][12,1][15,20][19,3,13](8,18,14)(9)
gap> f^-1*g;
[2,11,4,5][10,7][12,1][15,20][19,3,13](8,18,14)(9)
gap> last=last2;
true
gap> f:=PartialPerm([110000], [100002]);;                             
gap> g:=PartialPerm([19000], [90002]);; 
gap> LQUO(f, g)=f^-1*g;
true

# LQuoPPerm22, Case 2 of 3, dom(g) known, deg(g)>deg(f)
gap> f:=PartialPermNC( [ 123567811121619 ], 
> [ 918201151681914131 ] );;
gap> g:=PartialPermNC( [ 1234578101113181920 ], 
> [ 5173102121411166915 ] );;
gap> LQUO(f, g)=f^-1*g;
true
gap> LQUO(f, g);
[8,12][16,2][18,1,9,5][19,11,10][20,7]
gap> f:=PartialPerm([19000], [90002]);; DomainOfPartialPerm(f);;
gap> g:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g)=f^-1*g;
true

# LQuoPPerm22, Case 3 of 3, dom(g) known, deg(g)<=deg(f)
gap> f:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g:=PartialPerm([19000], [90002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g)=f^-1*g; 
true

# LQuoPPerm22, corner cases
gap> LQUO(EmptyPartialPerm(), PartialPerm([1]));
<empty partial perm>
gap> LQUO(PartialPerm([1]), EmptyPartialPerm());
<empty partial perm>

# LQuoPPerm42, Case 1 of 3, dom(g) unknown
gap> f := PPerm4([1234567810111216171819], 
>                [312144111817295158201019]);;
gap> g := PartialPerm(
> [131854140111290200201807319]);;
gap> LQUO(f, g);
[2,11,4,5][10,7][12,1][15,20][19,3,13](8,18,14)(9)
gap> f ^ -1 * g;
[2,11,4,5][10,7][12,1][15,20][19,3,13](8,18,14)(9)
gap> last = last2;
true
gap> f := PPerm4([110000], [100002]);;                             
gap> g := PartialPerm([19000], [90002]);; 
gap> LQUO(f, g) = f ^ -1 * g;
true

# LQuoPPerm42, Case 2 of 3, dom(g) known, deg(g)>deg(f)
gap> f := PPerm4([123567811121619], 
>                [918201151681914131]);;
gap> g := PartialPermNC([1234578101113181920], 
>                       [5173102121411166915]);;
gap> LQUO(f, g) = f ^ -1 * g;
true
gap> LQUO(f, g);
[8,12][16,2][18,1,9,5][19,11,10][20,7]
gap> f := PPerm4([19000], [90002]);; DomainOfPartialPerm(f);;
gap> g := PartialPerm([110000], [100002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g) = f ^ -1 * g;
true

# LQuoPPerm42, Case 3 of 3, dom(g) known, deg(g)<=deg(f)
gap> f := PPerm4([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g := PartialPerm([19000], [90002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g) = f ^ -1 * g; 
true

# LQuoPPerm42, corner cases
gap> LQUO(EMPTY_PPERM4, PartialPerm([1]));
<empty partial perm>
gap> LQUO(PPerm4([1]), EmptyPartialPerm());
<empty partial perm>

# LQuoPPerm24, Case 1 of 3, dom(g) unknown
gap> f := PartialPerm([1234567810111216171819], 
>                [312144111817295158201019]);;
gap> g := PPerm4(
> [131854140111290200201807319]);;
gap> LQUO(f, g);
[2,11,4,5][10,7][12,1][15,20][19,3,13](8,18,14)(9)
gap> f ^ -1 * g;
[2,11,4,5][10,7][12,1][15,20][19,3,13](8,18,14)(9)
gap> last = last2;
true
gap> f := PartialPerm([110000], [100002]);;                             
gap> g := PPerm4([19000], [90002]);; 
gap> LQUO(f, g) = f ^ -1 * g;
true

# LQuoPPerm24, Case 2 of 3, dom(g) known, deg(g)>deg(f)
gap> f := PartialPerm([123567811121619], 
>                [918201151681914131]);;
gap> g := PPerm4([1234578101113181920], 
>                       [5173102121411166915]);;
gap> LQUO(f, g) = f ^ -1 * g;
true
gap> LQUO(f, g);
[8,12][16,2][18,1,9,5][19,11,10][20,7]
gap> f := PartialPerm([19000], [90002]);; DomainOfPartialPerm(f);;
gap> g := PPerm4([110000], [100002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g) = f ^ -1 * g;
true

# LQuoPPerm24, Case 3 of 3, dom(g) known, deg(g)<=deg(f)
gap> f := PartialPerm([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g := PPerm4([19000], [90002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g) = f ^ -1 * g; 
true

# LQuoPPerm24, corner cases
gap> LQUO(EmptyPartialPerm(), PPerm4([1]));
<empty partial perm>
gap> LQUO(PartialPerm([1]), EMPTY_PPERM4);
<empty partial perm>

# LQuoPPerm44, Case 1 of 3, dom(g) unknown
gap> f := PPerm4([1234567810111216171819], 
>                [312144111817295158201019]);;
gap> g := PPerm4(
> [131854140111290200201807319]);;
gap> LQUO(f, g);
[2,11,4,5][10,7][12,1][15,20][19,3,13](8,18,14)(9)
gap> f ^ -1 * g;
[2,11,4,5][10,7][12,1][15,20][19,3,13](8,18,14)(9)
gap> last = last2;
true
gap> f := PPerm4([110000], [100002]);;                             
gap> g := PPerm4([19000], [90002]);; 
gap> LQUO(f, g) = f ^ -1 * g;
true

# LQuoPPerm44, Case 2 of 3, dom(g) known, deg(g)>deg(f)
gap> f := PPerm4([123567811121619], 
>                [918201151681914131]);;
gap> g := PPerm4([1234578101113181920], 
>                       [5173102121411166915]);;
gap> LQUO(f, g) = f ^ -1 * g;
true
gap> LQUO(f, g);
[8,12][16,2][18,1,9,5][19,11,10][20,7]
gap> f := PPerm4([19000], [90002]);; DomainOfPartialPerm(f);;
gap> g := PPerm4([110000], [100002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g) = f ^ -1 * g;
true

# LQuoPPerm44, Case 3 of 3, dom(g) known, deg(g)<=deg(f)
gap> f := PPerm4([110000], [100002]);; DomainOfPartialPerm(f);;
gap> g := PPerm4([19000], [90002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g) = f ^ -1 * g; 
true

# LQuoPPerm44, corner cases
gap> LQUO(EMPTY_PPERM4, PPerm4([1]));
<empty partial perm>
gap> LQUO(PPerm4([1]), EMPTY_PPERM4);
<empty partial perm>

# PowPPerm22, Case 1 of 6, dom(f) not known, codeg(f) <= deg(g)
gap> f:=PartialPerm(
> [3121441118172095150008201019]);;
gap> g := PartialPerm(
> [123456710111213141618192122], 
> [131824541411251292120222739]);;
gap> f ^ g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> g ^ -1 * f * g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> f ^ f;
[3,14][8,2,12,15][17,20][18,10,9](4)(5,11)(19)
gap> g ^ g;
[2,1,13,9][4,24][11,25][22,39](5)(7,14,21)(12)
gap> f ^ g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> f := PartialPerm([10]);;
gap> g := PartialPerm([1112]);;
gap> f ^ g;
<empty partial perm>
gap> g ^ f;
<empty partial perm>
gap> f ^ f;
<empty partial perm>
gap> g ^ g;
<empty partial perm>

# PowPPerm22, Case 2 of 6, dom(f) not known, codeg(f) > deg(g)
gap> f:=PartialPermNC(
> [ 28416614917019220120723251500000
>   2600240005 ]);;
gap> g:=PartialPermNC( [ 12345689101516171920 ], 
> [ 931517202121018116784 ] );;
gap> f^g=g^-1*f*g;
true

# PowPPerm22, Case 3 of 6, dom(f) known, deg(f) > deg(g), codeg(f) <= deg(g)
gap> f:= 
> PartialPermNC( [ 1234810100 ], [ 51043619 ] );;
gap> g:=
> PartialPermNC( [ 123579111415161718 ], 
> [ 414231779161510111 ] );;
gap> f^g=g^-1*f*g;
true

# PowPPerm22, Case 4 of 6, dom(f) known, deg(f) > deg(g), codeg(f) > deg(g)
gap> f:=PartialPermNC( [ 12345671011121314161819,
212223252930 ], [ 1318245414112512921202,
222318307319 ] );;
gap> g:=PartialPermNC( [ 123567811121619 ], 
> [ 918201151681914131 ] );;
gap> DegreeOfPartialPerm(f); DegreeOfPartialPerm(g);
30
19
gap> CodegreeOfPartialPerm(f); CodegreeOfPartialPerm(g);
30
20
gap> f^g;
[18,9][20,8](11)(14)
gap> g^-1*f*g;                    
[18,9][20,8](11)(14)
gap> last=last2;
true
gap> f:=PartialPerm([150000], [500002]);;
gap> g:=PartialPerm([140000], [400002]);;
gap> f^g=g^-1*f*g;
true

# PowPPerm22, Case 5 of 6, dom(f) known, deg(f)<=deg(g),  codeg(f)<=deg(g)
gap> f:=
> PartialPermNC( [ 12345910 ], [ 36421107 ] );;
gap> g:=
> PartialPermNC( [ 123579111415161718 ], 
> [ 414231779161510111 ] );
[5,3,2,14,16,10][18,1,4](7,17,11,9)(15)
gap> f^g;
[3,4,2]
gap> g^-1*f*g;
[3,4,2]

# PowPPerm22, Case 6 of 6, dom(f) known, deg(f) <= deg(g), codeg(f) > deg(g)
gap> f:=
> PartialPermNC( [ 123678910 ], [ 5824731100 ] );;
gap> g:=
> PartialPermNC( [ 12345671011131516171819 ], 
> [ 17110613419117121629820 ] );;
gap> f^g;
[4,6][10,1][17,13](19)
gap> g^-1*f*g;
[4,6][10,1][17,13](19)

# PowPPerm24, Case 1 of 6, dom(f) not known, codeg(f) <= deg(g)
gap> f:=PartialPerm(
> [3121441118172095150008201019]);;
gap> g := PPerm4(
> [123456710111213141618192122], 
> [131824541411251292120222739]);;
gap> f ^ g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> g ^ -1 * f * g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> f ^ f;
[3,14][8,2,12,15][17,20][18,10,9](4)(5,11)(19)
gap> g ^ g;
[2,1,13,9][4,24][11,25][22,39](5)(7,14,21)(12)
gap> f ^ g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> f := PartialPerm([10]);;
gap> g := PPerm4([1112]);;
gap> f ^ g;
<empty partial perm>
gap> g ^ f;
<empty partial perm>
gap> f ^ f;
<empty partial perm>
gap> g ^ g;
<empty partial perm>
gap> EmptyPartialPerm() ^ g;
<empty partial perm>
gap> g ^ EmptyPartialPerm();
<empty partial perm>

# PowPPerm24, Case 2 of 6, dom(f) not known, codeg(f) > deg(g)
gap> f:=PartialPerm(
> [ 28416614917019220120723251500000
>   2600240005 ]);;
gap> g:=PPerm4( [ 12345689101516171920 ], 
> [ 931517202121018116784 ] );;
gap> f^g=g^-1*f*g;
true

# PowPPerm24, Case 3 of 6, dom(f) known, deg(f) > deg(g), codeg(f) <= deg(g)
gap> f:= 
> PartialPerm( [ 1234810100 ], [ 51043619 ] );;
gap> g:=
> PPerm4( [ 123579111415161718 ], 
> [ 414231779161510111 ] );;
gap> f^g=g^-1*f*g;
true

# PowPPerm24, Case 4 of 6, dom(f) known, deg(f) > deg(g), codeg(f) > deg(g)
gap> f:=PartialPerm( [ 12345671011121314161819,
212223252930 ], [ 1318245414112512921202,
222318307319 ] );;
gap> g:=PPerm4( [ 123567811121619 ], 
> [ 918201151681914131 ] );;
gap> DegreeOfPartialPerm(f); DegreeOfPartialPerm(g);
30
19
gap> CodegreeOfPartialPerm(f); CodegreeOfPartialPerm(g);
30
20
gap> f^g;
[18,9][20,8](11)(14)
gap> g^-1*f*g;                    
[18,9][20,8](11)(14)
gap> last=last2;
true
gap> f:=PartialPerm([150000], [500002]);;
gap> g:=PPerm4([140000], [400002]);;
gap> f^g=g^-1*f*g;
true

# PowPPerm24, Case 5 of 6, dom(f) known, deg(f)<=deg(g),  codeg(f)<=deg(g)
gap> f:=
> PartialPerm( [ 12345910 ], [ 36421107 ] );;
gap> g:=
> PPerm4( [ 123579111415161718 ], 
> [ 414231779161510111 ] );
[5,3,2,14,16,10][18,1,4](7,17,11,9)(15)
gap> f^g;
[3,4,2]
gap> g^-1*f*g;
[3,4,2]

# PowPPerm24, Case 6 of 6, dom(f) known, deg(f) <= deg(g), codeg(f) > deg(g)
gap> f:=
> PartialPerm( [ 123678910 ], [ 5824731100 ] );;
gap> g:=
> PPerm4( [ 12345671011131516171819 ], 
> [ 17110613419117121629820 ] );;
gap> f^g;
[4,6][10,1][17,13](19)
gap> g^-1*f*g;
[4,6][10,1][17,13](19)

# PowPPerm42, Case 1 of 6, dom(f) not known, codeg(f) <= deg(g)
gap> f:=PPerm4(
> [3121441118172095150008201019]);;
gap> g := PartialPerm(
> [123456710111213141618192122], 
> [131824541411251292120222739]);;
gap> f ^ g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> g ^ -1 * f * g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> f ^ f;
[3,14][8,2,12,15][17,20][18,10,9](4)(5,11)(19)
gap> g ^ g;
[2,1,13,9][4,24][11,25][22,39](5)(7,14,21)(12)
gap> f ^ g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> f := PPerm4([10]);;
gap> g := PartialPerm([1112]);;
gap> f ^ g;
<empty partial perm>
gap> g ^ f;
<empty partial perm>
gap> f ^ f;
<empty partial perm>
gap> g ^ g;
<empty partial perm>
gap> EMPTY_PPERM4 ^ g;
<empty partial perm>
gap> g ^ EMPTY_PPERM4; 
<empty partial perm>

# PowPPerm42, Case 2 of 6, dom(f) not known, codeg(f) > deg(g)
gap> f:=PPerm4(
> [ 28416614917019220120723251500000
>   2600240005 ]);;
gap> g:=PartialPerm( [ 12345689101516171920 ], 
> [ 931517202121018116784 ] );;
gap> f^g=g^-1*f*g;
true

# PowPPerm42, Case 3 of 6, dom(f) known, deg(f) > deg(g), codeg(f) <= deg(g)
gap> f:= 
> PPerm4( [ 1234810100 ], [ 51043619 ] );;
gap> g:=
> PartialPerm( [ 123579111415161718 ], 
> [ 414231779161510111 ] );;
gap> f^g=g^-1*f*g;
true

# PowPPerm42, Case 4 of 6, dom(f) known, deg(f) > deg(g), codeg(f) > deg(g)
gap> f:=PPerm4( [ 12345671011121314161819,
212223252930 ], [ 1318245414112512921202,
222318307319 ] );;
gap> g:=PartialPerm( [ 123567811121619 ], 
> [ 918201151681914131 ] );;
gap> DegreeOfPartialPerm(f); DegreeOfPartialPerm(g);
30
19
gap> CodegreeOfPartialPerm(f); CodegreeOfPartialPerm(g);
30
20
gap> f^g;
[18,9][20,8](11)(14)
gap> g^-1*f*g;                    
[18,9][20,8](11)(14)
gap> last=last2;
true
gap> f:=PPerm4([150000], [500002]);;
gap> g:=PartialPerm([140000], [400002]);;
gap> f^g=g^-1*f*g;
true

# PowPPerm42, Case 5 of 6, dom(f) known, deg(f)<=deg(g),  codeg(f)<=deg(g)
gap> f:=
> PPerm4( [ 12345910 ], [ 36421107 ] );;
gap> g:=
> PartialPerm( [ 123579111415161718 ], 
> [ 414231779161510111 ] );
[5,3,2,14,16,10][18,1,4](7,17,11,9)(15)
gap> f^g;
[3,4,2]
gap> g^-1*f*g;
[3,4,2]

# PowPPerm42, Case 6 of 6, dom(f) known, deg(f) <= deg(g), codeg(f) > deg(g)
gap> f:=
> PPerm4( [ 123678910 ], [ 5824731100 ] );;
gap> g:=
> PartialPerm( [ 12345671011131516171819 ], 
> [ 17110613419117121629820 ] );;
gap> f^g;
[4,6][10,1][17,13](19)
gap> g^-1*f*g;
[4,6][10,1][17,13](19)

# PowPPerm44, Case 1 of 6, dom(f) not known, codeg(f) <= deg(g)
gap> f:=PPerm4(
> [3121441118172095150008201019]);;
gap> g := PPerm4(
> [123456710111213141618192122], 
> [131824541411251292120222739]);;
gap> f ^ g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> g ^ -1 * f * g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> f ^ f;
[3,14][8,2,12,15][17,20][18,10,9](4)(5,11)(19)
gap> g ^ g;
[2,1,13,9][4,24][11,25][22,39](5)(7,14,21)(12)
gap> f ^ g;
[1,12][4,2,11][13,8,21](5,25)(22)(24)
gap> f := PPerm4([10]);;
gap> g := PPerm4([1112]);;
gap> f ^ g;
<empty partial perm>
gap> g ^ f;
<empty partial perm>
gap> f ^ f;
<empty partial perm>
gap> g ^ g;
<empty partial perm>
gap> g ^ EMPTY_PPERM4;
<empty partial perm>
gap> EMPTY_PPERM4 ^ g;
<empty partial perm>

# PowPPerm44, Case 2 of 6, dom(f) not known, codeg(f) > deg(g)
gap> f:=PPerm4(
> [ 28416614917019220120723251500000
>   2600240005 ]);;
gap> g:=PPerm4( [ 12345689101516171920 ], 
> [ 931517202121018116784 ] );;
gap> f^g=g^-1*f*g;
true

# PowPPerm44, Case 3 of 6, dom(f) known, deg(f) > deg(g), codeg(f) <= deg(g)
gap> f:= 
> PPerm4( [ 1234810100 ], [ 51043619 ] );;
gap> g:=
> PPerm4( [ 123579111415161718 ], 
> [ 414231779161510111 ] );;
gap> f^g=g^-1*f*g;
true

# PowPPerm44, Case 4 of 6, dom(f) known, deg(f) > deg(g), codeg(f) > deg(g)
gap> f:=PPerm4( [ 12345671011121314161819,
212223252930 ], [ 1318245414112512921202,
222318307319 ] );;
gap> g:=PPerm4( [ 123567811121619 ], 
> [ 918201151681914131 ] );;
gap> DegreeOfPartialPerm(f); DegreeOfPartialPerm(g);
30
19
gap> CodegreeOfPartialPerm(f); CodegreeOfPartialPerm(g);
30
20
gap> f^g;
[18,9][20,8](11)(14)
gap> g^-1*f*g;                    
[18,9][20,8](11)(14)
gap> last=last2;
true
gap> f:=PPerm4([150000], [500002]);;
gap> g:=PPerm4([140000], [400002]);;
gap> f^g=g^-1*f*g;
true

# PowPPerm44, Case 5 of 6, dom(f) known, deg(f)<=deg(g),  codeg(f)<=deg(g)
gap> f:=
> PPerm4( [ 12345910 ], [ 36421107 ] );;
gap> g:=
> PPerm4( [ 123579111415161718 ], 
> [ 414231779161510111 ] );
[5,3,2,14,16,10][18,1,4](7,17,11,9)(15)
gap> f^g;
[3,4,2]
gap> g^-1*f*g;
[3,4,2]

# PowPPerm44, Case 6 of 6, dom(f) known, deg(f) <= deg(g), codeg(f) > deg(g)
gap> f:=
> PPerm4( [ 123678910 ], [ 5824731100 ] );;
gap> g:=
> PPerm4( [ 12345671011131516171819 ], 
> [ 17110613419117121629820 ] );;
gap> f^g;
[4,6][10,1][17,13](19)
gap> g^-1*f*g;
[4,6][10,1][17,13](19)

#
# a bunch of tests involving T_PERM2 permutations of degree 65536
#
gap> f:=PartialPerm([0,0,1,5]);
[3,1][4,5]
gap> g:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,100001]));
[65536,1][65537,100001]
gap> p1 := (1,65536);
(1,65536)
gap> p2 := (3,65536);
(3,65536)

# products
gap> f*p1;
[3,65536][4,5]
gap> f*p2;
[3,1][4,5]
gap> p1*f;
[3,1][4,5]
gap> p2*f;
[4,5][65536,1]
gap> g*p1;
[65537,100001](65536)
gap> g*p2;
[65536,1][65537,100001]
gap> p1*g;
[65537,100001](1)
gap> p2*g;
[3,1][65537,100001]

# quotients
gap> f/p1 = f*p1;
true
gap> f/p2 = f*p2;
true
gap> g/p1 = g*p1;
true
gap> g/p2 = g*p2;
true
gap> LQUO(p1,f) = p1*f;
true
gap> LQUO(p2,f) = p2*f;
true
gap> LQUO(p1,g) = p1*g;
true
gap> LQUO(p2,g) = p2*g;
true

# conjugation: f^p = p^-1 * f * p
gap> f^p1;
[3,65536][4,5]
gap> f^p2;
[4,5][65536,1]
gap> g^p1;
[1,65536][65537,100001]
gap> g^p2;
[3,1][65537,100001]
gap> ListX([p1,p2],[f,g], {x,y} -> (x*y)*x = y^x);
[ true, true, true, true ]
gap> ListX([p1,p2],[f,g], {x,y} -> x*(y*x) = y^x);
[ true, true, true, true ]

#
#
#

# from Semigroups...
gap> f:=PartialPermNC([0,1,0,20]);
[2,1][4,20]
gap> f^2;
<empty partial perm>
gap> f^-1;
[1,2][20,4]
gap> f:=PartialPermNC([0,20,0,1]); 
[2,20][4,1]
gap> f^2;
<empty partial perm>
gap> f^-1;
[1,4][20,2]
gap> ImageSetOfPartialPerm(f^-1);
24 ]
gap> ImageSetOfPartialPerm(f);   
120 ]
gap> f^-1<f;
false
gap> f<f^-1;
true
gap> f:=PartialPermNC([2,4], [20,1]);
[2,20][4,1]
gap> f^-1=f;
false
gap> f=f^-1;
false
gap> f^-1;
[1,4][20,2]
gap> f*f^-1;
<identity partial perm on [ 24 ]>
gap> f^-1*f;   
<identity partial perm on [ 120 ]>
gap> f^2;
<empty partial perm>
gap> f:=[PartialPermNC([ 125 ], [ 174 ]), 
> PartialPermNC([ 12348 ], [ 17568 ]),
> PartialPermNC([ 12457 ], [ 34527 ]),
> PartialPermNC([ 123567 ], [ 526817 ])];;
gap> f[1]*f[2];
[5,6](1)
gap> f[1]*f[2]*f[3]; 
[1,3]
gap> f[4]*f[1]*f[3];
[1,5][2,7][6,3]
gap> f[4]^4;
[3,8](2)(7)
gap> f[4]^5;
<identity partial perm on [ 27 ]>
gap> f[4]^10;
<identity partial perm on [ 27 ]>
gap> f[4]^-4
[8,3](2)(7)
gap> 
gap> f:=PartialPerm([110000], [100002]);;
gap> g:=f^-1;;
gap> ForAll(DomainOfPartialPerm(f), i-> (i^f)^g=i);
true
gap> ForAll(ImageSetOfPartialPerm(f), i-> (i^g)^f=i);     
true
gap> p:=(1,3,2)(4,5);;
gap> f:=PartialPermNC([ 134567910 ], [ 61492375 ]);
[10,5,9,7,3,1,6,2](4)
gap> p*f;
[10,5,4,9,7,3](1)(2,6)
gap> f*p;
[10,4,5,9,7,2](1,6)(3)
gap> FixedPointsOfPartialPerm(f*p);
3 ]
gap> f:=PartialPermNC([ 123567810 ],
> [ 625478910 ]);
[1,6,7,8,9][3,5,4](2)(10)
gap> g:=PartialPermNC([ 123578 ], [ 8109156 ]);
[2,10][3,9][7,5,1,8,6]
gap> f<g;
false
gap> g<f;
true
gap> f=g;
false
gap> f/g;
[10,2](1,8,3,7)
gap> f/g=f*g^-1;
true
gap> f/g^-1=f*g;
true
gap> AsPermutation(f);
fail
gap> AsTransformation(f);
<transformation: 6,2,5,10,4,7,8,9,10>
gap> AsTransformation(f, 12);
<transformation: 6,2,5,12,4,7,8,9,12,10,12>
gap> f;
[1,6,7,8,9][3,5,4](2)(10)
gap> f:=PartialPermNC([ 134569 ], [ 9105728 ]);;
gap> AsTransformation(f);
<transformation: 9,11,10,5,7,2,11,11,8,11>
gap> AsTransformation(f);
<transformation: 9,11,10,5,7,2,11,11,8,11>
gap> AsTransformation(PartialPerm([12356910],
>                                 [3584197]), 
>                     3);
Error, usage: the 2nd argument must not be a moved point of the 1st argument,
gap> OnTuples([1..DegreeOfPartialPerm(f)], f);
9105728 ]
gap> g:=PartialPermNC([ 123456781011121319 ],
> [ 3171213612209164158 ]);;
gap> OnTuples([1..DegreeOfPartialPerm(f)], f);
9105728 ]
gap> DomainOfPartialPerm(f)=ImageSetOfPartialPerm(f^-1);
true
gap> ImageSetOfPartialPerm(f)=DomainOfPartialPerm(f^-1);   
true
gap> FixedPointsOfPartialPerm(f);
[  ]
gap> FixedPointsOfPartialPerm(f^-1);
[  ]
gap> FixedPointsOfPartialPerm(g);   
[  ]
gap> f:=PartialPermNC([ 134569 ], [ 9105728 ]);;
gap> ImageSetOfPartialPerm(g);
1234689121315161720 ]
gap> OnSets(DomainOfPartialPerm(f), f)=ImageListOfPartialPerm(f);
false
gap> OnSets(DomainOfPartialPerm(f), f)=ImageSetOfPartialPerm(f);
true
gap> OnPosIntSetsPartialPerm(DomainOfPartialPerm(f), f) 
> = ImageSetOfPartialPerm(f);
true
gap> OnTuples(DomainOfPartialPerm(f), f)=ImageSetOfPartialPerm(f);
false
gap> OnTuples(DomainOfPartialPerm(f), f)=ImageListOfPartialPerm(f);   
true
gap> OnTuples(ImageListOfPartialPerm(f), f^-1)=DomainOfPartialPerm(f);
true
gap> OnSets(ImageSetOfPartialPerm(f), f^-1)=DomainOfPartialPerm(f);
true
gap> OnPosIntSetsPartialPerm(ImageSetOfPartialPerm(f), f ^ -1)
> = DomainOfPartialPerm(f);
true
gap> OnSets(ImageSetOfPartialPerm(g), g^-1)=DomainOfPartialPerm(g);
true
gap> OnTuples(ImageListOfPartialPerm(g), g^-1)=DomainOfPartialPerm(f);
false
gap> OnPosIntSetsPartialPerm(ImageSetOfPartialPerm(g), g ^ -1
> = DomainOfPartialPerm(g);
true
gap> OnTuples(ImageListOfPartialPerm(g), g^-1)=DomainOfPartialPerm(g);
true
gap> OnSets([10 .. 20], f);
[  ]
gap> OnPosIntSetsPartialPerm([10 .. 20], f);
[  ]
gap> OnPosIntSetsPartialPerm([0], f) = ImageSetOfPartialPerm(f);
true
gap> f := PPerm4([134569], [9105728]);;
gap> g := PPerm4([123456781011121319],
>                [3171213612209164158]);;
gap> OnSets(DomainOfPartialPerm(f), f)=ImageListOfPartialPerm(f);
false
gap> OnSets(DomainOfPartialPerm(f), f)=ImageSetOfPartialPerm(f);
true
gap> OnPosIntSetsPartialPerm(DomainOfPartialPerm(f), f) 
> = ImageSetOfPartialPerm(f);
true
gap> OnTuples(DomainOfPartialPerm(f), f)=ImageSetOfPartialPerm(f);
false
gap> OnTuples(DomainOfPartialPerm(f), f)=ImageListOfPartialPerm(f);   
true
gap> OnTuples(ImageListOfPartialPerm(f), f^-1)=DomainOfPartialPerm(f);
true
gap> OnSets(ImageSetOfPartialPerm(f), f^-1)=DomainOfPartialPerm(f);
true
gap> OnPosIntSetsPartialPerm(ImageSetOfPartialPerm(f), f ^ -1)
> = DomainOfPartialPerm(f);
true
gap> OnSets(ImageSetOfPartialPerm(g), g^-1)=DomainOfPartialPerm(g);
true
gap> OnPosIntSetsPartialPerm(ImageSetOfPartialPerm(g), g ^ -1
> = DomainOfPartialPerm(g);
true
gap> OnTuples(ImageListOfPartialPerm(g), g^-1)=DomainOfPartialPerm(f);
false
gap> OnTuples(ImageListOfPartialPerm(g), g^-1)=DomainOfPartialPerm(g);
true
gap> OnSets([10 .. 20], f);
[  ]
gap> OnPosIntSetsPartialPerm([0], f) = ImageSetOfPartialPerm(f);
true
gap> OnPosIntSetsPartialPerm([], f) = [];
true

#
gap> f:=PartialPermNC([ 12345671112131419 ],
> [ 513761015914420192 ]);
[1,5,10][3,7,9][11,14,19,2,13,20][12,4,6,15]
gap> One(f);
<identity partial perm on 
123456791011121314151920 ]>
gap> One(f)*f=f*One(f);
true
gap> One(f)*f=f;
true
gap> OnSets([1..100], f);
245679101314151920 ]
gap> f:=PartialPermNC([203921492144313431123]);
[4,13431][5,1,2039][6,2,2149][7,3,21443]
gap> OnSets([1..10000], f); 
123203921491343121443 ]
gap> ImageListOfPartialPerm(f);
203921492144313431123 ]
gap> ImageListOfPartialPerm(f);
203921492144313431123 ]
gap> ImageSetOfPartialPerm(f);
123203921491343121443 ]
gap> ImageSetOfPartialPerm(f);
123203921491343121443 ]
gap> RankOfPartialPerm(f);
7
gap> f:=PartialPermNC(
> [ 945531542977166788698953620599408170,
>  65297837744852432931813550490994635,
>  84079800850890027000733307769410,
>  630007556000906400010000300226,
>  11390000000800106125 ]);
[1,9,7,71,64][5,42,79][12,98][14,36][16,59,41][17,94][19,81,2,45,85]
[21,65,75,100][22,29,32,13,95,10,88][23,78,3,53][24,37,99][28,4,15,20,70,90]
[30,93][31,18][38,46][40,84,39,35,49][43,80][47,89][50,27,52][54,73][57,77]
[58,69][82,26,48][83,11,6,97,25,74][92,8,66,56][96,61,63](33,55)
gap> 50^f;
27
gap> 27^f;
52
gap> 52^f;
0
gap> 50^f;
27
gap> 27^f;
52

#
gap> f:=PartialPermNC( [ 1236810 ], [ 267915 ] );;
gap> f<f;
false

#
gap> f:=PartialPermNC([]);;
gap> f<f;
false

# Test for the bug in RestrictedPartialPerm
gap> RestrictedPartialPerm(EmptyPartialPerm(), [1,2,3,4]);
<empty partial perm>
gap> RestrictedPartialPerm(PartialPerm([1],[1]), [2,3,4]);                     
<empty partial perm>

# Test for bug in QuoPPerm2 as reported by Bill Allombert
gap> x := PartialPerm([70000], [1]);
[70000,1]
gap> CodegreeOfPartialPerm(x / x);
70000

# Test Zero and MultiplicativeZeroOp
gap> x := PartialPerm([12479], [53749]);;
gap> Zero(x);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 1st choice method found for `ZeroMutable' on 1 arguments
gap> MultiplicativeZeroOp(x);
<empty partial perm>
gap> MultiplicativeZero(x);
<empty partial perm>

# Test PartialPerm
gap> PartialPerm([1,2,8],[3,4,1,2]);
Error, usage: the 1st argument must be a set of positive integers and the 2nd \
argument must be a duplicate-free list of positive integers of equal length to\
 the first
gap> PartialPerm([0,1],[2,3]);
Error, usage: the 1st argument must be a set of positive integers and the 2nd \
argument must be a duplicate-free list of positive integers of equal length to\
 the first
gap> PartialPerm([2,3],[0,1]);
Error, usage: the 1st argument must be a set of positive integers and the 2nd \
argument must be a duplicate-free list of positive integers of equal length to\
 the first
gap> PartialPerm([-2,-3],[5,6]);
Error, usage: the 1st argument must be a set of positive integers and the 2nd \
argument must be a duplicate-free list of positive integers of equal length to\
 the first
gap> PartialPerm([5,6],[-2,-3]);
Error, usage: the 1st argument must be a set of positive integers and the 2nd \
argument must be a duplicate-free list of positive integers of equal length to\
 the first
gap> PartialPerm([5,2^100], [5,6]);
Error, usage: the 1st argument must be a set of positive integers and the 2nd \
argument must be a duplicate-free list of positive integers of equal length to\
 the first
gap> PartialPerm([5,6],[5,2^100]);
Error, usage: the 1st argument must be a set of positive integers and the 2nd \
argument must be a duplicate-free list of positive integers of equal length to\
 the first
gap> PartialPerm([5,5],[5,6]);
Error, usage: the 1st argument must be a set of positive integers and the 2nd \
argument must be a duplicate-free list of positive integers of equal length to\
 the first
gap> PartialPerm([5,6],[5,5]);
Error, usage: the 1st argument must be a set of positive integers and the 2nd \
argument must be a duplicate-free list of positive integers of equal length to\
 the first

# New tests
gap> x := PartialPerm([000]);
<empty partial perm>

# IsPPermHandler
gap> IsPartialPerm(x);
true
gap> IsPartialPerm(1);
false
gap> IsPartialPerm(infinity);
false

# PreImagePPermInt
gap> 1 / EmptyPartialPerm();
fail
gap> 1 / PartialPerm([12479], [53749]);
fail
gap> 3 / PartialPerm([12479], [53749]);
2
gap> 3 / PartialPerm([10 ^ 5], [3]);
100000
gap> 1 / PartialPerm([10 ^ 5], [3]);
fail
gap> 3 / PartialPerm([10 ^ 5], [10 ^ 5 + 1]);
fail
gap> (10 ^ 5 + 1) / PartialPerm([10 ^ 5], [10 ^ 5 + 1]);
100000
gap> PreImagePartialPerm(PartialPerm([12479], [53749]), 1);
fail
gap> PreImagePartialPerm(PartialPerm([10 ^ 5], [3]), 3);
100000

# IsGeneratorsOfMagmaWithInverses
gap> IsGeneratorsOfMagmaWithInverses([PartialPerm([2]), PartialPerm([1])]);
false
gap> IsGeneratorsOfMagmaWithInverses([PartialPerm([21]), PartialPerm([1])]);
false
gap> IsGeneratorsOfMagmaWithInverses([PartialPerm([21]), PartialPerm([12])]);
true

# LargestImageOfMovedPoint
gap> LargestImageOfMovedPoint(EmptyPartialPerm());
0

# SmallestImageOfMovedPoint
gap> SmallestImageOfMovedPoint(EmptyPartialPerm());
infinity
gap> SmallestImageOfMovedPoint(PartialPerm([12479], [12749]));
4

# PartialPermOp/NC
gap> f := Transformation([9104210591096]);;
gap> PartialPermOp(f, [6 .. 8], OnPoints);
[1,4][2,5][3,6]
gap> f := Transformation([9104210591096]);;
gap> PartialPermOp(f, [867], OnPoints);
[1,5][2,6][3,4]
gap> PartialPermOp(f, [8676], OnPoints);
fail
gap> PartialPermOp(f, [79], OnPoints);
fail
gap> PartialPermOp(f, [101112], OnPoints);
[1,4](2)(3)
gap> PartialPermOp(f, [101112]);
[1,4](2)(3)
gap> PartialPermOp(f, [101112], function(x, f)
> if x > 10 then return 100; else return x ^ f; fi; end);
fail
gap> PartialPermOp(PartialPerm([1]), SymmetricInverseMonoid(2), OnRight);
fail
gap> PartialPermOp(PartialPerm([1]), SymmetricInverseMonoid(1), OnRight);
<identity partial perm on [ 12 ]>
gap> PartialPermOp(PartialPerm([1]), SymmetricInverseMonoid(1));
<identity partial perm on [ 12 ]>
gap> f := Transformation([9104210591096]);;
gap> PartialPermOpNC(f, [6 .. 8], OnPoints);
[1,4][2,5][3,6]
gap> f := Transformation([9104210591096]);;
gap> PartialPermOpNC(f, [867], OnPoints);
[1,5][2,6][3,4]
gap> PartialPermOpNC(f, [101112], OnPoints);
[1,4](2)(3)
gap> PartialPermOpNC(f, [101112]);
[1,4](2)(3)
gap> PartialPermOpNC(f, [101112], function(x, f)
> if x > 10 then return 100; else return x ^ f; fi; end);
[1,4][2,5][3,6]
gap> PartialPermOpNC(PartialPerm([1]), SymmetricInverseMonoid(1), OnRight);
<identity partial perm on [ 12 ]>
gap> PartialPermOpNC(PartialPerm([1]), SymmetricInverseMonoid(1));
<identity partial perm on [ 12 ]>

# RandomPartialPerm
gap> RandomPartialPerm(4);;
gap> RandomPartialPerm(2 ^ 60);
Error, usage: the argument must be a positive integer, a set, or 2 sets, of po\
sitive integers, 
gap> f := RandomPartialPerm([4 .. 10]);;
gap> IsSubset([4 .. 10], DomainOfPartialPerm(f));
true
gap> IsSubset([4 .. 10], ImageSetOfPartialPerm(f));
true
gap> f := RandomPartialPerm([6 .. 10], [1 .. 5]);;
gap> IsSubset([6 .. 10], DomainOfPartialPerm(f));
true
gap> IsSubset([1 .. 5], ImageSetOfPartialPerm(f));
true
gap> f := RandomPartialPerm([12 ^ 60]);
Error, usage: the argument must be a positive integer, a set, or 2 sets, of po\
sitive integers, 
gap> f := RandomPartialPerm([312]);
Error, usage: the argument must be a positive integer, a set, or 2 sets, of po\
sitive integers, 
gap> f := RandomPartialPerm([1 .. 3], [312]);
Error, usage: the argument must be a positive integer, a set, or 2 sets, of po\
sitive integers, 
gap> f := RandomPartialPerm([312], [1 .. 3]);
Error, usage: the argument must be a positive integer, a set, or 2 sets, of po\
sitive integers, 
gap> f := RandomPartialPerm([312], [132 ^ 60]);
Error, usage: the argument must be a positive integer, a set, or 2 sets, of po\
sitive integers, 

# PartialPermNC
gap> PartialPermNC(123);
Error, usage: there should be one or two arguments,
gap> PartialPerm(123);
Error, usage: there should be one or two arguments, 
gap> PartialPerm([122 ^ 60]);
Error, usage: the argument must be a list of non-negative integers and the non\
-zero elements must be duplicate-free,
gap> PartialPerm([122]);
Error, usage: the argument must be a list of non-negative integers and the non\
-zero elements must be duplicate-free,

# String etc
gap> EvalString(String(PartialPerm([12479], [53749]))) 
> = PartialPerm([12479], [53749]);
true
gap> PrintString(PartialPerm([12479], [53749]));
"PartialPerm( \>[ 12479 ], \<\>[ 53749 ]\<\> )\<"
gap> PrintObj(PartialPerm([12479], [53749])); 
> "this string allows us to test the PrintObj method";
PartialPerm( [ 12479 ], [ 53749 ]
  )"this string allows us to test the PrintObj method"
gap> SetUserPreference("NotationForPartialPerms", "domainimage");;
gap> PartialPerm( [ 12479 ], [ 53749 ]);
12479 ] -> [ 53749 ]
gap> PartialPerm([123]);
<identity partial perm on [ 123 ]>
gap> SetUserPreference("NotationForPartialPerms", notationpp);;
gap> SetUserPreference("NotationForPartialPerms", "input");;
gap> PartialPerm( [ 12479 ], [ 53749 ]);
PartialPerm( [ 12479 ], [ 53749 ] )
gap> SetUserPreference("NotationForPartialPerms", notationpp);;

# Collections
gap> coll := [PartialPerm([12479], [53749]), 
>             PartialPerm([124567], [189753])];;
gap> DegreeOfPartialPermCollection(coll);
9
gap> CodegreeOfPartialPermCollection(coll);
9
gap> RankOfPartialPermCollection(coll);
7
gap> ImageOfPartialPermCollection(coll);
1345789 ]
gap> FixedPointsOfPartialPerm(coll);
19 ]
gap> MovedPoints(coll);
124567 ]
gap> NrFixedPoints(coll);
2
gap> NrMovedPoints(coll);
6
gap> LargestMovedPoint(coll);
7
gap> LargestImageOfMovedPoint(coll);
9
gap> SmallestMovedPoint(coll);
1
gap> SmallestImageOfMovedPoint(coll);
3

# ShortLexLeqPartialPerm
gap> f := PartialPerm([123], [7000034]);
[1,70000][2,3,4]
gap> ShortLexLeqPartialPerm(f, f);
false
gap> g := PartialPerm([12479], [53749]);;
gap> ShortLexLeqPartialPerm(f, g);
true
gap> ShortLexLeqPartialPerm(g, f);
false
gap> ShortLexLeqPartialPerm(g, g);
false
gap> ShortLexLeqPartialPerm(EmptyPartialPerm(), g);
true
gap> ShortLexLeqPartialPerm(g, EmptyPartialPerm());
false
gap> ShortLexLeqPartialPerm(EmptyPartialPerm(), f);
true
gap> ShortLexLeqPartialPerm(f, EmptyPartialPerm());
false
gap> g := PartialPerm([245], [537]);;
gap> ShortLexLeqPartialPerm(f, g);
true
gap> ShortLexLeqPartialPerm(g, f);
false
gap> g := PartialPerm([124], [537]);;
gap> ShortLexLeqPartialPerm(f, g);
false
gap> ShortLexLeqPartialPerm(g, f);
true
gap> ShortLexLeqPartialPerm(g, g);
false
gap> ShortLexLeqPartialPerm(g ^ -1, g);
false
gap> ShortLexLeqPartialPerm(g, g ^ -1);
true
gap> ShortLexLeqPartialPerm(f ^ -1, f);
false
gap> ShortLexLeqPartialPerm(f, f ^ -1);
true
gap> g := PartialPerm([123], [537]);;
gap> ShortLexLeqPartialPerm(f, g);
false
gap> ShortLexLeqPartialPerm(g, f);
true
gap> ShortLexLeqPartialPerm(f, g);
false
gap> f := PartialPerm([123], [538]);;
gap> g := PartialPerm([123], [537]);;
gap> ShortLexLeqPartialPerm(f, g);
false
gap> ShortLexLeqPartialPerm(g, f);
true
gap> f := PartialPerm([1], [70000]);
[1,70000]
gap> g := PartialPerm([2], [70000]);
[2,70000]
gap> ShortLexLeqPartialPerm(f, g);
true
gap> ShortLexLeqPartialPerm(g, f);
false
gap> f := PartialPerm([1], [70000]);
[1,70000]
gap> g := PartialPerm([1], [70001]);
[1,70001]
gap> ShortLexLeqPartialPerm(f, g);
true
gap> ShortLexLeqPartialPerm(g, f);
false
gap> f := PartialPerm([123], [7000034]);;
gap> f := f * f ^ -1;
<identity partial perm on [ 123 ]>
gap> ShortLexLeqPartialPerm(f, PartialPerm([123]));
false
gap> ShortLexLeqPartialPerm(PartialPerm([123]), f);
false
gap> f := PartialPermNC([65536]) * PartialPermNC([265536], [700001]);
<identity partial perm on [ 1 ]>
gap> ShortLexLeqPartialPerm(f, PartialPerm([1]));
false
gap> ShortLexLeqPartialPerm(PartialPerm([1]), f);
false
gap> ShortLexLeqPartialPerm(1, f);
Error, ShortLexLeqPartialPerm: <f> must be a partial permutation (not the inte\
ger 1)
gap> ShortLexLeqPartialPerm(f, 1);
Error, ShortLexLeqPartialPerm: <g> must be a partial permutation (not the inte\
ger 1)
gap> ShortLexLeqPartialPerm(21);
Error, ShortLexLeqPartialPerm: <f> must be a partial permutation (not the inte\
ger 2)

# CodegreeOfPartialPerm
gap> CodegreeOfPartialPerm(ID_PPERM2);
1
gap> CodegreeOfPartialPerm(ID_PPERM4);
1
gap> DomainOfPartialPerm(EMPTY_PPERM4);
[  ]
gap> ImageSetOfPartialPerm(EMPTY_PPERM4);
[  ]
gap> ImageListOfPartialPerm(EMPTY_PPERM4);
[  ]
gap> NaturalLeqPartialPerm(EMPTY_PPERM4, ID_PPERM4);
true
gap> ShortLexLeqPartialPerm(EMPTY_PPERM4, ID_PPERM4);
true
gap> ShortLexLeqPartialPerm(ID_PPERM4, EMPTY_PPERM4);
false
gap> () * EmptyPartialPerm();
<empty partial perm>
gap> (165537) * EMPTY_PPERM4;
<empty partial perm>

# ProdPPerm42
gap> PartialPermNC([65536]) * EmptyPartialPerm();
<empty partial perm>

# ProdPPerm44
gap> PartialPermNC([65536]) * EMPTY_PPERM4;
<empty partial perm>
gap> EMPTY_PPERM4 * PartialPermNC([65536]);
<empty partial perm>

# ProdPPerm42
gap> PartialPermNC([1]) * EMPTY_PPERM4;
<empty partial perm>
gap> EMPTY_PPERM4 * PartialPermNC([1]);
<empty partial perm>

# PowIntPPerm2
gap> (-1) ^ PartialPerm([1]);
Error, usage: the first argument must be a positive small integer,
gap> "a" ^ PartialPerm([1]);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 1st choice method found for `^' on 2 arguments
gap> (2 ^ 100) ^ PartialPerm([1]);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 1st choice method found for `^' on 2 arguments

# PowIntPPerm2
gap> (-1) ^ PPerm4([1]);
Error, usage: the first argument must be a positive small integer,
gap> "a" ^ PPerm4([1]);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 1st choice method found for `^' on 2 arguments
gap> (2 ^ 100) ^ PPerm4([1]);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 1st choice method found for `^' on 2 arguments

# LQuoPerm4PPerm2, Case 1 of 4, deg(p)<deg(f),  dom(f) unknown
gap> f:=PartialPermNC( [ 234567810111214151719 ], 
> [ 19717148531815132121020 ] );;
gap> f:=JoinOfPartialPerms(f, PartialPermNC([100000], [1]));;
gap> p:=(1770000);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm4PPerm2, Case 2 of 4, deg(p)<deg(f),  dom(f) known
gap> f:=PartialPermNC( [ 234567810111214151719 ], 
> [ 19717148531815132121020 ] );;
gap> f:=JoinOfPartialPerms(f, PartialPermNC([100000], [1]));;
gap> DomainOfPartialPerm(f);;
gap> p:=(1770000);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm4PPerm2, Case 3 of 4, deg(p)>=deg(f), dom(f) unknown
gap> f:=PartialPermNC( [ 234567810111214151719 ], 
> [ 19717148531815132121020 ] );;
gap> f:=JoinOfPartialPerms(f, PartialPermNC([10000], [1]));;
gap> p:=(1770000);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm4PPerm2, Case 4 of 4, deg(p)>=deg(f), dom(f) known
gap> f:=PartialPermNC( [ 234567810111214151719 ], 
> [ 19717148531815132121020 ] );;
gap> f:=JoinOfPartialPerms(f, PartialPermNC([10000], [1]));;
gap> DomainOfPartialPerm(f);;
gap> p:=(1770000);;
gap> LQUO(p, f)=p^-1*f;
true

# QuoPPerm2Perm2, Case 1 of 6: codeg(f)<=deg(p), domain known
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );; DomainOfPartialPerm(f);;
gap> p:=(7100);;
gap> g:=f/p;;
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f/p=f*p^-1;
true

# QuoPPerm2Perm2, Case 2 of 6: codeg(f)<=deg(p), domain not known
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );;
gap> p:=(7100);;
gap> g:=f/p;;
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> f/p=f*p^-1;
true
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );;
gap> p:=(7100);;
gap> g:=f/p;;
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f/p=f*p^-1;
true

# QuoPPerm2Perm2, Case 3 of 6: codeg(f)>deg(p), domain known
gap> f:=PartialPerm([1100], [1002]);; DomainOfPartialPerm(f);;
gap> p:=(710);;
gap> g:=f/p;;
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f/p=f*p^-1;
true
gap> f:=PartialPerm([165535], [655352]);;
gap> p:=(1710000);;
gap> g:=f/p;;
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f/p=f*p^-1;
true

# QuoPPerm2Perm2, Case 4 of 6: codeg(f)>deg(p), domain not known
gap> f:=PartialPerm([1100], [1002]);;
gap> p:=(710);;   
gap> g:=f/p;;                       
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f/p=f*p^-1;
true
gap> f:=PartialPerm([110000], [100002]);;
gap> p:=(131000);; 
gap> g:=f/p;;
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f/p=f*p^-1;
true

# QuoPPerm2Perm2, Case 5 of 6: deg(p)=65536, domain not known
gap> p:=(1,65536,123);;
gap> f:=PartialPerm([110000], [100002]);;
gap> g:=f/p;;
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f/p=f*p^-1;
true

# QuoPPerm2Perm2, Case 6 of 6: deg(p)=65536, domain known
gap> f:=PartialPerm([110000], [100002]);; DomainOfPartialPerm(f);;
gap> p:=(1,65536,123);;
gap> g:=f/p;;
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f/p=f*p^-1;
true

# QuoPPerm2Perm4, Case 1 of 2: domain known
gap> f:=PartialPerm( [ 123610 ], [ 278106 ] );; DomainOfPartialPerm(f);;
gap> p:=(1,100000,123);;
gap> g:=f/p;;
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> f/p=f*p^-1;
true

# QuoPPerm2Perm4, Case 2 of 2: domain not known
gap> f:=PartialPerm([11000], [10002]);;
gap> p:=(1,100000,123);;
gap> g:=f/p;;
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> f/p=f*p^-1;
true

# QuoPPerm4Perm2, Case 1 of 2: domain not known
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,100001]));;
gap> p:=(1,2,4);;
gap> g:=f/p;
[65536,4][65537,100001]
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);  
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> f/p=f*p^-1;
true

# QuoPPerm4Perm2, Case 2 of 2: domain known
gap> f:=PartialPermNC(Concatenation(List([1..65535], x-> 0), [1,100001])); 
[65536,1][65537,100001]
gap> p:=(1,2,4);;
gap> g:=f/p;
[65536,4][65537,100001]
gap> OnTuples(ImageListOfPartialPerm(f), p^-1)=ImageListOfPartialPerm(g);
true
gap> CodegreeOfPartialPerm(g)=Maximum(ImageSetOfPartialPerm(g));
true
gap> DomainOfPartialPerm(g)=DomainOfPartialPerm(f);
true
gap> f/p=f*p^-1;
true

# QuoPPerm24, Case 1 of 4, dom(f) known,   dom(g) known
gap> f:=PartialPerm( [ 123456791112151619 ],
> [ 2411120101516536129 ] );; DomainOfPartialPerm(f);;
gap> g:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true

# QuoPPerm24, Case 2 of 4, dom(f) known,   dom(g) unknown
gap> f:=PartialPerm( [ 123456791112151619 ],
> [ 2411120101516536129 ] );; DomainOfPartialPerm(f);;
gap> g:=PartialPerm([1100000], [1000002]);;                         
gap> f/g=f*g^-1;
true

# QuoPPerm24, Case 3 of 4, dom(f) unknown, dom(g) known
gap> f:=PartialPerm( [ 123456791112151619 ],
> [ 2411120101516536129 ] );;                         
gap> g:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true

# QuoPPerm24, Case 4 of 4, dom(f) unknown, dom(g) unknown
gap> f:=PartialPerm( [ 123456791112151619 ],
> [ 2411120101516536129 ] );;                             
gap> g:=PartialPerm([1100000], [1000002]);;                         
gap> f/g=f*g^-1;
true

# QuoPPerm42, Case 1 of 4, dom(f) known,   dom(g) known
gap> f:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(f);;
gap> g:=PartialPerm( [ 123456791112151619 ],
> [ 2411120101516536129 ] );; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true

# QuoPPerm42, Case 2 of 4, dom(f) known,   dom(g) unknown
gap> f:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(f);;
gap> g:=PartialPerm( [ 123456791112151619 ],
> [ 2411120101516536129 ] );; 
gap> f/g=f*g^-1;
true

# QuoPPerm42, Case 3 of 4, dom(f) unknown, dom(g) known
gap> f:=PartialPerm([1100000], [1000002]);;
gap> g:=PartialPerm( [ 123456791112151619 ],
> [ 2411120101516536129 ] );; DomainOfPartialPerm(g);;                     
gap> f/g=f*g^-1;
true

# QuoPPerm42, Case 4 of 4, dom(f) unknown, dom(g) unknown
gap> f:=PartialPerm([1100000], [1000002]);;                         
gap> g:=PartialPerm( [ 123456791112151619 ],
> [ 2411120101516536129 ] );;                             
gap> f/g=f*g^-1;
true

# QuoPPerm44, Case 1 of 4, dom(f) known,   dom(g) known
gap> f:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(f);;
gap> g:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(g);;
gap> f/g=f*g^-1;
true

# QuoPPerm44, Case 2 of 4, dom(f) known,   dom(g) unknown
gap> f:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(f);;
gap> g:=PartialPerm([1100000], [1000002]);; 
gap> f/g=f*g^-1;
true

# QuoPPerm44, Case 3 of 4, dom(f) unknown, dom(g) known
gap> f:=PartialPerm([1100000], [1000002]);;
gap> g:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(g);;                     
gap> f/g=f*g^-1;
true

# QuoPPerm44, Case 4 of 4, dom(f) unknown, dom(g) unknown
gap> f:=PartialPerm([1100000], [1000002]);;                         
gap> g:=PartialPerm([1100000], [1000002]);;                             
gap> f/g=f*g^-1;
true

# LQuoPerm2PPerm4, Case 1 of 4, deg(p)<deg(f),  dom(f) unknown
gap> f:=PartialPerm([165536], [655362]);;
gap> p:=(1760000);;
gap> LQUO(p, f)=p^-1*f; 
true

# LQuoPerm2PPerm4, Case 2 of 4, deg(p)<deg(f),  dom(f) known
gap> f:=PartialPerm([165536], [655362]);; DomainOfPartialPerm(f);;
gap> p:=(1760000);;
gap> LQUO(p, f)=p^-1*f; 
true

# LQuoPerm2PPerm4, Case 3 of 4, deg(p)>=deg(f), dom(f) unknown
gap> f:=PartialPerm([165536], [655362]);;                         
gap> p:=(1770000);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm2PPerm4, Case 4 of 4, deg(p)>=deg(f), dom(f) known
gap> f:=PartialPerm([165536], [655362]);; DomainOfPartialPerm(f);;
gap> p:=(1760000);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm4PPerm4, Case 1 of 4, deg(p)<deg(f),  dom(f) unknown
gap> f:=PartialPerm([170000], [700002]);;
gap> p:=(1766000);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm4PPerm4, Case 2 of 4, deg(p)<deg(f),  dom(f) known
gap> f:=PartialPerm([170000], [700002]);;
gap> DomainOfPartialPerm(f);;
gap> p:=(1766000);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm4PPerm4, Case 3 of 4, deg(p)>=deg(f), dom(f) unknown
gap> f:=PartialPerm([166000], [660002]);;
gap> p:=(1770000);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPerm4PPerm4, Case 4 of 4, deg(p)>=deg(f), dom(f) known
gap> f:=PartialPerm([166000], [660002]);;
gap> DomainOfPartialPerm(f);;
gap> p:=(1770000);;
gap> LQUO(p, f)=p^-1*f;
true

# LQuoPPerm24, Case 1 of 3, dom(g) unknown
gap> f:=PartialPerm([1100], [1002]);;
gap> g:=PartialPerm([1100000], [1000002]);;
gap> LQUO(f, g)=f^-1*g;
true

# LQuoPPerm24, Case 2 of 3, dom(g) known, deg(g)>deg(f)
gap> f:=PartialPerm([1100], [1002]);;
gap> g:=PartialPerm([1100000], [1000002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g)=f^-1*g;
true

# LQuoPPerm24, Case 3 of 3, dom(g) known, deg(g)<=deg(f)
gap> f:=PartialPerm([19000], [90002]);;
gap> g:=PartialPerm([1100], [1002]);;  
gap> g:=JoinOfPartialPerms(g, PartialPermNC([101], [100000]));;
gap> DomainOfPartialPerm(g);;
gap> LQUO(f, g)=f^-1*g;
true

# LQuoPPerm42, Case 1 of 3, dom(g) unknown
gap> f:=PartialPerm([1100000], [1000002]);;
gap> g:=PartialPerm([1100], [1002]);;
gap> LQUO(f, g)=f^-1*g;
true

# LQuoPPerm42, Case 2 of 3, dom(g) known, deg(g)>deg(f)
gap> f:=PartialPerm([1100000], [1000002]);;
gap> g:=PartialPerm([1100], [1002]);; 
gap> g:=JoinOfPartialPerms(g, PartialPermNC([100001],[101]));;
gap> DomainOfPartialPerm(g);;
gap> LQUO(f, g)=f^-1*g;
true

# LQuoPPerm42, Case 3 of 3, dom(g) known, deg(g)<=deg(f)
gap> f:=PartialPerm([1100000], [1000002]);;
gap> g:=PartialPerm([1100], [1002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g)=f^-1*g;
true

# LQuoPPerm44, Case 1 of 3, dom(g) unknown
gap> f:=PartialPerm([165536], [655362]);;
gap> g:=PartialPerm([165536], [655362]);;
gap> LQUO(f, g)=f^-1*g;
true

# LQuoPPerm44, Case 2 of 3, dom(g) known, deg(g)>deg(f)
gap> f:=PartialPerm([165536], [655362]);;
gap> g:=PartialPerm([166000], [660002]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g)=f^-1*g;
true

# LQuoPPerm44, Case 3 of 3, dom(g) known, deg(g)<=deg(f)
gap> f:=PartialPerm([166000], [660002]);;
gap> g:=PartialPerm([166553], [665532]);; DomainOfPartialPerm(g);;
gap> LQUO(f, g)=f^-1*g;
true

# OnSets and OnTuples
gap> OnSets([2 ^ 60], PartialPerm([123457], [645382]));
Error, <set> must be a list of positive small integers
gap> OnTuples([2 ^ 60], PartialPerm([123457], [645382]));
Error, <tup> must be a list of small integers
gap> OnSets(["a"], PartialPerm([123457], [645382]));
Error, <set> must be a list of positive small integers
gap> OnTuples(["a"], PartialPerm([123457], [645382]));
Error, <tup> must be a list of small integers
gap> OnSets([2 ^ 60], PPerm4([123457], [645382]));
Error, <set> must be a list of positive small integers
gap> OnTuples([2 ^ 60], PPerm4([123457], [645382]));
Error, <tup> must be a list of small integers
gap> OnSets(["a"], PPerm4([123457], [645382]));
Error, <set> must be a list of positive small integers
gap> OnTuples(["a"], PPerm4([123457], [645382]));
Error, <tup> must be a list of small integers

# Test regression for OnSets and OnTuples on empty sets
gap> OnSets([], PartialPerm([])) = [];
true
gap> OnTuples([], PartialPerm([])) = [];
true
gap> OnSets([1], PartialPerm([])) = [];
true
gap> OnTuples([1], PartialPerm([])) = [];
true

#
gap> SetUserPreference("PartialPermDisplayLimit", 1);
gap> PartialPerm([1], [2]);
<partial perm on 1 pt with degree 1, codegree 2>
gap> SetUserPreference("PartialPermDisplayLimit", 100);;

#
gap> SetUserPreference("PartialPermDisplayLimit", display);;
gap> SetUserPreference("NotationForPartialPerm", notationpp);;
gap> SetUserPreference("NotationForTransformations", notationt);;

#
gap> STOP_TEST("pperm.tst");

[Dauer der Verarbeitung: 0.192 Sekunden, vorverarbeitet 2026-06-12]