Tetrahedral Symmetry#
A tetrahedron is formed by joining alternating vertices as one traverses the edges of a cube. Taking these four vertices to be
(such that they each lie on the unit sphere) we find that the corresponding spherically-projected coordinates are
(Note that an equivalent tetrahedron could be constructed using the points antipodal to the ones above; this is referred to as the “diametral tetrahedron”.)
The discrete rotational symmetries of the tetrahedron can be constructed by
composing the two-fold rotation about the
respectively.
from sympy import I, Matrix, Rational, conjugate, cos, exp, pi, simplify, sqrt, symbols
# Check of the above:
sp1 = (1 + I) / (sqrt(3) - 1)
sp2 = -(1 + I) / (sqrt(3) - 1)
sp3 = (1 - I) / (sqrt(3) + 1)
sp4 = (-1 + I) / (sqrt(3) + 1)
# fmt: off
((sp1 + I) / (sp1 - I)).equals(sp1) and \
((sp2 + I) / (sp2 - I)).equals(sp3) and \
((sp3 + I) / (sp3 - I)).equals(sp4) and \
((sp4 + I) / (sp4 - I)).equals(sp2)
# fmt: on
True
In terms of the homogeneous coordinates
Polynomial Invariants#
Keeping in mind that all symmetry transformations of the tetrahedron merely exchange a number of vertices with one another, it’s expected that a polynomial with roots at the locations of the vertices in the complex plane will be invariant under such transformations. To see this, consider the product
and apply the transformation
where we define
In the case of both transformations
The above guarantees that the function
# Check of the above
simplify(
(Rational(1, 2) * (1 + I)) ** 4 * (1 - sp1) * (1 - sp2) * (1 - sp3) * (1 - sp4)
)
The above can also be done for the edge midpoints, and face centers, of the tetrahedron.
In the latter case, it’s as simple as trading
(The second-last equality follows since
Therefore, the combinations
orth = Rational(1, 2) * Matrix([[1 + I, -1 + I], [1 + I, 1 - I]])
u, v = symbols("u v")
U, V = symbols("U V")
uv = Matrix([u, v])
uv_prime = orth * uv
print(f"{uv_prime=}")
Phi = (u - sp1 * v) * (u - sp2 * v) * (u - sp3 * v) * (u - sp4 * v)
# print(Phi.subs(u, uv_prime[0]))
Phi_prime = Phi.subs([(u, U), (v, V)]).subs([(U, uv_prime[0]), (V, uv_prime[1])])
(Phi_prime / exp(2 * pi * I / 3)).rewrite(cos).radsimp().expand()
uv_prime=Matrix([
[u*(1/2 + I/2) + v*(-1/2 + I/2)],
[ u*(1/2 + I/2) + v*(1/2 - I/2)]])
In contrast, the six midpoints are at
Under the transformation
where, in the last line, we make use of
Therefore,
By direct computation, one can evaluate the combination
# Check of the above:
Phi = (u - sp1 * v) * (u - sp2 * v) * (u - sp3 * v) * (u - sp4 * v)
Psi = (
(u - conjugate(sp1) * v)
* (u - conjugate(sp2) * v)
* (u - conjugate(sp3) * v)
* (u - conjugate(sp4) * v)
)
simplify(Psi**3 - Phi**3).factor()
# Second check:
t = u * v * (u - v) * (u + v) * (u**2 + v**2)
(Psi**3 - Phi**3).equals(12 * sqrt(3) * I * t**2)
True
e_3, z_1 = symbols("e_3 z_1")
zs = [0, z_1, z_1 * e_3, z_1 * e_3]