Учитывая два непустых списка целых чисел, ваше представление должно вычислить и вернуть дискретную свертку двух. Интересно, что если вы рассматриваете элементы списка как коэффициенты многочленов, свертка двух списков представляет коэффициенты произведения двух многочленов.
Определение
Учитывая списки A=[a(0),a(1),a(2),...,a(n)]
и B=[b(0),b(1),b(2),...,b(m)]
(установка a(k)=0 for k<0 and k>n
и b(k)=0 for k<0 and k>m
), тогда свертка двух определяется как A*B=[c(0),c(1),...,c(m+n)]
гдеc(k) = sum [ a(x)*b(y) for all integers x y such that x+y=k]
правила
- Допускается любое удобное форматирование ввода и вывода для вашего языка.
- Встроенные модули для свертки, создания матриц свертки, корреляции и полиномиального умножения не допускаются.
Примеры
[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]*[] = []
и не может быть возможным для[]*[] = ?
. Свертка не четко определена в пустых списках. Я думаю, вы должны гарантировать, что списки ввода непусты.Ответы:
J
108 байтИспользование:
Описание: Программа берет два списка, составляет таблицу умножения, затем добавляет числа на положительных диагоналях.
источник
MATL , 19 байт
Попробуйте онлайн!
объяснение
Это создает блочно-диагональную матрицу с двумя входами, обращая первый. Например, с входами
[1 4 3 5]
,[1 3 2]
матрицаКаждая запись свертки получается путем смещения первой строки на одну позицию вправо, вычисления произведения каждого столбца и суммирования всех результатов.
В принципе, сдвиг должен выполняться с нулями слева. Эквивалентно, круговое смещение может использоваться, потому что матрица содержит нули в соответствующих записях.
Например, первый результат получается из смещенной матрицы
и таким образом
1*1 == 1
. Второй получается изи, таким образом
4*1+1*3 == 7
, и т. д. Это должно быть сделаноm+n-1
раз, гдеm
иn
длина ввода. Код использует цикл сm+n
итерациями (который сохраняет несколько байтов) и отбрасывает последний результат.источник
Haskell,
5549 байтовОпределяет оператора
#
.источник
[0,0..]
могут(0<$b)
дать точно необходимую длину, оставляя пустым базовый случай_#b=0<$b
.Matlab / Octave, 41 байт
Это определяет анонимную функцию. Чтобы вызвать его, присвойте его переменной или используйте
ans
.Попробуй это здесь .
объяснение
Это использует факты, которые
Код вычисляет корни двух полиномов (функции
roots
) и объединяет их в массив столбцов. Отсюда получаются коэффициенты многочлена произведения с лидирующей1
(функциейpoly
). Наконец, результат умножается на старшие коэффициенты двух полиномов.источник
Октава , 48 байт
Попробуй это здесь .
объяснение
Дискретная свертка соответствует умножению (дискретного времени) преобразований Фурье. Таким образом, одним из способов умножения многочленов будет преобразование их, умножение преобразованных последовательностей и обратное преобразование.
Если вместо преобразования Фурье используется дискретное преобразование Фурье (ДПФ) , результатом является циклическая свертка исходных последовательностей полиномиальных коэффициентов. Код следует этому маршруту. Чтобы сделать круговую свертку равной стандартной свертке, последовательности дополняются нулями, а результат обрезается.
источник
05AB1E ,
1817 байтКод
объяснение
Теория позади:
Чтобы найти свертку, давайте рассмотрим пример
[1, 2, 3]
,[3, 4, 5]
. Мы позиционируем значения первого массива вверх ногами и вертикально, вот так:Теперь мы помещаем второй массив как лестницу и умножаем его на:
В результате чего:
Затем мы складываем их, получая в результате:
Итак, свертка есть
[3, 10, 22, 22, 15]
.Сам код:
Мы будем делать это шаг за шагом , используя
[1, 2, 3]
, в[3, 4, 5]
качестве тестового примера.Сначала мы нажимаем,
0
а затемE
оцениваем первый входной массив. Мы наносим на карту каждый элемент, используяv
.Таким образом, для каждого элемента мы добавляем второй массив,
²
а затем используем длину первого массива¹g
и уменьшаем его на 1 (с<
). Мы конвертируем это в список нулей с (длина 1-го массива - 1) нулей, используяÅ0
и добавляем это в наш список. Теперь наш стек выглядит следующим образом для первого элемента в списке ввода:Мы умножаем этот массив на текущий элемент, сделанный с
y*
. После этого мы нажимаемN
, что указывает на индекс текущего элемента (с нулевым индексом) и поворачиваем массив, который много раз вправо, используяFÁ}
. Наконец, мы добавляем это к нашему начальному значению (0
). Итак, в основном делается следующее:Который затем неявно печатается. Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
Желе , 9 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
Шелуха , 5 байт
Попробуйте онлайн!
Примечание: при предоставлении нулевого полиномиального / пустого списка вам необходимо указать его тип (т.е.
[]:LN
)!объяснение
источник
Matlab, 33 байта
Попробуйте онлайн!
Создает матрицу всех поэлементных произведений входных данных, затем суммирует по диагонали. В
,1
конце вынуждает matlab суммировать вдоль правильного направления, когда один из входных векторов имеет длину 1.В Octave
spdiags
не работает для векторов, что приводит к ошибке, когда один из входов имеет длину 1. Matlab 2016b или новее требуется для явного расширения поэлементного произведения.источник
Рубин, 83 байта
Почти прямо вытащил ответ, который я сделал ранее относительно расширения корней в полином .
источник
Python, 90 байт
источник
JavaScript (ES6), 64 байта
Возвращает пустой массив, если любой из входных данных пуст. На основании моего ответа на полиномиал .
источник
Юлия,
6255 байтПопробуйте онлайн!
источник
Clojure, 104 байта
Объединение
sorted-map
гарантирует, что значения возвращаются в правильном порядке. Хотелось бы, чтобы было еще несколько тестов.источник