PIPS
pnome-root.c
Go to the documentation of this file.
1 /*
2 
3  $Id: pnome-root.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 /* computes the possible roots of a polynomial
44  * currently only works for degree 0,1,2)
45  * returned value is a vector of polynomial
46  * if p is independent of var, returns VECTEUR_UNDEFINED
47  */
49  switch(polynome_degree(p,var)) {
50  /* should we verify the other components are equal to zero ? */
51  case 0:
52  return VECTEUR_UNDEFINED;
53  /* gather a x var + b information */
54  case 1: {
56  for(pp=p ; pp != POLYNOME_NUL; pp = polynome_succ(pp)) {
57  Pmonome m = polynome_monome(pp);
58  Value val ;
59  if((val=vect_coeff(var, monome_term(m)))!=VALUE_ZERO) {
60  Pmonome dup = monome_dup(m);
61  if(vect_size(monome_term(dup))>1)
62  vect_del_var(monome_term(dup),var);
63  else
64  vect_chg_var(&monome_term(dup),var,TCST);
65  polynome_monome_add(&a,dup);
66  monome_rm(&dup);
67  }
68  else {
69  polynome_monome_add(&b,m);
70  }
71  }
72  /* the root is -b/a */
73  polynome_negate(&b);
74  b=polynome_div(b,a);
75  polynome_rm(&a);
76  return vect_new(b,1);
77  }
78  /* gather a x^2 + b x + c informations */
79  case 2:{
81  for(pp=p ; pp != POLYNOME_NUL; pp = polynome_succ(pp)) {
82  Pmonome m = polynome_monome(pp);
83  Value val =vect_coeff(var, monome_term(m));
84  if(val==2) {
85  Pmonome dup = monome_dup(m);
86  vect_chg_var(&monome_term(dup),var,TCST);
87  polynome_monome_add(&a,dup);
88  monome_rm(&dup);
89  }
90  else if(val == 1 ) {
91  Pmonome dup = monome_dup(m);
92  vect_chg_var(&monome_term(dup),var,TCST);
93  polynome_monome_add(&b,dup);
94  monome_rm(&dup);
95  }
96  else {
97  polynome_monome_add(&c,m);
98  }
99  }
100  /* compute determinant */
101  Ppolynome delta=polynome_mult(a,c),tmp;
102  delta=polynome_scalar_multiply(delta,4);
103  polynome_negate(&delta);/* delta =-4 a c*/
104  tmp=polynome_mult(b,b);
105  polynome_add(&delta,tmp);
106  polynome_rm(&tmp);
107 
108  /* take its square root if possible */
109  Ppolynome sqdelta = polynome_nth_root(delta,2);
110  if(POLYNOME_UNDEFINED_P(sqdelta))
111  polynome_error(__FUNCTION__,"cannot solve this degree 2 polynomial symbolically\n");
112 
113  /* the roots are (-b +sqdelta) / 2a and (-b -sqdelta) / 2a */
114  Ppolynome r0,r1=polynome_dup(b);
115  r0=polynome_addition(b,sqdelta);
116  polynome_negate(&r0);
117  polynome_scalar_mult(&a,2);// warning: modifies a in place */
118  r0=polynome_div(tmp=r0,a);
119  polynome_rm(&tmp);
120 
121  polynome_negate(&b); //warning modifies b in place
122  r1=polynome_addition(b,sqdelta);
123  r1=polynome_div(tmp=r1,a);
124  polynome_rm(&tmp);
125  Pvecteur roots=vect_new(r0,1);
126  vect_add_elem(&roots,r1,1);
127  return roots;
128  }
129  default:
130  polynome_error(__FUNCTION__,"solving polynome not implemented yet in that case\n");
131  }
132  return VECTEUR_NUL;
133 
134 
135 }
#define VALUE_ZERO
int Value
int vect_size(Pvecteur v)
package vecteur - reductions
Definition: reductions.c:47
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
Pmonome monome_dup(Pmonome pm)
Pmonome monome_dup(Pmonome pm) PRIVATE creates and returns a copy of pm.
Definition: pnome-alloc.c:132
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
Ppolynome polynome_addition(Ppolynome pp, Ppolynome pp2)
Ppolynome polynome_addition(Ppolynome pp, Ppolynome pp2) pp = pp + pp2.
Definition: pnome-bin.c:195
Ppolynome polynome_div(Ppolynome pp1, Ppolynome pp2)
Ppolynome polynome_div(Ppolynome pp1, Ppolynome pp2) returns p = pp1 / pp2.
Definition: pnome-bin.c:381
Ppolynome polynome_mult(Ppolynome pp1, Ppolynome pp2)
Ppolynome polynome_mult(Ppolynome pp1, Ppolynome pp2) returns pp1 * pp2.
Definition: pnome-bin.c:287
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 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
Pvecteur polynome_roots(Ppolynome p, Variable var)
computes the possible roots of a polynomial currently only works for degree 0,1,2) returned value is ...
Definition: pnome-root.c:48
Ppolynome polynome_nth_root(Ppolynome p, int n)
computes the n-root of polynomial if possible, that is if all exponents are multiple of n return POLY...
Definition: pnome-scal.c:177
void polynome_scalar_mult(Ppolynome *ppp, float factor)
void polynome_scalar_mult(Ppolynome* ppp, float factor) (*ppp) = factor * (*ppp) !...
Definition: pnome-scal.c:46
Ppolynome polynome_scalar_multiply(Ppolynome pp, float factor)
Ppolynome polynome_scalar_multiply(Ppolynome pp, float factor) pp = factor * (pp) !...
Definition: pnome-scal.c:65
void polynome_negate(Ppolynome *ppp)
void polynome_negate(Ppolynome *ppp); changes sign of polynomial *ppp.
Definition: pnome-unaires.c:45
#define POLYNOME_NUL
#define POLYNOME_UNDEFINED_P(pp)
#define monome_term(pm)
#define polynome_monome(pp)
#define polynome_succ(pp)
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.
#define VECTEUR_NUL
DEFINITION DU VECTEUR NUL.
#define VECTEUR_UNDEFINED
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
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_add_elem(Pvecteur *pvect, Variable var, Value val)
void vect_add_elem(Pvecteur * pvect, Variable var, Value val): addition d'un vecteur colineaire au ve...
Definition: unaires.c:72
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
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
void vect_chg_var(Pvecteur *ppv, Variable v_old, Variable v_new)
void vect_chg_var(Pvecteur *ppv, Variable v_old, Variable v_new) replace the variable v_old by v_new
Definition: unaires.c:168