summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Bishop <kanzure@gmail.com>2011-05-13 17:20:28 -0500
committerBryan Bishop <kanzure@gmail.com>2011-05-13 17:20:28 -0500
commite38fda98ce8a2c06f8b735e7827a964ccb173219 (patch)
tree04ac29f25fcfb4b84b9e51a11e5a2d44e76f44d0
parentbf5a08da64d2d2b7f756c4d484ee5ed4a20285d3 (diff)
downloadlolcad-e38fda98ce8a2c06f8b735e7827a964ccb173219.tar.gz
lolcad-e38fda98ce8a2c06f8b735e7827a964ccb173219.zip
implemented subst_expr
-rw-r--r--esolid/esolid.py110
1 files changed, 108 insertions, 2 deletions
diff --git a/esolid/esolid.py b/esolid/esolid.py
index 719ff5d..e5b25de 100644
--- a/esolid/esolid.py
+++ b/esolid/esolid.py
@@ -240,7 +240,29 @@ class K_RATPOLY:
def add_var(self, i):
"""returns a polynomial of num_vars + 1 variables of
degree deg[0], deg[1], ..., deg[i - 1], 0, deg[i], ..., deg[num_vars - 1]."""
- raise NotImplementedError, bryan_message
+ assert i < (self.num_vars + 1)
+
+ #locals: j, dp
+ dp = [0] * (self.num_vars + 1)
+
+ j = 0
+ while j < i:
+ dp[j] = self.degree[j]
+ j += 1
+ dp[i] = 0
+
+ j = i
+ while j < self.num_vars:
+ dp[j + 1] = self.degree[j]
+ j += 1
+
+ P = K_RATPOLY(self.num_vars + 1, dp)
+
+ j = 0
+ while j < self.num_coeffs:
+ P.coeffs[j] = self.coeffs[j]
+ j += 1
+ return P
def remove_var(self, i):
"""PROVIDED self.degree[i] == 0,
returns a polynomial of num_vars - 1 variables of degree
@@ -344,7 +366,91 @@ class K_RATPOLY:
and, renaming
X_{i + 1}, ..., X_{num_vars - 1} to X_i, ..., X_{num_vars - 2}."""
return self.subst_val_proto(i, b, 1)
- #subst_expr(i, P)
+ def subst_expr(self, i, P):
+ """returns a polynomial of num_vars - 1 variables obtained by
+ computing
+ *this(X_o, X_1, ..., X_{i - 1},
+ P (X_0, X_1, ..., X_{i - 1}, X_{i + 1}, X_{num_vars - 1}),
+ X_{i+1}, ..., X_{num_vars - 1})
+ and, renaming
+ X_{i + 1}, ..., X_{num_vars - 1} to X_i, ..., X_{num_vars - 2}.
+ """
+ assert i < self.num_vars
+ assert self.num_vars == P.num_vars + 1
+
+ #locals: j, k, l, dq, PP, dpp0, p, p1, ppp, pq, Q
+ if self.num_vars > 1:
+ dq = [None] * (self.num_vars - 1)
+
+ j = 0
+ while j < i:
+ dq[j] = self.degree[j] + self.degree[i] * P.degree[j]
+ j += 1
+
+ j = i + 1
+ while j < self.num_vars:
+ dq[j - 1] = self.degree[j] + self.degree[i] * P.degree[j - 1]
+ j += 1
+ else: dq = []
+
+ Q = K_RATPOLY(self.num_vars - 1, dq)
+ PP = [K_RATPOLY()] * (self.degree[i] + 1)
+
+ if P.num_vars > 0:
+ dpp0 = [0] * P.num_vars
+ else: dpp0 = []
+
+ PP[0] = K_RATPOLY(P.num_vars, dpp0)
+ PP[0].coeffs[0] = 1
+
+ if self.degree[i] > 0:
+ PP[1] = P
+
+ j = 2
+ while j <= self.degree[i]:
+ PP[j] = P * PP[j - 1]
+ j += 1
+
+ j = 0
+ while j < self.num_coeffs:
+ if sgn(self.coeffs[j]):
+ p = self.index_to_powers(j)
+ if self.num_vars > 1:
+ p1 = [None] * (self.num_vars - 1)
+
+ k = 0
+ while k < i:
+ p1[k] = p[k]
+ k += 1
+
+ k = i + 1
+ while k < self.num_vars:
+ p1[k - 1] = p[k]
+ k += 1
+ else:
+ p1 = []
+
+ k = 0
+ while k < PP[p[i]].num_coeffs:
+ if sgn(PP[p[i]].coeffs[k]):
+ ppp = PP[p[i]].index_to_powers(k)
+ if self.num_vars > 1:
+ pq = [None] * (self.num_vars - 1)
+
+ l = 0
+ while l < self.num_vars -1:
+ pq[l] = p1[l] + ppp[l]
+ l += 1
+ else:
+ pq = []
+
+ l = Q.powers_to_index(pq)
+ Q.coeffs[l] += self.coeffs[j] * PP[p[i]].coeffs[k]
+ k += 1
+ j += 1
+ Q.reduce_deg()
+ return Q
+
#subst_expr(i, P, D)
#subst_param_expr(X, Y, Z, W)
#as_FLOATPOLY()