diff options
author | Bryan Bishop <kanzure@gmail.com> | 2011-05-13 17:20:28 -0500 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2011-05-13 17:20:28 -0500 |
commit | e38fda98ce8a2c06f8b735e7827a964ccb173219 (patch) | |
tree | 04ac29f25fcfb4b84b9e51a11e5a2d44e76f44d0 | |
parent | bf5a08da64d2d2b7f756c4d484ee5ed4a20285d3 (diff) | |
download | lolcad-e38fda98ce8a2c06f8b735e7827a964ccb173219.tar.gz lolcad-e38fda98ce8a2c06f8b735e7827a964ccb173219.zip |
implemented subst_expr
-rw-r--r-- | esolid/esolid.py | 110 |
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() |