Octahedral Symmetry#
The six vertices of the octahedron can be taken as identical to the six edge
midpoints of the tetrahedron. As such they have
The octahedral symmetry group is generated by transformations
Under transformation
Therefore, only
The 8 face centers of the octahedron are formed by combining the 8 tetrahedral
roots
# Check of the above:
from sympy import I, diff, simplify, sqrt, symbols
from tetra import Phi, Psi, t
from functools import reduce
u, v = symbols("u v")
W = simplify(Phi * Psi)
W
In order to work out the transformation properties of
In other words,
# Check of the above:
def hessian(f, u, v):
du2 = diff(diff(f, u), u)
dudv = diff(diff(f, u), v)
dv2 = diff(diff(f, v), v)
return du2 * dv2 - dudv**2
hessian(t, u, v).equals(-25 * Phi * Psi)
True
The edge midpoints of the octahedron form a polynomial invariant,
The edge midpoints can be labeled as follows:
The corresponding stereographically-projected points in the complex plane are given by
One way to compute
# Check of the above:
def stereo(v1, v2, v3):
return (v1 + I * v2) / (1 - v3)
ls = []
ls.append(stereo(1 / sqrt(2), 1 / sqrt(2), 0))
ls.append(stereo(1 / sqrt(2), -1 / sqrt(2), 0))
ls.append(stereo(-1 / sqrt(2), 1 / sqrt(2), 0))
ls.append(stereo(-1 / sqrt(2), -1 / sqrt(2), 0))
ls.append(stereo(0, 1 / sqrt(2), 1 / sqrt(2)))
ls.append(stereo(0, 1 / sqrt(2), -1 / sqrt(2)))
ls.append(stereo(0, -1 / sqrt(2), 1 / sqrt(2)))
ls.append(stereo(0, -1 / sqrt(2), -1 / sqrt(2)))
ls.append(stereo(1 / sqrt(2), 0, 1 / sqrt(2)))
ls.append(stereo(1 / sqrt(2), 0, -1 / sqrt(2)))
ls.append(stereo(-1 / sqrt(2), 0, 1 / sqrt(2)))
ls.append(stereo(-1 / sqrt(2), 0, -1 / sqrt(2)))
chi = reduce(lambda x, y: x * y, [u - x * v for x in ls])
simplify(chi)
Alternatively, we can make use of the four-fold symmetry relating the midpoints
and similarly for
where each
# Check of the above
x = symbols("x")
def reduce_multiply(any_list):
return reduce(lambda x, y: x * y, any_list)
expr = reduce_multiply([u - x * I**k * v for k in range(4)])
simplify(expr)
chi_part1 = expr.subs(x, 1 / sqrt(2) * (1 + I)).expand()
chi_part1
chi_part5 = expr.subs(x, 1 + sqrt(2)).expand()
chi_part5
chi_part9 = expr.subs(x, -1 + sqrt(2)).expand()
chi_part9
chi = (chi_part1 * chi_part5 * chi_part9).expand()
chi
As it turns out,
# Check of the above:
def jacobian(f, g, u, v):
return diff(f, u) * diff(g, v) - diff(f, v) * diff(g, u)
jacobian(t, W, u, v).equals(-8 * chi)
True
Since
Lastly,
by direct computation we can verify that the absolute invariants
# Check of the above:
simplify(chi**2 - W**3).factor()
# Second check:
(chi**2 - W**3).equals(-108 * t**4)
True