+ self._deortho_matrix = matrix.block_diagonal(
+ [J._deortho_matrix for J in factors]
+ )
+
+ self._inner_product_matrix = matrix.block_diagonal(
+ [J._inner_product_matrix for J in factors]
+ )
+
+ # Building the multiplication table is a bit more tricky
+ # because we have to embed the entries of the factors'
+ # multiplication tables into the product EJA.
+ zed = self.zero()
+ self._multiplication_table = [ [zed for j in range(i+1)]
+ for i in range(n) ]
+
+ # Keep track of an offset that tallies the dimensions of all
+ # previous factors. If the second factor is dim=2 and if the
+ # first one is dim=3, then we want to skip the first 3x3 block
+ # when copying the multiplication table for the second factor.
+ offset = 0
+ for f in range(m):
+ phi_f = self.cartesian_embedding(f)
+ factor_dim = factors[f].dimension()
+ for i in range(factor_dim):
+ for j in range(i+1):
+ f_ij = factors[f]._multiplication_table[i][j]
+ e = phi_f(f_ij)
+ self._multiplication_table[offset+i][offset+j] = e
+ offset += factor_dim