Найдите инвариант цикла этой функции

Мне нужно найти инвариант цикла gcd (алгоритм Евклида), но я не знаю, с чего начать и что искать

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

person PHPCore    schedule 30.08.2020    source источник
comment
Разве ваш код уже не является инвариантом цикла? это навсегда true.   -  person Giorgi Tsiklauri    schedule 30.08.2020


Ответы (2)


Наибольший общий делитель x и y остается одним и тем же на протяжении всего цикла. Таким образом, инвариант цикла равен gcd(x,y) = c, где c — константа.

person Joni    schedule 30.08.2020
comment
x › y является инвариантом, только если вы игнорируете первую итерацию цикла, в которой он не обязательно выполняется. - person John Bollinger; 31.08.2020

Инвариант цикла — это условие, которое выполняется на каждой итерации цикла. В вашем случае вы не зацикливаетесь на условии, которое может измениться, поэтому, если инвариант цикла не является условием цикла, всегда верно, единственное, что верно для каждой итерации, - это значение m всегда показывает, показывает ли x можно разделить на у.

person JustAnotherDeveloper    schedule 30.08.2020