Функция Пи является расширением факториала по реалам (или даже комплексным числам). Для целых чисел п , Π (п) = п! , но чтобы получить определение по реалам, мы определяем его с помощью интеграла:
В этих проблемах мы будем инвертировать П функцию.
Для вещественного числа z ≥ 1 найдите положительное x такое, что Π (x) = z . Ваш ответ должен быть точным не менее 5 десятичных цифр.
Примеры:
120 -> 5.0000
10 -> 3.39008
3.14 -> 2.44815
2017 -> 6.53847
1.5 -> 1.66277
120 -> -0.991706
. Это связано с тем, что) (x) стремится к бесконечности, а x - к -1 справа. Возможно, вы хотите настаивать на том, что x> 0 также.Ответы:
Mathematica,
171527 байтВывод выглядит так
{{x -> n}}
, гдеn
находится решение, которое не может быть разрешено.источник
Pyth, 4 байта
Программа, которая принимает ввод числа и печатает результат.
Тестирование
Как это устроено
источник
MATL , 13 байт
Это использует линейный поиск по шагам,
1e-5
начиная с1
. Так что это ужасно медленно, и время ожидания в онлайн-компиляторе.Чтобы проверить это, следующая ссылка заменяет
1e-5
требование точности на1e-2
. Попробуйте онлайн!объяснение
источник
GeoGebra , 25 байт
Введен во вход CAS и ожидает ввода числа в ячейку электронной таблицы
A1
. Возвращает одноэлементный массив формы{x = <result>}
.Вот рисунок исполнения:
Как это устроено
N
в умеSolve
следующее уравнение:Gamma(x+1)=A1
с начальным значениемx=1
.источник
1.5
. Я не смог выяснить, какой алгоритм использует GeoGebra для численного решения, но первоначальное значениеx=1
дало чисто положительные ответы для каждого значения, которое я пробовал.MATLAB, 59 байт
Это анонимная функция, которая находит минимизатор квадрата разности между функцией Pi и его входом, начиная
1
с очень малого допуска (заданногоeps
) для достижения желаемой точности.Тестовые случаи (запуск на Matlab R2015b):
Вы можете попробовать это онлайн в Octave, но, к сожалению, некоторым результатам не хватает необходимой точности.
источник
J,
8633 байтаИспользует метод Ньютона с log Pi, чтобы избежать переполнения.
Это предыдущая версия, которая вычисляет log Gamma, используя приближение Стирлинга. Размер шага (1e3) и количество членов в журнале Gamma (3) могут быть увеличены для возможно более высокой точности за счет производительности.
Еще одна версия, которая вычисляет коэффициент коэффициентов на лету
Попробуйте онлайн! и увидеть термины сходятся .
объяснение
источник
Mathematica, 21 байт
FindRoot
применяет метод Ньютона внутренне, когда есть начальное значение.Два метода ниже применяют метод Ньютона напрямую.
Альтернатива с использованием FixedPoint 45 байт
Более точная реализация метода Ньютона для решения этой проблемы, поскольку Mathematica может вычислять производную напрямую, а не аппроксимировать ее.
Использование правил для многократной замены будет короче, но существует ограничение (65536) на количество итераций, которые он может выполнить,
FixedPoint
и при этом не имеет ограничения.Альтернативное использование правил, 38 байт
источник
Желе , 34 байта
Попробуйте онлайн! или просмотреть промежуточные значения по мере их сходства .
Реализация комбинации J метода Ньютона и аппроксимации производной (секущий метод) для вычисления обратного значения Π ( n ).
Вместо этого он решает обратный лог ( Π ( n )), чтобы избежать переполнения.
Начинается с начальной догадки х 0 = y +1, где y = log ( Π ( n )). Затем выполняется итерация до сходимости с использованием x n +1 = x n - (log ( Π ( x n )) - y ) / (log (( Π (1.001 * x) n )) - log ( Π ( x n ))) / (0,001 * x n )).
источник
1.5
PARI / GP, 30 байтов
Находит решение между
1
иx+1
. К сожалению,x
он недостаточно велик в качестве верхней границы для ввода1.5
.источник
Mathematica, 26 байт
Еще одно решение Mathematica!
Решение уравнений всегда можно превратить в задачу минимизации.
Находит аргумент, который минимизирует разницу между левой и правой сторонами уравнения.
Использование NArgMin вместо NMinimize заставляет вывод быть желаемым результатом, а не обычным подробным выводом на основе правил (и это сохраняет байт!)
источник
C с libm, 111
Обновление - исправлено для входа 1.5.
gamma(x+1)
является монотонно возрастающей функцией в рассматриваемом диапазоне, shis - это просто двоичный поиск, пока разница между последовательными значениями не станет небольшой. Начальная нижняя граница0
и начальная верхняя граница2*x
.Ввод и вывод через указатель на двойник передается в функцию.
Я почти уверен, что это можно сделать глубже - в частности, я не думаю, что мне нужно 4 местных пары, но пока я не вижу простого способа уменьшить это.
Попробуйте онлайн - собирает (связывает с libm) и запускает в bash-скрипте.
Слегка разряженный
источник