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)
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)