7
An linear discrete convolution is an operation that turns two vectors of numbers into a third vector of numbers by multiplying elements inside-out. Formally, for two vectors a
and b
with elements 0
to n - 1
, the discrete linear convolution of a
and b
can be computed with this loop:
for i = 0 to 2*n - 2
c[i] = 0;
for j = 0 to n - 1
if i - j >= 0 and i - j < n
c[i] = c[i] + a[j] * b[i - j];
As an example, the convolution of a = { 1, 2, 3, 4 }
and b = { 5, 6, 7, 8 }
is c = { 5, 16, 34, 60, 61, 52, 32 }
.
These convolutions appear when doing long multiplication, for example:
1234 * 5678 =
20 24 28 32
15 18 21 24
10 12 14 16
5 6 7 8
--------------------
5 16 34 60 61 52 32
--------------------
32
52
61
60
34
16
5
--------------------
7006652
Your task is to write a program or function that, given two arrays (or similar) a
and b
of non-negative integers of equal length n
and optionally, n
and an output array c
, computes the linear discrete convolution of a
and b
and returns it, assigns it to the parameter c
. or prints it out. You may also take input from the user while or before your code is running. The following constraints apply:
- Your program must run in subquadratic or o(n 2) time. An algorithm like the pseudo-code above that runs in quadratic time Θ(n 2) is invalid.
- You may assume that all integers in in- and output are in the range from 0 to 65535, this also applies to
n
. - You may not claim that your algorithm runs in subquadratic time because
n
has an upper bound. - The results must be exact.
- This is code golf, the shortest code in octets wins.
- You may not use existing library routines or similar to compute a Fourier transform or a number theoretic transform or the respective inverse transformations.
@LegionMammal978 No, O(n²) time allows for quadratic-time algorithms. o(n²) doesn't, that's the difference between big-O and little-O (think of big-O being ≤ and little-o being <). – FUZxxl – 2015-12-21T20:14:07.567
@LegionMammal978 No, that's Ω vs. Θ vs. O. There is also ω and o. – FUZxxl – 2015-12-21T20:17:31.547
1@LegionMammal978 Why do you delete your comments? They are useful for future readers. – FUZxxl – 2015-12-21T20:17:59.103
Comments are not for discussions. For the record, I was confused about the differences between big- and little-O complexity. – LegionMammal978 – 2015-12-21T20:20:05.777
@LegionMammal978 Maybe other users are confused, too. Your comments help them and answer questions they might have asked again. – FUZxxl – 2015-12-21T20:22:37.867
@PeterTaylor Reworded. – FUZxxl – 2015-12-21T21:23:48.633
@FUZxxl If you think other users might stumble over the same confusion, then it's something you should address in the challenge. Comments aren't meant to be permanent, and people shouldn't be expected to read them. – Martin Ender – 2015-12-21T22:51:09.727
So, let me get this straight: looping through each digit in each of the two integers qualifies for Θ(n²), but not o(n²), which makes it invalid? – ETHproductions – 2015-12-21T23:15:29.663
@ETHproductions yes. – FUZxxl – 2015-12-21T23:33:44.010
@FUZxxl I think you should say "discrete convolution", not "linear discrete convolution". A convolution is always a linear operation, AFAIK – Luis Mendo – 2015-12-22T00:47:47.310
@LuisMendo There are also cyclic and negacyclic convolutions, so I felt the need to clarify that the convolution isn't cyclic. Perhaps I should have said “acyclic?” – FUZxxl – 2015-12-22T00:48:35.170
@FUZxxl Oh, you mean "linear" as opposed to "circular". I always call that just "convolution". But you're right, now I see in which sense you said linear – Luis Mendo – 2015-12-22T00:49:29.817
2I'll give a 200-point bounty for any TI-BASIC solution, with no time limit. – lirtosiast – 2016-01-03T04:39:49.813