Seifert Matrix Computations (by Julia Collins)

Every knot or link in 3-dimensional space can be represented by a closed braid. Such a representation determines a Seifert surface for the link; that is, a surface which has the knot or link as its boundary. These surfaces can be visualised using the program SeifertView. This website contains an algorithm to calculate the Seifert matrix of linking numbers for the Seifert surface determined by any closed braid entered by the user. The program will also show the block decomposition of the matrix as a sum of Seifert matrices of the connected braid components, and will find the genus of the Seifert surface.

Enter the braid data:
(Data should be a space-separated list of integers, e.g. “1 2 -1 -1 2 1 1 2”. Show me Explain)

Seifert matrix M =

Detailed Output

Explanation: Alphabetical notation translates the numerical braid entered into alphabetical notation for the user to input into SeifertView (for viewing the Seifert surface) if required. A link is a disjoint union of knots: the number of components gives the number of disjoint knots that the braid is composed of. The genus is the genus of the Seifert surface F that is constructed in the algorithm. The number of connected components is the number of connected surfaces generated by Seifert's algorithm on the braid. Each component corresponds to a disjoint sub-braid.

If the braid is a disjoint union of unlinked sub-braids, the program will suggest a new set of braids; it will also reorder the input accordingly. In that case the Seifert matrix will be a block-diagonal sum of the Seifert matrices of the independent braids, and when Attempt to show block decomposition is selected (), the block decomposition will be shown in the matrix (subject to browser support).

Downloadable versions

You can download variations of this program in C++ and Matlab.

Version What does it do that isn't on this website?
pretzel-v2.cpp, matrix-v2.h (C++) Computes the Alexander polynomial of the link. Gives a genus decomposition for disconnected braids. Incorporates the pretzel notation of SeifertView and also the alphabetical notation of a braid.
pretzel-v2.exe (Win32 build of the C++ code.) A Windows version to run on the command line.
Seifert.tar.gz (Matlab)Improved! Computes the Alexander polynomial, signature and Arf invariant of the link. Allows alphabetical notation for braids. (Once unpacked, run Seifert.m.)


This application is written in ECMAScript (“JavaScript”) and uses the W3C DOM. It may not work correctly on web browsers that do not support those standards.

Warning: you do not seem to have standard-conforming JavaScript or DOM support. This application will probably not work properly.


Knots and links

A knot is an embedding of a circle in S3; a link is an embedding of a disjoint union of circles. For every link L there exists a Seifert surface, which is a compact orientable surface in S3 whose boundary is L. Such a surface is not necessarily unique, and we will not insist that it must be connected.

Given a Seifert surface F of a link and given a basis {fi} for the first homology group of F, the (i,j)th entry in the Seifert matrix M is the linking number of fi and fj+. Here fj+ denotes the positive push-off of fj, which runs parallel to fj and lies just above F.

Since M depends non-trivially on both the surface F and the choice of a basis for H1(F), it is not an invariant of the link L. However, the polynomial Δ(t) = det(MtMT) is an invariant of L (up to powers of t) called its Alexander polynomial. For a link with disconnected Seifert surface the Alexander polynomial is defined to be zero.


The genus of a connnected orientable closed surface Σ is half the rank of H1(Σ), or in layman's terms it is the number of ‘holes’ in the surface. The genus of a connected orientable surface with boundary is defined to be the genus of the closed surface obtained by capping off all boundaries with disks. The genus of a disconnected surface is the sum of the genera of the connected components.

The genus g of a Seifert surface F can be computed with the formula 2g + (nq) = size(M) = rk(H1(F)); or, for a braid, with the alternative formula 2q − 2gn = χ = #(strands) − braid-length. Here q denotes the number of connected components of F, n denotes the number of components of the link, M denotes the Seifert matrix, and χ is, as always, the Euler characteristic. The braid length is the number of crossings in the braid.

Braid notation

A braid consists of m strings travelling from one vertical bar to another, with the condition that the strings must move from left to right and not loop back on themselves. The corresponding closed braid is the resulting link created by adding m untangled strings joining the second bar back to the first.

We encode the tangling of the strings of the braid by a string of non-zero integers; “+n” means that the nth strand crosses over the (n+1)th strand; “-n” means that it crosses under the (n+1)th strand.
An alternative notation sometimes used in knot tables is the alphabetical notation: the numbers 1 to 26 correspond to the letters ‘A’ to ‘Z’, and the negatives -1 to -26 correspond to the letters ‘a’ to ‘z’.


The braid of 5_2
A braid representation of the knot 52. Here m=3. The alphabetical notation would be AAABaB.

It is a theorem of Alexander's that every link can be represented by a closed braid.

Every braid has a canonical Seifert surface associated with it, which is obtained from applying Seifert's algorithm to the braid diagram.

Relation to SeifertView

The program SeifertView by Jack van Wijk is designed to visualise the Seifert surfaces constructed by Seifert's algorithm applied to braid diagrams. These are the same surfaces from which we construct our Seifert matrices in this website, and it is intended that the two programs should be used side-by-side.

SeifertView uses the alphabetical notation for braids and it differs from our notation in that the braids are encoded inversely to ours, i.e. capital and small letters are interchanged in their program. For example, a right handed trefoil for us is “AAA”, whereas for them it is “aaa”. They also make use of ‘pretzel’ notation which allows an optional odd integer to follow each letter to indicate multiple twisting of the strands. (The notation is explained here.) The pretzel encoding is often a more concise description of knots, and can result in a Seifert surface of smaller genus. For us this notation is currently only supported by the C++ version.




The algorithm for computing Seifert matrices was designed and implemented in Matlab by Julia Collins. The original C++ and Javascript versions of the program were implemented by Thomas Koeppe who also designed this website. v2 of the original C++ code is by Lukas Lewark, fixing a problem with fixed-precision entries in the Seifert matrices. The new code uses arbitrary precision rational numbers provided by the gmp-library. Any queries should be sent to

This is version 12-11-2016. ©2016 Thomas Köppe and Julia Collins and Lukas Lewark