雨谷の日和

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

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

ということで、2004.07.24のものをJavaで書き直してみた。
以下のようになると思う。

class Test {

  private static long[ ] array = new long[ ]{
    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,
  };

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

  public static void main(String[ ] args) throws Exception {
    int[ ] indexarray = new int[11];
    for(int i = 0; i < 11; ++i)indexarray[i] = i * 11;
    System.out.println("result: " + expand(indexarray, 11));
  }
}

次回、これを実測してみよう。