public class GCD2 { public static int gcd(int olda, int oldb) /*: requires "0 <= olda & 0 <= oldb" ensures "0 <= result & (EX q. result*q = olda) & (EX q. result * q = oldb) & (ALL c. (EX q. c*q = olda) & (EX q. c*q = oldb) --> (EX q. c*q = result))" */ { int a = olda; int b = oldb; while /*: inv "0 <= a & 0 <= b & (ALL c. (EX q. c*q = olda) & (EX q. c*q = oldb) <-> (EX q. c*q = a) & (EX q. c*q = b))" */ (a != 0 && b != 0) { if (a > b) a = a - b; else b = b - a; } return a > b ? a : b; } }