In[]:=
rationaltet={0,0,0},{0,0,1},0,
2
,0,2
,0,0;ResourceFunction["TetrahedronEdgeAngles"][EuclideanDistance@@#&/@Subsets[rationaltet,{2}]]Out[]=
,,,,,
π
2
π
2
π
2
π
3
π
3
π
4
In[]:=
Graphics3D[{Opacity[.7],Polygon/@Subsets[rationaltet,{3}]}]
Out[]=
In 2020, the complete list was found, so I made a Demonstration. But I did not know they could be generated with short code .
This notebook starts with the 15 unoriented lines through opposite vertices of an icosidodecahedron. Four-line selections give 15 essentially different tetrahedral normal configurations. Regge symmetry and relabeling expand these to 58 tetrahedral similarity classes. Six lie in the two infinite families, leaving 52 sporadic classes.
The selected icosidodecahedron points are face-normal directions, not tetrahedron vertices. They are retained as SourceLines. Actual tetrahedron vertices are reconstructed from every transformed dihedral-angle sextuple and stored as Points.
1. Icosidodecahedral source configurations
1. Icosidodecahedral source configurations
The 30 vertices occur in 15 antipodal pairs. Each pair represents one unoriented line through the origin. The angle order throughout the notebook is {12,34,13,24,14,23}, so opposite edges occupy adjacent positions.
In[]:=
idgenerators={{0,0,4},{1+Sqrt[5],-1+Sqrt[5],2}};icosidodecahedron=Flatten[ResourceFunction["SignedPermutations"][#,"Even"]&/@idgenerators,1];lines=DeleteDuplicatesBy[icosidodecahedron,Sort[{#,-#}]&];pairs={{1,2},{3,4},{1,3},{2,4},{1,4},{2,3}};edgePermutations=Table[First@FirstPosition[pairs,Sort[p[[#]]]]&/@pairs,{p,Permutations[Range[4]]}];canonicalAngles[a_]:=First@Sort[(a[[#]]&)/@edgePermutations];
Four face normals of a bounded tetrahedron have a linear dependence with coefficients of one sign. NullSpace finds that dependence. Multiplying each selected line by the sign of its coefficient chooses outward normal directions. The internal dihedral angle is π minus the angle between the corresponding outward normals.
In[]:=
seed[sourceLines_]:=Module[{relation,normals,angles},relation=First@NullSpace[Transpose[sourceLines]];If[MemberQ[relation,0],Return[Nothing]];normals=MapThread[Times,{Sign[relation],sourceLines}];angles=Rationalize[N[(Pi-(VectorAngle@@normals[[#]]&/@pairs))/Pi,30],10^-12];<|"SourceLines"->sourceLines,"SourceNormals"->normals,"Angles"->angles|>];seeds=DeleteDuplicatesBy[seed/@Select[Subsets[lines,{4}],MatrixRank[#]==3&],canonicalAngles[#["Angles"]]&];
2. Regge symmetry
2. Regge symmetry
Write the six angles as (a,a’,b,b’,c,c’), with each primed pair on opposite edges. A Regge transformation fixes a and a’. If s=(b+b’+c+c’)/2, it replaces the other four angles by s-b, s-b’, s-c and s-c’.
Relabeling the four faces supplies the other choices of fixed opposite-edge pair. reggeOrbit repeatedly applies the one Regge generator and all 24 face relabelings until the finite orbit stops growing.
In[]:=
regge[{a_,ap_,b_,bp_,c_,cp_}]:=With[{s=(b+bp+c+cp)/2},{a,ap,s-b,s-bp,s-c,s-cp}];
In[]:=
reggeOrbit[a_]:=FixedPoint[Union[#,regge/@#,Catenate[Table[x[[p]],{x,#},{p,edgePermutations}]]]&,{a}];
3. Reconstructing actual tetrahedron vertices
3. Reconstructing actual tetrahedron vertices
For outward unit face normals, the Gram matrix has diagonal entries 1 and off-diagonal entries -cos(παij). It is positive semidefinite of rank 3. Its three positive eigendirections produce four normals in ordinary three-dimensional coordinates.
Dihedral angles determine a tetrahedron only up to similarity. The reconstruction uses the four planes ni·x=1, so the resulting tetrahedron has inradius 1.
In[]:=
angleGram[a_]:=ReplacePart[IdentityMatrix[4],Catenate@MapThread[{#1->-Cos[Pi#2],Reverse@#1->-Cos[Pi#2]}&,{pairs,a}]];tetrahedronPoints[a_]:=Module[{v,u,k,n},{v,u}=Eigensystem[N[angleGram[a],40]];k=Ordering[v,-3];n=Transpose@MapThread[Times,{Sqrt[v[[k]]],u[[k]]}];LinearSolve[Delete[n,#],{1,1,1}]&/@Range[4]];
Each vertex is the intersection of the three face planes not containing that vertex. Consequently vertex i is opposite face i.
In[]:=
reggeRecords[source_]:=Map[<|"SourceLines"->source["SourceLines"],"SourceAngles"->source["Angles"],"Angles"->#|>&,reggeOrbit[source["Angles"]]];
In[]:=
reggeClassesBase=DeleteDuplicatesBy[Catenate[reggeRecords/@seeds],canonicalAngles[#["Angles"]]&];
In[]:=
reggeClasses=Map[Append[#,"Points"->tetrahedronPoints[#["Angles"]]]&,reggeClassesBase];
The expected result is 58. Points now contains newly generated tetrahedron vertices for every Regge class. SourceLines still contains the original unscaled icosidodecahedron selection that led to the class.
In[]:=
Length[reggeClasses]
Out[]=
58
4. The non-Sporadics and missing Sporadics
4. The non-Sporadics and missing Sporadics
The 58 classes contain 52 sporadics and six particular parameter choices from the two infinite families. familyQ tests every permitted relabeling against the two family formulas.
In[]:=
familyQ[a_]:=AnyTrue[(a[[#]]&)/@edgePermutations,Function[x,(x[[1]]==x[[2]]==1/2&&x[[4]]==1/3&&x[[5]]==x[[6]]&&x[[3]]==1-2x[[5]]&&1/6<x[[5]]<1/2)||(x[[5]]==x[[6]]&&x[[1]]==5/6-x[[5]]&&x[[2]]==1/6+x[[5]]&&x[[3]]==x[[4]]==2/3-x[[5]]&&1/6<x[[5]]<=1/3)]];sporadic52=Select[reggeClasses,!familyQ[#["Angles"]]&];{Length[reggeClasses],Length[sporadic52]}
Out[]=
{58,52}
The expected result is {58,52}.
The six non-sporadics
The six non-sporadics
In[]:=
Style[Complement[reggeClasses,sporadic52],9]
The seven missing sporadics
The seven missing sporadics
The following cases are not generated by the icosidodecahedron:
missingSporadics=,,,,,,,,,,,,,{0,1,0},{0,0,1},{0,0,0},,,,,,,,,,,{{,,,,,,,,,,,,,0,,,{0,0,1},{0,0,0},,,,,,,,,,,,,,0,,,{0,0,1},{0,0,0},,,,,,,,,,,,,,0,,,{0,0,1},{0,0,0},,,,,,,,,,,,,,0,,,{0,0,1},{0,0,0},,,,,,,,,,,,,,0,,,{0,0,1},{0,0,0}
1
3
1
3
2
3
1
2
1
4
1
4
1
3
1
12
1
12
1
6
1
2
1
2
1
2
1
4
1
3
1
2
1
3
1
2
1
2
1
12
1
12
1
6
1
2
2
,0,0},{0,2
,0},{0,0,1},{0,0,0}},3
7
1
3
2
7
2
7
1
3
5
7
1
21
1
21
1
3
1
3
1
7
4
7
1
3
1
3
4
7
3
7
1
21
1
21
1
3
1
3
4
21
2
7
4
7
4
7
2
7
10
21
1
21
1
21
1
3
1
3
7
24
1
3
11
24
7
24
1
2
13
24
1
12
1
12
1
6
1
2
5
24
1
3
13
24
5
8
1
4
3
8
1
12
1
12
1
3
1
6
7. Viewing
7. Viewing
The blue points are the four generator vertices selected directly from the icosidodecahedron. Section 6 rescales, rotates and translates the generated tetrahedron to its best fit among all 24 vertex correspondences.
CITE THIS NOTEBOOK
CITE THIS NOTEBOOK
Sporadic rational tetrahedra from the icosidodecahedron and Regge symmetry
by Ed Pegg
Wolfram Community, STAFF PICKS, July 29, 2026
https://community.wolfram.com/groups/-/m/t/3769659
by Ed Pegg
Wolfram Community, STAFF PICKS, July 29, 2026
https://community.wolfram.com/groups/-/m/t/3769659