# Last edited on 2018-04-10 19:23:27 by stolfilocal

def mat_cria(lins, cols):
  """Cria uma matriz de lins linhas e cols colunas,
  com todos os elementos iguais a None."""
  C = [ None ] * lins
  for i in range(lins):
    C[i] = [ None ] * cols
  return C
  
def mat_escreve(A):
  """Escreve a matriz A na tela, linha por linha."""
  linsA = len(A)    # Numero de linhas de A.
  colsA = len(A[0]) # Numero de colunas de A.
  for i in range(linsA):
    print(A[i])
  
def mat_soma(A, B):
  """Dadas matrizes A e B, nao vazias, devolve a matrix produto A*B."""
  linsA = len(A)    # Numero de linhas de A.
  colsA = len(A[0]) # Numero de colunas de A.
  linsB = len(B)    # Numero de linhas de B.
  colsB = len(B[0]) # Numero de colunas de B.
  assert linsA == linsB
  assert colsA == colsB
  # Aloca a matriz na memoria:
  linsC = linsA     # Numero de linhas de C = A+B.
  colsC = colsA     # Numero de colunas de C = A+B.
  C = mat_cria(linsC, colsC)
  # Preenche a matriz:
  for i in range(linsC):
    for j in range (colsC):
      C[i][j] = A[i][j] + B[i][j]
  return C

def mat_produto(A, B):
  """Dadas matrizes A e B, nao vazias, devolve a matrix produto A*B."""
  linsA = len(A)    # Numero de linhas de A.
  colsA = len(A[0]) # Numero de colunas de A.
  linsB = len(B)    # Numero de linhas de B.
  colsB = len(B[0]) # Numero de colunas de B.
  assert colsA == linsB  # Consistencia.
  # Aloca a matriz na memoria:
  linsC = linsA     # Numero de linhas de C = A*B.
  colsC = colsB     # Numero de colunas de C = A*B.
  C = mat_cria(linsC, colsC)
  # Preenche a matriz:
  for i in range(linsC):
    for j in range (colsC):
      # Calcula elemento [i][j] de C:
      soma = 0
      for k in range(colsA):
        soma = soma + A[i][k] * B[k][j]
      C[i][j] = soma
  return C
    
  
M = [ [ 10, 20, 30 ], [ 30, 40, 50 ], [ 40, 50, 60 ], [ 60, 70, 80 ] ]
N = [ [ 100, 100, 100 ], [ 200, 200, 200 ], [ 300, 300, 300 ], [ 400, 400, 400 ] ]
mat_escreve(mat_soma(M, N))

P = [ [ 1, 2 ], [3, 4], [5, 6 ] ]
mat_escreve(mat_produto(M, P))
