找到这个函数的循环不变量

Find loop invariant of this function

我需要找到 gcd 的循环不变量(euclid 算法),但我不知道从哪里开始或要看什么

    int f(int x, int y) {
       while (true) {
           int m = x % y;
           if(m == 0) return y;
           x = y;
           y = m;
       }
    }

循环不变量是在循环的每次迭代中都满足的条件。在您的情况下,您不是在可以更改的条件下循环,因此如果循环不变量不是“循环条件始终为真”,则每次迭代唯一适用的另一件事是“m 的值始终显示 x 是否可以被 y 整除。

x 和 y 的最大公约数在整个循环中保持不变。因此,循环不变量是 gcd(x,y) = c 其中 c 是常数。