def __invert__(self):
     '''Inversion modulo order (redefinition of operator '~')
     @note: This method caches modular inverse, so modifying value of X 
     directly with 'X.value = ...' can lead to incoherent inversion.
     '''
     if self.inverse == None: # caching inverse value (speed optimization)
         self.inverse = PrimeField(modinv(self.value, self.order),
                                   self.order)
     return self.inverse
 def __invert__(self):
     '''Inversion  (redefinition of operator '~')
     
         If [A(x) * B(x) mod P(x)=x^2+1] == 1, then computes 
         B(x) for a given A(x).
         
         Direct inversion algorithm
     '''
     delta = self.value[1] ** 2 + self.value[0] ** 2
     deltaInv = modinv(delta, self.order)
     return PrimeField2([(-self.value[0]) * deltaInv,
                         self.value[1] * deltaInv],
                        self.order)