Étant donné deux polynômes f,g
de degré arbitraire sur les entiers, votre programme / fonction doit évaluer le premier polynôme du deuxième polynôme. f(g(x))
(alias la composition (fog)(x)
des deux polynômes)
Détails
Les Builtins sont autorisés. Vous pouvez assumer toute mise en forme raisonnable comme entrée / sortie, mais le format d'entrée et de sortie doit correspondre. Par exemple, formatage sous forme de chaîne
x^2+3x+5
ou comme liste de coefficients:
[1,3,5] or alternatively [5,3,1]
De plus, les polynômes d'entrée peuvent être supposés être entièrement développés, et les sorties devraient également être complètement développées.
Exemples
A(x) = x^2 + 3x + 5, B(y) = y+1
A(B(y)) = (y+1)^2 + 3(y+1) + 5 = y^2 + 5y + 9
A(x) = x^6 + x^2 + 1, B(y) = y^2 - y
A(B(y))= y^12 - 6y^11 + 15y^10 - 20y^9 + 15y^8 - 6y^7 + y^6 + y^4 - 2 y^3 + y^2 + 1
A(x) = 24x^3 - 144x^2 + 288x - 192, B(y) = y + 2
A(B(y)) = 24y^3
A(x) = 3x^4 - 36x^3 + 138x^2 - 180x + 27, B(y) = 2y + 3
A(B(y)) = 48y^4 - 96y^2
(.)
est une réponse dans Haskell. Vous voulez probablement dire une représentation de la liste des coefficients.Réponses:
Haskell,
8672 octetsDéfinit une fonction
o
telle queo g f
calcule la composition f ∘ g. Les polynômes sont représentés par une liste non vide de coefficients commençant au terme constant.Démo
Comment ça marche
Pas de bibliothèques ou de programmes intégrés liés aux polynômes. Observez les récidives similaires
f (x) = a + f₁ (x) x ⇒ f (x) g (x) = ag (x) + f₁ (x) g (x) x,
f (x) = a + f₁ (x) x ⇒ f (g (x)) = a + f₁ (g (x)) g (x),
pour la multiplication et la composition polynomiales, respectivement. Ils prennent tous les deux la forme
f (x) = a + f₁ (x) x ⇒ W (f) (x) = C (a) (x) + U (W (f₁)) (x).
L'opérateur
!
résout une récurrence de cette forme pour W étant donné U et C, en utilisantzipWith(+).(++[0,0..])
pour l'addition polynomiale (en supposant que le deuxième argument est plus long - pour nos besoins, il le sera toujours). Ensuite,(0:)
multiplie un argument polynomial par x (en ajoutant un coefficient nul);(<$>g).(*)
multiplie un argument scalaire par le polynômeg
;(0:)!((<$>g).(*))
multiplie un argument polynomial par le polynômeg
;pure
lève un argument scalaire en un polynôme constant (liste singleton);(0:)!((<$>g).(*))!pure
compose un argument polynomial avec le polynômeg
.la source
Mathematica, 17 octets
Exemple d'utilisation:
la source
TI-Basic 68k, 12 octets
L'utilisation est simple, par exemple pour le premier exemple:
Qui revient
la source
→
d'avoir 1 octet dans TI-BASIC?Python 2, 138
156 162octetsLes entrées devraient être des listes entières avec les plus petites puissances en premier.
Non golfé:
Dans ce calcul, les coefficients polynomiaux sont considérés comme des chiffres (qui peuvent être négatifs) d'un nombre dans une très grande base. Une fois les polynômes dans ce format, la multiplication ou l'addition est une opération à un seul entier. Tant que la base est suffisamment grande, il n'y aura aucun report qui se répandra dans les chiffres voisins.
-18 de l'amélioration liée
B
comme suggéré par @xnor.la source
B
, serait-10**len(`a+b`)
ce suffisant?Python + SymPy,
5935 octetsMerci à @asmeurer d'avoir joué au golf 24 octets!
Essai
la source
compose()
fonction.from module import*;function
était une soumission valable. Quoi qu'il en soit, il s'agit d'une politique plus récente, qui autorise les importations et les fonctions d'assistance avec des lambdas sans nom.Sauge, 24 octets
Depuis Sage 6.9 (la version qui s'exécute sur http://sagecell.sagemath.org ), les appels de fonction sans affectation d'argument explicite (
f(2) rather than f(x=2)
) provoquent l'impression d'un message ennuyeux et inutile sur STDERR. Parce que STDERR peut être ignoré par défaut dans le code golf, cela est toujours valide.Ceci est très similaire à la réponse SymPy de Dennis parce que Sage est a) construit sur Python et b) utilise Maxima , un système d'algèbre informatique très similaire à SymPy à bien des égards. Cependant, Sage est beaucoup plus puissant que Python avec SymPy, et est donc un langage suffisamment différent pour qu'il mérite sa propre réponse.
Vérifiez tous les cas de test en ligne
la source
PARI / GP , 19 octets
ce qui vous permet de faire
obtenir
la source
MATLAB avec Symbolic Toolbox, 28 octets
Il s'agit d'une fonction anonyme. Pour l'appeler, affectez-le à une variable ou utilisez
ans
. Les entrées sont des chaînes au format (les espaces sont facultatifs)Exemple d'exécution:
la source
Python 2,
239232223 octetsUne mise en œuvre «correcte» qui n'abuse pas des bases. Coefficient le moins significatif en premier.
a
est l'additionm
polynomiale, la multiplication polynomiale et lao
composition.la source
m([c],e(m,[[1]]+[g]*k))
pas la même chose quee(m,[[c]]+[g]*k)
?a=lambda*l:map(lambda x,y:(x or 0)+(y or 0),*l)
( or 0)
dans cette version.JavaScript (ES6),
150103 octetsAccepte et renvoie les polynômes sous forme de tableau a = [a 0 , a 1 , a 2 , ...] qui représente un 0 + a 1 * x + a 2 * x 2 ...
Edit: sauvé 47 octets en passant de la multiplication polynomiale récursive à itérative, ce qui m'a ensuite permis de fusionner deux
map
appels.Explication: r est le résultat, qui commence à zéro, représenté par un tableau vide, et p est g h , qui commence à un. p est multiplié par chaque f h à son tour, et le résultat accumulé dans r . p est également multiplié par g en même temps.
la source
Pyth,
5134 octetsSuite de tests .
la source
Ruby 2,4 + polynôme , 41 + 12 = 53 octets
Utilise le drapeau
-rpolynomial
. L'entrée est deuxPolynomial
objets.Si quelqu'un me surpasse en Ruby vanille (pas de bibliothèque externe polynomiale), je serai très impressionné.
la source