Polynomial Invariants#
The goal of these notes is to work through several examples of polynomial invariants, constructed from the symmetries of platonic solids.
After building up some preliminary results for the tetrahedron and octahedron, corresponding expressions for the icosahedron and dodecahedron are constructed using the former results as building blocks.
Preliminaries#
Rotation (in three dimensions) of the vector
or, in components,
Introducing the variables
we see the rotation matrix
(Recall that
The orthogonality of
where the second equality follows from the definition of
# Imports
from functools import reduce
from sympy import I, Matrix, conjugate, expand, simplify, sqrt, symbols
# Check of the above:
a1, b1, c1, d1 = symbols("a1 b1 c1 d1")
def o_mat(a, b, c, d):
return Matrix(
[
[2 * d**2 - 1 + 2 * a**2, 2 * (a * b - c * d), 2 * (a * c + b * d)],
[2 * (a * b + c * d), 2 * d**2 - 1 + 2 * b**2, 2 * (b * c - a * d)],
[2 * (a * c - b * d), 2 * (b * c + a * d), 2 * d**2 - 1 + 2 * c**2],
]
)
O1 = o_mat(a1, b1, c1, d1)
expand((O1 * O1.transpose()).subs(d1, sqrt(1 - a1**2 - b1**2 - c1**2)))
Two such rotations can be composed as follows:
where, if
# Check of the above:
a2, b2, c2, d2 = symbols("a2 b2 c2 d2")
O2 = o_mat(a2, b2, c2, d2)
expand(
(
O2 * O1
- o_mat(
a1 * d2 + a2 * d1 - b1 * c2 + b2 * c1,
b1 * d2 + b2 * d1 - c1 * a2 + c2 * a1,
c1 * d2 + c2 * d1 - a1 * b2 + a2 * b1,
-a1 * a2 - b1 * b2 - c1 * c2 + d1 * d2,
)
)
.subs(d1, sqrt(1 - a1**2 - b1**2 - c1**2))
.subs(d2, sqrt(1 - a2**2 - b2**2 - c2**2))
)
Stereographic Projection#
In what follows, it’s helpful to map the rotations on the sphere to the complex
plane, by performing an equatorial spherical projection from the point where
Inverting, we find
where we define
Rotations about the
If we wish to write an arbitrary rotation of a point on the sphere about some
direction specified by
which satisfy the antipodal relation
# Check of the above
n1, n2, n3 = symbols("n1 n2 n3", real=True)
z1 = (n1 + I * n2) / (1 - n3)
z1A = (-n1 - I * n2) / (1 + n3)
simplify((z1 * conjugate(z1A)).subs(n3, sqrt(1 - n1**2 - n2**2)))
simplify((z1 + z1A) / (z1 - z1A))
simplify((2 * z1 * z1A) / (z1A - z1))
simplify((2 / (z1 - z1A)).subs(n3, sqrt(1 - n1**2 - n2**2)))
As such, the rotation leaving such points fixed is
Solving for
where we make use of the notation introduced above which interrelates
Fractionalized Coordinates#
Lastly, to re-interpret the above transformation in the complex plane as a
homogeneous one, it is conventional to write
In terms of
In this space, the rotations described above are a subgroup of
satisfies