/* Produits de deux matrices de reels carrees   */
/* de taille n x n                              */
/* Mesure du temps d'exécution                  */

public class ProduitMatricesCarreesAvecMesureDeTemps2 {

/* Fonction de creation et retour d'une matrice */
/* de double carree                             */
/* 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      */
/* de double carree 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 du tableau                */
/* de reels de dimension 2 de taille n x n      */
/* obtenu par produit d'un tableau de reels     */
/* de dimension 2 de taille n x n               */
/* par un tableau de reels de dimension 2       */
/* de taille n x n                              */
/* m1 : le premier tableau de reels             */
/* m2 : le second tableau de reels              */
/* m  : le tableau obtenu 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) {
    double [][] m1;
    double [][] m2;
    double [][] m;
    int n;
    for ( n = 100 ; n <= 1000 ; n = n+100 ) {
      Ecran.formater("%5d : ",n);
      long tmi = System.nanoTime();
      m1 = nouvelleMatrice(n);
      m2 = nouvelleMatrice(n);
      m = nouvelleMatrice(n);
      long tmf = System.nanoTime();
      Ecran.formater("%15d %8.2f",tmf-tmi,(tmf-tmi)/((double) n));
      long t1i = System.nanoTime();
      initRandMatrice(m1);
      long t1f = System.nanoTime();
      Ecran.formater("%15d %8.2f",t1f-t1i,(t1f-t1i)/((double) n*n));
      long t2i = System.nanoTime();
      initRandMatrice(m2);
      long t2f = System.nanoTime();
      Ecran.formater("%15d %8.2f",t2f-t2i,(t2f-t2i)/((double) n*n));
      long ti = System.nanoTime();
      produit(m1,m2,m);
      long tf = System.nanoTime();
      Ecran.formater("%15d %8.2f\n",tf-ti,(tf-ti)/((double) n*n*n)); }
  }
}
