По сути, это то же самое, что и нахождение полиномов S, T, таких что PS + QT = 1. Это возможно, когда gcd (P, Q) = 1, и это можно сделать с помощью galoistools.gf_gcdex
.Например, давайте инвертируем 3x^3+2x+4
по модулю x^2+2x+3
с полем коэффициента Z / 11Z:
from sympy.polys.domains import ZZ
from sympy.polys.galoistools import gf_gcdex
p = ZZ.map([3, 0, 2, 4])
q = ZZ.map([1, 2, 3])
z = 11
s, t, g = gf_gcdex(p, q, z, ZZ)
if len(g) == 1 and g[0] == 1:
print(s)
else:
print('no inverse')
Это печатает [8, 5]
- обратное значение равно 8x+5
.Проверка работоспособности от руки:
(3x^3+2x+4)*(8x+5) = 24x^4 + 15x^3 + 16x^2 + 42x + 20
= 2x^4 + 4x^3 + 5x^2 + 9x + 9
= (x^2 + 2x + 3)*(2x^2 - 1) + 1
= 1 mod q