Логарифмы: описание, свойства и график функции

Логарифмы: описание, свойства и график функции Полезное

Логарифм числа b по основанию a — это показатель степени c, в которую нужно возвести a, чтобы получить b: если a^c = b, то log_a(b) = c. Проще говоря, логарифм отвечает на вопрос «в какую степень возвести основание, чтобы получить аргумент». Ниже разберем определение с условиями, свойства и формулы, три ходовых основания (2, e, 10), график логарифмической функции и то, откуда в IT берется сложность O(log n).

Сразу разведем три близких понятия, которые легко спутать: логарифм — это число (результат); логарифмирование — операция нахождения этого числа; логарифмическая функция y = log_a(x) — это правило, которое каждому x ставит в соответствие его логарифм. Дальше по тексту держим это различие.

Определение и обозначение

Запись log_a(b) читается как «логарифм числа b по основанию a». Здесь b — аргумент, a — основание. Логарифмирование — это одна из двух обратных операций к возведению в степень: если по a^c = b искать основание a, получаем корень; если искать показатель c — получаем логарифм.

Ограничения (без них выражение не определено): аргумент b > 0, основание a > 0 и a ≠ 1. Причина проста: степень положительного основания всегда положительна, поэтому отрицательные числа и ноль логарифмировать нельзя, а единица в любой степени дает единицу, и однозначно «подобрать показатель» для другого аргумента не выйдет.

Быстрая проверка понимания: log_2(8) = 3, потому что 2^3 = 8; log_10(1000) = 3, потому что 10^3 = 1000.

Три основания: 2, e и 10

Основание может быть любым допустимым числом, но на практике встречаются три. У каждого — своя короткая запись, их важно не путать.

Основание Название Запись Где применяется
2 двоичный log_2(x), lb(x), в CS часто просто log(x) алгоритмы, структуры данных, оценка сложности
e ≈ 2,71828 натуральный ln(x) непрерывный рост, матанализ, производные
10 десятичный lg(x), log_10(x) инженерные шкалы (дБ, pH), «порядки величин»

Число e — это иррациональная константа (ее нельзя записать конечной или периодической дробью), приблизительно 2,71828. Она возникает как предел непрерывного роста: если сумма растет на 100% в год, но начисление идет непрерывно, а не разом в конце года, за год она умножается не на 2, а на e. Именно поэтому натуральный логарифм удобен для описания процессов вида «скорость роста пропорциональна текущему значению» — радиоактивного распада, остывания, накопления процентов.

Оговорка про запись: обозначение lb для двоичного логарифма стандартизировано (ISO 80000-2), но в текстах по алгоритмам чаще пишут просто log n, подразумевая основание 2. Это не небрежность: при оценке асимптотики основание влияет лишь на постоянный множитель (см. формулу перехода ниже), поэтому в записи O(log n) его опускают.

Свойства и формулы

Все формулы ниже работают только при условии, что аргументы положительны, а основание допустимо (a > 0, a ≠ 1). Это не украшение, а часть правила.

  • log_a(1) = 0 — единица получается возведением в нулевую степень.
  • log_a(a) = 1 — основание в первой степени дает само себя.
  • log_a(x · y) = log_a(x) + log_a(y) при x > 0, y > 0 — логарифм произведения равен сумме логарифмов.
  • log_a(x / y) = log_a(x) — log_a(y) при x > 0, y > 0 — логарифм частного равен разности.
  • log_a(x^p) = p · log_a(x) при x > 0 — показатель степени выносится множителем.
  • Переход к новому основанию: log_a(x) = log_c(x) / log_c(a). Отсюда, например, log_2(x) = ln(x) / ln(2) — именно так двоичный логарифм считают через натуральный.

Проверим свойство произведения и переход основания на числах:

import math

# логарифм произведения = сумма логарифмов
print(math.log2(4 * 8))            # 5.0
print(math.log2(4) + math.log2(8)) # 5.0

# переход к новому основанию: log_3(81) через натуральный
print(math.log(81) / math.log(3))  # 4.0  (3**4 == 81)

# math.log(x, base) делает переход внутри
print(math.log(81, 3))             # 4.0

Фактический вывод: 5.0, 5.0, 4.0, 4.0. Обратите внимание: math.log(x) без второго аргумента — это натуральный логарифм (по основанию e), для основания 10 есть math.log10, для 2 — math.log2.

Логарифмическая функция и ее график

Логарифмическая функция — это y = log_a(x) при a > 0 и a ≠ 1. Она обратна показательной функции y = a^x: их графики симметричны относительно прямой y = x.

Свойства функции и то, как они читаются на графике:

  • Область определения D(f) = (0; +∞) — функция существует только для положительных x; слева от нуля графика нет.
  • Область значений E(f) = (-∞; +∞) — по вертикали кривая уходит и вниз, и вверх без ограничений.
  • График всегда проходит через точку (1; 0), потому что log_a(1) = 0 при любом основании, и через точку (a; 1).
  • Ось ординат (прямая x = 0) — вертикальная асимптота: при x, стремящемся к нулю справа, значение уходит к -∞ (при a > 1) или к +∞ (при 0 < a < 1), но саму ось график не пересекает.
  • При a > 1 функция строго возрастает на всей области определения; при 0 < a < 1 — строго убывает.
  • Функция непрерывна и дифференцируема всюду, где определена; она не четная и не нечетная, не имеет ни наибольшего, ни наименьшего значения.

Проще всего увидеть форму по таблице значений. Для y = log_2(x) (основание больше 1, кривая возрастает):

x 1/4 1/2 1 2 4 8
log_2(x) -2 -1 0 1 2 3

Для y = log_(1/3)(x) (основание между 0 и 1, кривая убывает):

x 1/9 1/3 1 3 9
log_(1/3)(x) 2 1 0 -1 -2

Видно главное отличие: обе кривые проходят через (1; 0), но при основании больше 1 значения растут вправо, а при основании меньше 1 — убывают. Чем ближе x к нулю, тем круче график прижимается к вертикальной оси.

Откуда в IT берется O(log n)

Ключевая для программирования черта логарифма: он растет очень медленно. Чтобы log_2(n) вырос на единицу, аргумент n нужно удвоить. Обратная сторона того же факта — если на каждом шаге алгоритм вдвое сокращает объем данных, число шагов равно примерно log_2(n). Отсюда и берется сложность O(log n).

Классический пример — двоичный поиск в отсортированном массиве: сравниваем искомое со средним элементом и каждый раз отбрасываем половину. Максимальное число сравнений для массива из n элементов равно floor(log_2(n)) + 1.

import math

def binary_search_steps(data, target):
    lo, hi, steps = 0, len(data) - 1, 0
    while lo <= hi:
        steps += 1
        mid = (lo + hi) // 2
        if data[mid] == target:
            return steps
        if data[mid] < target:
            lo = mid + 1
        else:
            hi = mid - 1
    return steps  # не найдено - вернем число проверенных шагов

n = 1_000_000
data = list(range(n))
worst = max(binary_search_steps(data, t) for t in (0, n - 1, n // 2))
print(worst)                          # 20
print(math.floor(math.log2(n)) + 1)   # 20

Фактический вывод: 20 и 20. Смысл: чтобы найти любой из миллиона элементов, двоичному поиску хватает 20 сравнений. Линейный перебор в худшем случае сделал бы миллион. Тот же логарифмический рост стоит за высотой сбалансированного двоичного дерева поиска, глубиной пирамиды (heap) и разбиением задач в алгоритмах «разделяй и властвуй».

Оговорка: O(log n) описывает поведение при больших n и скрывает постоянные множители и основание логарифма — на практике важны еще и константы, кеш и реальные данные. Асимптотика показывает тенденцию роста, а не точное время.

Выводы

  • Логарифм log_a(b) — это показатель степени, в которую надо возвести основание a, чтобы получить аргумент b; выражение определено только при b > 0, a > 0, a ≠ 1.
  • Три рабочих основания: 2 (двоичный, алгоритмы), e ≈ 2,71828 (натуральный, непрерывный рост), 10 (десятичный, инженерные шкалы); переход между основаниями — делением логарифмов.
  • Свойства (логарифм произведения, частного, степени, переход основания) действуют при положительных аргументах и превращают умножение в сложение.
  • График y = log_a(x): область определения (0; +∞), проходит через (1; 0), вертикальная асимптота x = 0; при a > 1 возрастает, при 0 < a < 1 убывает.
  • В IT логарифм задает медленный рост: если алгоритм вдвое сокращает данные за шаг, его сложность — O(log n) (двоичный поиск, деревья поиска, кучи).

Где применяется / связь с практикой

Логарифмы — не только школьная тема: без них не оценить сложность алгоритма, не разобрать структуры данных и не понять, почему одни решения масштабируются, а другие нет. Тот же аппарат нужен в аналитике данных и машинном обучении — логарифмические шкалы, кросс-энтропия, логистическая регрессия опираются на свойства логарифма.

Освойте тему на практике

Если хочется собрать математику под задачи разработки и анализа данных в систему, а не учить формулы вразнобой, посмотрите курс Прикладная математика: там логарифмы, функции и оценка сложности разбираются в связке с практическими задачами. Понять формат и уровень до старта помогают бесплатные открытые уроки — это живой разбор темы с преподавателем.

Смежные темы: Логарифмы и их основные свойства.

FAQ

Почему нельзя логарифмировать ноль и отрицательные числа? Логарифм ищет показатель степени, а положительное основание в любой степени дает только положительное число. Поэтому для нуля и отрицательных аргументов такого показателя не существует, и выражение не определено.

Что значит запись log без основания? В математике по контексту: часто lg (основание 10) или ln (основание e). В текстах по алгоритмам log n почти всегда означает основание 2 — при оценке O(…) основание меняет лишь постоянный множитель и его опускают.

Как посчитать логарифм по редкому основанию на калькуляторе или в коде, если есть только ln и lg? Через формулу перехода: log_a(x) = ln(x) / ln(a) (или lg(x) / lg(a)). Например, log_2(10) = ln(10) / ln(2).

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)