Si nous écrivons une séquence de nombres comme coefficients d'une série de puissances, alors cette série de puissances est appelée la fonction génératrice (ordinaire) (ou Gf) de cette séquence. Autrement dit, si pour une fonction F(x)
et une série d'entiers, a(n)
nous avons:
a(0) + a(1)x + a(2)x^2 + a(3)x^3 + a(4)x^4 + ... = F(x)
Alors F(x)
est la fonction génératrice de a
. Par exemple, la série géométrique nous dit que:
1 + x + x^2 + x^3 + x^4 + ... = 1/(1-x)
Ainsi, la fonction génératrice de 1, 1, 1, ...
est 1/(1-x)
. Si nous différencions les deux côtés de l'équation ci-dessus et multiplions par, x
nous obtenons l'égalité suivante:
x + 2x^2 + 3x^3 + 4x^4 + ... = x/(1-x)^2
Ainsi, la fonction génératrice de 1, 2, 3, ...
est x/(1-x)^2
. La génération de fonctions est un outil très puissant et vous pouvez faire beaucoup de choses utiles avec elles. Une brève introduction peut être trouvée ici , mais pour une explication vraiment approfondie, il y a l'étonnant livre générant une fonctionnalité.
Dans ce défi, vous prendrez une fonction rationnelle (le quotient de deux polynômes avec des coefficients entiers) comme entrée comme deux tableaux de coefficients entiers, d'abord le numérateur puis le dénominateur. Par exemple, la fonction f(x) = x / (1 - x - x^2)
sera codée comme [0, 1], [1, -1, -1]
dans l'entrée.
Compte tenu de cette entrée, votre programme doit imprimer à l'infini les coefficients de la série de puissance égale à la fonction de génération, un par ligne, en commençant par le coefficient de x
, puis x^2
, etc.
Exemples:
[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, ...
la source
Réponses:
Haskell , 63 octets
Essayez-le en ligne!
Définit un opérateur
%
renvoyant une liste de coefficients paresseux infinie. La liste est indexée zéro, donc le coefficient constant est inclus.la source
Mathematica, 64
8390octetsMerci à @ngenisis et @Jenny_mathy!
Prenez la saisie comme deux listes.
Besoin
Alt+.
de terminer l'exécution pour voir le résultat. Le frontend peut se bloquer en raison d'une sortie rapide.Version 83 octets (@Jenny_mathy):
la source
64
octets:Do[Echo@Limit[D[#/#2/i!&@@Fold[x#+#2&]/@#,{x,i}],x->0],{i,∞}]&
. Cela suppose que l'entrée est une liste de deux listes et que les coefficients sont dans l'ordre décroissant. Le seul intégré que je connaisse pour faire cev
qui est estInternal`FromCoefficientList
i
à l'intérieur du lambda. (D'un autre côté, je ne suis pas vraiment sûr de savoir si la capacité à courir à plusieurs reprises est pertinente lorsque le but est d'imprimer une liste infinie ... y a-t-il eu un méta-consensus à ce sujet?)Iterator {i,∞} does not have appropriate bounds
.CJam (22 octets)
Démo en ligne . Notez que comme beaucoup des réponses existantes, cela inclut le 0e coefficient dans la sortie.
Dissection
la source
Mathematica,
8679 octetsPrend la saisie sous forme de deux listes distinctes (coefficients du numérateur, coefficients du dénominateur). Si l'entrée peut être prise directement comme une fraction de polynômes plutôt que comme des listes de coefficients, cela peut être considérablement raccourci.
Il semble que cela
Do
puisse fonctionner avec des limites infinies dans la v11. Je ne peux pas tester cela localement, mais si c'est le cas, cette solution peut être raccourcie à 75 octets :la source
n
de 1 au lieu de0
, cela donne les mêmes résultats que votre solution; les deux échouent, cependant, sur l'avant-dernier cas de test, que cette solution réussit lors du démarragen
à partir de 0.Pyth , 23 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Pari / GP , 66 octets
Essayez-le en ligne!
la source