# Revision history [back]

The following worked for me:

def div( f, g, ring ):
"""
Division algorithm on Page 11 of Using AG by Cox;
f is the dividend;
g is a list of ordered divisors;
The output consists of a list of coefficients for g and the remainder;
p is the intermediate dividend;
"""
n = len(g)
p, r, q = f, 0,  [0 for _ in range(0,n)]

count = 0
while p != 0:
count += 1
i, divisionoccured = 0, False
print ( "Step %s:\n\tp = %s\n\tr = %s\n\tq = %s"
% ( count, p, r, q ) )

while i < n and not divisionoccured:
glt, plt = g[i].lt(), p.lt()

if glt and plt / glt in ring:
q[i] = q[i] + plt // glt
p    =    p - plt // glt * g[i]
divisionoccured = True
print "\t\tChange:\n\t\tq[%s] = %s\n\t\tp = %s" % ( i, q[i], p )
else:
i = i + 1
print "\t\tIncrementing i: i = %s" % i
if not divisionoccured:
r = r + p.lt()
p = p - p.lt()

return q, r

R.<a,b>    = PolynomialRing( QQ )
K          = FractionField( R )
RK.<x,y,z> = PolynomialRing( K, order='lex' )

f  = a*x^2*y^3 + x*y + 2*b
g1 = a^2*x + 2
g2 = x*y   - b

div( f, [g1,g2], RK )


This replaces the line with the divides method call by a test if the division (makes sens and) lands still in the ring.

Results with many verbose prints in the one test case submitted:

Step 1:
p = a*x^2*y^3 + x*y + 2*b
r = 0
q = [0, 0]
Change:
q[0] = 1/a*x*y^3
p = ((-2)/a)*x*y^3 + x*y + 2*b
Step 2:
p = ((-2)/a)*x*y^3 + x*y + 2*b
r = 0
q = [1/a*x*y^3, 0]
Change:
q[0] = 1/a*x*y^3 + ((-2)/a^3)*y^3
p = x*y + 4/a^3*y^3 + 2*b
Step 3:
p = x*y + 4/a^3*y^3 + 2*b
r = 0
q = [1/a*x*y^3 + ((-2)/a^3)*y^3, 0]
Change:
q[0] = 1/a*x*y^3 + ((-2)/a^3)*y^3 + 1/a^2*y
p = 4/a^3*y^3 + ((-2)/a^2)*y + 2*b
Step 4:
p = 4/a^3*y^3 + ((-2)/a^2)*y + 2*b
r = 0
q = [1/a*x*y^3 + ((-2)/a^3)*y^3 + 1/a^2*y, 0]
Incrementing i: i = 1
Incrementing i: i = 2
Step 5:
p = ((-2)/a^2)*y + 2*b
r = 4/a^3*y^3
q = [1/a*x*y^3 + ((-2)/a^3)*y^3 + 1/a^2*y, 0]
Incrementing i: i = 1
Incrementing i: i = 2
Step 6:
p = 2*b
r = 4/a^3*y^3 + ((-2)/a^2)*y
q = [1/a*x*y^3 + ((-2)/a^3)*y^3 + 1/a^2*y, 0]
Incrementing i: i = 1
Incrementing i: i = 2
([1/a*x*y^3 + ((-2)/a^3)*y^3 + 1/a^2*y, 0], 4/a^3*y^3 + ((-2)/a^2)*y + 2*b)