Я считаю, что это используется в криптографии (так называемая необратимая функция ).
Если нам нужно вычислить (2**n) mod m
рекурсивно, это будет наиболее очевидный способ сделать это.Поскольку глубина рекурсии равна n
, сложность O(n)
очевидна.
Однако, если мы хотим поддерживать произвольный размер m
(в криптографии возможны 512-битные ключи, и онибольше, чем любой арифметический регистр), мы также должны учитывать, что (в большинстве случаев нам не нужно использовать арифметику произвольной точности, поэтому этот термин обычно равен 1).
EDIT @Mysticial: Функция явно не вызывает аппаратную mod
операцию, все, что она делает - это сдвиг и вычитание.сдвиг всегда O(1)
, а сложение / вычитание O(ceil(m/sizeof_ALU_precision))