2013-06-11 18 views
5

galoisフィールド(GF4)でnumpy配列を使いたいです。 GF4クラスを配列要素に設定しました。 これは配列+整数計算で機能しますが、配列+配列計算では機能しません。galoisフィールドでnumpy配列を計算するには?

import numpy 

class GF4(object): 
    """class for galois field""" 
    def __init__(self, number): 
     self.number = number 
     self.__addL__ = ((0,1,2,3),(1,0,3,2),(2,3,0,1),(3,2,1,0)) 
     self.__mulL__ = ((0,0,0,0),(0,1,2,3),(0,2,3,1),(0,3,1,2)) 
    def __add__(self, x): 
     return self.__addL__[self.number][x] 
    def __mul__(self, x): 
     return self.__mulL__[self.number][x] 
    def __sub__(self, x): 
     return self.__addL__[self.number][x] 
    def __div__(self, x): 
     return self.__mulL__[self.number][x] 
    def __repr__(self): 
     return str(self.number) 

a = numpy.array([GF4(numpy.random.randint(4)) for i in range(18)]).reshape(3,6) 
b = numpy.array([GF4(numpy.random.randint(4)) for i in range(18)]).reshape(3,6) 

"""" 
In [261]: a 
Out[261]: 
array([[1, 1, 2, 0, 2, 1], 
     [0, 3, 1, 0, 3, 1], 
     [1, 2, 0, 3, 2, 1]], dtype=object) 

In [262]: b 
Out[262]: 
array([[0, 0, 3, 1, 0, 0], 
     [0, 1, 0, 1, 1, 1], 
     [3, 2, 2, 0, 2, 0]], dtype=object) 

In [263]: a+1 
Out[263]: 
array([[0, 0, 3, 1, 3, 0], 
     [1, 2, 0, 1, 2, 0], 
     [0, 3, 1, 2, 3, 0]], dtype=object) 

In [264]: a+b 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-264-f1d53b280433> in <module>() 
----> 1 a+b 

<ipython-input-260-0679b73b59a4> in __add__(self, x) 
     8   self.__mulL__ = ((0,0,0,0),(0,1,2,3),(0,2,3,1),(0,3,1,2)) 
     9  def __add__(self, x): 
---> 10   return self.__addL__[self.number][x] 
    11  def __mul__(self, x): 
    12   return self.__mulL__[self.number][x] 

TypeError: tuple indices must be integers, not GF4 
""" 

しかし、配列と配列*整数の計算でも機能します。

""" 
In [265]: a+b*1 
Out[265]: 
array([[1, 1, 1, 1, 2, 1], 
     [0, 2, 1, 1, 2, 0], 
     [2, 0, 2, 3, 0, 1]], dtype=object) 
""" 

次のコードを修正するにはどうすればよいですか? クラスGF4を使いたいです。

+0

私はすべての計算がガロア体にあるrabinの情報分散アルゴリズムを実装しようとしています。あなたのコードは有望だと思いますが、私がPythonを初めて使ったので理解できません。あなたが私に言及することができる事件に関する書類はありますか? – Miind

+0

ドキュメントはありません。私のコードの詳細は忘れています...これらのコードはGalois FieldクラスとGF - GFとGF - Integerに対してオーバーロード演算子(add/sub/mul/div)を定義しています。 GF4操作では番号マッピング(\ _ \ _ addL \ _ \ _と\ _ \ _ mulL \ _ \ _)を簡単に定義できます。さらに、GF4 subとdivはaddとmulのサブセットにすぎません。 –

答えて

3

問題は、xGF4のオブジェクトである場合にPythonがタプルのインデックスを作成する方法を知らないことです。

def __add__(self, x): 
    if isinstance(x, GF4): 
     x = x.number 
    return self.__addL__[self.number][x] 

あなたの第3のテストケースが機能する理由を説明し、あなたが見てみたいことがあり、別の潜在的な問題が、あります:あなたがある返される何GF4intを追加するときにはそれを解決するために、このような何かを行うことができますintではなく、GF4です。これは望ましい動作でない限り、私は__add__のためのあなたのコードをもっとすべきだと思います。

def __add__(self, x): 
    if isinstance(x, GF4): 
     x = x.number 
    return GF4(self.__addL__[self.number][x]) 

youneedは、より多くの保護手段を構築し、自分自身のいくつかのエラーをスローする場合は、すべての可能性の上に考えると決定することをお勧めします、例えばGF4floatを追加しようとすると返品はどうなりますか?

+0

うわー!!私はそれを解決することができます!ありがとう:) ところで、 "isinstance"の処理を使うのが一般的ですか? –

+2

正直言って、それは非常にpythonicではありません。あなたの特定のクラスのためのより良いオプションは、[サブクラスのint型](http://stackoverflow.com/questions/3238350/subclassing-int-in-python)と演算子をオーバーロードすると思います。おそらくtry/except節とともに[duck typing](http://en.wikipedia.org/wiki/Duck_typing)を使ってクラスを実装することもできます。 – Jaime

+0

私はあなたの反応のために深く理解できました。ありがとうございました。 –

関連する問題