void abort() { }; extern unsigned __VERIFIER_nondet_uint(); /*@ requires (1); ensures ((0 != cond)); @*/ void assume_abort_if_not(int cond) { if(!cond) {abort();} } /*@ requires (0) && (cond != 0); ensures (0) && (1); @*/ void __VERIFIER_assert(int cond) { if (!(cond)) { ERROR: {/*@ assert(0); */;} } return; } int main() { unsigned n, a; unsigned r, k, q, d, s, t; n = __VERIFIER_nondet_uint(); assume_abort_if_not(n>=0 && n<=1); a = __VERIFIER_nondet_uint(); assume_abort_if_not(a>=0 && a<=1); assume_abort_if_not(n < (0x7fffffff * 2U + 1U)/8); assume_abort_if_not(a > 2); d = a; r = n % d; t = 0; k = n % (d - 2); q = 4 * (n / (d - 2) - n / d); s = sqrt(n); /*@ loop invariant (0); @*/ while (1) { __VERIFIER_assert(d * d * q - 2 * q * d - 4 * r * d + 4 * k * d + 8 * r == 8 * n); __VERIFIER_assert(k * t == t * t); __VERIFIER_assert(d * d * q - 2 * d * q - 4 * d * r + 4 * d * t + 4 * a * k - 4 * a * t - 8 * n + 8 * r == 0); __VERIFIER_assert(d * k - d * t - a * k + a * t == 0); if (!((s >= d) && (r != 0))) break; if (2 * r + q < k) { t = r; r = 2 * r - k + q + d + 2; k = t; q = q + 4; d = d + 2; } else if ((2 * r + q >= k) && (2 * r + q < d + k + 2)) { t = r; r = 2 * r - k + q; k = t; d = d + 2; } else if ((2 * r + q >= k) && (2 * r + q >= d + k + 2) && (2 * r + q < 2 * d + k + 4)) { t = r; r = 2 * r - k + q - d - 2; k = t; q = q - 4; d = d + 2; } else { t = r; r = 2 * r - k + q - 2 * d - 4; k = t; q = q - 8; d = d + 2; } } return 0; }