# Getting started with sage_matroids: II

Following on from my previous post on getting started with sage_matroids, let’s look at a few more of the built-in features.

One of the most fundamental classes of matroids is the class of ** graphic matroids**. Given a graph , the graphic matroid has the edge set of as its elements, and the forests of as its independent sets. The circuits of , i.e. the minimal dependent sets, are then precisely the cycles of , so sometimes is called the

*of .*

**cycle matroid**The decision to go with Sage, rather than to either develop a stand-alone system or build on an existing stand-alone system, was largely driven by the fact that Sage provides both a standard programming language and a vast amount of inbuilt combinatorial functionality already. In particular, we can just piggyback on the very extensive “graphs” package to immediately create a graphic matroid using, of course, the canonical graph theory example.

sage: pm = Matroid(graphs.PetersenGraph()) sage: pm Regular matroid of rank 9 on 15 elements with 2000 bases

In this case, the matroid reports that it is a * regular matroid*, which is a matroid represented by a totally unimodular matrix (a matrix all of whose sub-determinants are 0, 1 or -1). Let’s see it:

sage: pm.representation() [-1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0] [ 1 0 0 -1 -1 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 1 0 -1 -1 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 1 0 -1 -1 0 0 0 0 0 0] [ 0 1 0 0 0 0 0 1 0 -1 0 0 0 0 0] [ 0 0 1 0 0 0 0 0 0 0 -1 -1 0 0 0] [ 0 0 0 0 1 0 0 0 0 0 0 0 -1 -1 0] [ 0 0 0 0 0 0 1 0 0 0 1 0 0 0 -1] [ 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0] [ 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1]

In fact, this matrix is just the vertex-edge incidence matrix of the Petersen graph, with the first entry in each column set to -1. A regular matroid can be represented over any field by the same matrix.

Turning a graph into a matroid is easy of course, but what about the other way round?

Suppose we start with a binary matroid and ask “Does this matroid come from a graph?” For example, consider the matroid “bm” with the following representing matrix:

sage: bm Binary matroid of rank 6 on 15 elements, type (4, 2) sage: bm.representation() [1 0 0 0 0 0 1 1 0 0 1 0 1 0 0] [0 1 0 0 0 0 0 0 1 1 0 0 1 1 0] [0 0 1 0 0 0 1 1 1 0 1 0 0 0 1] [0 0 0 1 0 0 0 0 0 0 1 1 1 1 0] [0 0 0 0 1 0 1 1 0 0 0 1 0 0 1] [0 0 0 0 0 1 0 1 1 1 1 0 0 0 0]

It is clear that this *particular* matrix is not the vertex-edge incidence matrix of any graph, because some of the columns have more than two 1s. However a matroid can be represented by many different matrices and, in particular, any matrix that is row-equivalent to this matrix will represent the same matroid. Searching through all the matrices row-equivalent to this one in order to find one with no more than two ones in each column is enough, but is rather unappealing. Fortunately, there are better ways to determine whether a matroid is graphic, and Rudi has implemented an elegant algorithm devised by Jim Geelen and Bert Gerards:

sage: bm.is_graphic() False

A matroid is ** cographic** if its

*dual*matroid is graphic, and so we check this

sage: bm.dual().is_graphic() True

It would be nice if a “True” response from the “is_graphic()” method actually gave us a graph as well so we could identify *which* graphic matroid we have, but this is currently not implemented. Of course, the beauty of the open nature of Sage is that if anyone feels like implementing this, then they can create the code, submit it to Sage as a patch, and then have it reviewed and incorporated into sage_matroids for all future users. Ultimately sage_matroids will grow and develop only if users who build useful functions for their own research then contribute them back to the community in this way.

Anyway, in the absence of this functionality we have to do a bit more work. Let’s pull out some more information

sage: bm.size() 15 sage: bm.rank() 6 sage: bm.bases_count() 2000

So the dual of bm has rank 9, size 15 and 2000 spanning trees. There’s only one graph that matches this, which is the Petersen graph, but let’s just confirm this to be absolutely sure.

sage: bm.dual().is_isomorphic(pm) True

Here we are using the sage_matroids function “is_isomorphic” which detects isomorphism between matroids (using a straightforward, but optimised, algorithm).

Next time I’ll give some examples on how to *combine* functions, either from sage_matroids or elsewhere in Sage, to very quickly and easily add new functionality and save it for re-using.