Эффективно вычислить модуль нотации Кнута со стрелкой вверх

Я уже использую памятку в качестве словаря. Есть ли что-нибудь еще, что я могу сделать? Я подозреваю, что цикл for может быть оптимизирован. Для справки я вычисляю knuth_arrow(2, 3, 9, 14**8)

memo = {}

def knuth_arrow(a, n, b, m):
    if (a, n, b) in memo:
        return memo[(a, n, b)]

    if n == 0:
        return (a*b) % m

    if n == 1:
        s = pow(a, b, m)
        memo[(a, n, b)] = s
        return s

    if n > 1:
        s = a
        for i in range(b-1):
            s = knuth_arrow(a, n-1, s, m)

        memo[(a, n, b)] = s
        return s

0 ответов

Другие вопросы по тегам