2013-06-11 1 views
5

galois field (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의 정보 분산 알고리즘을 구현하려고합니다. 코드가 유망하다고 생각 하긴하지만, 파이썬에 익숙하지 않기 때문에 이해가되지 않습니다. 나를 의뢰 할 수있는 사건에 관한 문서가 있습니까? – Miind

+0

문서가 없으며 코드 세부 정보를 잊어 버렸습니다 ... 이러한 코드는 Galois Field 클래스와 GF - GF 및 GF - Integer에 대한 연산자 (add/sub/mul/div)를 오버로드합니다. GF4 연산은 번호 매핑 (\ _ \ _ addL \ _ \ _ 및 \ _ \ _ mulL \ _ \ _)을 간단하게 정의 할 수 있습니다. 또한 GF4 sub 및 div는 add 및 mul의 하위 집합입니다. –

답변

3

문제는 xGF4 개체 인 경우 파이썬이 튜플을 인덱싱하는 방법을 모른다는 것입니다. 세 번째 테스트 케이스가 작동하는 이유

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

는 설명 당신이보고 할 수있는 또 다른 잠재적 인 문제가있다 : 당신은 것을 해결하기 위해 이런 일을 할 수있는 당신이 GF4int를 추가 할 때 반환됩니다 것입니다 int가 아니라 GF4입니다. 당신은 모든 가능성을 통해 생각하고 youneed 자신의 몇 가지 오류를 더 안전 장치를 구축하고 던져 여부를 결정 할 수 있습니다

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

:이 원하는 행동이 아니라면, 나는 더 많은처럼 __add__에 대한 코드가 있어야한다고 생각합니다 , 예. GF4float을 추가하려고하면 어떤 수익이 발생합니까?

+0

와우 !! 나는 그것을 풀 수 있었다! 감사합니다 :) 그런데, "isinstance"의 처리를 사용하는 것이 일반적입니까? –

+2

솔직히 말해서 아주 평범하지는 않습니다. 귀하의 특정 클래스에 대한 더 나은 옵션을 [하위 int int 형식] (http://stackoverflow.com/questions/3238350/subclassing-int-in-python) 될 것이라고 생각하고 연산자를 오버로드합니다. try/except 절과 함께 [duck typing] (http://en.wikipedia.org/wiki/Duck_typing)을 사용하여 클래스를 구현할 수도 있습니다. – Jaime

+0

나는 당신의 대답 때문에 깊이 이해할 수있었습니다. 고맙습니다. –