In [1]:
from sympy import *
init_printing()
Zuerst wird ein Polynomring geschaffen. QQ
ist $\mathbb Q$. Alternative Termordnungen sind grlex
und grevlex
.
In [2]:
P, erzeuger = xring('x,y', QQ, lex)
x, y = erzeuger
In [3]:
def S_poly(p, q):
kgv = p.leading_monom().lcm(q.leading_monom())
t1 = kgv / p.leading_term() * p
t2 = kgv / q.leading_term() * q
return t1 - t2
In [4]:
f1 = x*y**2-x
f2 = x - y**3
G = [f1, f2]
G
Out[4]:
In [5]:
s = S_poly(f1, f2)
s
Out[5]:
In [6]:
s.div(G)
Out[6]:
In [7]:
f3 = s.div(G)[1]
f3
Out[7]:
In [8]:
G.append(f3)
S_poly(f1, f3)
Out[8]:
In [9]:
s = S_poly(f2, f3)
s
Out[9]:
In [10]:
s.div(G)
Out[10]:
In [11]:
G
Out[11]:
Es gibt auch zwei Funktionen, welche die reduzierte Gröbner-Basis direkt bestimmen. Zuerst die Funktion für den Fall, dass die Variablen wie oben einem vorab definierten Polynomring angehören.
In [12]:
from sympy.polys import groebnertools as gt
In [13]:
gt.groebner(G, P)
Out[13]:
Die zweite Funktion akzeptiert Polynome aus Symbolen. Hier muss man die Termordnung explizit angeben. Wenn alle Koeffizienten ganz sind, arbeitet der Algorithmus über $\mathbb Z$; eine Gröbner-Basis über $\mathbb Z$ ist i.a. über $\mathbb Q$ nicht reduziert. Diese Funktion ist durch den allgemeinen import in der ersten Zeile bereits geladen.
In [14]:
x = Symbol('x')
y = Symbol('y')
f1 = 3*x*y**2-x
f2 = x - y**3
f1, f2
Out[14]:
In [15]:
G = groebner([f1, f2], x, y, order='lex')
G
Out[15]:
In [16]:
G.polys
Out[16]:
Achtung: Die Klasse Poly
ist wieder eine andere Klasse.
In [ ]: