Book XII · Proposition 9

XII.9

In equal pyramids which have triangular bases the bases are reciprocally proportional to the heights; and those pyramids in which the bases are reciprocally proportional to the heights are equal.Heath, 1908

Every step, checked

What it needs, and what needs it

Needs: XI.34 XII.5

Rests on: C.N.1, C.N.2, C.N.3, C.N.4, C.N.5, Def.10, Def.15, Def.4, Post.5, XI.Def.10, XI.Def.13, XI.Def.3, XI.Def.8, XI.Def.9

Depth: 18 steps of argument above the first principles. Parallel postulate: needed.

What it takes on trust

The proposition as code

@proposition("XII.9", THEOREM, sample=samples3.polygon_base)
def prop_XII_9(a: Point3, b: Point3, c: Point3, d: Point3) -> Out:
    """In equal pyramids on triangular bases the bases are reciprocally
    proportional to the heights, and conversely."""
    hypothesis("the four points are not in one plane", not coplanar(a, b, c, d))
    first = _drawn(pyramid((a, b, c), d, "the first pyramid"))
    # A second pyramid equal to the first, its base doubled and its height
    # halved: the reciprocation the proposition is about, made rather than found.
    wider = posit3(Point3(a.x + 2 * (b.x - a.x), a.y + 2 * (b.y - a.y),
                          a.z + 2 * (b.z - a.z)), "P")
    ground = plane_through(a, b, c, "the plane of the bases")
    lower = posit3(midpoint_of(_foot(d, ground), d), "R")
    second = _drawn(pyramid((a, wider, c), lower, "the second pyramid"))

    because(prop_XI_34, a, b, c, d)

    bases = (parallelogram_area(vector_between(a, b), vector_between(a, c)) / 2,
             parallelogram_area(vector_between(a, wider), vector_between(a, c)) / 2)
    heights = (height_over(d, ground), height_over(lower, ground))
    claim("the two pyramids are equal", "XII.5",
          content(first) == content(second))
    claim("so as the base is to the base, so is the height to the height "
          "reciprocally", "XII.9", bases[0] * heights[0] == bases[1] * heights[1])
    claim("and pyramids whose bases are reciprocally proportional to their "
          "heights are equal", "XII.9",
          3 * content(first) == bases[0] * heights[0]
          and 3 * content(second) == bases[1] * heights[1])
    return Out(pyramids=(first, second), bases=bases, heights=heights)