5

I want to use numpy array on galois field (GF4). so, I set GF4 class to array elements. It works on array + integer calculation but it dosen't works on array + array calculation.

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

But it also works on array and array * integer 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)
"""

How should I correct the following codes? I want to use my class GF4.

Ryoji Ishii
  • 303
  • 1
  • 4
  • 14
  • I'm trying to implement rabin's information dispersal algorithm in which all the computations are in a galois field; your codes sounds promising, but I don't understand it since I'm new to python. Is there any documentation regarding the case you could refer me to? – Amir Afianian Dec 23 '15 at 16:45
  • There's no documents and I forgot my code details... Those codes are defines Galois Field class and overloading operators(add/sub/mul/div) against GF - GF and GF - Integer s. GF4 operations can define as number mappings(\_\_addL\_\_ and \_\_mulL\_\_) simply. In addition, GF4 sub and div operating is just a subset of add and mul. – Ryoji Ishii Dec 25 '15 at 01:39

1 Answers1

3

The problem is that Python doesn't know how to index tuples when x is a GF4 object. You could do something like this to solve that:

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

There is another potential issue you may want to look at, that explains why your third test case works: when you add an int to a GF4 what gets returned is an int, not a GF4. Unless this is a desired behavior, I think your code for __add__ should be more like:

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

You may want to think over all the possibilities and decide if youneed to build more safeguards and throw a few errors of your own, e.g. what should be the return if you try to add a float to a GF4?

Jaime
  • 65,696
  • 17
  • 124
  • 159
  • wow!! I could solve it! Thanks :) By the way, is it general to use processing of "isinstance"? – Ryoji Ishii Jun 11 '13 at 13:05
  • 2
    It's not very pythonic, to be honest. I think the better option for your particular class would be to [subclass the int numeric type](http://stackoverflow.com/questions/3238350/subclassing-int-in-python) and overload the operators. You could also implement you class using [duck typing](http://en.wikipedia.org/wiki/Duck_typing), probably with a try/except clause. – Jaime Jun 11 '13 at 14:17
  • I could understand deeply because of your response. thank you. – Ryoji Ishii Jun 11 '13 at 14:54