PIPS
pnome-private.c File Reference
#include <stdio.h>
#include <string.h>
#include "boolean.h"
#include "arithmetique.h"
#include "vecteur.h"
#include "polynome.h"
+ Include dependency graph for pnome-private.c:

Go to the source code of this file.

Functions

Pmonome monome_del_var (Pmonome pm, Variable var)
 Pmonome monome_del_var(Pmonome pm, Variable var) PRIVATE returns a copy of monomial pm, where variable var is deleted. More...
 
bool monome_colin (Pmonome pm1, Pmonome pm2)
 bool monome_colin(Pmonome pm1, Pmonome pm2) PRIVATE returns true if the two monomials are "colinear": same variables, same exponents. More...
 
bool monome_equal (Pmonome pm1, Pmonome pm2)
 bool monome_equal(Pmonome pm1, Pmonome pm2) PRIVATE returns true if the two monomials are equal same coeff., same variables, same exponents. More...
 
float Bernouilli (int i)
 float Bernouilli(int i) PRIVATE returns Bi = i-th Bernouilli number More...
 
int factorielle (int n)
 int factorielle (int n) PRIVATE returns n! More...
 
double intpower (double d, int n)
 double intpower(double d, int n) returns d^n for all integers n More...
 
bool is_inferior_monome (Pmonome pm1, Pmonome pm2, int *is_inferior_var)
 bool is_inferior_monome(Pmonome pm1, pm2, int (*is_inferior_var)()) returns the qsort comparison (pm1<pm2) we follow the "lexicographic" order: decreasing powers of the main variable, (according to the variable order relation passed in is_inferior_var) the decreasing powers of the next main variable, ... More...
 

Function Documentation

◆ Bernouilli()

float Bernouilli ( int  i)

float Bernouilli(int i) PRIVATE returns Bi = i-th Bernouilli number

later, we could compute bigger Bernouilli(i) with the recurrence

To please the gcc compiler

Definition at line 108 of file pnome-private.c.

110 {
111  switch (i) {
112  case 1: return((float) 1/6);
113  case 2: return((float) 1/30);
114  case 3: return((float) 1/42);
115  case 4: return((float) 1/30);
116  case 5: return((float) 5/66);
117  case 6: return((float) 691/2730);
118  case 7: return((float) 7/6);
119  case 8: return((float) 3617/510);
120  case 9: return((float) 43867/798);
121  case 10: return((float) 174611/330);
122  case 11: return((float) 854513/138);
123  case 12: return((float) 236364091/2730);
124  default: polynome_error("Bernouilli(i)", "i=%d illegal\n", i);
125  /* later, we could compute bigger Bernouilli(i) with the recurrence */
126  }
127  /* To please the gcc compiler */
128  return 0.;
129 }
void polynome_error(const char *name, char *fmt,...)
INTLIBRARY.
Definition: pnome-error.c:62

References polynome_error().

Referenced by polynome_sum_of_power().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ factorielle()

int factorielle ( int  n)

int factorielle (int n) PRIVATE returns n!

Definition at line 136 of file pnome-private.c.

138 {
139  int fact = -1;
140 
141  if (n<0)
142  polynome_error("factorielle", "n=%d", n);
143  else if (n<2)
144  fact = 1;
145  else
146  fact = factorielle(n-1) * n;
147 
148  return fact;
149 }
int factorielle(int n)
int factorielle (int n) PRIVATE returns n!

References polynome_error().

Referenced by average_probability_matrix().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ intpower()

double intpower ( double  d,
int  n 
)

double intpower(double d, int n) returns d^n for all integers n

Definition at line 155 of file pnome-private.c.

158 {
159  if (n>0)
160  return (intpower(d, n-1) * d);
161  else if (n==0)
162  return((double) 1);
163  else
164  return (intpower(d, n+1) / d);
165 }
double intpower(double d, int n)
double intpower(double d, int n) returns d^n for all integers n

Referenced by float_to_frac(), and polynome_sum_of_power().

+ Here is the caller graph for this function:

◆ is_inferior_monome()

bool is_inferior_monome ( Pmonome  pm1,
Pmonome  pm2,
int is_inferior_var 
)

bool is_inferior_monome(Pmonome pm1, pm2, int (*is_inferior_var)()) returns the qsort comparison (pm1<pm2) we follow the "lexicographic" order: decreasing powers of the main variable, (according to the variable order relation passed in is_inferior_var) the decreasing powers of the next main variable, ...

When pm1=pm2 we return false. When pm1 or pm2 is MONOME_NUL or MONOME_UNDEFINED we return false.

is_inferior_var is indeed to be understood as the qsort comparator method and so is ill-defined here. RK

Initial version: Pvecteur pv1 = vect_tri(monome_term(pm1), is_inferior_var); Pvecteur pv2 = vect_tri(monome_term(pm2), is_inferior_var);

Fabien's version: Pvecteur pv1 = vect_sort(monome_term(pm1), vect_compare); Pvecteur pv2 = vect_sort(monome_term(pm2), vect_compare);

Pbase pbsorted = (Pbase) vect_tri(pb, is_inferior_var);

Pbase pbsorted = (Pbase) vect_sort(pb, vect_compare);

The following test is added by L.Zhou .
We want the constant term at the end . Jul.15, 91

The following test is added by L.Zhou . Mar.26, 91

Definition at line 179 of file pnome-private.c.

182 {
183  if (MONOME_UNDEFINED_P(pm1) || MONOME_UNDEFINED_P(pm2)
184  || MONOME_NUL_P(pm1) || MONOME_NUL_P(pm2))
185  return (false);
186  else {
187  /* Initial version:
188  Pvecteur pv1 = vect_tri(monome_term(pm1), is_inferior_var);
189  Pvecteur pv2 = vect_tri(monome_term(pm2), is_inferior_var);
190  */
191  /* Fabien's version:
192  Pvecteur pv1 = vect_sort(monome_term(pm1), vect_compare);
193  Pvecteur pv2 = vect_sort(monome_term(pm2), vect_compare);
194  */
197  Pbase pb = base_union((Pbase) pv1, (Pbase) pv2);
198  /* Pbase pbsorted = (Pbase) vect_tri(pb, is_inferior_var); */
199  /* Pbase pbsorted = (Pbase) vect_sort(pb, vect_compare); */
200  Pbase pbsorted = (Pbase) vect_sort(pb, is_inferior_var);
201  bool result = false;
202 
203  /* The following test is added by L.Zhou .
204  We want the constant term at the end . Jul.15, 91 */
205  if ( term_cst(pv1) )
206  return(true);
207  else if ( term_cst(pv2) )
208  return(false);
209 
210  /* The following test is added by L.Zhou . Mar.26, 91 */
211  if ( vect_coeff_sum(pv1) < vect_coeff_sum(pv2) )
212  result = true;
213  else if ( vect_coeff_sum(pv1) > vect_coeff_sum(pv2) )
214  ;
215  else {
216  while (!BASE_NULLE_P(pbsorted)) {
217  Variable var = vect_first_var((Pvecteur) pbsorted);
218  Value power1 = vect_coeff(var, pv1);
219  Value power2 = vect_coeff(var, pv2);
220 
221  if ( power1 < power2 ) {
222  result = true;
223  break;
224  }
225  else if ( power2 < power1 )
226  break;
227  vect_erase_var((Pvecteur *) &pbsorted, var);
228  }
229  }
230 
231  vect_rm((Pvecteur) pbsorted);
232  vect_rm((Pvecteur) pb);
233  vect_rm(pv2);
234  vect_rm(pv1);
235 
236  return (result);
237  }
238 }
int Value
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
#define monome_term(pm)
#define MONOME_UNDEFINED_P(pm)
#define MONOME_NUL_P(pm)
Variable vect_first_var(Pvecteur pvec)
PRIVATE: marquage du couple var_val comme visite par remplacement de var par -var dans le couple (OBS...
Definition: private.c:227
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
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 term_cst(varval)
#define BASE_NULLE_P(b)
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78
void vect_erase_var(Pvecteur *ppv, Variable v)
void vect_erase_var(Pvecteur * ppv, Variable v): projection du vecteur *ppv selon la direction v (i....
Definition: unaires.c:106
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
Value vect_coeff_sum(Pvecteur vect)
Value vect_coeff_sum(Pvecteur vect): coefficient sum de tout les val de ce vecteur (devrait etre dans...
Definition: unaires.c:246

References BASE_NULLE_P, base_union(), is_inferior_var(), MONOME_NUL_P, monome_term, MONOME_UNDEFINED_P, term_cst, vect_coeff(), vect_coeff_sum(), vect_erase_var(), vect_first_var(), vect_rm(), and vect_sort().

Referenced by polynome_sort().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ monome_colin()

bool monome_colin ( Pmonome  pm1,
Pmonome  pm2 
)

bool monome_colin(Pmonome pm1, Pmonome pm2) PRIVATE returns true if the two monomials are "colinear": same variables, same exponents.

We consider that MONOME_UNDEFINED is only colinear to MONOME_UNDEFINED. [???]

Parameters
pm1m1
pm2m2

Definition at line 77 of file pnome-private.c.

79 {
80  if (MONOME_UNDEFINED_P(pm1) || MONOME_UNDEFINED_P(pm2)
81  || MONOME_NUL_P(pm1) || MONOME_NUL_P(pm2))
82  return(pm1 == pm2);
83  else
84  return(vect_equal(monome_term(pm1), monome_term(pm2)));
85 }
bool vect_equal(Pvecteur v1, Pvecteur v2)
bool vect_equal(Pvecteur v1, Pvecteur v2): test a egalite de deux vecteurs
Definition: reductions.c:278

References MONOME_NUL_P, monome_term, MONOME_UNDEFINED_P, and vect_equal().

Referenced by polynome_check(), polynome_monome_add(), and polynome_monome_addition().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ monome_del_var()

Pmonome monome_del_var ( Pmonome  pm,
Variable  var 
)

Pmonome monome_del_var(Pmonome pm, Variable var) PRIVATE returns a copy of monomial pm, where variable var is deleted.

pnome-private.c

is it the only variable

now it is a constant term

Parameters
pmm
varar

Definition at line 47 of file pnome-private.c.

50 {
51  if (MONOME_UNDEFINED_P(pm))
52  return (MONOME_UNDEFINED);
53  else if (MONOME_NUL_P(pm))
54  return (MONOME_NUL);
55  else {
56  Pmonome newpm = new_monome();
57 
58  monome_coeff(newpm) = monome_coeff(pm);
59  monome_term(newpm) = vect_del_var(monome_term(pm), var);
60  if (VECTEUR_NUL_P(monome_term(newpm))) {
61  /* is it the only variable */
62  monome_term(newpm) = vect_new(TCST, VALUE_ONE);
63  /* now it is a constant term */
64  }
65 
66  return(newpm);
67  }
68 }
#define VALUE_ONE
Pmonome new_monome()
INTLIBRARY.
Definition: pnome-alloc.c:48
#define monome_coeff(pm)
Macros definitions.
#define MONOME_UNDEFINED
#define MONOME_NUL
Null/undefined, monomial/polynomial definitions.
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
#define VECTEUR_NUL_P(v)
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
Pvecteur vect_del_var(Pvecteur v_in, Variable var)
Pvecteur vect_del_var(Pvecteur v_in, Variable var): allocation d'un nouveau vecteur egal a la project...
Definition: unaires.c:206

References monome_coeff, MONOME_NUL, MONOME_NUL_P, monome_term, MONOME_UNDEFINED, MONOME_UNDEFINED_P, new_monome(), TCST, VALUE_ONE, vect_del_var(), vect_new(), and VECTEUR_NUL_P.

Referenced by polynome_factorize(), and polynome_var_subst().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ monome_equal()

bool monome_equal ( Pmonome  pm1,
Pmonome  pm2 
)

bool monome_equal(Pmonome pm1, Pmonome pm2) PRIVATE returns true if the two monomials are equal same coeff., same variables, same exponents.

Parameters
pm1m1
pm2m2

Definition at line 93 of file pnome-private.c.

95 {
96  if (MONOME_UNDEFINED_P(pm1) || MONOME_UNDEFINED_P(pm2)
97  || MONOME_NUL_P(pm1) || MONOME_NUL_P(pm2))
98  return(pm1 == pm2);
99  else
100  return(vect_equal(monome_term(pm1), monome_term(pm2))
101  && ((monome_coeff(pm1) == monome_coeff(pm2))));
102 }

References monome_coeff, MONOME_NUL_P, monome_term, MONOME_UNDEFINED_P, and vect_equal().

+ Here is the call graph for this function: