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 configuration

  • backend – string (default = None).

  • verbose – (default = False). If True 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 configuration

  • backend – 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)