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)