Я вижу, что вы реализуете двоичное возведение в степень с дополнительной функцией, которая сокращена в моде.
То, что вы можете сделать, это взять нормальный (хвостовой рекурсивный) алгоритм двоичного возведения в степень и просто изменить2-арные функции + и * для ваших собственных определяемых пользователем 3-арных функций + / mod и * / mode, которые также принимают r и уменьшают результат mod r перед его возвратом.
Теперь, как вы выполняете двоичное возведение в степеньв хвосте рекурсивно?Вам нужна основная функция для вызова вспомогательной функции, которая принимает дополнительный параметр аккумулятора - начальное значение 1. Это похоже на хвостовую рекурсивную функцию REVERSE с использованием вспомогательной функции REVAPPEND - если вы знакомы с этим.
Надеюсь, что это поможет, и не стесняйтесь спрашивать, если вам нужна дополнительная информация.