pythonでfinite field

有限体上の行列の計算をpythonでやりたい。
有限体上の計算は普通の計算と少しやり方が違うので、pythonで演算子が呼ばれた時に読み出される特殊メソッドを書き換えてやれば良いはず。
行列の計算は今までnumpyを使っていたのでこれをそのまま使う。
numpyのndarrayクラスを継承して__add__とかの特殊メソッドを書き換えればいけるかと思ったけど上手くいかなかった。

#!/usr/bin/env python  
# -*- coding: utf-8 -*- 
import numpy

class asdf(numpy.ndarray):
    def __add__(self, x):
        return 0
    def __mul__(self, x):
        return 1

a=numpy.arange(16).reshape(4,4)
b=numpy.arange(16).reshape(4,4)
"""
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
"""

print a+b
print a.dot(b)
"""
>>> print a+b
[[ 0  2  4  6]
 [ 8 10 12 14]
 [16 18 20 22]
 [24 26 28 30]]
>>> print a.dot(b)
[[ 56  62  68  74]
 [152 174 196 218]
 [248 286 324 362]
 [344 398 452 506]]
"""


a=asdf(shape=a.shape, buffer=a, dtype=a.dtype)
b=asdf(shape=b.shape, buffer=b, dtype=b.dtype)

"""
>>> a
asdf([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> b
asdf([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
"""

print a+b
print a.dot(b)
"""
>>>print a+b
0
>>> print a.dot(b)
[[ 56  62  68  74]
 [152 174 196 218]
 [248 286 324 362]
 [344 398 452 506]]
"""

どうやらdot関数はそのインスタンスの__add__とかを呼び出して使ってるわけではないみたい。

numpyと有限体を扱うモジュールのGaloisってのを組み合わせて同じようなことをやってる人がいたけど、この人もうまくいってないみたい。
Can I use my own Python class with numpy or some other matrix library?

同じ有限体とかを使えるNZMATHってモジュールをみつけたけど、これは使い方がよくわからない
NZMATH
ドキュメント読んでもコードがこれっぽっちも出てこないし解説する気が見えてこない…

あとあんまり関係ないけど面白そうなの見つけました
Sympy

SymPy は記号計算を行うための Python のライブラリである。Python を使った離散事象のシミュレーション言語 SimPy (en) と混同されやすいが、別のものである。 計算機代数システム (computer algebra system, CAS) として完備することを目的として開発が進められているが、拡張性を損なわないように、ソースコードは可能な限り簡素に保たれている。SymPy はすべて Python で書かれており、他の外部のライブラリは、オプションとしてのプロット機能以外には、何も必要としない。

ふーむ