From 6a1b563eefe36fdaba96c6d419442cd469692530 Mon Sep 17 00:00:00 2001 From: Nathann Cohen Date: Sun, 15 Feb 2015 12:26:54 +0100 Subject: [PATCH] trac #17804: Add cardinality function to know the number of orderings --- src/sage/graphs/pq_trees.py | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/sage/graphs/pq_trees.py b/src/sage/graphs/pq_trees.py index 71af6b4852f..2e4b58fe77f 100644 --- a/src/sage/graphs/pq_trees.py +++ b/src/sage/graphs/pq_trees.py @@ -685,6 +685,28 @@ def set_contiguous(self, v): return PARTIAL, False + def cardinality(self): + r""" + Return the number of orderings allowed by the structure. + + EXAMPLE:: + + sage: from sage.graphs.pq_trees import P, Q + sage: p = P([[0,3], [1,2], [2,3], [2,4], [4,0],[2,8], [2,9]]) + sage: p.cardinality() + 5040 + sage: p.set_contiguous(3) + (1, True) + sage: p.cardinality() + 1440 + """ + from math import factorial + n = factorial(self.number_of_children()) + for c in self._children: + if isinstance(c,PQ): + n = n*c.cardinality() + return n + class Q(PQ): r""" A Q-Tree is a PQ-Tree whose children are @@ -976,3 +998,20 @@ def set_contiguous(self, v): return (PARTIAL, not seen_right_end) + def cardinality(self): + r""" + Return the number of orderings allowed by the structure. + + EXAMPLE:: + + sage: from sage.graphs.pq_trees import P, Q + sage: q = Q([[0,3], [1,2], [2,3], [2,4], [4,0],[2,8], [2,9]]) + sage: q.cardinality() + 5040 + """ + n = 1 + for c in self._children: + if isinstance(c,PQ): + n = n*c.cardinality() + + return n if (self.number_of_children() == 1) else 2*n