: GCD   ( a b -- gcd)
    ?DUP                    ( -- a b b | a 0 )
    IF  SWAP OVER           ( a b -- b a b)
        MOD                 ( -- b [a mod b] )
        RECURSE             \ call itself
    THEN  ;

: GCD  ( a b -- gcd)
    BEGIN   ?DUP            ( -- a b b | a 0 )
    WHILE   SWAP OVER       ( -- b a b)
            MOD             ( -- a [a mod b] )
    REPEAT  ;