SageMath Minicourse

At the 2019 CMS Summer Meeting in Regina, I gave a mini-course on the casual use of SageMath, for research and study in discrete math. As an example, I constructed a strongly regular graph; this used incidence structures, projective spaces, hyperovals, and finite fields.

The slides for the talk are here: guo-cms. There is an accompanying .sage file, which can be executed from the sage command line with runfile, or copied in line by line, into a sage worksheet. This file is downloadable from my Google Drive here. Since it seems difficult to download or upload a .sage file, since it is executable, I’ve also included the contents below:

# CMS file for SRG, T2*O demonstration
def number_common_nbrs(G,u,v):
	return len(Set(G.neighbors(u)).intersection(Set(G.neighbors(v))))

def get_incidence_matrix(pts,blk):
	M = Matrix(len(pts), len(blk))
	for it in range(len(pts)):
		for ce in range(len(blk)):
			if pts[it] in blk[ce]:
				M[it,ce] = 1
	return M

# returns point graph of an incidence structure
def pointsGraph(T):
	P = T.ground_set()
	return Graph([range(len(P)), lambda i,j: i!=j and areAdjacent(T,P[i],P[j]) ])

# returns true if 2 pts in incidence structure T lie on the same block
def areAdjacent(S,i,j):
	adj = false
	for k in S.blocks():
		if i in k and j in k:
			adj = true
			break
	return adj

# Here is a strongly regular graph; you can use number_common_nbrs(G,u,v)
# on the pairs of vertices of srg to verfiy that it is strongly regular.
srg = Graph('X~}CKMFPACgJONHCCPHAJGG{SP?cPGaGkOaNBCP?SPC`GaJAGaN')

# Here is a generalized quadrangle;
# pts is a list of points
# blks is a list that has lists consisting of points incident to each block
# One can check that for every p in pts and b in blks such that p is not in b
# there exists a unique b' in blks such that p is in b' and b' intersects b.

pts = [0, 1, 2, 3, 4, 5, 6, 7]
blks = [[0, 1], [0, 2], [0, 5], [0, 7], [1, 3], [1, 4], [1, 6],
        [2, 3], [2, 4], [2, 6], [3, 5], [3, 7], [4, 5], [4, 7],
        [5, 6], [6, 7]]
gq = [pts, blks]

# Now we will construct the GQ from T_2^*(O) of order q = 4.
# first we construct the field of order 4
F = GF(4,'a')
# Now we will construct the projective space PG(3,q);
# the points, lines, and planes will be 1-dim, 2-dim, and 3-dim, resp.,
# subspaces of a 4-dimensional vector space
# for now, it is only necessary to have the 4-dim vector space
V = VectorSpace(F,4)
# We will pick a specific plane in this vector space,
# in which we will place the hyperoval
W = V.subspace_with_basis([[F.one(),0,0,0],[0,F.one(),0,0],
                            [0,0,F.one(),0]])
# Now we construct the hyperconic hyperoval in W
ov = []
elts = F.list()
for i in elts:
	ov.append(W.subspace_with_basis([[i,i^2,1,0]]))
ov.append(W.subspace_with_basis([[0,1,0,0]]))
ov.append(W.subspace_with_basis([[1,0,0,0]]))

# Now we get the points of the GQ, which are points of V, not in W.
ptslist =[]
for i in V.subspaces(1):
	if not i.is_subspace(W):
		ptslist.append(i)

# Now we get the lines of the GQ, which are 2-dim subspaces of V,
# which intersect a point of the hyperoval.
lns =[]
for i in V.subspaces(2):
	if not i.is_subspace(W):
		for k in ov:
			if k.is_subspace(i):
				lns.append(i)

# Now we will make the incidence structure
pts = range(len(ptslist))
blcks = []
for i in lns:
	b =[]
	for j in pts:
		if ptslist[j].is_subspace(i):
			b.append(j)
	blcks.append(b)
GQ = IncidenceStructure(pts, blcks)

# We get the points graph of GQ; vertices are pts and adjacent if they
# are in the same block. The code for this is above.
t2o = pointsGraph(GQ)

Useful websites