仕方がないのでmatrix.rbを一部移植したよ!@Python (修正:3/17 16:36)

google先生の偉大さにまた気がつかされました。
Numpyが多倍長演算してない件について - CanI’s Diary
で、多倍長演算可なライブラリを募集したわけですが、待ってても見つかりそうにないので、Rubyの標準ライブラリにある、MatrixクラスをPythonに移植しました。
使わない機能まで移植するのは非常に骨が折れるので、とりあえず、pow()関連の関数群だけ。

matrix.py

#!/usr/bin/env python

class Matrix :

  def __init__(self, argv) :
    self.rows = [argv[i] for i in range(0, len(argv))]

  def __mul__(self, other) :
    if isinstance(other, Matrix) :
      rows = []
      for i in range(0, len(self.rows)) :
        columns = []
        for j in range(0, len(other.rows[0])) :
          vij = 0
          for k in range(0, len(self.rows[0])) :
            vij += self[i, k] * other[k, j]
          columns.append(vij)
        rows.append(columns)
      return Matrix(rows)
    else :
      raise TypeError()

  def __pow__(self, other, modulo=False) :
    if isinstance(other, int) or isinstance(other, long):
      if other > 0 :
        x = self
        z = x
        n = other - 1
        while n != 0 :
          while True:
            div, mod = divmod(n, 2)
            if mod != 0 :
              break
            x = x * x
            n = div
          z *= x
          n -= 1
        return z
      else :
        raise ValueError()
    else :
      raise TypeError()

  def __getitem__(self, key) :
    return self.rows[key[0]][key[1]]

ホントに必要な機能しか実装してません。
例外処理は、サポートしてない型を引数に入れた時と、値が負の時にraiseするだけ。

(※修正:__pow__メソッドで、long型(多倍長整数)をotherに放り込んでもTypeErrorがraiseしないようにしました。)

やっぱり

(0..hoge).collect |i|{
  (0..piyo).collect |j|{
    (0..fuga).upon do |k|
      //hogehoge
    end
  }
}

とか嫌いです。