summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Bishop <kanzure@gmail.com>2011-05-13 13:19:25 -0500
committerBryan Bishop <kanzure@gmail.com>2011-05-13 13:19:25 -0500
commitd75f82cc4f5bfa88cc23191b3b2fd7ae5230fb09 (patch)
tree1104854827d4ca7f446c69cc1b5a09770aab5610
parent2acb1ced17dff260029f55f3fa30793fabe0b2f1 (diff)
downloadlolcad-d75f82cc4f5bfa88cc23191b3b2fd7ae5230fb09.tar.gz
lolcad-d75f82cc4f5bfa88cc23191b3b2fd7ae5230fb09.zip
implemented reduce_deg
-rw-r--r--esolid/esolid.py53
1 files changed, 50 insertions, 3 deletions
diff --git a/esolid/esolid.py b/esolid/esolid.py
index d4b9a82..f36daa4 100644
--- a/esolid/esolid.py
+++ b/esolid/esolid.py
@@ -96,10 +96,10 @@ class K_RATPOLY:
def index_to_powers(self, index):
"""returns p = (p[0], p1[1], ..., p[num_vars - 1] s.t.
coeffs[i] is the coefficient of the monomial X^p of *this."""
- assert i < len(self.coeffs)
+ assert index < len(self.coeffs)
if len(self.degree) > 0:
- j = i
+ j = index
p = [None] * len(self.degree)
k = len(self.degree) - 1
@@ -158,8 +158,55 @@ class K_RATPOLY:
to max. degrees in X_0, X_1, ..., X_{num_vars - 1}, resp.
returns True if some deg[i] is reduced, and
False otherwise."""
+ #locals: i, j, k, l, d, p, nc, c
reduced = False
- raise NotImplementedError, bryan_message
+
+ if self.num_vars > 0:
+ d = [0] * self.num_vars
+
+ i = 0
+ while i < self.num_coeffs:
+ p = self.index_to_powers(i)
+
+ if sgn(self.coeffs[i]) and p:
+ j = 0
+ while j < self.num_vars:
+ if d[j] < p[j]:
+ d[j] = p[j]
+ j+= 1
+ i += 1
+
+ i = 0
+ while not reduced and i < self.num_vars:
+ if d[i] < self.degree[i]: reduced = True
+ else: #if d[i] >= self.deg[i]
+ i += 1
+
+ if reduced:
+ i = 0
+ nc = 1
+ while i < self.num_vars:
+ nc *= d[i] + 1
+ i+= 1
+
+ c = [None] * nc
+ i = 0
+ while i < self.num_coeffs:
+ if sgn(self.coeffs[i]):
+ p = self.index_to_powers(i)
+ j = k = 0
+ l = nc
+ while k < self.num_vars:
+ assert p[k] <= d[k]
+ l /= d[k] + 1
+ j += l * (d[k] - p[k])
+ k += 1
+ c[j] = self.coeffs[i]
+ i+= 1
+
+ self.num_coeffs = nc
+ self.coeffs = c
+ self.deg = d
return reduced
def add_var(self, i):
"""returns a polynomial of num_vars + 1 variables of