Book XI · Proposition 37

XI.37

If four straight lines be proportional, the parallelepipedal solids on them which are similar and similarly described will also be proportional; and, if the parallelepipedal solids on them which are similar and similarly described be proportional, the straight lines will themselves also be proportional.Heath, 1908

Every step, checked

What it needs, and what needs it

Needs: XI.33

Rests on: VI.Def.1, XI.Def.11, XI.Def.9

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

What it takes on trust

Nothing. It draws no intersections and reads nothing off the picture.

The proposition as code

@proposition("XI.37", THEOREM, sample=samples3.corner_and_arms)
def prop_XI_37(o: Point3, a: Point3, b: Point3, c: Point3) -> Out:
    """Four proportional straight lines carry similar parallelepipeds that are
    proportional, and conversely."""
    hypothesis("the three arms are not in one plane", not coplanar(o, a, b, c))
    ratio, apart = Fraction(3, 2), Fraction(5, 4)
    lines = (Fraction(1), ratio, apart, apart * ratio)
    hypothesis("the four straight lines are proportional",
               lines[0] * lines[3] == lines[1] * lines[2])

    directions = tuple(unit(vector_between(o, point)) for point in (a, b, c))

    def described(reach):
        return parallelepiped(o, *[_arm_at(o, step, reach) for step in directions])

    solids = [described(reach) for reach in lines]
    _built(solids[0])
    _built(solids[3])
    contents = [content(solid) for solid in solids]

    because(prop_XI_33, o, a, b, c)

    claim("the four solids are similar and similarly described", "XI.Def.9",
          all(_solid_angle_of(o, tuple(solid.vertices[i] for i in (1, 3, 4)))
              == _solid_angle_of(o, tuple(solids[0].vertices[i] for i in (1, 3, 4)))
              for solid in solids[1:]))
    claim("as the first solid is to the second, so is the third to the fourth",
          "XI.37", contents[0] * contents[3] == contents[1] * contents[2])
    # The converse is checked where it can fail: a fourth line that is not the
    # fourth proportional, and the solid on it, which the proportion must then
    # refuse. Each content is the cube on its line times one and the same
    # figure, so a proportion between the solids is one between the cubes.
    astray = lines[3] * Fraction(6, 5)
    claim("and a solid on any other line breaks the proportion, so solids "
          "proportional give lines proportional", "XI.37",
          lines[0] * astray != lines[1] * lines[2]
          and contents[0] * content(described(astray)) != contents[1] * contents[2])
    return Out(solids=tuple(solids), lines=lines)