# The purpose of this GAP program is to enumerate _all_ genus 2 interval
# exchanges, not just the ones that are in the connected component
# of our preferred starting exchange tau_0
# We think of a complete genus 2 interval exchange as taking a disc and
# adding 7 bands. The boundary of the disc is divided into 28 segments,
# alternating between a place where we attach a band, and a "gaps"
# between bands. We label both kinds of segments from 1,2,...,14,
# going clockwise around the disc, with gap i coming immediately before
# band region i. Further, two of the gaps are distinguished because
# they form the vertical sides of the thickened interval; one of these
# distinguished intervals can be taken to be labeled "1". If we
# smoothing, the complementary regions have valence either [3,3,3,5] or
# [3,3,4,4].
# A gluing of bands is specified by a fixed point free involution in S_14.
# There are 135,135 such gluings.
# To find the structure of the complementary regions, we simply look
# at the cycle structure of the product of the gluing and an 14-cycle.
ComplementaryRegions := function( bandgluing )
return Orbits(Group(bandgluing * (1,2,3,4,5,6,7,8,9,10,11,12,13,14) ), [1..14]);
end;
# Checks if we have a complete genus 2 exchange
IsGenus2Exchange := function( bandgluing )
return List(ComplementaryRegions(bandgluing), r -> Length(r)) in
[ [5,3,3,3], [4, 4, 3, 3], [4, 3, 4, 3], [4, 3, 3, 4]];
end;
# Given a gluing and a choice k of which other gap to smooth, construct
# the corresponding IE, which is encoded as a pair of lists:
#
# [ [bands along top, bands along bottom]
MakeExchange := function(bandgluing, k)
local bands, bandform;
bands := Orbits(Group(bandgluing), [1..14]);
bandform := List([1..14], i -> Position(bands, First(bands, b -> i in b)));
return [ List([1..k-1], i -> bandform[i]), Reversed(List([k..14], i -> bandform[i]))];
end;
# Functions for putting an IE in standard form
BasicNormalize := function(IE)
local labels;
labels := Unique(Concatenation(IE));
return List(IE, s -> List(s, x -> Position(labels, x)));
end;
FullNormalize := function(IE)
return Minimum(BasicNormalize(IE), BasicNormalize(Reversed(IE)));
end;
# Presumes the existence of at least one orientation rev. band.
IsRecurrent := function(exchange)
return not (false in List(exchange, e -> Length(Unique(e)) < Length(e)));
end;
# This function realizes all possible choices of gap to smooth which result in
# a complete genus 2 exchange.
GluingToExchanges := function( bandgluing )
local regions, posscuts, exch;
regions := ComplementaryRegions(bandgluing);
posscuts := Filtered(Reversed(Filtered(regions, r -> Length(r) > 3))[1], c -> c <> 1);
exch := List(posscuts, p -> FullNormalize(MakeExchange(bandgluing,p)));
return Filtered(exch, IsRecurrent);
end;
# Finds all possible genus 2 exchanges, of which there are 201.
Genus2Exchanges := function()
local possGluings;
possGluings := AsList(ConjugacyClass(SymmetricGroup(14), (1,2)(3,4)(5,6)(7,8)(9,10)(11,12)(13,14)));
return Unique(Concatenation(List(Filtered(possGluings, IsGenus2Exchange), b -> GluingToExchanges(b))));
end;