Большое спасибо всем. (Пока писал появилось несколько новых сообщений. Однако "не пропадать же добру".)
Не ожидал, что получится такая дискуссия. Я конечно искал в интернете и много нашел разных сайтов с обсуждением этого вопроса. Но меня конкретно интересовало какой алгоритм применяется в Mathematika. В справке доступной мне Mathematika ничего не нашел.
Поэтому и обратился на сайт.
Мне кажется, самые лучшие варианты ответов есть на СоХабр (ссылка
https://sohabr.net/habr/post/255761/ )
Там были рассмотрены несколько разных вариантов. Первый самый простой (Наивный алгоритм) в цикле. Второй - Алгоритм вычисления деревом, третий - Алгоритм вычисления факторизацией, четвертый - Библиотека GMP. Все подробно и детально расписано, приводятся листинги программ. Очень много есть модификаций алгоритмов в комментариях.
На сайте
http://ru.stackoverflow.com/questions/2479/%D0%A1%D0%B0%D0%BC%D1%8B%D0%B9-%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B0%D0%BBтоже есть много интересного и много ссылок.
Может быть какая-нибудь оптимизация формулы Стирлинга (или даже непосредственно она)?
На этом сайте один из вариантов как раз использует формулу Стирлинга. В результате получается формула
Цитата:
«... с бинарным масштабным коэффициентом, …. которая при правильно выбранной точности вычислений будет точной.»
Там же была указана очень интересная статья On the Complexity Calculating Factorials (по ссылке
http://www.cecm.sfu.ca/personal/pborwein/PAPERS/P29.pdf) . В ней предлагают считать факториал за
(где
— время перемножения двух n-значных чисел).
Луддизм 21-го столетия - соревноваться с компилятором в оптимизации.
Не совсем понял. Причем тут Луддиты? Кажется они ломали машины.
А уважаемый
rockclimber вроде ничего не ломал.
Еще раз большое спасибо за ссылки. Буду смотреть и постараюсь разобраться.
P.S. У меня даже появилась одна идейка по рационализации программы простого цикла. За счет нее количество итераций в цикле уменьшается в два раза. Когда полностью ее добью, (если все получится) то выложу для обозрения