/* Produits de deux matrices carrees de reels   */
/* de taille n x n                              */

public class ProduitMatricesCarrees {

/* Fonction de creation et retour d'une matrice */
/* carree de double                             */
/* taille : la taille de la matrice a generer   */

  static double [][] nouvelleMatrice(int taille) {
    double [][] t = new double[taille][taille];
    return t;
  }

/* Fonction d'initialisation d'une matrice      */
/* carree de double avec des nombres aleatoires */
/* compris dans l'intervalle [0.0,1.0]          */
/* tab : la matrice carree a initialiser        */

  static void initRandMatrice(double [][] tab) {
    int n = tab.length;
    for ( int i = 0 ; i < n ; i++ ) {
      for ( int j = 0 ; j < n ; j++ ) {
        tab[i][j] = Math.random(); } }
  }

/* Fonction de calcul de la matrice de reels    */
/* de taille n x n obtenue par produit          */
/* d'une matrice de reels de taille n x n       */
/* par une matrice de reels de taille n x n     */
/* m1 : la premiere matrice de reels            */
/* m2 : la seconde matrice de reels             */
/* m  : la matrice de reels obtenue par produit */

  static void produit(double [][] m1,
                      double [][] m2,
                      double [][] m) {
    int n = m1.length;
    double [][] m2t = nouvelleMatrice(n);
    for ( int i = 0 ; i < n ; i++ ) {
      for ( int j = 0 ; j < n ; j++ ) {
        m2t[j][i] = m2[i][j]; } }
    double [][] tmp = nouvelleMatrice(n);
    for ( int i = 0 ; i < n ; i++ ) {
      for ( int j = 0 ; j < n ; j++ ) {
        tmp[i][j] = 0.0;
        for ( int k = 0 ; k < n ; k++ ) {
          tmp[i][j] = tmp[i][j] + m1[i][k]*m2t[j][k]; } } }
    for ( int i = 0 ; i < n ; i++ ) {
      for ( int j = 0 ; j < n ; j++ ) {
        m[i][j] = tmp[i][j]; } }
  }
  
/* Programme principal                          */

  public static void main(String [] args) {
    int n;
    double [][] m1;
    double [][] m2;
    double [][] m;
    Ecran.afficher("n? ");
    n = Clavier.saisirInt();
    m1 = nouvelleMatrice(n);
    m2 = nouvelleMatrice(n);
    m = nouvelleMatrice(n);
    Ecran.afficherln("Génération de m1");
    initRandMatrice(m1);
    Ecran.afficherln("Génération de m2");
    initRandMatrice(m2);
    Ecran.afficherln("Début du calcul du produit de m1 par m2");
    produit(m1,m2,m);
    Ecran.afficherln("Fin du calcul du produit de m1 par m2");
  }
}