Counting

My own background is (mostly) in combinatorics, especially the enumeration of discrete structures on regular lattices. So, my approach to the topics at hand will be very discrete flavoured.

Given a set of discrete structures, , such as

  • words in two symbols — eg
  • Dyck paths
  • Binary trees
  • self-avoiding walks and polygons
  • poker-hands
  • permutations
  • involutions
  • knot diagrams
  • knot types

the main question I’d like to be able answer is

How many objects are there in ?

Most of the sets I have described are infinite sets, so the above question is boring. Instead we need to grade the sets by some notion of size. This should be a function

For most of the objects we’ll talk about, this will end up being something like “the number of crossings”, “the number of edges”, “the number of symbols”. We can then grade our original set as

Then the main question becomes

How many objects are there of size ?

where (hopefully) the answer is now finite. Lets call it (for the moment) .

What is an acceptable answer? This can be quite hard to decide. For example, the (somewhat literal) answer is completely correct, but obviously not much use. It does, however, somehow set a baseline for what is “useful”. I guess we should call the above a “brute force” solution.

In particular, if we think about actually computing the number — the expression above takes time proportional to to compute . This is pretty useless, and so anything that might be faster than the above is arguably “useful”. Of course there are exceptions to this — for example, if we have an expression that is useless for computing the numbers, but can tell us other properties (eg the asymptotics of the numbers), then it might still be “useful” and perhaps even more useful than being able to compute quickly.

Anyway — what we’d really like is an explicit expression for that is quick to compute. For example To compute we need to do operations.

We might also be happy with a more implicit expression like a generating function This can be expanded in polynomial time, and it also contains useful information about the asymptotics of the coefficients - the interested reader should take a look at the topic of “analytic combinatorics” and the wonderful text of Flajolet & Sedgewick.

We might also be happy with a recurrence: which we can iterate in polynomial time to find . We can also use such linear recurrences (with polynomial coefficients) to extract information about the asymptotic growth of .

For some problems finding such expressions is pretty easy

  • words in two symbols —
  • Dyck paths —
  • Binary trees —
  • permutations —
  • involutions — or

but far too frequently they are just too damn hard and no such nice expression is known — nor any useful implicit expression

  • self-avoiding walks and polygons
  • knot diagrams
  • knot types

And — of course — as “luck” would have it, these are precisely the sort of objects that we are interested in.

So why can’t we just use the brute force solution?