# FFT convolution works only with certain domain length

in my quest to understand how I can use FFT to compute integrals (see my other question click, still no answer there), I came across the fact that a convolution of two functions can be calculated by multiplying the Fourier transforms of the functions and taking the inverse transform of that product.

Now suppose I want to calculate $$\int_{0}^R x \text{sin}(y-x)dx.$$ I can write this as the convolution of $$\text{sin}(x)$$ with $$x\cdot \text{Ind}_{x with $$\text{Ind}$$ as an indicator function that gives the proper integral boundaries.

My $$x$$ vector is given on N data points, equally spaced between 0 and some L, and to these N points I also know $$\text{sin}(x)$$.

The strange thing is, if $$L=2\pi$$, the method seems to work. But with another L, say $$L=1$$ it does not work. What is the reason for this, and what can I do?

I have read about the method of zero-padding where I add N-1 zeros to both function vectors. Would that help? And if so, I want to have a vector of the original size N after the ifft (which will give me a vector of 2N-1), so that I have the convolution value to each of my N $$x$$ values. Is there a way to do this?

import numpy as np
import matplotlib.pyplot as plt
from numpy.fft import fft, fftfreq, ifft

pi2 = 2 * np.pi

N = 2001   ## should be odd!!
R = 0.2
L = 1

x = np.linspace(0, L-L/N, N)
f = np.sin(x)
g = x.copy()
g[g>R]=0      ## indicator function

# f=np.pad(f, (0, N-1), 'constant')   ## zero padding??
# g=np.pad(g, (0, N-1), 'constant')

F = fft(f)
G = fft(g)
C = (L/N)*ifft(F*G)

analytic_sol = -np.sin(R-x)+R*np.cos(R-x)-np.sin(x)   ## analytic result

plt.plot(x, C, label="test")
plt.plot(x, analytic_sol, label="analytic",linestyle="--")
plt.legend()
plt.show() Notice how the solution only becomes valid at x=0.2=R, i.e. when the indicator function becomes zero. What happens here?