Étant donné deux listes d'entiers non vides , votre soumission doit calculer et renvoyer la convolution discrète des deux. Fait intéressant, si vous considérez les éléments de la liste comme des coefficients de polynômes, la convolution des deux listes représente les coefficients du produit des deux polynômes.
Définition
Étant donné les listes A=[a(0),a(1),a(2),...,a(n)]
et B=[b(0),b(1),b(2),...,b(m)]
(réglage a(k)=0 for k<0 and k>n
et b(k)=0 for k<0 and k>m
), la convolution des deux est définie comme A*B=[c(0),c(1),...,c(m+n)]
oùc(k) = sum [ a(x)*b(y) for all integers x y such that x+y=k]
Règles
- Tout formatage d'entrée et de sortie pratique pour votre langue est autorisé.
- Les fonctions intégrées pour la convolution, la création de matrices de convolution, la corrélation et la multiplication polynomiale ne sont pas autorisées.
Exemples
[1,1]*[1] = [1,1]
[1,1]*[1,1] = [1,2,1]
[1,1]*[1,2,1] = [1,3,3,1]
[1,1]*[1,3,3,1] = [1,4,6,4,1]
[1,1]*[1,4,6,4,1] = [1,5,10,10,5,1]
[1,-1]*[1,1,1,1,1] = [1,0,0,0,0,-1]
[80085,1337]*[-24319,406] = [-1947587115,7,542822]
[1,1]*[] = []
, et ne peut pas tenir pour[]*[] = ?
. La convolution n'est pas bien définie sur les listes vides. Je pense que vous devez garantir que les listes d'entrée ne sont pas vides.Réponses:
J,
108 octetsUsage:
Description: Le programme prend deux listes, crée une table de multiplication, puis ajoute les nombres sur les diagonales positives.
la source
MATL , 19 octets
Essayez-le en ligne!
Explication
Cela crée une matrice diagonale de bloc avec les deux entrées, inversant la première. Par exemple, avec des entrées
[1 4 3 5]
,[1 3 2]
la matrice estChaque entrée de la convolution est obtenue en décalant la première ligne d'une position vers la droite, en calculant le produit de chaque colonne et en additionnant tous les résultats.
En principe, le décalage doit être effectué avec un remplissage avec des zéros à partir de la gauche. De manière équivalente, un décalage circulaire peut être utilisé, car la matrice contient des zéros aux entrées appropriées.
Par exemple, le premier résultat est obtenu à partir de la matrice décalée
et est ainsi
1*1 == 1
. Le second est obtenu à partir deet est donc
4*1+1*3 == 7
, etc. Cela doit être faitm+n-1
fois, oùm
etn
sont les longueurs d'entrée. Le code utilise une boucle avec desm+n
itérations (qui économise quelques octets) et ignore le dernier résultat.la source
Haskell,
5549 octetsDéfinit un opérateur
#
.la source
[0,0..]
peut être(0<$b)
de donner exactement la longueur nécessaire, permettant le cas de base vide_#b=0<$b
.Matlab / Octave, 41 octets
Cela définit une fonction anonyme. Pour l'appeler, affectez-le à une variable ou utilisez
ans
.Essayez-le ici .
Explication
Cela exploite les faits
Le code calcule les racines des deux polynômes (fonction
roots
) et les concatène dans un tableau de colonnes. De là, il obtient les coefficients du polynôme produit avec une1
fonction ( leaderpoly
). Enfin, le résultat est multiplié par les coefficients de tête des deux polynômes.la source
Octave , 48 octets
Essayez-le ici .
Explication
La convolution discrète correspond à la multiplication des transformées de Fourier (en temps discret). Donc, une façon de multiplier les polynômes serait de les transformer, de multiplier les séquences transformées et de les retransformer.
Si la transformée de Fourier discrète (DFT) est utilisée à la place de la transformée de Fourier, le résultat est la convolution circulaire des séquences originales de coefficients polynomiaux. Le code suit cette route. Pour rendre la convolution circulaire égale à la convolution standard, les séquences sont complétées par un zéro et le résultat est tronqué.
la source
05AB1E ,
1817 octetsCode
Explication
La théorie derrière:
Pour trouver la convolution, nous allons prendre l'exemple
[1, 2, 3]
,[3, 4, 5]
. Nous positionnons les valeurs du premier tableau à l'envers et verticalement, comme ceci:Maintenant, nous plaçons le deuxième tableau comme une échelle et le multiplions par:
Résultat en:
Ensuite, nous les additionnons, ce qui donne:
Ainsi, la convolution est
[3, 10, 22, 22, 15]
.Le code lui-même:
Nous allons le faire étape par étape en utilisant le
[1, 2, 3]
,[3, 4, 5]
comme cas de test.Nous poussons d'abord
0
et ensuite nousE
évaluons le premier tableau d'entrée. Nous cartographions chaque élément en utilisantv
.Donc, pour chaque élément, nous poussons le deuxième tableau avec
²
puis la longueur du premier tableau en utilisant¹g
et diminuons cela de 1 (avec<
). Nous convertissons cela en une liste de zéros avec (longueur 1er tableau - 1) zéros, en l'utilisantÅ0
et en l'ajoutant à notre liste. Notre pile ressemble maintenant à ceci pour le premier élément de la liste d'entrée:On multiplie ce tableau par l'élément courant, fini avec
y*
. Après cela, nous poussonsN
, ce qui indique l'index de l'élément actuel (indexé zéro) et tournons le tableau autant de fois vers la droite en utilisantFÁ}
. Enfin, nous ajoutons cela à notre valeur initiale (0
). Donc, ce qui est essentiellement fait est le suivant:Qui est ensuite implicitement imprimé. Utilise l' encodage CP-1252 . Essayez-le en ligne! .
la source
Gelée , 9 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça fonctionne
la source
Husk , 5 octets
Essayez-le en ligne!
Remarque: Lorsque vous fournissez la liste zéro-polynôme / vide, vous devez spécifier son type (c'est-à-dire.
[]:LN
)!Explication
la source
Matlab, 33 octets
Essayez-le en ligne!
Crée une matrice de tous les produits élément par élément des entrées, puis additionne le long des diagonales. L'
,1
extrémité oblige matlab à additionner le long de la bonne direction lorsque l'un des vecteurs d'entrée a la longueur 1.Dans Octave
spdiags
ne fonctionne pas pour les vecteurs, ce qui entraîne une erreur lorsqu'une des entrées a une longueur 1. Matlab 2016b ou plus récent est requis pour l'expansion explicite du produit par élément.la source
Rubis, 83 octets
Presque directement tiré d' une réponse que j'ai faite plus tôt concernant l'expansion des racines dans un polynôme .
la source
Python, 90 octets
la source
JavaScript (ES6), 64 octets
Renvoie le tableau vide si l'une des entrées est vide. Basé sur ma réponse à Polynomialception .
la source
Julia,
6255 octetsEssayez-le en ligne!
la source
Clojure, 104 octets
La fusion
sorted-map
garantit que les valeurs sont retournées dans le bon ordre. Je souhaite qu'il y ait encore quelques cas de test.la source