雨谷の日和

過去20年で2,700を超えるアニメの第1話だけは見続けた僕のお勧めアニメがハズレなはずがない

行列式計算改良(先頭アドレスのみコピー)インデックス版(事前、alloca)

今度は、事前にメモリを確保する場合を、allocaで実装した場合を見てみよう。
ソースコードは以下のようになる。

#include 
#include 

long array[ ] = {
  1, 2, 3, 4, 6, 1, 7, 1, 9, 0, 0, 
  5, 1, 5, 7, 7, 3, 5, 3, 6, 1, 6, 
  7, 6, 4, 8, 4, 6, 1, 7, 1, 4, 8, 
  6, 5, 1, 0, 1, 5, 9, 1, 7, 5, 1, 
  2, 3, 1, 1, 5, 8, 4, 6, 3, 1, 5, 
  3, 1, 0, 3, 2, 9, 4, 8, 0, 3, 1, 
  3, 2, 8, 5, 0, 6, 3, 4, 4, 8, 5, 
  4, 9, 9, 4, 6, 1, 0, 1, 2, 1, 6, 
  9, 7, 6, 1, 6, 4, 5, 2, 9, 4, 4, 
  1, 2, 2, 2, 8, 3, 4, 9, 1, 2, 4, 
  6, 1, 6, 4, 4, 8, 6, 3, 4, 1, 4, 
};

int **indexarray_buf;

long expand(int *indexarray, int dim) {
  int i, j, l;
  int *indexsubarray;
  long value = 0;
  if(dim < 2)return array[indexarray[0]];
  indexsubarray = indexarray_buf[dim - 2];
  for(i = 0; i < dim; ++i){
    l = 0;
    for(j = 0; j < dim; ++j){
      if(i != j){
        indexsubarray[l] = indexarray[j] + 1;
        ++l;
      }
    }
    if(i % 2){
      value += (array[indexarray[i]] * expand(indexsubarray, (dim - 1)));
    }
    else{
      value -= (array[indexarray[i]] * expand(indexsubarray, (dim - 1)));
    }
  }
  return value;
}
 
int main() {
  int i;
  long value;
  int *indexarray;

  indexarray_buf = alloca(11 * sizeof(int *));
  for(i = 0; i < 11; ++i)indexarray_buf[i] = alloca(11 * sizeof(int));

  indexarray = indexarray_buf[10];
  for(i = 0; i < 11; ++i)indexarray[i] = i * 11;

  value = expand(indexarray, 11);
  printf("result:%ld\n",value);
  return 0;
}

次回は、この結果をみてみよう。