In [ ]:
class Field(object):
    
    def add( self, lhs, rhs ):
        return ( lhs.a+rhs.a, lhs.b+rhs.b )
    
    def subtract( self, lhs, rhs ):
        return ( lhs.a-rhs.a, lhs.b-rhs.b )

    def multiply( self, lhs, rhs ):
        return ( lhs.a+rhs.a, lhs.b+rhs.b )

field = Field()

class Number(object):
    
    def __init__( self, field, *args )
        self .field = field
        self .elements = args
    
    def plus( self, rhs ):
        return

class FieldNumber(object):

    def __init__( self, *args, number=None ):
        if number != None:
            self.repr = number
        else:
            self.repr = Number( field, *args )

    def __add__( self, rhs ):
        if isinstance( rhs, self.__class__ ):
            return FieldNumber( self.repr .plus( rhs.repr ) )
        elif isinstance( rhs, int ):
            return FieldNumber( self.repr .plus( Number( field, rhs ) ) )
        else:
            raise TypeError("unsupported operand type(s) for +: '{}' and '{}'").format(self.__class__, type(other))

    def __sub__( self, rhs ):
        if isinstance( rhs, self.__class__ ):
            return FieldNumber( self.repr .plus( rhs.repr ) )
        elif isinstance( rhs, int ):
            return FieldNumber( self.repr .minus( Number( field, rhs ) ) )
        else:
            raise TypeError("unsupported operand type(s) for +: '{}' and '{}'").format(self.__class__, type(other))

    def __neg__( self ) :
        return FieldNumber( self.repr .negate() )

    def __mul__( self, rhs ) :
        if isinstance( rhs, self.__class__ ):
            return FieldNumber( self.repr .times( rhs.repr ) )
        elif isinstance( rhs, int ):
            return FieldNumber( self.repr .times( Number( field, rhs ) ) )
        else:
            raise TypeError("unsupported operand type(s) for +: '{}' and '{}'").format(self.__class__, type(other))

    def __float__( self ) :
        return self.repr .value()