# HG changeset patch
# User Nathann Cohen
# Date 1352598337 -3600
# Node ID b3ae6f0441dd0c927aeaab04d2d25e65bbbc09f1
# Parent e2adf5f80f790f6b019f8ff6a879228c5fa46fc4
Another bug in graph products....
diff --git a/sage/graphs/generic_graph.py b/sage/graphs/generic_graph.py
--- a/sage/graphs/generic_graph.py
+++ b/sage/graphs/generic_graph.py
@@ -13606,9 +13606,10 @@
Returns the lexicographic product of self and other.
The lexicographic product of `G` and `H` is the graph `L` with vertex
- set `V(L)` equal to the Cartesian product of the vertices `V(G)` and
- `V(H)`, and `((u,v), (w,x))` is an edge iff - `(u, w)` is an edge of
- self, or - `u = w` and `(v, x)` is an edge of other.
+ set `V(L)=V(G)\times V(H)`, and `((u,v), (w,x))` is an edge iff :
+
+ * `(u, w)` is an edge of `G`, or
+ * `u = w` and `(v, x)` is an edge of `H`.
EXAMPLES::
@@ -13671,12 +13672,15 @@
Returns the strong product of self and other.
The strong product of `G` and `H` is the graph `L` with vertex set
- `V(L)` equal to the Cartesian product of the vertices `V(G)` and `V(H)`,
- and `((u,v), (w,x))` is an edge iff either - `(u, w)` is an edge of self
- and `v = x`, or - `(v, x)` is an edge of other and `u = w`, or - `(u,
- w)` is an edge of self and `(v, x)` is an edge of other. In other words,
- the edges of the strong product is the union of the edges of the tensor
- and Cartesian products.
+ `V(L)=V(G)\times V(H)`, and `((u,v), (w,x))` is an edge of `L` iff
+ either :
+
+ * `(u, w)` is an edge of `G` and `v = x`, or
+ * `(v, x)` is an edge of `H` and `u = w`, or
+ * `(u, w)` is an edge of `G` and `(v, x)` is an edge of `H`.
+
+ In other words, the edges of the strong product is the union of the
+ edges of the tensor and Cartesian products.
EXAMPLES::
@@ -13696,25 +13700,32 @@
TESTS:
- Strong product of graphs::
+ Strong product of graphs is commutative::
sage: G = Graph([(0,1), (1,2)])
sage: H = Graph([('a','b')])
sage: T = G.strong_product(H)
- sage: T.edges(labels=None)
- [((0, 'a'), (0, 'b')), ((0, 'a'), (1, 'a')), ((0, 'a'), (1, 'b')), ((0, 'b'), (1, 'b')), ((1, 'a'), (1, 'b')), ((1, 'a'), (2, 'a')), ((1, 'a'), (2, 'b')), ((1, 'b'), (2, 'b')), ((2, 'a'), (2, 'b'))]
sage: T.is_isomorphic( H.strong_product(G) )
True
- Strong product of digraphs::
+ Strong product of digraphs is commutative::
sage: I = DiGraph([(0,1), (1,2)])
sage: J = DiGraph([('a','b')])
sage: T = I.strong_product(J)
- sage: T.edges(labels=None)
- [((0, 'a'), (0, 'b')), ((0, 'a'), (1, 'a')), ((0, 'a'), (1, 'b')), ((0, 'b'), (1, 'b')), ((1, 'a'), (1, 'b')), ((1, 'a'), (2, 'a')), ((1, 'a'), (2, 'b')), ((1, 'b'), (2, 'b')), ((2, 'a'), (2, 'b'))]
sage: T.is_isomorphic( J.strong_product(I) )
True
+
+ Counting the edges (see :trac:`13699`)::
+
+ sage: g = graphs.RandomGNP(5,.5)
+ sage: gn,gm = g.order(), g.size()
+ sage: h = graphs.RandomGNP(5,.5)
+ sage: hn,hm = h.order(), h.size()
+ sage: product_size = g.strong_product(h).size()
+ sage: expected = gm*hn + hm*gn + 2*gm*hm
+ sage: if product_size != expected:
+ ... print "Something is really wrong here...", product_size, "!=", expected
"""
if self._directed and other._directed:
from sage.graphs.all import DiGraph
@@ -13731,6 +13742,8 @@
G.add_edge((u,v), (w,v))
for v,x in other.edges(labels=None):
G.add_edge((u,v), (w,x))
+ if not self._directed:
+ G.add_edge((w,v), (u,x))
for v,x in other.edges(labels=None):
for u in self:
G.add_edge((u,v), (u,x))
@@ -13741,9 +13754,10 @@
Returns the disjunctive product of self and other.
The disjunctive product of `G` and `H` is the graph `L` with vertex set
- `V(L)` equal to the Cartesian product of the vertices `V(G)` and `V(H)`,
- and `((u,v), (w,x))` is an edge iff either - `(u, w)` is an edge of
- self, or - `(v, x)` is an edge of other.
+ `V(L)=V(G)\times V(H)`, and `((u,v), (w,x))` is an edge iff either :
+
+ * `(u, w)` is an edge of `G`, or
+ * `(v, x)` is an edge of `H`.
EXAMPLES::