(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 z axis (which maps V1↔V2, V3↔V4) with the
three-fold rotation about the V1 axis (which maps V2→V3, V3→V4, V4→V2). On the complex plane, these correspond to
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
In the case of both transformations I and II, the product ∏i=14(u−ki′v) is clearly invariant, because the vertices all transform into one another under any of the transformations. For transformation I, the product ∏i=14(A−kiC)=1 because A=i and C=0. For transformation II, this product instead gives
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 ki→−1/kˉi in the above expression for Φ (since the face centers are in line with the antipodes of the vertices). This yields
# 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()
Loading...
# 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
from functools import reduce
from sympy import Poly
e_3, z_1 = symbols("e_3 z_1")
def e3_simp(expr, e, full=True, cleanup=True):
result = Poly(expr, e)
e_coeffs = reversed(result.all_coeffs())
simp_coeffs = [0] * 5
# enforce e**3 = 1
for i, coeff in enumerate(e_coeffs):
simp_coeffs[i % 3] += coeff
# enforce e**2 = - e - 1
if full:
simp_coeffs = [simp_coeffs[i] - simp_coeffs[2] for i in range(2)]
if cleanup:
return simplify(Poly.from_list(reversed(simp_coeffs), e).as_expr())
return Poly.from_list(reversed(simp_coeffs), e).as_expr()
zs = [0, z_1, z_1 * e_3, z_1 * e_3**2]
e3_simp(reduce(lambda x, y: x * y, [u - x * v for x in zs]), e_3)