Exterior Shifting

Uniform Hypergraphs

uniform_hypergraphFunction
 uniform_hypergraph(faces::Vector{Vector{Int}}, n::Int, k::Int)
 uniform_hypergraph(faces::Vector{Vector{Int}}, n::Int)
 uniform_hypergraph(faces::Vector{Vector{Int}})
 uniform_hypergraph(K::SimplicialComplex, k::Int)

Create a uniform hypergraph using faces, the size of each face should be k and all faces should be subsets of $[n]$. One can also create a UniformHypergraph for the k faces of a SimplicialComplex K.

#Examples

julia> U = uniform_hypergraph([[1, 2], [2, 3]], 4)
UniformHypergraph(4, 2, [[1, 2], [2, 3]])

julia> U = uniform_hypergraph([[1, 2], [2, 3]])
UniformHypergraph(3, 2, [[1, 2], [2, 3]])

julia> U = uniform_hypergraph(simplicial_complex([[1 ,2, 3], [1, 3, 4]]), 2)
UniformHypergraph(4, 2, [[1, 2], [1, 3], [1, 4], [2, 3], [3, 4]])

julia> face_size(U)
2

julia> faces(U)
5-element Vector{Vector{Int64}}:
 [1, 2]
 [1, 3]
 [1, 4]
 [2, 3]
 [3, 4]
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Matrix Constructions

generic_unipotent_matrixFunction
generic_unipotent_matrix(R::MPolyRing)
generic_unipotent_matrix(F::Field, n::Int)

Constructs a unipotent matrix with entries in a polynomial ring R. One can also provide a field F and an integer n, then the entries of the unipotent matrix will lie in a multivariate polynomial ring over F with n^2 variables.

Examples

julia> R, x = polynomial_ring(QQ, :x=> (1:2, 1:2))
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[x[1, 1] x[1, 2]; x[2, 1] x[2, 2]])

julia> generic_unipotent_matrix(R)
[1   x[1, 2]]
[0         1]

julia> generic_unipotent_matrix(GF(2), 2)
[1   x[1, 2]]
[0         1]
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
rothe_matrixFunction
rothe_matrix(F::Field, w::WeylGroupElem)
rothe_matrix(F::Field, p::PermGroupElem)
rothe_matrix(R::MPolyRing, w::WeylGroupElem)
rothe_matrix(R::MPolyRing, p::PermGroupElem)

For a base field F and a Weyl group element w return the matrix with entries in the multivariate polynomial ring R with n^2 many indeterminants where n - 1 is the rank of the root system of the Weyl group. As general_linear_group(n^2, R) has a Bruhat decomposition, any element lies in a unique double coset $BwB$, where $B$ is the Borel group of upper triangular matrices. The Rothe matrix is a normal form for the matrix on the left of a representative for the double coset corresponding to w. There is also the possibility to pass the underlying polynomial ring R instead. This will be explained further once the corresponding preprint is on the arXiv. We use the name Rothe matrix because of its resemblance with a Rothe diagram, see [Knu98].

Examples

julia> W = weyl_group(:A, 4)
Weyl group
  of root system of rank 4
    of type A4

julia> s = gens(W)
4-element Vector{WeylGroupElem}:
 s1
 s2
 s3
 s4

julia> w = s[2] * s[3] * s[4]
s2 * s3 * s4

julia> rothe_matrix(GF(2), w)
[1         0         0         0   0]
[0   x[2, 3]   x[2, 4]   x[2, 5]   1]
[0         1         0         0   0]
[0         0         1         0   0]
[0         0         0         1   0]

julia> rothe_matrix(QQ, perm([2, 3, 1]))
[x[1, 3]   1   0]
[x[2, 3]   0   1]
[      1   0   0]

julia> Fx, x = polynomial_ring(GF(2), :x => (1:5, 1:5))
(Multivariate polynomial ring in 25 variables over GF(2), FqMPolyRingElem[x[1, 1] x[1, 2] … x[1, 4] x[1, 5]; x[2, 1] x[2, 2] … x[2, 4] x[2, 5]; … ; x[4, 1] x[4, 2] … x[4, 4] x[4, 5]; x[5, 1] x[5, 2] … x[5, 4] x[5, 5]])

julia> rothe_matrix(Fx, w)
[1         0         0         0   0]
[0   x[2, 3]   x[2, 4]   x[2, 5]   1]
[0         1         0         0   0]
[0         0         1         0   0]
[0         0         0         1   0]

julia> rothe_matrix(Fx, perm([1, 3, 2, 5, 4]))
[1         0   0         0   0]
[0   x[2, 3]   1         0   0]
[0         1   0         0   0]
[0         0   0   x[4, 5]   1]
[0         0   0         1   0]
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
compound_matrixFunction
compound_matrix(m::MatElem, k::Int)
compound_matrix(p::PermGroupElem, k::Int)
compound_matrix(w::WeylGroupElem, k::Int)
compound_matrix(m::MatElem, K::UniformHypergraph)

Given a matrix m, return the matrix where each entry is a k$\times$k-minor of m. The entries of the compound matrix are ordered with respect to the lexicographic order on sets. When passed a PermGroupElem or WeylGroupElem, return the compound matrix for their permutation matrix representation.

Alternatively, passing a UniformHypergraph K will return the compound matrix with entries the face_size(K) minors, and restrict the rows to the rows corresponding to K.

Examples

julia> M = generic_unipotent_matrix(QQ, 3)
[1   x[1, 2]   x[1, 3]]
[0         1   x[2, 3]]
[0         0         1]

julia> compound_matrix(M, 2)
[1   x[2, 3]   x[1, 2]*x[2, 3] - x[1, 3]]
[0         1                     x[1, 2]]
[0         0                           1]

julia> compound_matrix(perm([1, 3, 2]), 2)
[0   1    0]
[1   0    0]
[0   0   -1]

julia> W = weyl_group(:A, 2)
Weyl group
  of root system of rank 2
    of type A2

julia> compound_matrix(longest_element(W), 2)
[ 0    0   -1]
[ 0   -1    0]
[-1    0    0]

julia> K = uniform_hypergraph([[1, 2], [2, 3]])
UniformHypergraph(3, 2, [[1, 2], [2, 3]])

julia> compound_matrix(M, K)
[1   x[2, 3]   x[1, 2]*x[2, 3] - x[1, 3]]
[0         0                           1]
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Exterior (Partial) Shifting

exterior_shiftFunction
exterior_shift(F::Field, K::SimplicialComplex, w::WeylGroupElem)
exterior_shift(F::Field, K::UniformHypergraph, w::WeylGroupElem)
exterior_shift(K::SimplicialComplex, w::WeylGroupElem)
exterior_shift(K::UniformHypergraph, w::WeylGroupElem)
exterior_shift(K::SimplicialComplex)
exterior_shift(K::UniformHypergraph)

Computes the (partial) exterior shift of a simplical complex or uniform hypergraph K with respect to the Weyl group element w and the field F. If the field is not given then QQ is used during the computation. If w is not given then longest_element(weyl_group(:A, n_vertices(K) - 1)) is used

Examples

julia> K = real_projective_plane()
Abstract simplicial complex of dimension 2 on 6 vertices

julia> is_shifted(K)
false

julia> L = exterior_shift(K)
Abstract simplicial complex of dimension 2 on 6 vertices

julia> facets(L)
10-element Vector{Set{Int64}}:
 Set([2, 3, 1])
 Set([4, 2, 1])
 Set([5, 2, 1])
 Set([6, 2, 1])
 Set([4, 3, 1])
 Set([5, 3, 1])
 Set([6, 3, 1])
 Set([5, 4, 1])
 Set([4, 6, 1])
 Set([5, 6, 1])

julia> is_shifted(L)
true

julia> betti_numbers(L) == betti_numbers(K)
true

julia> W = weyl_group(:A, n_vertices(K) - 1)
Weyl group
  of root system of rank 5
    of type A5

julia> s = gens(W)
5-element Vector{WeylGroupElem}:
 s1
 s2
 s3
 s4
 s5

julia> w = s[2] * s[3] * s[4]
s2 * s3 * s4

julia> L = exterior_shift(GF(2), K, w)
Abstract simplicial complex of dimension 2 on 6 vertices
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source