]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/polynomial.py
COPYING,LICENSE: add (AGPL-3.0+)
[sage.d.git] / mjo / polynomial.py
index 8b493711924d705e17eb612efd56e390ea98e88e..e50fece270e78be01904872cbd3d3571698325ea 100644 (file)
@@ -135,12 +135,12 @@ def multidiv(f, gs):
     If we get a zero remainder, then the numerator should belong to
     the ideal generated by the denominators::
 
-        sage: set_random_seed()
         sage: R = PolynomialRing(QQ, 'x,y,z')
         sage: x,y,z = R.gens()
         sage: s = ZZ.random_element(1,5).abs()
         sage: gs = [ R.random_element() for idx in range(s) ]
-        sage: f = R.random_element(ZZ.random_element(10).abs())
+        sage: # hack for SageMath Trac #28855
+        sage: f = R(R.random_element(ZZ.random_element(10).abs()))
         sage: (qs, r) = multidiv(f,gs)
         sage: r != 0 or f in R.ideal(gs)
         True
@@ -149,12 +149,11 @@ def multidiv(f, gs):
     times the denominators, and the remainder's monomials aren't divisible
     by the leading term of any denominator::
 
-        sage: set_random_seed()
         sage: R = PolynomialRing(QQ, 'x,y,z')
-        sage: x,y,z = R.gens()
         sage: s = ZZ.random_element(1,5).abs()
         sage: gs = [ R.random_element() for idx in range(s) ]
-        sage: f = R.random_element(ZZ.random_element(10).abs())
+        sage: # hack for SageMath Trac #28855
+        sage: f = R(R.random_element(ZZ.random_element(10).abs()))
         sage: (qs, r) = multidiv(f,gs)
         sage: r + sum( qs[i]*gs[i] for i in range(len(gs)) ) == f
         True
@@ -162,6 +161,19 @@ def multidiv(f, gs):
         ....:                     for g in gs ))
         True
 
+    Exercise 8 in Section 2.4 of Cox, Little, and O'Shea says that we
+    should always get a zero remainder if we divide an element of a
+    monomial ideal by its generators::
+
+        sage: R = PolynomialRing(QQ,'x,y,z')
+        sage: gs = R.random_element().monomials()
+        sage: I = R.ideal(gs)
+        sage: # hack for SageMath Trac #28855
+        sage: f = R(I.random_element(ZZ.random_element(5).abs()))
+        sage: (qs, r) = multidiv(f, gs)
+        sage: r.is_zero()
+        True
+
     """
     R = f.parent()
     s = len(gs)
@@ -171,9 +183,8 @@ def multidiv(f, gs):
     qs = [R.zero()]*s
 
     while p != R.zero():
-        i = 0
-        division_occurred = false
-        while i < s:
+        for i in range(0,s):
+            division_occurred = false
             # If gs[i].lt() divides p.lt(), then this remainder will
             # be zero and the quotient will be in R (and not the
             # fraction ring, which is important).
@@ -182,13 +193,7 @@ def multidiv(f, gs):
                 qs[i] += factor
                 p -= factor*gs[i]
                 division_occurred = true
-                # Don't increment "i" here because we want to try
-                # again with this "denominator" g[i]. We might
-                # get another factor out of it, but we know that
-                # we can't get another factor out of an *earlier*
-                # denominator g[i-k] for some k.
-            else:
-                i += 1
+                break
 
         if not division_occurred:
             r += p.lt()