Suppose I give SnapPy a cusped hyperbolic 3-manifold (using, say, the link editor) and specify some filling. SnapPy can then provide a presentation of the fundamental group of the filled manifold. Can it tell me what the core curve of the added solid torus is, as a word in the fundamental group?

  • 1
    $\begingroup$ From a link surgery diagram, you can do this by hand. Start with a Wirtinger presentation of the link exterior, find suitable representatives of longitudes to partner with meridians, add relations for the fillings. That gets the fundamental group of the filled manifold. For the desired core curve, express it in terms of the meridian+longitude of the corresponding link component. $\endgroup$
    – Ken Baker
    Commented May 20, 2019 at 17:34
  • $\begingroup$ Good point, and that's enough for some of what I have in mind. But I'd really like to use some of SnapPy's related functionality (like the holonomy representation in terms of the presentation of $\pi_1$ it provides). $\endgroup$ Commented May 20, 2019 at 17:52

1 Answer 1


I think you want to use Snappy's 'fillings_may_affect_generators=False' flag for your purposes. Although you can also extract the information directly if for some reason this becomes inefficient.

In[1]: M = Manifold('m004')

not needed but M.fundamental_group? will give all possible flags

In[2]: G = M.fundamental_group?
Manifold.fundamental_group(self, simplify_presentation=True, fillings_may_affect_generators=True, minimize_number_of_generators=True, try_hard_to_shorten_relators=True)

there is more but it is redacted here

In[3]: G = M.fundamental_group()

In[4]: G

In[5]: m=G.meridian(); G.meridian()
Out[5]: 'ab'

In[6]: l=G.longitude(); G.longitude()
Out[6]: 'aBAbABab'

In[7]: M.dehn_fill((5,1),0)

In[8]: H = M.fundamental_group(fillings_may_affect_generators=False)

In[9]: H

Here, the second relation is m^5*l.

The core curve will be isotopic to any curve p*[m]+q*[l] (in boundary M) such that |5q-1p|=1. More generally for filling along r,s, we want |rq-sp|=1.

There are a number of simple python scripts to do that for example the extended gcd script taken from https://www.kkhaydarov.com/greatest-common-divisor-python/

def egcd(r, s):
   if r == 0:
     return (s, 0, 1)
     g, x, y = egcd(s % r, r)
     return (g, y - (b // a) * x, x)

Here the g is the gcd of r and s, p=y - (s // r) * x and q=x.

To complete the example where we will fill along (5,1), (p,q)=(1,0) so m is sufficient.

  • $\begingroup$ Thanks! Asking for meridians/longitudes seems problematic when M has multiple cusps. Know of any simple workaround? So far, for integral surgery, I've been defining Minfinity=M.copy(), doing (1,0)-fillings on any cusp(s) that I want filled, then defining Ginfinity=Minfinity.fundamental_group(False,False). The new relations $w_i$ in Ginfinity should correspond to meridians, hence cores after integral filling. Then, as above, I go back and do the desired fillings on M and define H=M.fundamental_group(False,False). Now the words $w_i$ should represent the cores when viewed in H. But... oof! $\endgroup$ Commented Jun 25, 2019 at 12:57
  • 1
    $\begingroup$ I think I might be steering right into the 'oof' here, but if inputing from the link editor, the meridians and longitudes are meant come from the blackboard framing of the link. If you want something canonical you could always try a geometric framing (where the shortest two or two of the shortest three elements form a basis for the peripheral torus). $\endgroup$ Commented Jun 25, 2019 at 13:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.