Build the idea in three steps
- Signed numbers need a size: Int.natAbs reads |c|, the distance from zero — −11 and 11 both measure 11, and the sign is forgotten on purpose.
- The record natAbsHom stores the machine and its promises side by side: map_mul' fixes |a × b| = |a| × |b|, map_one' fixes |1| = 1, and map_zero' fixes |0| = 0.
- Sizes multiply — that is the field map_mul' — and it is the reason a descent can rank suspects by size: replace each solution's c by |c|, a natural number, and "smaller suspect" becomes a smallest number that you can always find.
A small example
Measure, then multiply: |−7| = 7 and |3| = 3, and indeed |−7 × 3| = |−21| = 21 = 7 × 3. Sizes never care about the sign, only how far from zero.