Book XIII · Proposition 16
To construct an icosahedron and comprehend it in a sphere, like the aforesaid figures; and to prove that the side of the icosahedron is the irrational straight line called minor.Heath, 1908
Rests on: X.85-90, XI.Def.14, XI.Def.25, XI.Def.26, XI.Def.27
Depth: 3 steps of argument above the first principles. Parallel postulate: not needed.
@proposition("XIII.16", CONSTRUCTION, sample=samples3.sphere_about)
def prop_XIII_16(o: Point3, a: Point3) -> Out:
"""Construct an icosahedron in a sphere, and prove its side is the
irrational straight line called minor."""
hypothesis("the sphere has a positive radius", o != a)
hypothesis("the diameter of the sphere is rational, being the line every "
"other is named against",
is_rational_line(sqrt(4 * space_len2(o, a))))
globe = sphere_through(o, a, "the given sphere")
line3(o, a, "the radius")
corners, edges = _figure(o, a, _icosahedron(), "an edge of the icosahedron")
because(prop_XIII_15, o, a)
side2, across = _edge2(corners, edges), 4 * space_len2(o, a)
side = sqrt(side2 / across)
named = classify(side)
# X.76 makes the minor out of two lines incommensurable in square whose
# squares add to a rational area and whose rectangle is medial. The two are
# the terms the side itself divides into, so the appeal is carried out on
# the figure's own magnitudes and not on a pair chosen to suit it.
because(get("X.76").wrapped, named.terms[0], -named.terms[1])
claim("every vertex of the icosahedron is on the sphere", "XI.Def.14",
all(on_sphere(corner, globe) for corner in corners))
claim("it is contained by twenty equal and equilateral triangles, five "
"edges meeting at each corner", "XI.Def.27",
len(corners) == 12 and len(edges) == 30
and _at_each_corner(corners, edges) == {5}
and all(space_len2(corners[i], corners[j]) == side2 for i, j in edges))
claim("and the side of the icosahedron is the irrational straight line "
"called minor", "X.76", named.name == "minor")
claim("it is of the fourth degree over the rationals, so neither a rational "
"line nor a medial one", "X.73", named.algebraic_degree == 4)
return Out(icosahedron=corners, side2=side2, side=side, name=named.name)