Dadas duas listas de números inteiros não vazias , seu envio deve calcular e retornar a convolução discreta dos dois. Curiosamente, se você considerar os elementos da lista como coeficientes de polinômios, a convolução das duas listas representa os coeficientes do produto dos dois polinômios.
Definição
Dadas as listas A=[a(0),a(1),a(2),...,a(n)]
e B=[b(0),b(1),b(2),...,b(m)]
(definição a(k)=0 for k<0 and k>n
e b(k)=0 for k<0 and k>m
), a convolução das duas é definida como A*B=[c(0),c(1),...,c(m+n)]
ondec(k) = sum [ a(x)*b(y) for all integers x y such that x+y=k]
Regras
- Qualquer formatação conveniente de entrada e saída para o seu idioma é permitida.
- Não são permitidos embutidos para convolução, criação de matrizes de convolução, correlação e multiplicação polinomial.
Exemplos
[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]*[] = []
e não pode ser válido para[]*[] = ?
. A convolução não está bem definida em listas vazias. Eu acho que você deve garantir que as listas de entrada não sejam vazias.Respostas:
J,
108 bytesUso:
Descrição: o programa pega duas listas, faz uma tabela de multiplicação e depois adiciona os números nas diagonais positivas.
fonte
MATL , 19 bytes
Experimente online!
Explicação
Isso cria uma matriz diagonal de bloco com as duas entradas, revertendo a primeira. Por exemplo, com entradas
[1 4 3 5]
,[1 3 2]
a matriz éCada entrada da convolução é obtida deslocando a primeira linha uma posição para a direita, computando o produto de cada coluna e somando todos os resultados.
Em princípio, a mudança deve ser feita preenchendo com zeros a partir da esquerda. Equivalentemente, o deslocamento circular pode ser usado, porque a matriz contém zeros nas entradas apropriadas.
Por exemplo, o primeiro resultado é obtido da matriz deslocada
e é assim
1*1 == 1
. O segundo é obtido dee é assim
4*1+1*3 == 7
, etc. Isso deve ser feitom+n-1
vezes, ondem
en
são os comprimentos de entrada. O código usa um loop comm+n
iterações (que economiza alguns bytes) e descarta o último resultado.fonte
Haskell,
5549 bytesDefine um operador
#
.fonte
[0,0..]
pode ser(0<$b)
para fornecer exatamente o comprimento necessário, permitindo o estojo de base vazio_#b=0<$b
.Matlab / Octave, 41 bytes
Isso define uma função anônima. Para chamá-lo, atribua a uma variável ou use
ans
.Experimente aqui .
Explicação
Isso explora os fatos que
O código calcula as raízes dos dois polinômios (função
roots
) e concatena-os em uma matriz de colunas. A partir disso, obtém os coeficientes do polinômio do produto com uma liderança1
(funçãopoly
). Finalmente, o resultado é multiplicado pelos coeficientes principais dos dois polinômios.fonte
Oitava , 48 bytes
Experimente aqui .
Explicação
Convolução discreta corresponde à multiplicação das transformadas de Fourier (em tempo discreto). Portanto, uma maneira de multiplicar os polinômios seria transformá-los, multiplicar as seqüências transformadas e transformar de volta.
Se a transformada de Fourier discreta (DFT) for usada em vez da transformada de Fourier, o resultado será a convolução circular das seqüências originais dos coeficientes polinomiais. O código segue esta rota. Para tornar a convolução circular igual à convolução padrão, as seqüências são preenchidas com zero e o resultado é aparado.
fonte
05AB1E ,
1817 bytesCódigo
Explicação
A teoria por trás:
Para encontrar a convolução, vamos dar o exemplo
[1, 2, 3]
,[3, 4, 5]
. Posicionamos os valores da primeira matriz de cabeça para baixo e verticalmente, assim:Agora, colocamos a segunda matriz como uma escada e a multiplicamos por:
Resultando em:
Em seguida, adicionamos-os, resultando em:
Então, a convolução é
[3, 10, 22, 22, 15]
.O código em si:
Vamos fazer isso passo a passo usando o
[1, 2, 3]
,[3, 4, 5]
como o caso de teste.Primeiro pressionamos
0
e depois avaliamosE
a primeira matriz de entrada. Mapeamos cada elemento usandov
.Portanto, para cada elemento, pressionamos a segunda matriz com
²
e, em seguida, o comprimento da primeira matriz, usando-a¹g
e diminuindo-a em 1 (com<
). Convertemos isso em uma lista de zeros com (comprimento 1ª matriz - 1) zeros, usandoÅ0
e anexando isso à nossa lista. Nossa pilha agora se parece com isso no primeiro item da lista de entrada:Multiplicamos essa matriz pelo item atual, feito com
y*
. Depois disso, pressionamosN
, que indica o índice do item atual (indexado a zero) e rotacionamos o array muitas vezes para a direita usandoFÁ}
. Finalmente, adicionamos isso ao nosso valor inicial (0
). Então, o que basicamente é feito é o seguinte:Que é impresso implicitamente. Usa a codificação CP-1252 . Experimente online! .
fonte
Geléia , 9 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Casca , 5 bytes
Experimente online!
Nota: Ao fornecer a lista polinomial zero / vazia, você precisa especificar seu tipo (ou seja,
[]:LN
)!Explicação
fonte
Matlab, 33 bytes
Experimente online!
Cria uma matriz de todos os produtos em elementos dos insumos e depois soma ao longo das diagonais. O
,1
no final força o matlab a somar na direção correta quando um dos vetores de entrada tiver o comprimento 1.O Octave
spdiags
não funciona para vetores, resultando em um erro quando uma das entradas tiver o comprimento 1. O Matlab 2016b ou mais recente é necessário para a expansão explícita do produto em termos de elementos.fonte
Ruby, 83 bytes
Quase diretamente retirado de uma resposta que eu fiz anteriormente sobre expansão de raízes em um polinômio .
fonte
Python, 90 bytes
fonte
JavaScript (ES6), 64 bytes
Retorna a matriz vazia se uma das entradas estiver vazia. Com base na minha resposta ao Polynomialception .
fonte
Julia,
6255 bytesExperimente online!
fonte
Clojure, 104 bytes
Mesclando para
sorted-map
garantir que os valores sejam retornados na ordem correta. Eu gostaria que houvesse mais alguns casos de teste.fonte