E1 [Find remained] Divide m by n and r be the remainder. (We will know that 0 <= r < n)
E2 [Is it zero?] If r = 0, the algorithm terminates, n is the answer
E3 [Reduce] Set m = n, then n = r, then go back to step E1 -----------------------------------------------------------------------
[3] Change Algorithm E so that all trivial replacement operations such as m = n are avoided. Write this new algorithm in the style of Algorithm E and call it Algorithm F.
======================================================================== Claude Sonnet 4.6 ========================================================================
Algorithm F
Given two positive integers m and n, find their greatest common divisor.
F1 [Find remainder] Divide m by n and let r be the remainder. (We will know that 0 ≤ r < n.)
F2 [Is it zero?] If r = 0, the algorithm terminates and n is the answer.
F3 [Find remainder] Divide n by r and let m be the remainder. (We will know that 0 ≤ m < r.)
F4 [Is it zero?] If m = 0, the algorithm terminates and r is the answer.
F5 [Find remainder] Divide r by m and let n be the remainder. (We will know that 0 ≤ n < m.) Go back to F2.
Explanation
The key insight is that instead of shuffling values with temporary replacements like:
m = n, n = r
we reuse the existing variables (m, n, r) in rotation, dividing and storing each new remainder directly into the variable that is no longer needed:
Step Divides Remainder stored in F1...m by n...r F3...n by r...m F5...r by m...n
Each variable naturally becomes the "oldest" value at each stage and is safely overwritten. This eliminates all trivial assignments while preserving the logic of Euclid's algorithm. □