Pull to refresh

Comments 22

n в степени n — это одна, пусть и сложная, операция pow(n,n), время её выполнения не зависит от степени, в которую возводится число

вы серьезно считаете, что компьютер циклом возводит число в степень!?

а в дробную, простите, как? пол шага цикла делает? :)

так что, в отличие от линейного способа вычисления факториала, формула Стирлинга для компьютера действительно сильно проще
UFO landed and left these words here
Советую взять логарифмическую линейку и попробовать.
И для схемы «слева направо», и для схемы «справа налево» количество операций возведения в квадрат одинаково и равно k, где k — длина показателя степени n в битах, k ∼ ln n.

© Wikipedia


А говорите не зависит

Так, и в чем противоречие? Для того чтобы показатель не влиял на время выполнения оно должно за O(1) операций выполняться. А так у него примерно логарифмический рост ± оптимизации.

Так оно и выполняется за O(1), если считать приближенно, а не точно. А считать точно тут смысла нет ни малейшего, потому что это уже аппроксимация.

pow(n,n) — это не аппаратная функция. Эту функцию реализует компилятор циклом. А компилятор может содержать и n! А мы сами можем запрограммировать и формулу Стирлинга. Но от этого она не станет элементарной.
время её выполнения не зависит от степени, в которую возводится число

Я не знаю удивляться мне или плакать. Попробуйте pow(2,2) и попробуйте pow(100,100).

а в дробную, простите, как? пол шага цикла делает? :)

Все это было бы действительно смешно, если бы не было так грустно.

Вот я только что проверил:


pow(2,2)      100000000 times, elapsed 00:00:03.7979203
pow(100, 100) 100000000 times, elapsed 00:00:03.6476442

Исходный код
            var sw = Stopwatch.StartNew();
            for (int i = 0; i < N; i++)
                Math.Pow(2, 2);
            Console.WriteLine($"pow(2,2)      {N} times, elapsed {sw.Elapsed}");

            sw.Restart();
            for (int i = 0; i < N; i++)
                Math.Pow(100, 100);
            Console.WriteLine($"pow(100, 100) {N} times, elapsed {sw.Elapsed}");
Возведение в степень делается за log N — умножений, а exp считается через ряд Тейлора, как и логарифм.
Ряд Тейлора не используется. Exp(x) считается через функцию 2x (exp(x) сводится к 2x lb e), где для двоичного представления x показатель ответа известен сразу (целая часть от x), а для мантиссы (которая принимает значения между 1 и 2) используют или интерполяционный полином (в отличие от ряда Тейлора он имеет более равномерное распределение ошибки), или таблицы с интерполяцией/уточнением, но в любом случае время расчета не зависит от величины аргумента.
Если бы автор посмотрел ещё более старые учебники, то нашёл бы ещё больше «загогулин». Математические обозначения менялись сами по себе, равно как и их использование в физике. Ну и анализировать формулу, не понимая значения символов в ней — тоже так себе занятие.
И ни слова не говорится, что по n подразумевается суммирование.

Это такое соглашение в тензорной алгебре — повторяющийся индекс означает суммирование по нему. Ещё там есть прикол с отсутствующими индексами — они тоже означают суммирование, а не срез как можно было бы подумать.


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

А теперь кто прав?

В копенгагенской интерпретации правильные ответы — 1, а.
В многомировой интерпретации правильные ответы — 2, б.
Насколько я знаю, эти интерпретации эквивалентны (до тех пор, пока применимы обе).

Равно как и еще пара десятков других интерпретаций. Математика всюду одна, результат экспериментов — тоже, на то они и интерпретации.
Я, что-то не пойму, чем формула Стирлинга проще определяющей формулы. В каком отношении проще?

Учебник такого и не пишет. Она сравнительно проще других формул.
Имхо, не стоило смешивать Стирлинга со Шредингером. Первая «загогулина» ни о чем, а вторая — известная и интересная проблема.
Опять же имхо у Саскинда разложено наиболее чётко и доступно.
Про факториал повеселило :) Полностью согласен
Наверно, имеется ввиду докомпьютерная эпоха. По формуле Стирлинга ещё хоть как-то можно вычислить.

А должны быть — не полностью. Уже хотя бы потому, что n^n не требует n умножений.
Кроме того, выше уже написали, что эта формула сводится к элементарным действиям и одному полиному.

Sign up to leave a comment.

Articles