Абсолютные суммы полиномиальных коэффициентов Сиди

28

Задний план

Полином Сиди степени n - или (n + 1) -ый полином Сиди - определяется следующим образом.

определение полиномов Сиди

Полиномы Сиди имеют несколько интересных свойств, но и их коэффициенты. Последние образуют последовательность OEIS A075513 .

задача

Напишите полную программу или функцию, которая, учитывая неотрицательное целое число n , печатает или возвращает абсолютную сумму коэффициентов полинома Сиди степени n , то есть

определение предполагаемого выхода

Эти суммы образуют последовательность OEIS A074932 .

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

Поскольку это , вы должны сделать свой код как можно короче. Все стандартные правила применяются.

Контрольные примеры (на основе 0)

 n           Σ

 0           1
 1           3
 2          18
 3         170
 4        2200
 5       36232
 6      725200
 7    17095248
 8   463936896
 9 14246942336

Контрольные примеры (на основе 1)

 n           Σ

 1           1
 2           3
 3          18
 4         170
 5        2200
 6       36232
 7      725200
 8    17095248
 9   463936896
10 14246942336
Деннис
источник

Ответы:

46

Python 2 , 43 байта

f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)

Попробуйте онлайн!

Другой подход

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

Представьте себе игровое шоу с k + m кандидатами, которое работает следующим образом.

В первом раунде все кандидаты должны выполнить определенную задачу как можно быстрее. В K кандидаты которые выполняют задачу быстрее всего выиграть 1 K $ (один kilodollar) каждый и продвижение в 3 -м раунде.

Во втором раунде m оставшихся кандидатов получают второй шанс присоединиться к другому k . Каждому кандидату задают вопрос. Если они ответят на вопрос правильно, они выиграют 1 k $ и перейдут к 3 раунду. Однако, если они не ответят на вопрос, они будут исключены из игры. Это означает, что в третьем раунде будет от k до k + m кандидатов, в зависимости от того, сколько из них сможет ответить на их вопросы.

3-й тур состоит из m конкурсов, похожих на 1-й. В каждом конкурсе участники должны выполнить определенную задачу. В отличие от 1 тура, только один кандидат получает приз, но все кандидаты получают право участвовать в следующем конкурсе. Каждый конкурс платит вдвое больше, чем конкурс до него; первый платит 2 k $, а последний 2 m k $ .

Обратите внимание, что, поскольку все призы являются степенями двух, знание того, сколько призовых денег заработал кандидат, означает, что мы знаем, продвинулись ли они в 3-й раунд и в каком из конкурсов 3-го тура они выиграли.

Предположим, вы смотрите игровое шоу, и первый тур уже завершен, поэтому вы знаете, какие k кандидатов уже достигли третьего раунда и какие m кандидатов все еще застряли во втором раунде. Каким образом можно распределить оставшиеся призовые деньги?

После того, как мы знаем , какой из второго раунда м кандидатов выдвигали в 3 -м раунде, легко рассчитать возможные результаты для этого конкретного сценария. Если J кандидатов заранее, есть к + J всего кандидатов в 3 -м раунде, и , таким образом , к + J возможные результаты для каждого конкурса. Если в третьем раунде будет m индивидуальных соревнований, это даст (k + j) m результатов для всех m соревнований.

Теперь j может принимать любое значение от 0 до m , в зависимости от того, какие кандидаты правильно ответят в раунде 2. Для каждого фиксированного значения j есть m C j различных комбинаций j кандидатов, которые могли бы перейти в раунд 3. Если мы вызовем Общее количество возможных результатов для k раунда 3 кандидатов и m раунда 2 кандидатов g (m, k) , мы получаем следующую формулу.

формула для г

Если мы исправим k = 1 , мы получим следующий частный случай, который составляет наш новый подход к решению исходной задачи.

отношения между Сигмой и г

Рекурсивная формула

Теперь предположим , что вы заснули во время рекламы после того, как 1 -м раунде, и проснулся как раз вовремя , чтобы увидеть , кто выиграл последний конкурс круглого 3 и , таким образом , главный приз 2 м K $ . У вас нет никакой другой информации, даже того, сколько призовых денег в итоге выиграл кандидат. Как можно распределить оставшиеся призовые деньги?

Если победителем стал один из m кандидатов во 2- м туре, мы уже сейчас должны были перейти в 3-й тур . Таким образом, у нас фактически есть k + 1 кандидатов в 3 раунде, но только m - 1 кандидатов в раунде 2. Так как мы знаем победителя последнего конкурса, есть только m - 1 конкурсы с неопределенными результатами, поэтому есть g (m - 1, к + 1) возможные результаты.

Если победителем является один из k кандидатов, пропустивших раунд 2, расчет становится немного сложнее. Как и прежде, осталось только m - 1 тур , но теперь у нас все еще есть k кандидатов в 3 туре и m кандидатов в 2 туре. Так как количество кандидатов в раунде 2 и количество конкурсов в раунде 3 разные, возможные результаты не могут рассчитываться с помощью простого вызова g . Тем не менее, после первого тура 2 кандидата ответили - правильно или нет - количество кандидатов в 2 раунде еще раз соответствует m - 1 раунду 3 конкурса. Если кандидат выдвигается, есть k + 1 раунд 3 кандидата и, таким образом, g (m - 1, k + 1)возможные результаты; если кандидат исключен, число кандидатов в 3 раунде остается на уровне k, и возможны g (m - 1, k) результатов. Поскольку кандидат продвигается или нет, существует g (m - 1, k + 1) + g (m - 1, k) возможных результатов, объединяющих эти два случая.

Теперь, если мы добавим потенциальные результаты для всех k + m кандидатов, которые могли бы выиграть главный приз, результат должен соответствовать g (m, k) . Есть m участников раунда 2, которые приводят к g (m - 1, k + 1) потенциальным результатам каждый, и участники k раунда 3, которые приводят к g (m - 1, k + 1) + g (m - 1, k) из них. Подводя итог, мы получаем следующую идентичность.

рекурсивная формула для г

Вместе с базовым корпусом

базовый вариант для г

Эти две формулы полностью характеризуют функцию g .

Реализация гольфа

В то время как

g=lambda m,k=1:0**m or(m+k)*g(m-1,k+1)+k*g(m-1,k)

(49 байтов, 0**mдает 1 раз m падает до 0 ) или даже

g=lambda m,k=1:m<1 or(m+k)*g(m-1,k+1)+k*g(m-1,k)

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

Если мы определим функцию f, которая принимает число n кандидатов в 1 раунд вместо числа m кандидатов в 2 раунд в качестве первого аргумента, т.е.

определение е с точки зрения г

мы получаем рекурсивную формулу

рекурсивная формула для f

с базовым случаем

Базовый случай для F

Наконец, мы имеем

отношения между Сигмой и е

поэтому реализация Python

f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)

( k/nдает 1 раз при n = k ) решает задачу под рукой с индексированием на основе 1.

Деннис
источник
8

Mathematica, 33 32 байта

Сохранено один байт благодаря JungHwan Мин .

Binomial[#,r=0~Range~#].(r+1)^#&
alephalpha
источник
3

MATL , 12 байт

t:XnG:QG^*sQ

Ввод на основе 0.

Попробуйте онлайн!

объяснение

Рассмотрим ввод 5в качестве примера.

t      % Take n implicitly. Duplicate
       % STACK: 5, 5
:      % Range [1 2 ...n]
       % STACK: 5, [1 2 3 4 5]
Xn     % N-choose-k, vectorized
       % STACK: [5 10 10 5 1]
G:Q    % Push [2 3 ... n+1]
       % STACK: [5 10 10 5 1], [2 3 4 5 6]
G^     % Raise to n
       % STACK: [5 10 10 5 1], [32 243 1024 3125 7776]
*      % Multiply, element-wise
       % STACK: [160 2430 10240 15625 7776]
s      % Sum of array
       % STACK: 36231
Q      % Add 1. Display implicitly
       % STACK: 36232
Луис Мендо
источник
2

R, 36 байт

sum(choose(n<-scan(),0:n)*(0:n+1)^n)

Здесь векторизация R очень удобна при применении формулы.

Billywob
источник
2

J , 19 байт

+/@((!{:)*>:^{:)@i.

Использует индексацию по одному.

Попробуйте онлайн!

объяснение

+/@((!{:)*>:^{:)@i.  Input: integer n
                 i.  Range [0, 1, ..., n-1]
   (           )@    Operate on that range
             {:        Get the last value, n-1
          >:           Increment, range becomes [1, 2, ..., n]
            ^          Exponentiate. [1^(n-1), 2^(n-1), ..., n^(n-1)]
    ( {:)              Get the last value, n-1
     !                 Binomial coefficient. [C(n-1, 0), C(n-1, 1), ..., C(n-1, n-1)]
         *             Multiply
+/@                  Reduce by addition
миль
источник
1

Максима, 39 байт

f(n):=sum(binomial(n,k)*(k+1)^n,k,0,n);
rahnema1
источник
1

PARI / GP, 35 байт

n->sum(k=0,n,binomial(n,k)*(k+1)^n)
alephalpha
источник
0

Аксиома, 39 байт

f(n)==sum(binomial(n,i)*(i+1)^n,i=0..n)

код теста и результаты

(35) -> [[i,f(i)] for i in 0..9]
   (35)
   [[0,1], [1,3], [2,18], [3,170], [4,2200], [5,36232], [6,725200],
    [7,17095248], [8,463936896], [9,14246942336]]
RosLuP
источник
0

Желе , 9 байт

cR×R‘*ƊS‘

Попробуйте онлайн!

Как это работает

cR×R‘*ƊS‘ - Main link. Argument: n (integer)        e.g.   5
 R        - Range from 1 to n                              [1, 2, 3, 4, 5]
c         - Binomial coefficient                           [5, 10, 10, 5, 1]
      Ɗ   - Last three links as a monad:
   R      -   Link 1: Range from 1 to n                    [1, 2, 3, 4, 5]
    ‘     -   Link 2: Increment                            [2, 3, 4, 5, 6]
     *    -   Link 3: To the power of n                    [32, 243, 1024, 3125, 7776]
  ×       - Multiply, pairwise                             [160, 2430, 10240, 15625, 7776]
       S  - Sum                                            36231
        ‘ - Increment                                      36232

источник