def convert_to_milnor_matrix(n, basis, p=2):
    r"""
    Change-of-basis matrix, 'basis' to Milnor, in dimension
    `n`, at the prime `p`.

    INPUT:

    - ``n`` - non-negative integer, the dimension
    - ``basis`` - string, the basis from which to convert
    - ``p`` - positive prime number (optional, default 2)

    OUTPUT:
        
    ``matrix`` - change-of-basis matrix, a square matrix over ``GF(p)``

    .. note::

        This is called internally.  It is not intended for casual
        users, so no error checking is made on the integer `n`, the
        basis name, or the prime.  Also, users should call
        :func:`convert_to_milnor_matrix` instead of this function
        (which has a trailing underscore in its name), because the
        former is the cached version of the latter.

    EXAMPLES::

        sage: from sage.algebras.steenrod.steenrod_algebra_bases import convert_to_milnor_matrix
        sage: convert_to_milnor_matrix(5, 'adem') # indirect doctest
        [0 1]
        [1 1]
        sage: convert_to_milnor_matrix(45, 'milnor')
        111 x 111 dense matrix over Finite Field of size 2
        sage: convert_to_milnor_matrix(12,'wall')
        [1 0 0 1 0 0 0]
        [1 1 0 0 0 1 0]
        [0 1 0 1 0 0 0]
        [0 0 0 1 0 0 0]
        [1 1 0 0 1 0 0]
        [0 0 1 1 1 0 1]
        [0 0 0 0 1 0 1]

    The function takes an optional argument, the prime `p` over
    which to work::

        sage: convert_to_milnor_matrix(17,'adem',3)
        [0 0 1 1]
        [0 0 0 1]
        [1 1 1 1]
        [0 1 0 1]
        sage: convert_to_milnor_matrix(48,'adem',5)
        [0 1]
        [1 1]
        sage: convert_to_milnor_matrix(36,'adem',3)
        [0 0 1]
        [0 1 0]
        [1 2 0]
    """
    from sage.matrix.constructor import matrix
    from sage.rings.all import GF
    from steenrod_algebra import SteenrodAlgebra
    if n == 0:
        return matrix(GF(p), 1, 1, [[1]])
    milnor_base = steenrod_algebra_basis(n, 'milnor', p)
    rows = []
    A = SteenrodAlgebra(basis=basis, p=p)
    for poly in A.basis(n):
        d = poly.milnor().monomial_coefficients()
        for v in milnor_base:
            entry = d.get(v, 0)
            rows = rows + [entry]
    d = len(milnor_base)
    return matrix(GF(p), d, d, rows)
def convert_to_milnor_matrix(n, basis, p=2, generic='auto'):
    r"""
    Change-of-basis matrix, 'basis' to Milnor, in dimension
    `n`, at the prime `p`.

    INPUT:

    - ``n`` - non-negative integer, the dimension
    - ``basis`` - string, the basis from which to convert
    - ``p`` - positive prime number (optional, default 2)

    OUTPUT:

    ``matrix`` - change-of-basis matrix, a square matrix over ``GF(p)``

    EXAMPLES::

        sage: from sage.algebras.steenrod.steenrod_algebra_bases import convert_to_milnor_matrix
        sage: convert_to_milnor_matrix(5, 'adem') # indirect doctest
        [0 1]
        [1 1]
        sage: convert_to_milnor_matrix(45, 'milnor')
        111 x 111 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries)
        sage: convert_to_milnor_matrix(12,'wall')
        [1 0 0 1 0 0 0]
        [1 1 0 0 0 1 0]
        [0 1 0 1 0 0 0]
        [0 0 0 1 0 0 0]
        [1 1 0 0 1 0 0]
        [0 0 1 1 1 0 1]
        [0 0 0 0 1 0 1]

    The function takes an optional argument, the prime `p` over
    which to work::

        sage: convert_to_milnor_matrix(17,'adem',3)
        [0 0 1 1]
        [0 0 0 1]
        [1 1 1 1]
        [0 1 0 1]
        sage: convert_to_milnor_matrix(48,'adem',5)
        [0 1]
        [1 1]
        sage: convert_to_milnor_matrix(36,'adem',3)
        [0 0 1]
        [0 1 0]
        [1 2 0]
    """
    from sage.matrix.constructor import matrix
    from sage.rings.all import GF
    from steenrod_algebra import SteenrodAlgebra
    if generic == 'auto':
        generic = False if p == 2 else True
    if n == 0:
        return matrix(GF(p), 1, 1, [[1]])
    milnor_base = steenrod_algebra_basis(n, 'milnor', p, generic=generic)
    rows = []
    A = SteenrodAlgebra(basis=basis, p=p, generic=generic)
    for poly in A.basis(n):
        d = poly.milnor().monomial_coefficients()
        for v in milnor_base:
            entry = d.get(v, 0)
            rows = rows + [entry]
    d = len(milnor_base)
    return matrix(GF(p), d, d, rows)
Beispiel #3
0
def convert_to_milnor_matrix(n, basis, p=2):
    r"""
    Change-of-basis matrix, 'basis' to Milnor, in dimension
    `n`, at the prime `p`.

    INPUT:

    - ``n`` - non-negative integer, the dimension
    - ``basis`` - string, the basis from which to convert
    - ``p`` - positive prime number (optional, default 2)

    OUTPUT:

    ``matrix`` - change-of-basis matrix, a square matrix over ``GF(p)``

    .. note::

        This is called internally.  It is not intended for casual
        users, so no error checking is made on the integer `n`, the
        basis name, or the prime.  Also, users should call
        :func:`convert_to_milnor_matrix` instead of this function
        (which has a trailing underscore in its name), because the
        former is the cached version of the latter.

    EXAMPLES::

        sage: from sage.algebras.steenrod.steenrod_algebra_bases import convert_to_milnor_matrix
        sage: convert_to_milnor_matrix(5, 'adem') # indirect doctest
        [0 1]
        [1 1]
        sage: convert_to_milnor_matrix(45, 'milnor')
        111 x 111 dense matrix over Finite Field of size 2
        sage: convert_to_milnor_matrix(12,'wall')
        [1 0 0 1 0 0 0]
        [1 1 0 0 0 1 0]
        [0 1 0 1 0 0 0]
        [0 0 0 1 0 0 0]
        [1 1 0 0 1 0 0]
        [0 0 1 1 1 0 1]
        [0 0 0 0 1 0 1]

    The function takes an optional argument, the prime `p` over
    which to work::

        sage: convert_to_milnor_matrix(17,'adem',3)
        [0 0 1 1]
        [0 0 0 1]
        [1 1 1 1]
        [0 1 0 1]
        sage: convert_to_milnor_matrix(48,'adem',5)
        [0 1]
        [1 1]
        sage: convert_to_milnor_matrix(36,'adem',3)
        [0 0 1]
        [0 1 0]
        [1 2 0]
    """
    from sage.matrix.constructor import matrix
    from sage.rings.all import GF
    from steenrod_algebra import SteenrodAlgebra
    if n == 0:
        return matrix(GF(p), 1, 1, [[1]])
    milnor_base = steenrod_algebra_basis(n,'milnor',p)
    rows = []
    A = SteenrodAlgebra(basis=basis, p=p)
    for poly in A.basis(n):
        d = poly.milnor().monomial_coefficients()
        for v in milnor_base:
            entry = d.get(v, 0)
            rows = rows + [entry]
    d = len(milnor_base)
    return matrix(GF(p),d,d,rows)
def convert_to_milnor_matrix(n, basis, p=2):
    r"""
    Change-of-basis matrix, 'basis' to Milnor, in dimension
    `n`, at the prime `p`.

    INPUT:

    - ``n`` - non-negative integer, the dimension
    - ``basis`` - string, the basis from which to convert
    - ``p`` - positive prime number (optional, default 2)

    OUTPUT:

    ``matrix`` - change-of-basis matrix, a square matrix over ``GF(p)``

    EXAMPLES::

        sage: from sage.algebras.steenrod.steenrod_algebra_bases import convert_to_milnor_matrix
        sage: convert_to_milnor_matrix(5, 'adem') # indirect doctest
        [0 1]
        [1 1]
        sage: convert_to_milnor_matrix(45, 'milnor')
        111 x 111 dense matrix over Finite Field of size 2
        sage: convert_to_milnor_matrix(12,'wall')
        [1 0 0 1 0 0 0]
        [1 1 0 0 0 1 0]
        [0 1 0 1 0 0 0]
        [0 0 0 1 0 0 0]
        [1 1 0 0 1 0 0]
        [0 0 1 1 1 0 1]
        [0 0 0 0 1 0 1]

    The function takes an optional argument, the prime `p` over
    which to work::

        sage: convert_to_milnor_matrix(17,'adem',3)
        [0 0 1 1]
        [0 0 0 1]
        [1 1 1 1]
        [0 1 0 1]
        sage: convert_to_milnor_matrix(48,'adem',5)
        [0 1]
        [1 1]
        sage: convert_to_milnor_matrix(36,'adem',3)
        [0 0 1]
        [0 1 0]
        [1 2 0]
    """
    from sage.matrix.constructor import matrix
    from sage.rings.all import GF
    from steenrod_algebra import SteenrodAlgebra
    if n == 0:
        return matrix(GF(p), 1, 1, [[1]])
    milnor_base = steenrod_algebra_basis(n,'milnor',p)
    rows = []
    A = SteenrodAlgebra(basis=basis, p=p)
    for poly in A.basis(n):
        d = poly.milnor().monomial_coefficients()
        for v in milnor_base:
            entry = d.get(v, 0)
            rows = rows + [entry]
    d = len(milnor_base)
    return matrix(GF(p),d,d,rows)