Book I · Proposition 44

I.44

To a given straight line to apply, in a given rectilineal angle, a parallelogram equal to a given triangle.Heath, 1908

The application of areas -- the engine of Book II and, later, of the Greek solution of quadratic problems.

ABCDELM
148 lines and circles drawn, of which 61 helper constructions drew the fainter ones

Every step, checked

What it needs, and what needs it

Needs: I.3 I.15 I.23 I.31 I.42 I.43

Used by: I.45

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

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

What it takes on trust

The proposition as code

@proposition(
    "I.44",
    CONSTRUCTION,
    sample=_line_triangle_angle,
    note="The application of areas -- the engine of Book II and, later, of the "
    "Greek solution of quadratic problems.",
)
def prop_I_44(
    a: Point,
    b: Point,
    c: Point,
    d: Point,
    e: Point,
    p: Point,
    q: Point,
    r: Point,
    away_from: "Point | None" = None,
) -> Out:
    hypothesis("A and B are distinct", a != b)
    hypothesis("CDE is a genuine triangle", not collinear(c, d, e), guard=True)
    hypothesis("PQR is a genuine angle", not collinear(p, q, r), guard=True)
    outline(p, q, r, close=False)  # the arms of the given angle

    # Carry a parallelogram equal to the triangle, in the given angle, over to B,
    # with its base along AB produced (I.3 for the lengths, I.23 for the angle).
    model = prop_I_42(c, d, e, p, q, r)
    corner_f, corner_e, corner_c, corner_g = model.parallelogram
    base_length = length(corner_e, corner_c)
    side_length = length(corner_e, corner_f)

    # AB is produced far enough past B for I.3 to cut the base off it: I.3 asks
    # for the greater line, and the base carried over may exceed AB itself.
    span = 2 * base_length / length(a, b) + 1
    beyond = posit(Point(b.x + span * (b.x - a.x), b.y + span * (b.y - a.y)), "B'")
    placed_e = posit(prop_I_3(b, beyond, corner_e, corner_c).cut, "E")
    turned = prop_I_23(corner_f, corner_e, corner_c, b, placed_e, apart_from=away_from)
    placed_g = posit(_along(b, turned.ray_through, side_length), "G")
    placed_f = posit(_fourth_vertex(b, placed_e, placed_g), "F")

    claim("BEFG equals the given triangle and has the given angle", ["I.3", "I.23", "I.42"],
          _area(b, placed_e, placed_f, placed_g) == _area(c, d, e)
          and eq_angle(placed_e, b, placed_g, p, q, r))

    # the gnomon: complete the figure about the diameter HB produced
    top = line(placed_f, placed_g, "FG produced")
    h = posit(meet_one(top, _parallel_through(a, b, placed_g)), "H")
    diameter = line(h, b, "the diameter HB")
    side = line(placed_f, placed_e, "FE produced")
    if parallel(diameter, side):
        raise GeometryError("HB and FE do not meet in this configuration")
    k = posit(meet_one(diameter, side), "K")
    through_k = _parallel_through(k, placed_e, a)
    l = posit(meet_one(through_k, Line.through(h, a)), "L")
    m = posit(meet_one(through_k, Line.through(placed_g, b)), "M")

    claim("HLKF is a parallelogram and HK its diameter", "I.31",
          parallel(Line.through(h, l), Line.through(placed_f, k))
          and parallel(Line.through(h, placed_f), Line.through(l, k)))
    # HLKF is the parallelogram, HK its diameter, and B the point on it: I.43's
    # own configuration. The angles at B are vertical, which is I.15's.
    because(prop_I_43, h, l, k, placed_f, b)
    because(prop_I_15, placed_g, m, placed_e, a)

    claim("the complements about the diameter are equal, so LABM equals BEFG", "I.43",
          _area(l, a, b, m) == _area(b, placed_e, placed_f, placed_g))
    claim("therefore the applied parallelogram equals the given triangle", "C.N.1",
          _area(l, a, b, m) == _area(c, d, e))
    claim("and the angle ABM equals the given angle, being vertical to GBE", "I.15",
          eq_angle(a, b, m, p, q, r))

    # What the enunciation is about: the parallelogram applied to AB, and the
    # triangle it is equal to. Three levels of helper construction stand behind
    # them, and stay in the figure, drawn back.
    outline_result(l, a, b, m)
    outline_result(c, d, e)
    return Out(parallelogram=(l, a, b, m))