Congruence Normality of Hyperplane Arrangements¶
Module for the computations related to congruence normality/uniformity of posets of regions of hyperplane arrangements.
This module has methods to test simplicial hyperplane arrangements of rank 3
for congruence normality. A hyperplane arrangement is congruence normal if
each of its posets of regions is obtainable from the one element lattice
through a finite sequence of doublings of convex sets. Equivalently, one can
create a directed graph on shards of the arrangement for each base region and
check if it is acyclic, see the module
VectorConfiguration
and its method
is_congruence_normal()
. The method
vectorconf_to_hyperplane_arrangement()
creates a hyperplane
arrangement from a three-dimensional vector configuration. Every region of
each arrangement is then tested to determine if the corresponding poset is
congruence normal in the RegionsCongruenceNormal()
method.
EXAMPLES:
This vector configuration is congruence normal for any choice of base region in the corresponding hyperplane arrangement. We load it from the database:
sage: from cn_hyperarr.main import *
sage: always_normals = db_normals_CEL[(6,24,1)]; always_normals
((0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 1))
sage: vc = VectorConfiguration([vector(x) for x in always_normals]);vc
Vector configuration of 6 vectors in dimension 3
sage: h = vectorconf_to_hyperplane_arrangement(vc);h
Arrangement of 6 hyperplanes of dimension 3 and rank 3
sage: h.n_regions()
24
sage: A6_24 = RegionsCongruenceNormality(vc);
sage: A6_24.values()
dict_values([True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True, True])
This vector configuration of ten vectors is sometimes congruence normal. It is the smallest simplicial arrangement of rank three that is not always congruence normal and is referred to as \(A(10,60)_3\) in [CEL]. We also load it from the database:
sage: from cn_hyperarr.main import *
sage: sometimes_normals = db_normals_CEL[(10,60,3)]; sometimes_normals
((2*tau + 1, 2*tau, tau),
(2*tau + 2, 2*tau + 1, tau + 1),
(1, 1, 1),
(tau + 1, tau + 1, tau),
(2*tau, 2*tau, tau),
(tau + 1, tau + 1, 1),
(1, 1, 0),
(0, 1, 0),
(1, 0, 0),
(tau + 1, tau, tau))
sage: ncn_conf = VectorConfiguration([vector(x) for x in sometimes_normals]);ncn_conf
Vector configuration of 10 vectors in dimension 3
sage: A10_60_3 = RegionsCongruenceNormality(ncn_conf)
sage: A10_60_3.values()
dict_values([False, False, True, True, True, True, False, False, True, True, False, True, True, False, True, False, True, True, True, True, True, True, False, False, False, True, True, True, True, True, False, False, True, True, True, True, False, False, True, True, False, True, True, False, True, False, True, True, True, True, True, True, False, False, False, True, True, True, True, True])
-
cn_hyperarr.main.
RegionsCongruenceNormality
(vector_conf, backend=None, verbose=False, nb_proc=4)¶ Return whether regions in the hyperplane arrangement generated by the vector configuration
vector_conf
lead to congruence normal lattice of regions.INPUT:
vectorconf
– a vector configurationbackend
– string (default =None
).verbose
– (default = False). IfTrue
return number of hyperplanes, normal vectors, number of regions.nb_proc
– (default =4
). The number of processors to use to verify.
OUTPUT:
A dictionary whose keys are tuple (vector,vc) where vector is a representative vector of a region of the hyperplane arrangement and vc is the corresponding acyclic vector configuration which is a reorientation of
vector_conf
.EXAMPLES:
An example of an arrangement that is always congruence normal:
sage: from cn_hyperarr.main import * sage: vc = VectorConfiguration([[1,0,0],[0,1,0],[0,0,1],[1,1,0],[0,1,1],[1,1,1]]) sage: h = vectorconf_to_hyperplane_arrangement(vc); sage: h.n_regions() 24 sage: check_result = RegionsCongruenceNormality(vc); sage: check_result.values() dict_values([True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]) sage: len(check_result.values()) 24
This vector configuration of ten vectors is sometimes congruence normal. It is the smallest simplicial arrangement of rank three that is not always congruence normal and is referred to as \(A(10,60)_3\) in [CEL]
sage: tau = AA((1+sqrt(5))/2) sage: ncn = [[2*tau+1,2*tau,tau],[2*tau+2,2*tau+1,tau+1],[1,1,1],[tau+1,tau+1,tau],[2*tau,2*tau,tau],[tau+1,tau+1,1],[1,1,0],[0,1,0],[1,0,0],[tau+1,tau,tau]] sage: ncn_conf = VectorConfiguration(ncn); sage: check = RegionsCongruenceNormality(ncn_conf) sage: vals_list = list(check.values()) sage: [vals_list.count(True), vals_list.count(False)] [40, 20]
-
cn_hyperarr.main.
vectorconf_to_hyperplane_arrangement
(vector_conf, backend=None)¶ Return the hyperplane arrangement associated to the vector configuration
vector_conf
.INPUT:
vector_conf
– a vector configurationbackend
– string (default =None
). The backend to use.
OUTPUT:
A hyperplane arrangement
EXAMPLES:
The arrangement \(A(10,60)_3\) with 10 hyperplanes is the smallest rank-three simplicial arrangement that is not congruence normal:
sage: from cn_hyperarr.main import * sage: tau = AA((1+sqrt(5))/2) sage: ncn = [[2*tau + 1, 2*tau, tau], [2*tau + 2, 2*tau + 1, tau + 1], ....: [1, 1, 1], [tau + 1, tau + 1, tau], [2*tau, 2*tau, tau], ....: [tau + 1, tau + 1, 1], [1, 1, 0], [0, 1, 0], [1, 0, 0], ....: [tau + 1, tau, tau]] sage: ncn_conf = VectorConfiguration(ncn); sage: ncn_arr = vectorconf_to_hyperplane_arrangement(ncn_conf); ncn_arr Arrangement of 10 hyperplanes of dimension 3 and rank 3
Using normaliz as backend:
sage: ncn_conf_norm = VectorConfiguration(ncn, 'normaliz') # optional - pynormaliz sage: ncn_conf_norm.backend() # optional - pynormaliz 'normaliz'
-
cn_hyperarr.main.
wrapper_forcing_acyclic
(vectorconf)¶ Return whether the vector configuration coming from a specific choice of base region gives rise to a congruence normal poset of regions.
INPUT:
vectorconf
– a vector configuration
OUTPUT:
A tuple. The first entry says if the forcing_orient_graph is acyclic. The second says the number of vertices.
EXAMPLES:
The arrangement \(A(10,60)_3\) with 10 hyperplanes is not congruence normal for the implicit choice of base region:
sage: from cn_hyperarr.main import * sage: tau = AA((1+sqrt(5))/2) sage: ncn = [[2*tau+1,2*tau,tau],[2*tau+2,2*tau+1,tau+1],[1,1,1],[tau+1,tau+1,tau],[2*tau,2*tau,tau],[tau+1,tau+1,1],[1,1,0],[0,1,0],[1,0,0],[tau+1,tau,tau]] sage: ncn_conf = VectorConfiguration(ncn); sage: wrapper_forcing_acyclic(ncn_conf); (False, 29)
A congruence normal arrangement, with an acyclic forcing_oriented_graph:
sage: vc = VectorConfiguration([[1,0,0],[0,1,0],[0,0,1],[1,1,0],[0,1,1],[1,1,1]]) sage: wrapper_forcing_acyclic(vc) (True, 11)