Dual matroids - Matroid Theory

Skip to content
Back to top
View this page
Edit this page

# Dual matroids

## Theory

Let \(M\) be a matroid with groundset \(E\). If \(B\) is the set of bases of \(M\), then the set \(\{E - b : b \in B\}\) is the set of bases of another matroid, the dual of \(M\).

EXAMPLES:

Sage

    sage: M = matroids.catalog.Fano()
    sage: N = M.dual()
    sage: M.is_basis('abc')
    True
    sage: N.is_basis('defg')
    True
    sage: M.dual().dual() == M
    True

Python

    >>> from sage.all import *
    >>> M = matroids.catalog.Fano()
    >>> N = M.dual()
    >>> M.is_basis('abc')
    True
    >>> N.is_basis('defg')
    True
    >>> M.dual().dual() == M
    True

## Implementation

The class `DualMatroid` wraps around a matroid instance to represent its dual. Only useful for classes that don’t have an explicit construction of the dual (such as `RankMatroid` and `CircuitClosuresMatroid`). It is also used as the default implementation of the method `M.dual()`. For direct access to the `DualMatroid` constructor, run:

Sage

    sage: from sage.matroids.advanced import *

Python

    >>> from sage.all import *
    >>> from sage.matroids.advanced import *

See also `sage.matroids.advanced`.

AUTHORS:

- Rudi Pendavingh, Michael Welsh, Stefan van Zwam (2013-04-01): initial version

class sage.matroids.dual_matroid.DualMatroid(matroid)

  Bases: `Matroid`

  Dual of a matroid.

  For some matroid representations it can be computationally expensive to derive an explicit representation of the dual. This class wraps around any matroid to provide an abstract dual. It also serves as the default implementation of the dual.

  INPUT:

  - `matroid` – matroid

  EXAMPLES:

  Sage

      sage: from sage.matroids.advanced import *
      sage: M = matroids.catalog.Vamos()
      sage: Md = DualMatroid(M)  # indirect doctest
      sage: Md.rank('abd') == M.corank('abd')
      True
      sage: Md
      Dual of 'Vamos: Matroid of rank 4 on 8 elements with circuit-closures
      {3: {{'a', 'b', 'c', 'd'}, {'a', 'b', 'e', 'f'}, {'a', 'b', 'g', 'h'},
           {'c', 'd', 'e', 'f'}, {'e', 'f', 'g', 'h'}},
       4: {{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}}}'

  Python

      >>> from sage.all import *
      >>> from sage.matroids.advanced import *
      >>> M = matroids.catalog.Vamos()
      >>> Md = DualMatroid(M)  # indirect doctest
      >>> Md.rank('abd') == M.corank('abd')
      True
      >>> Md
      Dual of 'Vamos: Matroid of rank 4 on 8 elements with circuit-closures
      {3: {{'a', 'b', 'c', 'd'}, {'a', 'b', 'e', 'f'}, {'a', 'b', 'g', 'h'},
           {'c', 'd', 'e', 'f'}, {'e', 'f', 'g', 'h'}},
       4: {{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}}}'

  dual()

    Return the dual of the matroid.

    Let \(M\) be a matroid with groundset \(E\). If \(B\) is the set of bases of \(M\), then the set \(\{E - b : b \in B\}\) is the set of bases of another matroid, the dual of \(M\). Note that the dual of the dual of \(M\) equals \(M\), so if this is the `DualMatroid` instance wrapping \(M\) then the returned matroid is \(M\).

    OUTPUT: the dual matroid

    EXAMPLES:

    Sage

        sage: M = matroids.catalog.Pappus().dual()
        sage: N = M.dual()
        sage: N.rank()
        3
        sage: N
        Pappus: Matroid of rank 3 on 9 elements with 9 nonspanning circuits

    Python

        >>> from sage.all import *
        >>> M = matroids.catalog.Pappus().dual()
        >>> N = M.dual()
        >>> N.rank()
        3
        >>> N
        Pappus: Matroid of rank 3 on 9 elements with 9 nonspanning circuits

  groundset()

    Return the groundset of the matroid.

    The groundset is the set of elements that comprise the matroid.

    OUTPUT: set

    EXAMPLES:

    Sage

        sage: M = matroids.catalog.Pappus().dual()
        sage: sorted(M.groundset())
        ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

    Python

        >>> from sage.all import *
        >>> M = matroids.catalog.Pappus().dual()
        >>> sorted(M.groundset())
        ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

  is_valid(certificate=False)

    Test if `self` obeys the matroid axioms.

    For a `DualMatroid`, we check its dual.

    INPUT:

    - `certificate` – boolean (default: `False`)

    OUTPUT: boolean, or (boolean, dictionary)

    EXAMPLES:

    Sage

        sage: M = matroids.catalog.K5dual()
        sage: type(M)
        <class 'sage.matroids.dual_matroid.DualMatroid'>
        sage: M.is_valid()
        True
        sage: M = Matroid([[0, 1], [2, 3]])
        sage: M.dual().is_valid()
        False

    Python

        >>> from sage.all import *
        >>> M = matroids.catalog.K5dual()
        >>> type(M)
        <class 'sage.matroids.dual_matroid.DualMatroid'>
        >>> M.is_valid()
        True
        >>> M = Matroid([[Integer(0), Integer(1)], [Integer(2), Integer(3)]])
        >>> M.dual().is_valid()
        False

  relabel(mapping)

    Return an isomorphic matroid with relabeled groundset.

    The output is obtained by relabeling each element \(e\) by `mapping[e]`, where `mapping` is a given injective map. If `mapping[e]` is not defined, then the identity map is assumed.

    INPUT:

    - `mapping` – a Python object such that `mapping[e]` is the new label of \(e\)

    OUTPUT: matroid

    EXAMPLES:

    Sage

        sage: M = matroids.catalog.K5dual(range(10))
        sage: type(M)
        <class 'sage.matroids.dual_matroid.DualMatroid'>
        sage: sorted(M.groundset())
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        sage: N = M.dual().relabel({0:10})
        sage: sorted(N.groundset())
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        sage: N.is_isomorphic(matroids.catalog.K5())
        True

    Python

        >>> from sage.all import *
        >>> M = matroids.catalog.K5dual(range(Integer(10)))
        >>> type(M)
        <class 'sage.matroids.dual_matroid.DualMatroid'>
        >>> sorted(M.groundset())
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        >>> N = M.dual().relabel({Integer(0):Integer(10)})
        >>> sorted(N.groundset())
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        >>> N.is_isomorphic(matroids.catalog.K5())
        True