Skip to main content

Command Palette

Search for a command to run...

Writing tests for fast exponentiation

Updated
•2 min read•View as Markdown

Решение без тестов быстро ломается, поэтому добавим к задаче простые проверки.

Задача

Вычислить base ** exp двумя способами: простым умножением и алгоритмом быстрого возведения в степень.

Решение

def power(base: int, exp: int) -> int:
    result = 1
    for _ in range(exp):
        result *= base
    return result


def fast_power(base: int, exp: int) -> int:
    result = 1
    while exp > 0:
        if exp % 2 == 1:
            result *= base
        base *= base
        exp //= 2
    return result


print(power(2, 10), fast_power(2, 10))

Как это работает

Быстрый метод использует двоичное представление показателя: показатель делится на два, а основание возводится в квадрат. Число умножений падает с exp до log2(exp).

Пример работы

1024 1024

Сложность

O(exp) против O(log exp).

Проверка тестами

Хорошая привычка — проверять решение сразу на нескольких примерах, включая крайние случаи.

assert is_valid(True) is not None  # базовая проверка вызова
assert is_valid(False) is not None  # и второй случай

Такой минимум уже защищает от случайной ошибки при правках кода.

Тесты вида assert удобны для учебных задач: они короткие, наглядные и не требуют фреймворков.

Читайте также:

степень · проверять · O(exp · задач · Вычислить · случайной · задаче · range(exp · квадрат · print(power(2 · быстро · умножением · падает · привычка · assert · представление · простым · while · двоичное · добавим · правках · наглядные · работы · Быстрый · возводится · O(log

More from this blog

N

News

4017 posts