Blame view

Giac_maj/giac-1.4.9/src/sym2poly.h 7.58 KB
6663b6c9   adorian   projet complet av...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
  // -*- mode:C++ ; compile-command: "g++ -I.. -g -c sym2poly.cc" -*-
  /*
   *  Copyright (C) 2000, 2014 B. Parisse, Institut Fourier, 38402 St Martin d'Heres
   *
   *  This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License as published by
   *  the Free Software Foundation; either version 3 of the License, or
   *  (at your option) any later version.
   *
   *  This program is distributed in the hope that it will be useful,
   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *  GNU General Public License for more details.
   *
   *  You should have received a copy of the GNU General Public License
   *  along with this program. If not, see <http://www.gnu.org/licenses/>.
   */
  #ifndef _GIAC_SYM2POLY_H_
  #define _GIAC_SYM2POLY_H_
  #include "first.h"
  #include "vector.h"
  
  #include "poly.h"
  #include "gen.h"
  #include "identificateur.h"
  #include "symbolic.h"
  #include "gausspol.h"
  #include "series.h"
  #include "static.h"
  
  #ifndef NO_NAMESPACE_GIAC
  namespace giac {
  #endif // ndef NO_NAMESPACE_GIAC
  
    struct unary_function_ptr;
    // helper for symbolic functions working on expressions
    // if the user enters a function instead of an expression
    // Example of use in _factor
    //  gen var,res;
    //  if (is_algebraic_program(args,var,res))
    //    return symbolic(at_program,makevecteur(var,0,_factor(res,contextptr)));
    bool is_algebraic_program(const gen & g,gen & f1,gen & f3);
    bool has_algebraic_program(const gen & g);
    // return true if g is a program/function
    bool guess_program(gen & g,GIAC_CONTEXT);
  
    // high-level fonctions on gen
    gen ratnormal(const gen & e,GIAC_CONTEXT0);
    gen recursive_ratnormal(const gen & e,GIAC_CONTEXT);
    // gen normal(const gen & e); // rational simplifications
    gen normal(const gen & e,GIAC_CONTEXT); // rational simplifications
    gen normal(const gen & e,bool distribute_div,GIAC_CONTEXT);
    gen normalize_sqrt(const gen & e,GIAC_CONTEXT);
  
    extern const unary_function_ptr * const  at_normal ;
    symbolic symb_normal(const gen & args);
  
    gen simplify3(gen & n,gen & d);
    gen recursive_normal(const gen & e,GIAC_CONTEXT);  
    gen _recursive_normal(const gen & e,GIAC_CONTEXT);  
    gen recursive_normal(const gen & e,bool distribute_div,GIAC_CONTEXT);
    gen _non_recursive_normal(const gen & args);
    extern const unary_function_ptr * const  at_non_recursive_normal ;
    symbolic symb_non_recursive_normal(const gen & args);
  
    gen rationalgcd(const gen & a, const gen & b,GIAC_CONTEXT);
  
    gen factor(const gen & e,bool withsqrt,GIAC_CONTEXT); // full factorization (alg ext)
    gen ratfactor(const gen & e,bool withsqrt,GIAC_CONTEXT); // full factorization (rat)
    gen factor(const gen & e,const identificateur & x,bool withsqrt,GIAC_CONTEXT); // factorization w.r.t. x
    gen factor(const gen & e,const gen & f,bool withsqrt,GIAC_CONTEXT);
    gen _factor(const gen & args,GIAC_CONTEXT);
    extern const unary_function_ptr * const  at_factor ;
    gen _collect(const gen & args,GIAC_CONTEXT);
    extern const unary_function_ptr * const  at_collect ;
    gen factorcollect(const gen & args,bool with_sqrt,GIAC_CONTEXT);
    symbolic symb_factor(const gen & args);
  
    // partial fraction de_VECT.
    gen partfrac(const gen & e,const vecteur & l,bool withsqrt,GIAC_CONTEXT);
    gen partfrac(const gen & e,bool withsqrt,GIAC_CONTEXT); 
    gen partfrac(const gen & e,const identificateur & x,bool withsqrt,GIAC_CONTEXT); 
    gen partfrac(const gen & e,const gen & f,bool withsqrt,GIAC_CONTEXT);
    gen _partfrac(const gen & args,GIAC_CONTEXT);
    extern const unary_function_ptr * const  at_partfrac ;
    symbolic symb_partfrac(const gen & args);
  
    gen _resultant(const gen & args,GIAC_CONTEXT);
    extern const unary_function_ptr * const  at_resultant ;
    symbolic symb_resultant(const gen & args);
    
    // reading arguments from the command line
    void readargs(int ARGC, char *ARGV[],vecteur & args,GIAC_CONTEXT); 
  #ifdef NSPIRE
    template<class T>
    void readargs_from_stream(nio::ios_base<T> & inf,vecteur & args,GIAC_CONTEXT);
    template<class T>
    gen read1arg_from_stream(nio::ios_base<T> & inf,GIAC_CONTEXT);
  #else
    void readargs_from_stream(std::istream & inf,vecteur & args,GIAC_CONTEXT);
    gen read1arg_from_stream(std::istream & inf,GIAC_CONTEXT);
  #endif
  
    // return position of expression in vecteur l, 0 if not found
    int equalposcomp(const vecteur & l,const gen & e);
    // add expression to list of variables
    void addtolvar(const gen & e, vecteur & l);
    // find list of variables of an expression and set tensor_dim to lvar size
    vecteur lvar(const gen & e); 
    gen symb_lvar(const gen & e);
    gen cklvar(const gen & e,GIAC_CONTEXT);
    extern const unary_function_ptr * const  at_lvar;
    void lvar(const vecteur & v,vecteur & l);
    void lvar(const sparse_poly1 & p,vecteur & l);
    void lvar(const gen & e,vecteur & l);
    // Vars for algebraic extension
    // Format is a matrice, each line is a vecteur of names/expressions
    // Each line corresponds to an alg extension over at least one new variable
    // The first line corresponds to other names/expressions not embedded
    // in an algebraic extension, it might be empty
    void alg_lvar(const gen & e,matrice & m);
    matrice alg_lvar(const gen & e);
    void alg_lvar(const sparse_poly1 & p,vecteur & l);
    gen symb_algvar(const gen & e);
    gen ckalgvar(const gen & e,GIAC_CONTEXT);
    extern const unary_function_ptr * const  at_algvar;
    gen minimal_polynomial(const gen & pp,bool minonly,GIAC_CONTEXT);
  
    vecteur cdr_VECT(const vecteur & l);
  
    vecteur divisor(const gen & n);
    // fractions, see fration.h for other functions
        // fraction pow(const _FRAC & p,const gen & n);
  
    void evident(polynome & p,factorization & f);
  
    // symbolic to tensor
    fraction sym2r(const gen & e, const vecteur & l,GIAC_CONTEXT);
    // return true if num and den are totally converted to internal format
    bool sym2r (const gen &e,const gen & iext,const vecteur &l,const vecteur & lv, const vecteur & lvnum,const vecteur & lvden, int l_size, gen & num,gen & den,GIAC_CONTEXT);
    bool sym2r (const gen &e,const vecteur &l,const vecteur & lv, const vecteur & lvnum,const vecteur & lvden, int l_size, gen & num,gen & den,GIAC_CONTEXT);
    bool sym2r (const gen &e,const vecteur &l, int l_size, gen & num,gen & den,GIAC_CONTEXT);
        // conversion to internal form
    gen e2r(const gen & e,const vecteur & l,GIAC_CONTEXT); 
    extern const unary_function_ptr * const  at_e2r ;
    symbolic symb_e2r(const gen & arg1, const gen & arg2);
    void fxnd(const gen & e,gen & num, gen & den);
    // fraction / x -> fraction of vecteur
    gen e2r(const gen & e,const gen & x,GIAC_CONTEXT);
    gen _e2r(const gen & args,GIAC_CONTEXT);
  
    // monomial and tensor to symbolic
    gen r2sym(const gen & e,const index_m & i,const vecteur & l,GIAC_CONTEXT);
    gen r2sym(const polynome & p, const vecteur & l,GIAC_CONTEXT);
        // back conversion
    gen r2sym(const gen & p, const vecteur & l,GIAC_CONTEXT);
    gen r2e(const gen & p,const vecteur & l,GIAC_CONTEXT);
    // fraction of vecteur -> fraction / x
    gen r2e(const gen & r,const gen & x,GIAC_CONTEXT);
    gen _r2e(const gen & args,GIAC_CONTEXT);
    extern const unary_function_ptr * const  at_r2e ;
    symbolic symb_r2e(const gen & arg1,const gen &arg2);
    
    gen r2sym(const fraction & f, const vecteur & l,GIAC_CONTEXT);
    gen r2sym(const std::vector< pf<gen> > & pfde_VECT,const vecteur & l,GIAC_CONTEXT);
    // convert factorization to symbolic form 
    gen r2sym(const factorization & vnum,const vecteur & l,GIAC_CONTEXT);
  
    void dbgprint(const polynome &p);
    void dbgprint(const gen & e);
  
  #ifndef NO_NAMESPACE_GIAC
  } // namespace giac
  #endif // ndef NO_NAMESPACE_GIAC
  
  #endif // _GIAC_SYM2POLY_H_