PIPS
pnome-reduc.c
Go to the documentation of this file.
1 /*
2 
3  $Id: pnome-reduc.c 1671 2019-06-26 19:14:11Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of Linear/C3 Library.
8 
9  Linear/C3 Library is free software: you can redistribute it and/or modify it
10  under the terms of the GNU Lesser General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  Linear/C3 Library is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with Linear/C3 Library. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 
25 /************************************************************* pnome-reduc.c
26  *
27  * REDUCTIONS ON POLYNOMIALS
28  *
29  */
30 
31 #ifdef HAVE_CONFIG_H
32  #include "config.h"
33 #endif
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include "linear_assert.h"
37 
38 #include "boolean.h"
39 #include "arithmetique.h"
40 #include "vecteur.h"
41 #include "polynome.h"
42 
43 /* Ppolynome polynome_var_subst(Ppolynome pp, Variable var, Ppolynome ppsubst)
44  * creates and returns a Ppolynome copied from pp in which every occurrence of
45  * variable var is substituted by polynomial ppsubst, which must not contain var.
46  */
47 Ppolynome polynome_var_subst(pp, var, ppsubst)
48 Ppolynome pp;
49 Variable var;
50 Ppolynome ppsubst;
51 {
52  Ppolynome ppsubst_n, ppmult;
53  Ppolynome newpp = POLYNOME_NUL;
54  Pmonome curpm, newpm;
55  int varpower;
56 
57  if (POLYNOME_UNDEFINED_P(pp))
58  return (POLYNOME_UNDEFINED);
59  else {
60  for( ; pp != POLYNOME_NUL; pp = polynome_succ(pp)) {
61  curpm = polynome_monome(pp);
62  if ((varpower = (int) vect_coeff(var, monome_term(curpm))) == 0)
63  polynome_monome_add(&newpp, curpm);
64  else {
65  /* the monomial curpm contains the variable var. */
66  /* We duplicate it, remove variable var from it, */
67  /* we multiply it with ppsubst^n (where n was the */
68  /* power of var), and we add the result to newpp. */
69 
70  if (POLYNOME_UNDEFINED_P(ppsubst))
71  return (POLYNOME_UNDEFINED);
72  else {
73  newpm = monome_del_var(curpm, var);
74  ppsubst_n = polynome_power_n(ppsubst, varpower);
75  ppmult = polynome_monome_mult(ppsubst_n, newpm);
76  polynome_add(&newpp, ppmult);
77 
78  polynome_rm(&ppmult);
79  polynome_rm(&ppsubst_n);
80  monome_rm(&newpm);
81  }
82  }
83  }
84  return(newpp);
85  }
86 }
87 
88 /* int polynome_degree(Ppolynome pp, Variable var)
89  * returns the degree of polynomial pp viewed as a polynomial
90  * of one variable, var.
91  * If pp is POLYNOME_UNDEFINED: abort. [???]
92  */
93 int polynome_degree(pp, var)
94 Ppolynome pp;
95 Variable var;
96 {
97  int power, deg = 0;
98 
99  /* polynome_degree: polynome is undefined */
101  for( ; pp != POLYNOME_NUL; pp = polynome_succ(pp)) {
102  power = (int) vect_coeff(var, monome_term(polynome_monome(pp)));
103  if (deg < power) deg = power;
104  }
105  return(deg);
106 }
107 
108 /* int polynome_max_degree(Ppolynome pp)
109  * returns the degree of polynomial pp
110  * Let's hope there aren't too many negative powers...
111  * If pp is POLYNOME_UNDEFINED: abort. [???]
112  */
114 {
115  int power, deg = 0;
117 
118  /* polynome_degree: polynome is undefined */
120  for(m = pp ; m != POLYNOME_NUL; m = polynome_succ(m)) {
121  power = (int) vect_sum(monome_term(polynome_monome(m)));
122  if (deg < power) deg = power;
123  }
124  return deg;
125 }
126 
127 
128 /* Ppolynome polynome_factorize(Ppolynome pp, Variable var, int n)
129  * returns the (polynomial) coefficient of var^n in polynomial pp
130  */
132 Ppolynome pp;
133 Variable var;
134 int n;
135 {
136  Ppolynome ppfact = POLYNOME_NUL;
137  Pmonome pm;
138 
139  if (POLYNOME_UNDEFINED_P(pp))
140  return (POLYNOME_UNDEFINED);
141  else {
142  for( ; pp != POLYNOME_NUL; pp = polynome_succ(pp))
143  if (n == (int) vect_coeff(var, monome_term(polynome_monome(pp)))) {
144  pm = monome_del_var(polynome_monome(pp), var);
145  polynome_monome_add(&ppfact, pm);
146  }
147 
148  return(ppfact);
149  }
150 }
151 
152 /* float polynome_TCST(Ppolynome pp)
153  * returns the constant term of polynomial pp.
154  * If pp is POLYNOME_UNDEFINED: abort. [???]
155  */
156 float polynome_TCST(pp)
157 Ppolynome pp;
158 {
159  Pmonome pm;
160  Pvecteur pvTCST = vect_new((Variable) TCST, VALUE_ONE);
161 
162  /* polynome_TCST: polynome is undefined */
164  for( ; pp != POLYNOME_NUL; pp = polynome_succ(pp) ) {
165  pm = polynome_monome(pp);
166  if (vect_equal(pvTCST, monome_term(pm)))
167  return(monome_coeff(pm));
168  }
169 
170  vect_rm(pvTCST);
171  return ((float) 0);
172 
173 }
174 
175 /* bool polynome_constant_p(Ppolynome pp)
176  * return true if pp is a constant polynomial
177  * (including null polynomial)
178  * If pp is POLYNOME_UNDEFINED: abort. [???]
179  */
181 Ppolynome pp;
182 {
183  /* polynome_constant_p: polynome is undefined */
185 
186  if (POLYNOME_NUL_P(pp))
187  return(true);
188  else {
189  Pvecteur pvTCST = vect_new((Variable) TCST, VALUE_ONE);
190  bool b = (vect_equal(pvTCST, monome_term(polynome_monome(pp)))
191  && (polynome_succ(pp) == POLYNOME_NUL));
192 
193  vect_rm(pvTCST);
194  return(b);
195  }
196 }
197 
198 
199 /* Pbase polynome_used_var(Ppolynome pp, bool *is_inferior_var())
200  * PRIVATE
201  * Returns, in a Pbase, a list of the variables used in pp,
202  * sorted according to the function is_inferior_var()
203  */
205 Ppolynome pp;
207 {
208  Pbase b = BASE_NULLE;
209  Pbase b2 = BASE_NULLE;
211 
212  if (!POLYNOME_UNDEFINED_P(pp)) {
213  for (pm = pp; !POLYNOME_NUL_P(pm); pm = polynome_succ(pm)) {
215  b = b2;
216  }
217 
218  /* FI: I do not understand what has been done here! (20/09/95) */
219  /* b2 = (Pbase) vect_tri((Pvecteur) b, is_inferior_var); */
220  /* FI: vect_compare() seems only good when Value=char * */
221  /* b2 = (Pbase) vect_sort((Pvecteur) b, vect_compare); */
223  vect_rm((Pvecteur) b);
224  }
225  else {
226  polynome_error("polynome_used_var",
227  "POLYNOME_UNDEFINED out of domain\n");
228  b2 = BASE_UNDEFINED;
229  }
230  return b2;
231 }
232 
233 
234 /* bool polynome_contains_var(Ppolynome pp, Variable var)
235  * PRIVATE
236  * returns true if variable var is in polynomial pp.
237  */
239 Ppolynome pp;
240 Variable var;
241 {
242  if ( POLYNOME_UNDEFINED_P(pp) )
243  return (false);
244  else {
245  for ( ; pp != POLYNOME_NUL; pp = polynome_succ(pp))
246  if (vect_coeff(var, monome_term(polynome_monome(pp))) != 0)
247  return (true);
248  return(false);
249  }
250 }
251 
252 
253 /* bool polynome_equal(Ppolynome pp1, Ppolynome pp2)
254  * return (pp1 == pp2)
255  * >>>TO BE CONTINUED<<<
256  */
257 bool polynome_equal(pp1, pp2)
258 Ppolynome pp1,pp2;
259 {
260  Ppolynome ppcopy1 = polynome_dup(pp1);
261  Ppolynome ppcopy2 = polynome_dup(pp2);
262 
265 
266 
267  /* TO BE CONTINUED */
268  polynome_error ("polynome_equal", "To be implemented!\n");
269  return false;
270 }
void const char const char const int
#define VALUE_ONE
Pbase base_union(Pbase b1, Pbase b2)
Pbase base_union(Pbase b1, Pbase b2): compute a new basis containing all elements of b1 and all eleme...
Definition: base.c:428
bool is_inferior_var(Variable, Variable)
Definition: polynome_ri.c:118
Value vect_sum(Pvecteur v)
Value vect_sum(Pvecteur v): somme des coefficients d'un vecteur (i.e.
Definition: reductions.c:261
bool vect_equal(Pvecteur v1, Pvecteur v2)
bool vect_equal(Pvecteur v1, Pvecteur v2): test a egalite de deux vecteurs
Definition: reductions.c:278
#define assert(ex)
Definition: newgen_assert.h:41
void monome_rm(Pmonome *ppm)
void monome_rm(Pmonome* ppm) PRIVATE frees space occupied by monomial *ppm returns *ppm pointing to M...
Definition: pnome-alloc.c:154
Ppolynome polynome_dup(Ppolynome pp)
Ppolynome polynome_dup(Ppolynome pp) creates and returns a copy of pp.
Definition: pnome-alloc.c:211
void polynome_rm(Ppolynome *ppp)
void polynome_rm(Ppolynome* ppp) frees space occupied by polynomial *ppp returns *ppp pointing to POL...
Definition: pnome-alloc.c:170
Ppolynome polynome_monome_mult(Ppolynome pp, Pmonome pm)
Ppolynome polynome_monome_mult(Ppolynome pp, Pmonome pm) PRIVATE returns pp * pm.
Definition: pnome-bin.c:266
void polynome_monome_add(Ppolynome *ppp, Pmonome pm)
void polynome_monome_add(Ppolynome* ppp, Pmonome pm) PRIVATE Add monomial pm to polynomial *ppp,...
Definition: pnome-bin.c:50
void polynome_add(Ppolynome *ppp, Ppolynome pp2)
void polynome_add(Ppolynome* ppp, Ppolynome pp2) (*ppp) = (*ppp) + pp2.
Definition: pnome-bin.c:171
void polynome_error(const char *name, char *fmt,...)
INTLIBRARY.
Definition: pnome-error.c:62
int default_is_inferior_pvarval(Pvecteur *pvarval1, Pvecteur *pvarval2)
bool default_is_inferior_pvarval(Pvecteur * pvarval1, Pvecteur * pvarval2) return true if var1 is bef...
Definition: pnome-io.c:286
Pmonome monome_del_var(Pmonome pm, Variable var)
Pmonome monome_del_var(Pmonome pm, Variable var) PRIVATE returns a copy of monomial pm,...
Definition: pnome-private.c:47
bool polynome_equal(Ppolynome pp1, Ppolynome pp2)
bool polynome_equal(Ppolynome pp1, Ppolynome pp2) return (pp1 == pp2) >>>TO BE CONTINUED<<<
Definition: pnome-reduc.c:257
int polynome_degree(Ppolynome pp, Variable var)
int polynome_degree(Ppolynome pp, Variable var) returns the degree of polynomial pp viewed as a polyn...
Definition: pnome-reduc.c:93
Pbase polynome_used_var(Ppolynome pp, int *is_inferior_var)
Pbase polynome_used_var(Ppolynome pp, bool *is_inferior_var()) PRIVATE Returns, in a Pbase,...
Definition: pnome-reduc.c:204
float polynome_TCST(Ppolynome pp)
float polynome_TCST(Ppolynome pp) returns the constant term of polynomial pp.
Definition: pnome-reduc.c:156
Ppolynome polynome_var_subst(Ppolynome pp, Variable var, Ppolynome ppsubst)
Ppolynome polynome_var_subst(Ppolynome pp, Variable var, Ppolynome ppsubst) creates and returns a Ppo...
Definition: pnome-reduc.c:47
bool polynome_constant_p(Ppolynome pp)
bool polynome_constant_p(Ppolynome pp) return true if pp is a constant polynomial (including null pol...
Definition: pnome-reduc.c:180
int polynome_max_degree(Ppolynome pp)
int polynome_max_degree(Ppolynome pp) returns the degree of polynomial pp Let's hope there aren't too...
Definition: pnome-reduc.c:113
bool polynome_contains_var(Ppolynome pp, Variable var)
bool polynome_contains_var(Ppolynome pp, Variable var) PRIVATE returns true if variable var is in pol...
Definition: pnome-reduc.c:238
Ppolynome polynome_factorize(Ppolynome pp, Variable var, int n)
Ppolynome polynome_factorize(Ppolynome pp, Variable var, int n) returns the (polynomial) coefficient ...
Definition: pnome-reduc.c:131
Ppolynome polynome_power_n(Ppolynome pp, int n)
Ppolynome polynome_power_n(Ppolynome pp, int n) returns pp ^ n (n>=0)
Definition: pnome-scal.c:121
Ppolynome polynome_sort(Ppolynome *ppp, int *is_inferior_var)
Ppolynome polynome_sort((Ppolynome *) ppp, bool (*is_inferior_var)()) Sorts the polynomial *ppp: mono...
#define POLYNOME_NUL
#define POLYNOME_UNDEFINED
#define POLYNOME_UNDEFINED_P(pp)
#define monome_term(pm)
#define polynome_monome(pp)
#define monome_coeff(pm)
Macros definitions.
#define POLYNOME_NUL_P(pp)
#define polynome_succ(pp)
Value b2
Definition: sc_gram.c:105
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
struct Svecteur * Pbase
void * Variable
arithmetique is a requirement for vecteur, but I do not want to inforce it in all pips files....
Definition: vecteur-local.h:60
#define BASE_UNDEFINED
#define BASE_NULLE
MACROS SUR LES BASES.
Pvecteur vect_new(Variable var, Value coeff)
Pvecteur vect_new(Variable var,Value coeff): allocation d'un vecteur colineaire au vecteur de base va...
Definition: alloc.c:110
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78
Value vect_coeff(Variable var, Pvecteur vect)
Variable vect_coeff(Variable var, Pvecteur vect): coefficient de coordonnee var du vecteur vect —> So...
Definition: unaires.c:228
Pvecteur vect_sort(Pvecteur v, int *compare)
Pvecteur vect_sort(v, compare) Pvecteur v; int (*compare)();.
Definition: unaires.c:335