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

Go to the source code of this file.

Functions

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 a vector of polynomial if p is independent of var, returns VECTEUR_UNDEFINED More...
 

Function Documentation

◆ polynome_roots()

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 a vector of polynomial if p is independent of var, returns VECTEUR_UNDEFINED

pnome-root.c

should we verify the other components are equal to zero ?

gather a x var + b information

the root is -b/a

gather a x^2 + b x + c informations

compute determinant

delta =-4 a c

take its square root if possible

the roots are (-b +sqdelta) / 2a and (-b -sqdelta) / 2a

Parameters
varar

Definition at line 48 of file pnome-root.c.

48  {
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
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
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

References monome_dup(), monome_rm(), monome_term, polynome_add(), polynome_addition(), polynome_degree(), polynome_div(), polynome_dup(), polynome_error(), polynome_monome, polynome_monome_add(), polynome_mult(), polynome_negate(), polynome_nth_root(), POLYNOME_NUL, polynome_rm(), polynome_scalar_mult(), polynome_scalar_multiply(), polynome_succ, POLYNOME_UNDEFINED_P, TCST, VALUE_ZERO, vect_add_elem(), vect_chg_var(), vect_coeff(), vect_del_var(), vect_new(), vect_size(), VECTEUR_NUL, and VECTEUR_UNDEFINED.

Referenced by do_solve_hardware_constraints_on_volume().

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