= Solution
Divide numerator and denominator by their positive <greatest common divisor>, then fix the sign:
``
PROCEDURE reduce(x: rational);
VAR g: INTEGER;
BEGIN
ASSERT(x.den # 0);
g := gcd(ABS(x.num),ABS(x.den));
x.num := x.num DIV g; x.den := x.den DIV g;
IF x.den < 0 THEN
x.num := -x.num; x.den := -x.den
END
END reduce;
``
The denominator condition ensures $g>0$, including when the numerator is zero. Dividing both components by the same nonzero integer preserves the fraction, and the final simultaneous sign change preserves it again. The resulting numerator and denominator are <coprime>; for zero the denominator becomes one.
Back to article page