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

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

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

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

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

In[]:=
Style[Complement[reggeClasses,sporadic52],9]

The seven missing sporadics

The following cases are not generated by the icosidodecahedron:
missingSporadics=​​
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
,{0,1,0},{0,0,1},{0,0,0},
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
,
6
1.11
…
,
6
-0.886
…
,
3
0.263
…
,0,
6
1.42
…
,
3
0.737
…
,{0,0,1},{0,0,0},
1
7
,
4
7
,
1
3
,
1
3
,
4
7
,
3
7
,
1
21
,
1
21
,
1
3
,
1
3
,
6
2.41
…
,
6
0.549
…
,
3
-0.328
…
,0,
6
2.47
…
,
3
1.33
…
,{0,0,1},{0,0,0},
4
21
,
2
7
,
4
7
,
4
7
,
2
7
,
10
21
,
1
21
,
1
21
,
1
3
,
1
3
,
12
1.76
…
,
12
0.132
…
,
6
1.41
…
,0,
12
1.76
…
,
6
-0.408
…
,{0,0,1},{0,0,0},
7
24
,
1
3
,
11
24
,
7
24
,
1
2
,
13
24
,
1
12
,
1
12
,
1
6
,
1
2
,
8
1.24
…
,
8
-0.163
…
,
4
-0.0217
…
,0,
8
1.31
…
,
4
0.173
…
,{0,0,1},{0,0,0},
5
24
,
1
3
,
13
24
,
5
8
,
1
4
,
3
8
,
1
12
,
1
12
,
1
3
,
1
6
,
8
1.18
…
,
8
0.488
…
,
4
1.31
…
,0,
8
1.48
…
,
4
0.325
…
,{0,0,1},{0,0,0}

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

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