#include<stdio.h>
#include<stdlib.h>
#include<time.h>


double random_number(double *rmin, double *rmax){
  return (*rmin) + (float)rand()/(float)RAND_MAX*((*rmax)-(*rmin));
}


int main(){
  double **A, **B, **C;
  double *Af, *Bf, *Cf;
  int i,j,k;
  double r_min,r_max;
  int i_0,k_a,k_b;
  int n_ges;

  clock_t tcpu_1, tcpu_2;

  n_ges = 400;
  r_min = 0.0;
  r_max = 1.0;

  srand(time(0));

  A = (double**)malloc(n_ges*sizeof(double*));
  B = (double**)malloc(n_ges*sizeof(double*));
  C = (double**)malloc(n_ges*sizeof(double*));

  Af = (double*)malloc(n_ges*n_ges*sizeof(double));
  Bf = (double*)malloc(n_ges*n_ges*sizeof(double));
  Cf = (double*)malloc(n_ges*n_ges*sizeof(double));

  for (i=0; i<n_ges; i++){
/*
    A[i] = (double*)malloc(n_ges*sizeof(double));
    B[i] = (double*)malloc(n_ges*sizeof(double));
    C[i] = (double*)malloc(n_ges*sizeof(double));
*/
    A[i] = &Af[i*n_ges];
    B[i] = &Bf[i*n_ges];
    C[i] = &Cf[i*n_ges];
  }

  for(i=0; i<n_ges; i++){
    for(j=0; j<n_ges; j++){
      A[i][j] = random_number(&r_min,&r_max);
      B[i][j] = random_number(&r_min,&r_max);
      C[i][j] = 0.;
    }
  }

  tcpu_1 = clock();
  for(i=0; i<n_ges; i++){
    for(j=0; j<n_ges; j++){
      for (k=0; k<n_ges; k++){
        C[i][j] += A[i][k]*B[k][j];
      }
//      printf("%6.3f",C[i][j]);
    }
//    printf("\n");
  }
  tcpu_2 = clock();

  printf("i,j,k: elapsed time:%.lf\n",(tcpu_2-tcpu_1)/(double)CLOCKS_PER_SEC);

/*
  for(i=0; i<n_ges; i++){
    for(j=0; j<n_ges; j++){
      C[i][j] = 0.;
    }
  }

  tcpu_1 = clock();
    for(j=0; j<n_ges; j++){
  for(i=0; i<n_ges; i++){
      for (k=0; k<n_ges; k++){
        C[i][j] += A[i][k]*B[k][j];
      }
    }
  }
  tcpu_2 = clock();

  printf("j,i,k: elapsed time:%.lf\n",(tcpu_2-tcpu_1)/(double)CLOCKS_PER_SEC);
  
  for(i=0; i<n_ges; i++){
    for(j=0; j<n_ges; j++){
      C[i][j] = 0.;
    }
  }

  tcpu_1 = clock();
  for(i=0; i<n_ges; i++){
      for (k=0; k<n_ges; k++){
    for(j=0; j<n_ges; j++){
        C[i][j] += A[i][k]*B[k][j];
      }
    }
  }
  tcpu_2 = clock();

  printf("i,k,j: elapsed time:%.lf\n",(tcpu_2-tcpu_1)/(double)CLOCKS_PER_SEC);
  
  for(i=0; i<n_ges; i++){
    for(j=0; j<n_ges; j++){
      C[i][j] = 0.;
    }
  }

  tcpu_1 = clock();
    for(j=0; j<n_ges; j++){
      for (k=0; k<n_ges; k++){
  for(i=0; i<n_ges; i++){
        C[i][j] += A[i][k]*B[k][j];
      }
    }
  }
  tcpu_2 = clock();

  printf("j,k,i: elapsed time:%.lf\n",(tcpu_2-tcpu_1)/(double)CLOCKS_PER_SEC);
  
  for(i=0; i<n_ges; i++){
    for(j=0; j<n_ges; j++){
      C[i][j] = 0.;
    }
  }

  tcpu_1 = clock();
      for (k=0; k<n_ges; k++){
  for(i=0; i<n_ges; i++){
    for(j=0; j<n_ges; j++){
        C[i][j] += A[i][k]*B[k][j];
      }
    }
  }
  tcpu_2 = clock();

  printf("k,i,j: elapsed time:%.lf\n",(tcpu_2-tcpu_1)/(double)CLOCKS_PER_SEC);
  
  for(i=0; i<n_ges; i++){
    for(j=0; j<n_ges; j++){
      C[i][j] = 0.;
    }
  }

  tcpu_1 = clock();
      for (k=0; k<n_ges; k++){
    for(j=0; j<n_ges; j++){
  for(i=0; i<n_ges; i++){
        C[i][j] += A[i][k]*B[k][j];
      }
    }
  }
  tcpu_2 = clock();

  printf("k,j,i: elapsed time:%.lf\n",(tcpu_2-tcpu_1)/(double)CLOCKS_PER_SEC);
*/
  
  return 0;
}

