読者です 読者をやめる 読者になる 読者になる

雨谷の日和

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

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

2004.07.20のものを、ポインタを使わない記述に書き換えてみる。
ポインタはその変数のメモリ上の位置を指し示すものだが、今回のソースコードでは配列の中の、参照するインデックス位置を指し示すのに使われているだけである。
ということで、ポインタの配列を受け渡す部分を、インデックスの配列を受け渡すように変更すれば良さそうだ。
以下のようにしてみた。

#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, 
};

long expand(int *indexarray, int dim) {
  int i, j, l;
  int *indexsubarray;
  long value = 0;
  if(dim < 2)return array[indexarray[0]];
  indexsubarray = malloc( (dim - 1) * sizeof(int));
  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)));
    }
  }
  free(indexsubarray);
  return value;
}
 
int main() {
  int i;
  long value;
  int *indexarray;
  indexarray = malloc(11 * sizeof(int));
  for(i = 0; i < 11; ++i)indexarray[i] = i * 11;
  value = expand(indexarray, 11);
  printf("result:%ld\n",value);
  free(indexarray);
  return 0;
}

今まではもともとの行列式の配列をmain内に定義しそれを受け渡していたが、今回はその配列のインデックス位置を受け渡すので、定義する位置を変えることにした。
さて、これで本当に同じような動作になっているのだろうか。
次回、実測してみて確かめたい。