2014-10-17 5 views
1

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

Как часть заданной задачи, я должен создать код в C, который будет оценивать x^n/n! для произвольного x и n = {1-10, 50, 100}

Я всегда могу перетащить его с помощью библиотеки большого числа, но мне интересно, сможет ли кто-то с лучшими математическими навыками предложить лучший алгоритм чем что-то с O (n!) ...

Я понимаю, что я могу разбить числитель на x^(n/2) x^(n/2) для четных значений n и x x^(n-1/2) * x^(n-1/2) для нечетных значений n. И что я могу дополнительно изменить это на логарифмическую базу x of n/2.

Но я застрял по нескольким причинам:

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

2 - Даже если я думаю о n! как 1 * 2 * 3 * ... * (n-1) * n, я до сих пор не могу рационализировать хороший способ упростить общее уравнение.

3 - Я рассмотрел алгоритм Карацубы для умножения, и, хотя это возможно, это кажется немного сложным для введения проблемы программирования.

Так что мне интересно, можете ли вы, ребята, подумать о какой-либо средней земле. Я предпочитаю объяснения прямых ответов, если у вас есть время :)

Приветствия,

+0

http://en.wikipedia.org/wiki/Gamma_function – Barmar

+0

ehh, мой плохой. Я должен был заметить это раньше. Общая цель решения состоит в том, чтобы аппроксимировать значение e^x, суммируя x^n/n !. Таким образом, использование функции, которая требует, чтобы e^x в качестве фактора не помогло бы ... приятное предложение. –

+0

Зачем вам это нужно? Есть ли язык программирования, который не имеет функции для вычисления 'e^x'? – Barmar

ответ

2

Мой совет вычислить все условия суммирования (положить их в массиве), а затем суммировать их в обратном порядке (т. е. от наименьшего к наибольшему), что немного уменьшает погрешность округления.

Обратите внимание, что вы можете вычислить k ий член из предыдущего умножения на x/k - вам не нужно постоянно вычислять x^n или n! непосредственно (это важно).

+0

Хороший вопрос о суммировании в обратном порядке. Сначала добавление небольших терминов гарантирует, что вы будете иметь как можно больше точности. – eigenchris