Jeśli napiszemy sekwencję liczb jako współczynniki szeregu mocy, wówczas ta seria mocy nazywana jest (zwykłą) funkcją generującą (lub Gf) tej sekwencji. To znaczy, jeśli dla niektórych funkcji F(x)
i serii liczb całkowitych a(n)
mamy:
a(0) + a(1)x + a(2)x^2 + a(3)x^3 + a(4)x^4 + ... = F(x)
Następnie F(x)
jest funkcja generowania a
. Na przykład szereg geometryczny mówi nam, że:
1 + x + x^2 + x^3 + x^4 + ... = 1/(1-x)
Więc funkcja generująca 1, 1, 1, ...
to 1/(1-x)
. Jeśli rozróżnimy obie strony powyższego równania i pomnożymy przez x
to otrzymamy następującą równość:
x + 2x^2 + 3x^3 + 4x^4 + ... = x/(1-x)^2
Więc funkcja generująca 1, 2, 3, ...
to x/(1-x)^2
. Generowanie funkcji jest bardzo potężnym narzędziem i można z nimi zrobić wiele przydatnych rzeczy. Krótkie wprowadzenie można znaleźć tutaj , ale dla naprawdę dokładnego wyjaśnienia istnieje niesamowita funkcjonalność generowania książek.
W tym wyzwaniu weźmiesz funkcję racjonalną (iloraz dwóch wielomianów ze współczynnikami całkowitymi) jako dane wejściowe jako dwie tablice współczynników całkowitych, najpierw licznik, a następnie mianownik. Na przykład funkcja f(x) = x / (1 - x - x^2)
zostanie zakodowana jak [0, 1], [1, -1, -1]
na wejściu.
Biorąc pod uwagę te dane wejściowe, twój program musi nieskończenie drukować współczynniki szeregu mocy, które są równe funkcji generowania, jeden na linię, zaczynając od współczynnika x
, a następnie x^2
itd.
Przykłady:
[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, ...
źródło
Odpowiedzi:
Haskell , 63 bajty
Wypróbuj online!
Definiuje operator
%
zwracający nieskończoną leniwą listę współczynników. Lista jest indeksowana od zera, więc uwzględniono stały współczynnik.źródło
Mathematica, 64
8390bajtyDzięki @ngenisis i @Jenny_mathy!
Weź dane jako dwie listy.
Musisz
Alt+.
zakończyć wykonywanie, aby zobaczyć wynik. Frontend może ulec awarii z powodu szybkiego wyjścia.Wersja 83 bajtów (@Jenny_mathy):
źródło
64
bajtów:Do[Echo@Limit[D[#/#2/i!&@@Fold[x#+#2&]/@#,{x,i}],x->0],{i,∞}]&
. Zakłada się, że dane wejściowe są listą dwóch list, a współczynniki są uporządkowane w kolejności malejącej. Jedyne, co wiem, żeby robić to, cov
robi, toInternal`FromCoefficientList
i
w lambda. (Z drugiej strony nie jestem do końca pewien, czy zdolność do wielokrotnego biegania jest istotna, gdy celem jest wydrukowanie nieskończonej listy ... czy w tej sprawie osiągnięto meta konsensus?)Iterator {i,∞} does not have appropriate bounds
.CJam (22 bajty)
Demo online . Zauważ, że jak wiele istniejących odpowiedzi, obejmuje to 0-ty współczynnik na wyjściu.
Sekcja
źródło
Mathematica,
8679 bajtówPobiera dane wejściowe jako dwie osobne listy (współczynniki licznika, współczynniki mianownika). Jeśli dane wejściowe można przyjąć bezpośrednio jako ułamek wielomianów, a nie jako listy współczynników, można to znacznie skrócić.
Wygląda na to, że
Do
może działać z nieograniczonymi granicami w wersji 11. Nie mogę przetestować tego lokalnie, ale jeśli tak jest, to rozwiązanie można skrócić do 75 bajtów :źródło
n
od 1 zamiast0
, daje to takie same wyniki jak rozwiązanie; oba kończą się niepowodzeniem w drugim do ostatniego przypadku testowym, który to rozwiązanie przechodzi, gdy zaczyna sięn
od 0.Pyth , 23 bajty
Wypróbuj online!
Jak to działa
źródło
Pari / GP , 66 bajtów
Wypróbuj online!
źródło