Знайдіть коефіцієнти раціональної породжуючої функції


12

Якщо ми запишемо послідовність чисел як коефіцієнти ряду потужностей, то цей силовий ряд називається (звичайною) функцією, що генерує (або Gf) цієї послідовності. Тобто, якщо для деякої функції F(x)та ряду цілих чисел у a(n)нас є:

a(0) + a(1)x + a(2)x^2 + a(3)x^3 + a(4)x^4 + ... = F(x)

Тоді F(x)є генеруюча функція a. Наприклад, геометричний ряд говорить нам, що:

1 + x + x^2 + x^3 + x^4 + ... = 1/(1-x)

Отже, генеруюча функція 1, 1, 1, ...є 1/(1-x). Якщо ми диференціюємо обидві сторони рівняння вище та помножимо на xто, отримаємо таку рівність:

x + 2x^2 + 3x^3 + 4x^4 + ... = x/(1-x)^2

Отже, генеруюча функція 1, 2, 3, ...є x/(1-x)^2. Функції генерації - це дуже потужний інструмент, і ви можете зробити багато корисних речей з ними. Короткий вступ можна знайти тут , але для дійсно ґрунтовного пояснення існує дивовижна книга, що генерує функціоналогію.


У цьому виклику ви скористаєтесь раціональною функцією (коефіцієнт двох многочленів з цілими коефіцієнтами) як вхід у вигляді двох масивів цілочисельних коефіцієнтів, спочатку чисельник, а потім знаменник. Наприклад, функція f(x) = x / (1 - x - x^2)буде закодована як [0, 1], [1, -1, -1]у вході.

З огляду на цей вхід, ваша програма повинна нескінченно друкувати коефіцієнти ряду потужностей, що дорівнює функції генерування, по одному на рядок, починаючи з коефіцієнта x, потім x^2і т.д.


Приклади:

[1], [1, -1] -> 1, 1, 1, 1, 1, 1, 1, ...
[1], [2, -2] -> 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, ...
[0, 1], [1, -2, 1] -> 1, 2, 3, 4, 5, 6, 7, 8, ...
[0, 1], [1, -1, -1] -> 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
[1], [1, -2] -> 1, 2, 4, 8, 16, 32, 64, 128, ...
[0, 1, 1], [1, -3, 3, -1] -> 1, 4, 9, 16, 25, 36, ...

Лайно, моя мова побудована для таких послідовностей, але я не можу реально вводити багатовимірний масив :(
Stephen

2
Я справді просто недостатньо математично налаштований на цю специфікацію, будь-який шанс ви могли б опублікувати більше пояснень для неспеціалістів для нас, звичайних людей?
Skidsdev


1
@trichoplax Це завжди змушує чисельник дорівнювати 1, що не однаково. Наприклад, він не може виразити мій останній приклад, квадрати.
orlp

1
Альтернативний спосіб фразування цього полягає в тому, що він оцінює загальну лінійну рекурсію. Таким чином, воно узагальнює це питання і може слугувати цілеспрямованою ціллю для майбутніх запитань щодо рецидивів.
Пітер Тейлор

Відповіді:



3

Математика, 64 83 90 байт

Do[Echo@Limit[D[#/#2/i!&@@Fold[x#+#2&]/@#,{x,i}],x->0],{i,∞}‌​]&

Дякуємо @ngenisis та @Jenny_mathy!

Візьміть дані як два списки.

Потрібно Alt+.припинити виконання, щоб побачити результат. Frontend може вийти з ладу через швидкий вихід.

83-байтна версія (@Jenny_mathy):

i=1;v=Tr[#*x^Range@Length@#]&;While[1<2,Echo@Limit[D[v@#/v@#2/i!,{x,i}],x->0];i++]&

83 байти: i = 1; v = Tr [# * x ^ Діапазон @ Довжина @ #] &; У той час як [1 <2, Echo @ Limit [D [v @ # / v @ # 2 / i !, {x, i}], x -> 0]; i ++] &
J42161217

@Jenny_mathy Вибачте за турботу. Я розумію, що у вашому першому коментарі є кілька непомітних символів Unicode. Після очищення код у порядку.
Кейу Ган

3
64байт: Do[Echo@Limit[D[#/#2/i!&@@Fold[x#+#2&]/@#,{x,i}],x->0],{i,∞}]&. Це передбачає, що вхід є списком з двох списків, а коефіцієнти у порядку зменшення. Тільки вбудований я НЕ знаю, щоб робити те , що vробитьInternal`FromCoefficientList
ngenisis

Чи працює це повторно? Я думаю, що для введення iв лямбда може знадобитися кілька додаткових дужок . (З іншого боку, я не дуже впевнений, чи є можливість повторного запуску актуальною, коли мета - надрукувати нескінченний список ... чи був мета консенсус щодо цього?)
Julian Wolf

@ngenisis: Яку версію ви використовуєте? На v10.0 ваше рішення дає мені Iterator {i,∞} does not have appropriate bounds.
Джуліан Вольф

1

CJam (22 байти)

{\{(W$(@\/_pW*f*.+1}g}

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

Розсічення

{           e# Define a block which takes numerator N and denominator D as arguments
  \         e# Flip to put D at the bottom, since that won't change
  {         e# Infinite loop:
    (       e#   Pop the first element of (the modified) N
    W$(     e#   Copy D and pop its first element
            e#   Stack: D N[1:] N[0] D[1:] D[0]
    @\/     e#   Bring N[0] to top, flip, divide
            e#   Stack: D N[1:] D[1:] N[0]/D[0]
    _p      e#   Print a copy
    W*f*.+  e#   Multiply by -1, multiply all, pointwise add
            e#   Stack: D N[1:]-(N[0]/D[0])*D[1:]
  1}g
}

0

Математика, 86 79 байт

f=x^Range@Length@#.#&;For[n=1,8>3,Print@SeriesCoefficient[f@#/f@#2,{x,0,n++}]]&

Вводиться як два окремі списки (коефіцієнти чисельника, коефіцієнти знаменника). Якщо вхід можна сприймати безпосередньо як частину многочленів, а не як списки коефіцієнтів, це можна значно скоротити.

Здається, що Doможна працювати з нескінченними межами в v11. Я не можу перевірити це локально, але, якщо це так, то це рішення можна скоротити до 75 байт :

f=x^Range@Length@#.#&;Do[Print@SeriesCoefficient[f@#/f@#2,{x,0,n}],{n,∞}]&

останній тестовий випадок не починається з 0.
J42161217

@Jenny_mathy: стріляй, дякую за голови вгору. Схоже, тестові випадки очікують, що починаються з першого замість нуля ... Досить впевнений, що це повинно дозволити мені зберегти кілька байт.
Джуліан Вольф

@Jenny_mathy: Я думаю, що тестові випадки можуть бути химерними. Починаючи nз 1 замість цього 0, це дає ті самі результати, що і ваше рішення; обидва не вдається, проте, у другому за останнім тестовому випадку, який це рішення проходить, починаючи nз 0.
Джуліан Вольф

0

Pyth , 23 байти

JE#
KchQhJ=t-M.t,Q*LKJ0

Спробуйте в Інтернеті!

Як це працює

                       Q = eval(input())
JE                     J = eval(input())
  #                    infinite loop:
 chQhJ                   Q[0]/J[0]
K                        assign that to K (and print it, because of the preceding newline)
              *LKJ       K times every element of J
            ,Q           [Q, that]
          .t      0      transpose, padding with 0s
        -M               subtract each pair
       t                 remove the first element
      =                  assign that back to Q

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