(* Compute the greatest common divisor (gcd) and the lowest common multiple (lcm) of two natural numbers by using addition and subtraction only. Note that gcd(m,n) * lcm(m,n) = m*n. Repeat reading pairs of integers until you encounter a 0. For each pair, print the arguments, the gcd and the lcm. Indicate the loop invariant.*) MODULE gcdlcm; FROM InOut IMPORT ReadCard, WriteLn, WriteString, WriteCard; VAR x,y,u,v: CARDINAL; BEGIN WriteString('x = '); ReadCard(x); WriteLn; WHILE x # 0 DO WriteString('y = '); ReadCard(y); u := x; v := y; WHILE x # y DO (*gcd(x,y) = gcd(x0,y0), x*v + y*u = 2*x0*y0*) IF x > y THEN x := x-y; u := u+v; ELSE y := y-x; v := v+u; END END; WriteCard(x,6); WriteCard((u+v) DIV 2,6); WriteLn; WriteString('x = '); ReadCard(x); WriteLn; END; END gcdlcm.