Баннер мобильный (3) Пройти тест

Логарифмы для программистов: что это такое и как их написать в коде

Школьная математика, которая пригодится

Разбор

4 февраля 2025

Поделиться

Скопировано
Логарифмы для программистов: что это такое и как их написать в коде

Содержание

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

    В этой статье мы разберем, что такое логарифмы, изучим их основные свойства и рассмотрим практическое применение. На нескольких простых примерах посмотрим, как работать с логарифмами в разных языках программирования, и разберем их роль в разработке эффективных алгоритмов.

    Что такое логарифм

    Как известно, степень числа с натуральным показателем n можно представить как многократное умножение этого числа самого на себя n раз. Например, число 5 во второй степени вычисляется так:

    \(5^2 = 5 \cdot 5 = 25\)

    А число 2 в третьей степени так:

    \(2^3 = 2 \cdot 2 = 8\)

    Корень n-ой степени определяется как основание степени, которое при возведении в n-ую степень дает подкоренное выражение. Это значит, что \(\sqrt25=5\), потому что пять в квадрате равно 25, а \(\sqrt[3]{8}=2\), так как два в кубе равно 8. Строго говоря, квадратный корень из 25 имеет два значения: 5 и -5, так как -5 в квадрате тоже равно 25. Но мы здесь имеем в виду так называемый арифметический квадратный корень, значение которого всегда неотрицательно. Кубический и иные корни нечетных степеней таким свойством не обладают. 

    Итак, корень — это основание степени. Что у нас осталось? А остался у нас показатель степени. Так вот, логарифм как раз и определяется как показатель степени, в которую нужно возвести основание логарифма, чтобы получить логарифмируемое выражение. Например:

    \(log_{5}25 = 2\)

    А также:

    \(log_{2}8 = 3\)

    Логарифмы по основанию 10 называются десятичными и обозначаются как lg. При этом основание логарифма не пишется:

    \(log_{10}1000 = lg 1000 = 3\)

    Логарифмы по основанию e (2.718) называются натуральными и обозначаются как ln. При этом, как и в случае с десятичными логарифмами, основание не пишется:

    \(log_{e}1 = ln 1 = 0\)

    Логарифм единицы равен нулю, потому что основание логарифма (как и любое другое число) в нулевой степени равно единице.

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

    Пьер Симон Лаплас как-то сказал, что изобретение логарифмов удлинило жизнь астрономов. Скорее всего имелось в виду, что логарифмы сделали жизнь астрономов значительно проще. Почему? 

    Астрономы часто сталкиваются в своей вычислительной практике с огромными величинами (звездные светимости, размеры, температуры, расстояния и так далее), которые надо умножать, делить, возводить в степень и тому подобное. Некоторые свойства логарифмов делают эти вычисления намного проще.

    Например, можно заменить произведение чисел суммой, то есть вместо того чтобы умножать числа, нужно просто сложить их логарифмы. Делается это при помощи вот такой формулы:

    \(log_{a}{(MN)} = log_{a}M + log_{a}N\)

    То есть логарифм произведения равен сумме логарифмов множителей. Для примера возьмем десятичный логарифм и пусть один множитель будет равен 1000, а другой — 100. Искомое произведение обозначим как x:

    \(x = 1000 \cdot 100\)

    \(lg x = lg 1000 + lg 100\)

    \(lg x = 3+2\)

    \(lg x = 5\)

    \(x = 10^5 = 100000\)

    Если умножение мы заменили сложением, то деление с помощью логарифмов заменяется вычитанием:

    \(log_{a}(\frac{M}{N}) = log_{a}M-log_{a}N\)

    Возьмем тот же десятичный логарифм и те же значения из прошлого примера. Искомое частное обозначим как x:

    \(x = \frac{1000}{100}\)

    \(lg x = lg 1000 — lg 100\)

    \(lg x = 3-2\)

    \(lg x = 1\)

    \(x = 10^1 = 10\)

    Если немного вдуматься, то можно сказать, что умножение — это многократное сложение и оно у нас заменяется обычным, однократным сложением, а деление — это многократное вычитание и с помощью логарифмов оно легко заменяется обычным, однократным вычитанием. А что с возведением в степень? Как уже говорилось, возведение в степень — это многократное умножение, а логарифмы позволяют заменить его однократным. То есть, возведение в степень заменяется обычным умножением:

    \(log_{a}N^m = m log_{a}N\)

    Возведем 100 в квадрат:

    \(x = 100^2\)

    \(lg x = 2 \cdot lg 100\)

    \(lg x = 2 \cdot 2\)

    \(lg x = 4\)

    \(x = 10^4 = 10000\)

    Также использование логарифмов позволяет достаточно просто извлекать корни. В этом случае извлечение корня заменяется делением:

    \(log_{a}\sqrt[m]N = \frac{log_{a}N}{m}\)

    Извлечем квадратный корень из 100:

    \(x = \sqrt 100\)

    \(lg x = \frac{lg 100}{2}\)

    \(lg x = \frac{2}{2}\)

    \(lg x = 1\)

    \(x = 10^1 = 10\)

    Далее рассмотрим как вычисляются логарифмы в разных языках программирования.

    Логарифмы в Python

    В языке программирования Python логарифмы можно вычислять при помощи специальных функций из модуля math. Но прежде чем их использовать необходимо этот модуль импортировать. В самом начале исходника нужно прописать:

    import math

    Для вычисления десятичных логарифмов в модуле присутствует функция log10(). Вот так ее можно использовать:

    num = math.log10(1000000)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    6.0

    Также имеется отдельная функция log2() для вычисления двоичных логарифмов, то есть таких логарифмов, у которых основание равно 2. Пример:

    num = math.log2(8)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    3.0

    Для вычисления логарифмов с произвольным основанием потребуется функция log(). На вход ей надо подать два аргумента: логарифмируемое число и основание логарифма. Вот так это делается:

    num = math.log(9, 3)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    2.0

    Если не указывать для функции log() второй аргумент, то по умолчанию будет вычисляться натуральный логарифм:

    num = math.log(42)
    
    print(num)

    Результат:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    3.7376696182833684
    

    Перейдем к следующему языку программирования.

    Логарифмы в Java

    В языке программирования Java для вычисления логарифмов можно использовать методы из класса Math. Вот так вычисляется десятичный логарифм:

    public class Logarithm {
    
        public static void main(String[] args) {
            System.out.println(Math.log10(1000000));
        }
       
    }

    Результат выполнения программы:

    run:
    6.0

    А так — натуральный:

    public class Logarithm {
    
        public static void main(String[] args) {
            System.out.println(Math.log(3));
        }
       
    }

    Результат выполнения:

    run:
    1.0986122886681098

    Как видим, все примерно так же, как и в Python. Но вот с вычислением логарифмов с произвольным основанием в Java есть небольшие сложности. Дело в том, что в Java отсутствует метод для вычисления логарифмов с произвольным основанием, поэтому придется воспользоваться формулой перехода к новому основанию и создать свой метод. Формула перехода позволяет заменить одно основание логарифма на другое. Вот она:

    \(log_{a}N = \frac {log_{b}N}{log_{b}a}\)

    Допустим, нам требуется вычислить логарифм числа 9 по основанию 3. Используем натуральные логарифмы, то есть переходим от основания 3 к основанию e:

    \(log_{3}9 = \frac {ln9}{ln 3}\)

    В итоге, исходя из формулы перехода, получаем такой метод:

    private static double customLog(double base, double number) {
            return Math.log(number) / Math.log(base);
        }

    На вход метода подаются основание (base) и число (number), а на выходе получается значение логарифма. В данном случае в формуле мы используем натуральные логарифмы. Испытаем этот метод в деле и вычислим с его помощью логарифм числа 9 по основанию 3:

    public class Logarithm {
    
        public static void main(String[] args) {
            System.out.println(customLog(3, 9));
        }
       
        private static double customLog(double base, double number) {
            return Math.log(number) / Math.log(base);
        }
       
    }

    Результат:

    run:
    2.0

    Все работает! Двигаемся дальше.

    Логарифмы в C и С++

    Языки программирования C и C++ похожи друг на друга. Язык C++ можно назвать надстройкой над языком C, которая привносит парадигму объектно-ориентированного программирования, так как чистый C ее не поддерживает. Но нам принципы ООП не понадобятся.

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

    #include "math.h"

    Чтобы была возможность вывести результат вычислений в консоль надо подключить еще один заголовочный файл:

    #include <stdio.h>

    Десятичный логарифм в C рассчитывается так:

    int main (int argc, char *argv[]) {
    
      double num = log10(1000);
    
      printf("Логарифм равен %.2f\n", num);
    }

    А в C++ так:

    int main() {
    
        double num = log10(1000);
    
        printf("Логарифм равен %.2f\n", num);
    
    }

    Результат выполнения:

    Приложение запущено в 13:25:46
    Логарифм равен 3.00
    Приложение завершилось

    Как видно, разница только в методе main, который является точкой входа в приложение. Аналогично вычисляются натуральный (log) и двоичный (log2) логарифмы. А вот с вычислением логарифмов с произвольным основанием здесь, как и в Java, придется создавать свой метод. Также, как и в случае с Java, воспользуемся формулой перехода к другому основанию:

    double logarithm(double base, double number) {
      return log(number)/log(base);
    }

    На примере языка C вычисление логарифма числа 81 по основанию 3 при помощи этого метода будет выглядеть примерно так:

    double logarithm(double base, double number) {
      return log(number)/log(base);
    }
    
    int main (int argc,  char *argv[]) {
    
      double num = logarithm(3, 81);
    
      printf("Логарифм равен %.2f\n", num);
    }

    Результат:

    alex@alex-pc:~/Projects/log-c$ ./log-c
    Логарифм равен 4.00

    На языке C++ код будет примерно такой же. Идем дальше.

    Логарифмы в JavaScript

    Создадим файл index.html со следующим содержимым:

    <!DOCTYPE html>
    <html>
        <head>
            <title>Logarithm</title>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
        </head>
        <body>
            <div id="result"></div>
            <script src="logarithm.js"></script>
        </body>
    </html>

    Видно, что к этому файлу подключен скрипт logarithm.js, в котором производятся расчеты. Результат выводится в элементе div с идентификатором result. Для вычисления логарифмов в JavaScript можно пользоваться методами из объекта Math. Также как и в некоторых других языках программирования здесь есть возможность вычислять десятичные (log10), двоичные (log2) и натуральные (log) логарифмы. Приведем пример вычисления десятичного логарифма. В скрипте прописываем такую строчку:

    document.getElementById("result").innerHTML = Math.log10(1000000);

    Если сейчас запустить файл index.html в любом доступном браузере, то перед нами должна появиться страница с числом шесть в верхнем левом углу:

    появилась цифра в углу

    Аналогично рассчитываются и другие типы логарифмов. А вот логарифмы с произвольным основанием снова придется рассчитывать при помощи своей функции. Как и в прошлых случаях воспользуемся формулой перехода:

    function customLog(number, base) {
        return Math.log(number)/Math.log(base);
    }

    Для примера вычислим логарифм числа 25 по основанию 5. Весь код скрипта в этом случае будет такой:

    document.getElementById("result").innerHTML = customLog(25, 5);
    
    function customLog(number, base) {
        return Math.log(number)/Math.log(base);
    }

    Запускаем и видим в углу страницы число 2. Ответ верный, а значит все работает правильно. Далее предлагаем самостоятельно решить одну несложную задачку.

    Задание для самостоятельного выполнения

    Попробуйте написать программу на языке программирования Python, которая рассчитывает логарифм по произвольному основанию и позволяет пользователю вводить с клавиатуры логарифмируемое число и основание логарифма.

    Решение

    Нам понадобится функция input(), которая как раз и позволяет считывать введенные пользователем данные. Создаем две переменные number и base. В них будут записываться возвращаемые значения от функций input(). Далее эти переменные подаем на вход функции log(). Результат ее работы присваиваем переменной result. 

    Вывод результата делаем при помощи функции print(). Так как функция log() принимает на вход только числовые значения, а input() возвращает нам строку, то делаем конвертацию введенных данных при помощи функции float(). В общем, код должен быть примерно такой:

    import math
    
    number = float(input("Введите число: "))
    
    base = float(input("Введите основание логарифма: "))
    
    result = math.log(number, base)
    
    print(result)

    Пример работы программы:

    alex@alex-pc:~$ /bin/python3 /home/alex/test.py
    Введите число: 27
    Введите основание логарифма: 3
    3.0

    Подведем итоги

    • Логарифм — это показатель степени, в которую надо возвести основание логарифма, чтобы получить логарифмируемое число.
    • Логарифмы обладают рядом интересных и полезных свойств. Например, с их помощью можно умножение заменить сложением, а деление — вычитанием.
    • В разных языках программирования логарифмы вычисляются схожим образом. Обычно для этого есть log(), log2(), log10().
    • В некоторых языках программирования нет функций или методов для вычисления логарифмов с произвольным основанием, поэтому приходится применять самописные функции или методы основанные на формуле перехода к другому основанию.

    Разбор

    Поделиться

    Скопировано
    0 комментариев
    Комментарии