n) { assert(n > 0 || (a != 0 || n != 0)); int r = 1, a0 = a, n0 = n; /* r == 1 and a0 == a and n0 == n and n >= 0 инвариант_цикла: a0**n0 == r*a**n ограничивающая_функция(n): n */
/* n > 0 and ограничивающая_функция(n) > 0 and инвариант_цикла */ if (n & 1) r *= a; /* (n - нечетно and a0**n0*a == r*a**n) or инвариант_цикла */ n >>= 1;
не должны зависеть от низкоуровневых компонент. И те, и те должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
тестирование сложности алгоритмов с помощью Mock-объектов. Математические структуры и моделирование. - Омск : Ом. гос. ун-т, 2013. Том. 27, № 1. 122 с.