docs: def gf_poly_mul(p, q):
      '''Multiply two polynomials, inside Galois Field (but the procedure is generic). Optimized function by precomputation of log.'''
      # Pre-allocate the result array
      r = bytearray(len(p) + len(q) - 1)
      # Precompute the logarithm of p
      lp = [gf_log[p[i]] for i in xrange(len(p))]
      # Compute the polynomial multiplication (just like the outer product of two vectors, we multiply each coefficients of p with all coefficients of q)
      for j in xrange(len(q)):
          qj = q[j] # optimization: load the coefficient once
          if qj != 0: # log(0) is undefined, we need to check that
              lq = gf_log[qj] # Optimization: precache the logarithm of the current coefficient of q
              for i in xrange(len(p)):
                  if p[i] != 0: # log(0) is undefined, need to check that...
                      r[i + j] ^= gf_exp[lp[i] + lq] # equivalent to: r[i + j] = gf_add(r[i+j], gf_mul(p[i], q[j]))
      return r