void abort() { }; extern int __VERIFIER_nondet_int(); void assume_abort_if_not(int cond) { if(!cond) {abort();} } /*@ requires ((1 <= cond)) && (cond != 0); ensures ((1 <= cond)) && (1); @*/ void __VERIFIER_assert(int cond) { if (!(cond)) { ERROR: {/*@ assert(0); */;} } return; } int main() { int X, Y; long long x, y, v, xy, yx; X = __VERIFIER_nondet_int(); Y = __VERIFIER_nondet_int(); v = ((long long) 2 * Y) - X; // cast required to avoid int overflow y = 0; x = 0; /*@ loop invariant ((((Y <= 2147483647) && (0 <= (Y + 2147483648))) && ((((long long) Y * 2) + (2 * ((__int128) Y * x))) == (((((__int128) X * y) * 2) + X) + v)))); @*/ while (1) { yx = (long long) Y*x; xy = (long long) X*y; __VERIFIER_assert( 2*yx - 2*xy - X + (long long) 2*Y - v == 0); if (!(x <= X)) break; // out[x] = y if (v < 0) { v = v + (long long) 2 * Y; } else { v = v + 2 * ((long long) Y - X); y++; } x++; } xy = (long long) x*y; yx = (long long) Y*x; __VERIFIER_assert(2*yx - 2*xy - X + (long long) 2*Y - v + 2*y == 0); return 0; }