public class GCD { /*@ @ requires a >= 0 && b >= 0; @ ensures \result >= 0; @ ensures (\exists int q; \result*q == a) && @ (\exists int q; \result*q == b) && @ (\forall int c; @ (\exists int q; c*q == a) && (\exists int q; c*q == b); @ (\exists int q; c*q == \result)); @*/ public static int gcd(int a, int b) { int olda = a; int oldb = b; /*@ loop_invariant a >= 0 && b >= 0 && @ (\forall int c; true; @ (\exists int q; c*q == olda) && (\exists int q; c*q == oldb) @ <==>(\exists int q; c*q == a) && (\exists int q; c*q == b) @ ); @ assignable a, b; @ decreases a+b; @*/ while (a != 0 && b != 0) { if (a > b) a = a - b; else b = b - a; } return (a > b) ? a : b; } }