2013-06-11 21 views
5

Chcę użyć tablicy numpy na polu galois (GF4). więc ustawiam klasę GF4 na elementy tablicy. Działa na tablicę + obliczanie liczby całkowitej, ale nie działa na tablicę i obliczanie tablicy.Jak obliczyć numpy tablice na polu galois?

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 
""" 

Ale działa również na tablicę i tablicę * calkowitość caliculation.

""" 
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) 
""" 

Jak należy poprawić następujące kody? Chcę użyć mojej klasy GF4.

+0

Próbuję zaimplementować algorytm rozrzucania informacji rabina, w którym wszystkie obliczenia są w polu galois; Twoje kody brzmią obiecująco, ale nie rozumiem tego, ponieważ jestem nowy w Pythonie. Czy jest jakaś dokumentacja dotycząca sprawy, do której możesz mnie skierować? – Miind

+0

Brak dokumentów i zapomniałem kodu. Kody te określają klasę Galois Field i przeciążają operatorów (dodaj/sub/mul/div) przeciwko GF - GF i GF - Integer s. Operacje GF4 mogą definiować po prostu odwzorowania liczb (\ _ \ _ addL \ _ \ _ i \ _ \ _ mulL \ _ \ _). Dodatkowo, działanie GF4 sub i div jest tylko podzbiorem add i mul. –

Odpowiedz

3

Problem polega na tym, że Python nie potrafi indeksować krotek, gdy x jest obiektem GF4. Można zrobić coś takiego rozwiązania to:

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

Jest inny potencjalny problem może chcesz patrzeć, który wyjaśnia dlaczego trzeci przypadek testowy działa: podczas dodawania int do GF4 co zostanie zwrócony jest int, a nie GF4. O ile nie jest to pożądane zachowanie, myślę, że Twój kod __add__ powinno być więcej takich jak:

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

Możesz pomyśleć nad wszystkimi możliwościami i zdecydować, czy youneed budować więcej gwarancji i rzucić kilka błędów własnego np jaki powinien być zwrot, jeśli spróbujesz dodać float do GF4?

+0

wow !! Mógłbym to rozwiązać! Dzięki :) Nawiasem mówiąc, czy ogólne jest używanie przetwarzania "isinstance"? –

+2

To nie jest bardzo pytoniczny, szczerze mówiąc. Myślę, że lepszym rozwiązaniem dla twojej konkretnej klasy byłoby [podklasy typu numerycznego] (http://stackoverflow.com/questions/3238350/subclassing-int-in-python) i przeciążenia operatorów. Możesz także zaimplementować klasę używając [typowania kaczki] (http://en.wikipedia.org/wiki/Duck_typing), prawdopodobnie z klauzulem try/except. – Jaime

+0

Mogłem zrozumieć głęboko z powodu twojej odpowiedzi. Dziękuję Ci. –

Powiązane problemy