Абсолютні суми коефіцієнтів поліномів Сіді


28

Фон

Поліном Сіді ступеня n - або (n + 1) многочлен Сіді - визначається наступним чином.

визначення многочленів Сіді

Поліноми Сіді мають кілька цікавих властивостей, але так само і їх коефіцієнти. Останні утворюють OEIS-послідовність A075513 .

Завдання

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

визначення запланованого виходу

Ці суми утворюють OEIS-послідовність A074932 .

Якщо ви віддаєте перевагу індексації на основі 1, ви можете взяти замість цього додатне ціле n і обчислити абсолютну суму коефіцієнтів n- го многочлена Sidi.

Оскільки це , ви повинні зробити свій код якомога коротшим. Діють усі стандартні правила.

Тестові приклади (на основі 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 к $ і переходять до третього раунду. Однак, якщо вони не зможуть відповісти на питання, вони виключаються з гри. Це означає, що 3 раунд матиме кандидатів від k до k + m , залежно від того, скільки може відповісти на їх запитання.

3 раунд складається з m більше змагань, схожих на раунд 1. У кожному конкурсі учасники повинні виконати певне завдання. На відміну від першого туру, лише один кандидат отримує приз, але всі кандидати отримують участь у наступному конкурсі. Кожен конкурс платить вдвічі більше, ніж змагання перед ним; перший платить 2 k $, а останній 2 m k $ .

Зауважте, що оскільки всі призи - це сили на дві, знаючи, скільки призових грошей заробив кандидат, ми знаємо, чи перейшли до 3-го туру і в якому з конкурсів 3-го туру вони виграли.

Припустимо , що ви дивитеся гри шоу і раунд 1 вже закінчився, так що ви знаєте , які K кандидати вже досягли раунд 3 і який м кандидати все ще застрягли в круглих 2. Скількома способами можна розподілити залишилися призові гроші?

Після того, як ми знаємо , який з другого раунду м кандидатів висували в 3 -му раунді, легко розрахувати можливі результати для цього конкретного сценарію. Якщо j кандидати висуваються, то в 3 раунді є всього k + j кандидатів, і таким чином k + j можливі результати для кожного конкурсу. З m індивідуальних змагань у 3 раунді це робить (k + j) m результатами для всіх m змагань.

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

формула для g

Якщо ми зафіксуємо k = 1 , отримаємо такий спеціальний випадок, який є нашим новим підходом до вирішення вихідної проблеми.

зв’язок між Сигмою та g

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

А тепер припустимо, що ви заснули під час рекламних роликів після 1 раунду, і прокинулися якраз вчасно, щоб побачити, хто виграв останній конкурс 3 раунду і, таким чином, великий приз у 2 млн. Доларів . Ви не маєте жодної іншої інформації, навіть того, скільки призових коштів виграв цей кандидат в цілому. Скількома способами можна розподілити решту грошових призів?

Якщо переможець був одним із m кандидатів у 2 раунді, ми вже тепер, коли вони, мабуть, перейшли до 3-го туру . Таким чином, ми фактично маємо k + 1 кандидатів у 3 раунді, але лише m - 1 кандидат у другому раунді. Оскільки ми знаємо переможця останнього конкурсу, є лише m - 1 конкурсів із невизначеними результатами, тому є g (m - 1, k + 1) можливі результати.

Якщо переможець є одним із k кандидатів, які пропустили 2 раунд, обчислення стає трохи складніше. Як і раніше, залишилось лише m - 1 раунд, але тепер у нас все ще k кандидатів у 3 турі та m кандидатів у другому раунді. Оскільки кількість кандидатів у 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

ці дві формули повністю характеризують функцію 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 з точки зору g

ми отримуємо рекурсивну формулу

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

з базовим корпусом

базовий корпус для 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.




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 корисна при застосуванні формули.


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



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]]

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.