def standardise(P, Q):
n, m = len(P), len(Q)
if n < m:
P = P + [0] * (m - n)
else:
Q = Q + [0] * (n - m)
return P, Q
def add(P, Q):
P, Q = standardise(P, Q)
return [ P[i] + Q[i] for i in range(len(P)) ]
def sous(P, Q):
P, Q = standardise(P, Q)
return [ P[i] - Q[i] for i in range(len(P)) ]
def prodmonome(P, k):
return [0] * k + P
def prod(P, Q):
n = max(len(P), len(Q))
if n == 1:
return [P[0]*Q[0]]
P, Q = standardise(P, Q)
k = n // 2
P0, P1 = P[0:k], P[k:n]
Q0, Q1 = Q[0:k], Q[k:n]
R0 = prod(P0, Q0)
R1 = prod(P1, Q1)
R2 = prod(add(P0, P1), add(Q0, Q1))
R2 = sous(sous(R2, R1), R0)
R1 = prodmonome(R1, 2 * k)
R2 = prodmonome(R2, k)
return add(add(R0, R1), R2)