Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Copyright 2013, 2014 by Alden Walker

Released under the GPL

Usage: ./branched -v[n] [-w] [-d] <genus> <nboundaries <loops>
-v: verbose
-w: find complementary regions and winding numbers
-d: display a preset genus 3 example

**************    Introduction    ****************

branched finds the minimal configuration of the loops and 
then produces a cellulation of the surface which is built of 
cells which are complementary regions.  

In its current state, it finds a minimal configuration (and displays it),
then (if asked) it finds the complementary regions (and displays them with their 
winding numbers).  It is intended to eventually work with 
branched surfaces (hence the name), but that functionality is in 

The winding numbers are computed relative to an arbitrary complementary 
region.  Notice that they will *not* make much sense if the 
collection of loops isn't homologically trivial.

Moira Chas (Stony Brook) has some Java applets on her web site
which compute self-intersections of a single loop on a surface with 
one boundary component.  branched has been tested to agree with 
this applet on a bunch of inputs.

**************    Installation   *******************

You need to have the X11 development libraries installed 
(you probably do); it expects them to be either in your include path 
(probably the case for linux) or at /usr/X11R6/ (probably the case for OSX).
Just type "make" to make.

**************    Execution      *******************


<genus> and <nboundaries> give the genus and number of 
boundaries, respectively, and <loops> is a space-separated list 
of words in the surface group.

Surface group presentation:

The surface group is generated by two letters for each genus, 
and one letter for each boundary, starting at the beginning of the 
alphabet.  The relator is always the product of the commutators and 
all the boundary generators, so for example a genus 2 surface has 
the presentation <a,b,c,d | [a,b][c,d]>, and a genus 2 surface 
with two boundary components has the presentation 
<a,b,c,d,e,f | [a,b][c,d]ef>

Display format:

The surface is displayed as a polygon together with the gluing pattern.
Boundary edges are bold.  The convention is that a letter "a" corresponds 
to the loop *entering* the polygon edge labeled "a".  Note that the 
order of the polygon edges is different from the order of the letters 
in the relator.


branched will rewrite the input words as geodesics.  This happens 
*even in the case of a free group* (surface with boundary), in 
which case you may find that your word has been rewritten using 
the boundary loop generators.  You may also find that it has been 
rewritten to another word of the same length.  This is due to 
the program finding a *unique* geodesic representative, so it 
has to make an (arbitrary) choice.


./branched 1 1 abAABB ab
./branched 1 1 AAAbABaaBab ABabaaB Ab
./branched 2 0 AdbcBCbaBD
./branched 2 0 ADDBdcBDaDCbcd
./branched 2 0 ADDBdcBDaDCbcd CCda a AcDadbAcd AC
./branched 2 2 AeefffaCfcFBCFBacadB AEbeFbCaeCD AAcdcbFeD
./branched 10 0 AtClEaltqIQndFmtElaRENBnIbLHsdBjeBBPKTP DcSIfLhlNbbSgeThqP AKscqDlbPOSQIGQCNftRQO T
./branched 6 8 AtClEaltqIQndFmtElaRENBnIbLHsdBjeBBPKTP DcSIfLhlNbbSgeThqP AKscqDlbPOSQIGQCNftRQO T


Compute with branched surfaces






No releases published


No packages published