Почти каждая функция может быть выражена как многочлен с бесконечными членами.
Например, e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! + ...
Например, sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...
Коэффициенты n
-членов образуют последовательность, и соответствующая функция называется порождающей функцией последовательности.
Коэффициенты n
-членов образуют последовательность.
Часто у-го n
термина будет знаменатель n!
. Поэтому мы умножаем коэффициент на, n!
чтобы получить другую последовательность, экспоненциальная генерирующая функция которой будет исходной функцией.
Например, последовательность, экспоненциальная генерирующая функция которой e^x
была бы 1,1,1,1,...
.
Например, последовательность, экспоненциальная генерирующая функция которой sin(x)
была бы 0,1,0,-1,0,1,0,-1,...
.
задача
Ваша задача состоит в том, чтобы найти n
-ю член последовательности которого экспоненциальная производящая функция является tan(x)
.
Testcases
n result
0 0
1 1
2 0
3 2
4 0
5 16
6 0
7 272
8 0
9 7936
10 0
11 353792
12 0
13 22368256
14 0
15 1903757312
16 0
17 209865342976
18 0
19 29088885112832
20 0
21 4951498053124096
22 0
23 1015423886506852352
24 0
25 246921480190207983616
26 0
(Скопировано здесь .) (Внимание: 0
термин отличается от)
Пример реализации
# copied from https://github.com/Mego/Seriously/blob/v2.0/SeriouslyCommands.py#L16
def memoized(f):
memo = {}
def m_fun(*args):
if args in memo:
return memo[args]
else:
res = f(*args)
memo[args] = res
return res
return m_fun
# copied from https://github.com/Mego/Seriously/blob/v2.0/SeriouslyCommands.py#L169
@memoized
def binomial(n,r):
if r > n:
return 0
elif r==n:
return 1
res = 1
i = 1
while i<=r:
res *= (n+1-i)
res /= i
i+=1
return int(res)
# 2*u(n+1) = Sum_{k=0..n} binomial(n, k)*u(k)*u(n-k)
# from A000111
@memoized
def u(n):
if n<0: return 0
if n==0: return 1
if n==1: return 1
return sum([binomial(n-1,k)*u(k)*u(n-1-k) for k in range(n)])//2
def t(n):
if n%2 == 0: return 0
return u(n)
print('\n'.join([str(x) + ' ' + str(t(x)) for x in range(26)]))
Ссылки
- Генерирующая функция в Википедии
- Экспоненциальная производящая функция в Википедии
- Пример экспоненциальной производящей функции в Википедии
- Генерирующая функция на MathWorld
- Экспоненциальная производящая функция на MathWorld
- Серия Тейлор в Википедии
- Вывод первых 9 членов требуемой последовательности
- Обязательный OEIS A009006 (обратите внимание, что
0
-ый термин отличается) - Алгоритм
- OEIS A000111: цифры вверх / вниз
Ответы:
CJam (
33 32 27 26 2320 байт)Онлайн демо
рассечение
Это по существу реализует повторение, описанное xnor .
Или с другим подходом, для 23 байтов:
Демо онлайн . Спасибо Деннису за 3 байта.
рассечение
Или с совершенно другим подходом, для 29 байтов:
Онлайн демо
К сожалению, особый случай требуется для ввода
0
.рассечение
Возможно, вы думаете: «WTF ?! Он отвечает не на тот вопрос». Если это так, это понятно, но оба подхода действительно дают правильные результаты .
источник
[WW]3ew
.0
в любом случае это должен быть особый случай, потому что он оценивается как1
.ri_1&a{{1$+}*]W%0+}@*0=
экономит 3 байта.Юлия,
403832 байтаВход и выход в форме
BigFloat
с. Попробуйте онлайн!Фон
Ряд Маклаурина касательной функции удовлетворяет тождеству
всякий раз, когда x лежит в его радиусе сходимости, где B n - число Бернулли.
Поскольку B 2 (n + 1) и (-1) n имеют один и тот же знак, B 2n + 1 = 0, если n> 0 и B 1 = 1/2 , мы можем переписать вышеизложенное следующим образом.
Кроме того, всякий раз, когда n является неотрицательным целым числом, мы имеем
где ζ обозначает дзета-функцию Римана .
Отсюда из соглашения 0 0 = 1 следует, что
это формула, которую использует реализация.
источник
Python, 57 байт
Меньше гольфа:
Мы можем вычислить
i
th-й коэффициент экспоненциальной производящей функции, дифференцируя времена касательной функцииi
и вычисляя при0
. Каждая производная является полиномом отtan(x)
, а ее значение в 0 является ее постоянным членом.Мы рекурсивно выражаем коэффициент
tan(x)**j
вi
производной отtan
функцииf(i,j)
. Рекурсивное выражение происходит из отношенияtan(x)' = 1 + tan(x)**2
.Таким образом, производная от
tan(x)**j
ISТаким образом, вкладчики
tan(x)**j
вi
производную й имеютtan(x)**(j-1)
иtan(x)**(j+1)
в(i-1)
производную, каждый с коэффициентом, равным его степени. Это дает рекурсивное выражениеОбратите внимание, что нам не нужно исключать отрицательные показатели,
j
потому что они все равно обнуляются и не вносят вклад, потому что пересечениеj=0
дает множитель0
.Базовый случай
i==0
соответствует самомуtan(x)
себеj==1
, а в противном случае - нулевым коэффициентам. Окончательная оценка происходит при постоянном членеj=0
, который устанавливается как значение по умолчанию.источник
Mathematica, 20 байтов
Прямой подход. Рассчитайте n- ю производную tan (x) и оцените ее при x = 0 .
использование
источник
Haskell, 48 байтов
Мы можем вычислить
i
th-й коэффициент экспоненциальной производящей функции, дифференцируя времена касательной функцииi
и вычисляя при0
. Каждая производная является полиномом отtan(x)
, а значение в 0 является ее постоянным членом.Мы рекурсивно выражаем коэффициент
tan(x)^j
вi
производной отtan
функцииi%j
. Рекурсивное выражение происходит из отношенияtan(x)' = 1 + tan(x)^2
.Таким образом, производная от
tan(x)^j
ISТаким образом, вкладчики
tan(x)^j
вi
производную й имеютtan(x)^(j-1)
иtan(x)^(j+1)
в(i-1)
производную, каждый с коэффициентом, равным его степени.источник
Желе ,
1211 байтКак CJam ответ Питера Тейлора , это вычисляет п - й член Эйлера вверх / вниз последовательность , если п нечетно и специальные футляры даже н а 0 .
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
Sage, 26 байт
Как и другие решения в математически ориентированных языках, эта функция вычисляет
n
производную thtan(x)
и оценивает ее вx = 0
.Попробуйте онлайн
источник
J,
1513 байтТакже есть встроенная функция,
t:
которая вычисляет n- й коэффициент экспоненциальной производящей функции tan (x) .Спасибо @ Leaky Nun за напоминание о наречиях Тейлора в серии J, которые сохранили 2 байта.
Альтернатива для 15 байтов .
Другой подход состоит в том, чтобы вычислить n- ю производную tan (x) и оценить ее при x = 0 .
Примечание. В J объем памяти, используемой производной функцией,
d.
быстро увеличивается с ростом n до 10.использование
объяснение
источник
Юлия,
3937 байтСохранено 2 байта благодаря Денису.
Не самое короткое решение Джулии (см. Решение Денниса), но это делается исключительно с использованием производной логики ... в виде матриц.
В основном, он использует тот факт, что производная tan (x) равна 1 + tan (x) ^ 2. Таким образом, поскольку производная любой степени tan (x), скажем tan (x) ^ k, равна k tan (x) ^ (k-1) tan (x) '= k tan (x) ^ (k-1) + k tan (x) ^ (k + 1), мы можем использовать простую матричную степень на матрице с соответствующими значениями для генерации расширения, причем вторая строка или столбец (в зависимости от конструкции) содержат производные tan (x ) сам.
Поэтому нам просто нужно найти константу в результирующем выражении, и это первое значение в соответствующей строке или столбце.
источник
!n=(spdiagm((0:n,1:n+1),(1,-1))^n)[2]
должно сработать.spdiagm
что позволит такой стиль строительства - попробовалdiagm
, но, конечно, это не сработало.JavaScript (ES6),
12745 байтПорт решений @ xnor.
источник
Haskell,
9593 байтаЭто в основном реализация общей формулы с некоторыми незначительными оптимизациями.
источник
MATLAB с набором символов, 84 байта
Пример работы:
источник
Haskell (слишком много байтов)
Используя только операции по спискам и Раймонда Мандзони результат :
К сожалению, это переполняет скромные значения
n
, так как используетInt
значения. Я постараюсь исправить проблему, используяInteger
значения. До тех пор предложения приветствуются.источник
Аксиома, 46 байт
код для теста и результатов
источник