Background and conventions

We take a graph to be with multi-edges, connected, and no self-loops.

Do note that Divisors should be explicitly constructed to the functions instead of passing a vector. For example, has_rank_at_least_r(g, Divisor([1, 0, 1, 0, 0, 1, 0, 1]), 1).