PyQNormaliz: First example¶

For computations over real embedded number fields with QNormaliz, first load the PyQNormaliz_cpp module

In [1]:
import PyQNormaliz_cpp


Now we enter a dodecahedron

In [2]:
dodec = PyQNormaliz_cpp.NmzCone( number_field = "min_poly (a^2 - 5) embedding [2.236067977499789 +/- 8.06e-16]",
cone = [
[ "-a + 3", "-a + 3", "-a + 3", 1 ],
[ "2*a - 4", 0, "a - 1", 1 ],
[ "-a + 3", "a - 3", "-a + 3", 1 ],
[ "a - 1", "2*a - 4", 0, 1 ],
[ "a - 1", "-2*a + 4", 0, 1 ],
[ 0, "a - 1", "2*a - 4", 1 ],
[ 0, "-a + 1", "2*a - 4", 1 ],
[ "-2*a + 4", 0, "a - 1", 1 ],
[ "a - 3", "-a + 3", "-a + 3", 1 ],
[ "a - 3", "a - 3", "-a + 3", 1 ],
[ "-a + 3", "-a + 3", "a - 3", 1 ],
[ 0, "a - 1", "-2*a + 4", 1 ],
[ "-a + 3", "a - 3", "a - 3", 1 ],
[ 0, "-a + 1", "-2*a + 4", 1 ],
[ "2*a - 4", 0, "-a + 1", 1 ],
[ "-a + 1", "2*a - 4", 0, 1 ],
[ "-a + 1", "-2*a + 4", 0, 1 ],
[ "a - 3", "-a + 3", "a - 3", 1 ],
[ "a - 3", "a - 3", "a - 3", 1 ],
[ "-2*a + 4", 0, "-a + 1", 1 ] ] )


The input for number field elements can be given as strings, or as a list of pairs of integers. The polynomial

a^2+1/2a-3/5

would be the list

[[-3,5],[1,2],[1,1]]

Now we can compute the support hyperplanes of the dodecahedron

In [3]:
PyQNormaliz_cpp.NmzResult(dodec,"SupportHyperplanes")

Out[3]:
[[[[-1, 4], [-1, 4]], [[0, 1]], [[-1, 2]], [[1, 1]]],
[[[-1, 4], [-1, 4]], [[0, 1]], [[1, 2]], [[1, 1]]],
[[[-1, 2]], [[-1, 4], [-1, 4]], [[0, 1]], [[1, 1]]],
[[[-1, 2]], [[1, 4], [1, 4]], [[0, 1]], [[1, 1]]],
[[[0, 1]], [[-1, 2]], [[-1, 4], [-1, 4]], [[1, 1]]],
[[[0, 1]], [[-1, 2]], [[1, 4], [1, 4]], [[1, 1]]],
[[[0, 1]], [[1, 2]], [[-1, 4], [-1, 4]], [[1, 1]]],
[[[0, 1]], [[1, 2]], [[1, 4], [1, 4]], [[1, 1]]],
[[[1, 2]], [[-1, 4], [-1, 4]], [[0, 1]], [[1, 1]]],
[[[1, 2]], [[1, 4], [1, 4]], [[0, 1]], [[1, 1]]],
[[[1, 4], [1, 4]], [[0, 1]], [[-1, 2]], [[1, 1]]],
[[[1, 4], [1, 4]], [[0, 1]], [[1, 2]], [[1, 1]]]]

The output might be a bit hard to read. Therefore one can pass functions to the result function.

In [4]:
def rational_handler(list):
return list[0]/list[1]

In [5]:
PyQNormaliz_cpp.NmzResult(dodec,"SupportHyperplanes",RationalHandler=rational_handler)

Out[5]:
[[[-0.25, -0.25], [0.0], [-0.5], [1.0]],
[[-0.25, -0.25], [0.0], [0.5], [1.0]],
[[-0.5], [-0.25, -0.25], [0.0], [1.0]],
[[-0.5], [0.25, 0.25], [0.0], [1.0]],
[[0.0], [-0.5], [-0.25, -0.25], [1.0]],
[[0.0], [-0.5], [0.25, 0.25], [1.0]],
[[0.0], [0.5], [-0.25, -0.25], [1.0]],
[[0.0], [0.5], [0.25, 0.25], [1.0]],
[[0.5], [-0.25, -0.25], [0.0], [1.0]],
[[0.5], [0.25, 0.25], [0.0], [1.0]],
[[0.25, 0.25], [0.0], [-0.5], [1.0]],
[[0.25, 0.25], [0.0], [0.5], [1.0]]]

The resulting number field elements are displayed as lists. One might want to display them as polynomial strings

In [6]:
def polynomial_string(list):
string = str(list[0][0]) + "/" + str(list[0][1])
for i in range(1,len(list)):
string += " + " + str(list[i][0]) + "/" + str(list[i][1]) + "*a^" + str(i)
return string

In [7]:
PyQNormaliz_cpp.NmzResult(dodec,"SupportHyperplanes",NumberfieldElementHandler=polynomial_string)

Out[7]:
[['-1/4 + -1/4*a^1', '0/1', '-1/2', '1/1'],
['-1/4 + -1/4*a^1', '0/1', '1/2', '1/1'],
['-1/2', '-1/4 + -1/4*a^1', '0/1', '1/1'],
['-1/2', '1/4 + 1/4*a^1', '0/1', '1/1'],
['0/1', '-1/2', '-1/4 + -1/4*a^1', '1/1'],
['0/1', '-1/2', '1/4 + 1/4*a^1', '1/1'],
['0/1', '1/2', '-1/4 + -1/4*a^1', '1/1'],
['0/1', '1/2', '1/4 + 1/4*a^1', '1/1'],
['1/2', '-1/4 + -1/4*a^1', '0/1', '1/1'],
['1/2', '1/4 + 1/4*a^1', '0/1', '1/1'],
['1/4 + 1/4*a^1', '0/1', '-1/2', '1/1'],
['1/4 + 1/4*a^1', '0/1', '1/2', '1/1']]

Furthermore, RationalHandler and MatrixHandler can also be used.