Логарифм числа. Основное логарифмическое тождество
Определение. Логарифмом числа b по основанию a , где a > 0 , a ≠ 1 , b > 0 , называется показатель степени, в которую нужно возвести основание a , чтоб получить число b .
Обозначение. log a b — произносится: «логарифм b по основанию a ».
Калькулятор логарифмов
График
Записи log a b = c и b = a c равносильны.
Подставив во вторую формулу значение степени через логарифм, получим основное логарифмичесое тождество.
Основное логарифмическое тождество
При условии, что a > 0 , a ≠ 1 , b > 0 можно записать основное логарифмическое тождество
3 -log3 7 = 1 3 log3 7 = 1 7
4 log2 7 =2 2 log2 7 = (2 log2 7 ) 2 = 7 2 = 49
2 1 + log2 7 = 2 · 2 log2 7 = 2 · 7 = 14
Вычисление логарифма равносильно решению показательного уравнения
при условии a > 0, a ≠ 1; b > 0, где
x — показатель степени, a — основа степени, b — степень числа a .
при условии a > 0, a ≠ 1; b > 0, где
x — логарифм числа b с основой a , a — основа логарифма, b — число, которое стоит под знаком логарифма.
2 5 = 32 ⇔ 5 = log2 32;
3 4 = 81 ⇔ 4 = log3 81;
log1/5 125 = -3 ⇔ (1/5) -3 = 125;
log2 1 16 = -4 ⇔ 2 -4 = 1 16 .
Найти логарифм: log 4 8
Обозначим log4 8 через x :
Перейдем к показательному уравнению:
4 x = 8
Сведем показательное уравнение к основе 2 и решим его:
log4 8 = 3 2
Найти x если : log x 125 = 3 2
За определением логарифма имеем:
Возведем обе части в степень 2 3 , и воспользуемся свойствами степеней:
( x 3/2 ) 2/3 = 125 2/3
x = (5 3 ) 2/3 = 5 3·2/3 = 5 2 = 25
Любые нецензурные комментарии будут удалены, а их авторы занесены в черный список!
Присоединяйтесь
© 2011-2023 Довжик Михаил
Копирование материалов запрещено.
Добро пожаловать на OnlineMSchool.
Меня зовут Довжик Михаил Викторович. Я владелец и автор этого сайта, мною написан весь теоретический материал, а также разработаны онлайн упражнения и калькуляторы, которыми Вы можете воспользоваться для изучения математики.
Если Вы хотите связаться со мной, имеете вопросы, предложения или хотите помочь развивать сайт OnlineMSchool пишите мне support@onlinemschool.com
Как записать log?
вот мой код этой функции
f = Math.log(1/5)*(1+Math.cos(3* t))/Math.log(1/3)*(1+Math.sin(5*t));
- Вопрос задан более двух лет назад
- 1210 просмотров
3 комментария
Простой 3 комментария
легко. для этого нужно всего..
volerass @volerass Автор вопроса
брюликам не важно сколько ты н, и чем ты мне помог?

volerass, он намекнул на то, что «домашнее задание» — это то, что должно решаться дома, а не спрашиваться на форумах
Решения вопроса 0
Ответы на вопрос 1
Денис Загаевский @zagayevskiy Куратор тега Java
Android developer at Yandex
В джаве Math.log вычисляет натуральный логарифм. Соответственно, тебе нужно сменить основание логарифма, чтобы вычислить правильно.
Например, логарифм по основанию b будет Math.log(x) / Math.log(b).
С этими знаниями не составит труда переписать твоё выражение.
Ответ написан более двух лет назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Java
- +1 ещё
Как лучше всего организовать очистку файла журнала в PostgreSQL?
- 3 подписчика
- 17 нояб.
- 606 просмотров
Быстрый целочисленный логарифм по основанию 2
Часто бывает нужно посчитать целую часть логарифма по основанию 2 от любого целого числа.
Решение в лоб это сделать цикл и в этом цикле постоянно делить число на два, пока оно не станет равно нулю. Сколько таких делений произошло, таково и значение логарифма. Да, такой способ рабочий и имеет право на жизнь, но я хочу показать как это можно сделать без всяких циклов и сложных конструкций.
Итак, мы хотим посчитать следующую формулу:
Решение
Для тех, кому не интересны рассуждения, я дам сразу готовые функции для вычисления логарифма:
uint32_t getHighBit_32(uint32_t x) < x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return x - (x >> 1); > uint32_t getBitCount_32(uint32_t x) < x = (x & 0x55555555) + ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F); x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF); return (x & 0x0000FFFF) + (x >> 16); > uint32_t getLog2_32(uint32_t x)
Объяснения
Для начала переведем число x в двоичную запись определенной длины.
Например, длины = 8, но это не принципиально и длина числа может быть любой.
А теперь вспомните, на чем основан перевод числа в двоичную запись. На том, чтобы представить число в виде суммы степеней двойки. Номер степени будет определять позицию бита, который равен 1. Например: . Т.е. номера степеней 5, 3, 2 и 0. Это значит что 5-ый, 3-ий, 2-ой, 0-ой биты равен 1. Остальные биты между ними равны нулю. Отсчет битов начинается с правой стороны. Получилось, что
Можно заметить, что перевод в двоичную запись тесно связан с возведением в степень, а логарифм это же операция обратная возведению в степень и равна она показателю степени.
Притом показатель степени, в которую нужно возвести 2, это номер единичного бита в двоичной записи. Получается, если найти номер единичного бита, то получим целую часть значения логарифма по основанию два. Например, если 32 = 100000, единичный бит стоит на 5 месте, поэтому логарифм равен 5.
Но поскольку единичных битов, может быть не 1, а несколько, то встает вопрос номер какого именно единичного бита брать, чтобы найти логарифм. Ответ — номер последнего единичного бита, начиная отсчет с правой стороны записи числа, потому что именно старшая степень двойки определяет целую часть логарифма, остальные составляют дробную часть логарифма.
Рассмотрим другой пример — число . Последний единичный бит стоит на 5 месте, поэтому целая часть логарифма от 45 равна 5. и действительно . Дробную часть мы отбрасываем и остается 5.
Также работает и с другими числами.
В итоге мы получили, что целая часть логарифма равна номеру последнего единичного бита отсчитывая справа. Вопрос: как найти номер последнего единичного бита?
Для этого есть функции основанные на побитовых операциях, которые я нашел в книжке Г.Уоррена «Алгоритмические трюки для программистов».
- Округление до степени двойки в меньшую сторону (или выделение последнего единичного бита в двоичной записи числа). На самом деле можно округлять и в большую сторону, но тогда значение логарифма тоже будет округлено в большую сторону.
- Подсчет количества единичных битов в двоичной записи числа
Используя эти две функции алгоритм вычисления алгоритма следующий:
- Выделить последний единичный бит в числе. Теперь число стало записано в виде 100000
- Вычесть единицу из полученного числа. Тогда число станет таким: 011111
- Подсчитать количество единичных битов и это будет целое значение логарифма
Исключительная ситуация
У логарифма есть исключительная ситуация, когда x = 0. По идее такого логарифма не существует (или в пределе он равен -∞). Однако, поскольку мы в программировании немного отходим от законов математики, то функции все равно работают даже когда на вход функции подается ноль. В таком случае значение логарифма будет равно 32 (если число 32-разрядное). Это происходит потому что функция округления до ближайшей степени двойки выдаст 0, потом мы из нуля вычитаем единицу и получаем число 0xFFFFFFFF, а единиц в таком числе 32 поэтому логарифм и будет равен 32.
Да, с точки зрения математики это некорректно, но есть случаи, когда это полезно с точки зрения программирования.
Подсчет длины двоичного кода
Применять подобную функцию вряд ли станут для вычисления именно математического логарифма, потому что чаще считают логарифмы от вещественных чисел, а не целых.
Однако подсчет длины двоичного кода — задача, которая на практике возникает чаще.
Пусть дан двоичный код определенной длины. Это может быть, например, путь в бинарном дереве. Если перед эти кодом записать единичный бит, то можно вычислять длину этого кода без использования вспомогательных переменных через взятие целочисленного логарифма.
Например, пусть дан код 0001110110. Он записан например в ячейку из 32 бит и нам нужно часто считать длину этого кода. Для этого припишем перед кодом дополнительный единичный бит.
Получим: 10001110110. И теперь можем смело считать длину этого кода через целочисленный логарифм, не храня отдельно длину этого кода где-то еще.
Если считать длину кода, где все нули, то функция выдаст длину = 32, что может быть некорректно, поэтому такую ситуацию надо предусмотреть. В каких-то ситуациях полезно, чтобы функция выдавала 32, а в каких-то, например, ноль.
Источники
- Г. Уоррен «Алгоритмические трюки для программистов. Исправленное издание.», 2004
UPD:
В комментариях верно отметили, что асимптотика функций getHighBit_32 и getBitCount_32 не O(1), а , где n — разрядность числа. Поэтому итоговая сложность алгоритма расчета логарифма не O(1), как может показаться на первый взгляд, а O(log2(n)).
- Битовые хаки
- Алгоритмы
Почему для вычисления сложности алгоритмов используется log N вместо lb N?

Во всех источниках сложность алгоритмов обозначается как log N (без указания основания). При этом имеется в виду логарифм по основанию 2. Но для такого логарифма есть свое обозначение lb. Причем это обозначение стандартизировано ISO 31-11 и наверное было бы логичнее и правильнее пользоваться именно им, но этого по какой-то причине не просходит, почему? UPD: у меня нет никакого математического образования и все, что я знаю о логарифмах, что это действие обратное возведению в степень. Возьмем конкретный пример — бинарный поиск. Везде описывают его сложность как log N. При этом под log N, как мне кажется, все таки подразумевается логарифм N по основанию именно 2, т.к. количество операций составляет именно логарифм N по основанию 2, т.е. в какую степень надо возвести именно 2 (а не 10 и не 100), чтобы получить N. Поэтому, если честно, я не понимаю ответов типа «потому что постоянные коэффициенты в обозначении O(n) не имеют значения» или «так как запись с большим O на константы не реагирует — неважно, какой именно логарифм использовать. « и буду признателен за более развернутый ответ, написанный не для математиков. Разве правило, что «константы в О-большом не имеют значения», относится к основанию логарифма? Разве для бинарного поиска не имеет никакой разницы как записать его сложность — логарифмом по основанию 2 или по основанию 100? Если под log N для бинарного поиска подразумевается именно логарифм по основанию 2, то почему бы его не записать как lb N, раз уж для двоичного логарифма есть свое обозначение, вместо того, чтобы записывать вообще без указания основания? UPD 2: я понимаю что «O(N) — это ни в коем случае не количество сравнений, это оценка времени работы алгоритма, максимально отвязанная от деталей реализации и машины.» Но вот этого: «А так как запись с большим O на константы не реагирует — неважно, какой именно логарифм использовать. « я не понимаю. Почему не важно какой логарифм использовать? Вот графики трех логарифмов — двоичного, натурального и по основанию 0,5: Возьмем все тот же бинарный поиск. Разве мы можем заменить в его сложности основание у логарифма с два на десять? А с два на 0,5? Мне кажется, не можем. Т.е. мы не можем подставить в выражении log N произвольное основание потому что зависимость будет совершенно другая — это хорошо видно на графике. Т.о. какой именно логарифм использовать важно. Или я не прав?
Отслеживать
задан 6 мар 2018 в 14:52
1,159 9 9 золотых знаков 23 23 серебряных знака 44 44 бронзовых знака
вам будет проще понять если вы построите график отношения log_2(x)/ln(x) и убедитесь, что это константа. Потом прочите ещё раз определение ( f(x) = O(log x) -> 0
