// -*- mode:C++ ; compile-command: "g++ -I.. -g -c subst.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 . */ #ifndef _GIAC_SUBST_H #define _GIAC_SUBST_H #include "first.h" #include "gen.h" #include "identificateur.h" #ifndef NO_NAMESPACE_GIAC namespace giac { #endif // ndef NO_NAMESPACE_GIAC gen cossinexp2rootof(const gen & e,GIAC_CONTEXT); gen checkanglemode(GIAC_CONTEXT); polynome gen2poly(const gen & g,int s); //grad gen angletorad(const gen & g,GIAC_CONTEXT); gen radtoangle(const gen & g,GIAC_CONTEXT); gen degtorad(const gen & g,GIAC_CONTEXT); gen radtodeg(const gen & g,GIAC_CONTEXT); int findpos(const vecteur & v,const gen & g); // find symbolic vars in g that have u has sommet vecteur lop(const gen & g,const unary_function_ptr & u); vecteur lop(const gen & g,const std::vector & v); vecteur lop(const gen & g,const unary_function_ptr * v); vecteur loptab(const gen & g,const unary_function_ptr * v); // One substitution vecteur subst(const vecteur & v,const gen & i,const gen & newi,bool quotesubst,GIAC_CONTEXT); gen subst(const gen & e,const gen & i,const gen & newi,bool quotesubst,GIAC_CONTEXT); sparse_poly1 subst(const sparse_poly1 & v,const gen & i,const gen & newi,bool quotesubst,GIAC_CONTEXT); // Multi substitutions vecteur subst(const vecteur & v,const vecteur & i,const vecteur & newi,bool quotesubst,GIAC_CONTEXT); gen subst(const gen & e,const vecteur & i,const vecteur & ewi,bool quotesubst,GIAC_CONTEXT); vecteur sortsubst(const vecteur & v,const vecteur & i,const vecteur & newi,bool quotesubst,GIAC_CONTEXT); // assumes that i is sorted gen sortsubst(const gen & e,const vecteur & i,const vecteur & newi,bool quotesubst,GIAC_CONTEXT); // assumes that i is sorted gen quotesubst(const gen & e,const gen & i,const gen & newi,GIAC_CONTEXT); gen gen_feuille(const gen & g); // Quick check if e contains some ptr of v bool has_op_list(const gen & e,const unary_function_ptr * v); // Quick check if e contains v bool has_op(const gen & e,const unary_function_ptr & u); template int equalposcomp(const std::vector & v, const T & w){ int n=1; for (typename std::vector::const_iterator it=v.begin();it!=v.end();++it){ if ((*it)==w) return n; else n++; } return 0; } typedef gen (* gen_op_context) (const gen &,GIAC_CONTEXT); gen subst(const gen & e,const std::vector & v,const std::vector< gen_op_context > & w,bool quotesubst,GIAC_CONTEXT); gen subst(const gen & e,const unary_function_ptr * v,const gen_op_context * w,bool quotesubst,GIAC_CONTEXT,bool recursive_nonrat=true); gen subst(const gen & e,const std::vector & v,const std::vector< gen (*) (const gen &) > & w,bool quotesubst,GIAC_CONTEXT); gen halftan(const gen & e,GIAC_CONTEXT); gen _halftan(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_halftan; gen shift_phase(const gen & e,GIAC_CONTEXT); gen _shift_phase(const gen & args,GIAC_CONTEXT); gen hyp2exp(const gen & e,GIAC_CONTEXT); gen _hyp2exp(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_hyp2exp; gen sincos(const gen & e,GIAC_CONTEXT); gen _sincos(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_sincos; gen trig2exp(const gen & e,GIAC_CONTEXT); gen _trig2exp(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_trig2exp; gen halftan_hyp2exp(const gen & e,GIAC_CONTEXT); gen _halftan_hyp2exp(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_halftan_hyp2exp; gen rewrite_hyper(const gen & e,GIAC_CONTEXT); gen asin2acos(const gen & e,GIAC_CONTEXT); gen _asin2acos(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_asin2acos; gen asin2atan(const gen & e,GIAC_CONTEXT); gen _asin2atan(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_asin2atan; gen acos2asin(const gen & e,GIAC_CONTEXT); gen _acos2asin(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_acos2asin; gen acos2atan(const gen & e,GIAC_CONTEXT); gen _acos2atan(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_acos2atan; gen atan2acos(const gen & e,GIAC_CONTEXT); gen _atan2acos(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_atan2acos; extern const unary_function_ptr * const at_atrig2ln; gen atan2asin(const gen & e,GIAC_CONTEXT); gen _atan2asin(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_atan2asin; bool is_rational(const gen & g); vecteur as_linear_combination(const gen & g,vecteur & wrt,GIAC_CONTEXT); bool is_unit(const gen & g); bool is_algebraic_extension(const gen & g); vecteur rlvar(const gen &e,bool alg); // rewrite vars of e in terms of exp/ln if s1 resp. s2 is > 1 // and simplify gen tsimplify_noexpln(const gen & e,int s1,int s2,GIAC_CONTEXT); gen tsimplify_common(const gen & e,GIAC_CONTEXT); gen tsimplify(const gen & e,GIAC_CONTEXT); gen _tsimplify(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_tsimplify; gen simplify(const gen & e,GIAC_CONTEXT); gen _simplify(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_simplify; gen trigcos(const gen & e,GIAC_CONTEXT); gen _trigcos(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_trigcos; gen trigsin(const gen & e,GIAC_CONTEXT); gen _trigsin(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_trigsin; gen trigtan(const gen & e,GIAC_CONTEXT); gen _trigtan(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_trigtan; gen tan2sincos(const gen & e,GIAC_CONTEXT); gen _tan2sincos(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_tan2sincos; gen tan2sincos2(const gen & e,GIAC_CONTEXT); gen _tan2sincos2(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_tan2sincos2; gen tan2cossin2(const gen & e,GIAC_CONTEXT); gen _tan2cossin2(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_tan2cossin2; gen tcollect(const gen & e,GIAC_CONTEXT); gen _tcollect(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_tcollect; gen lncollect(const gen & e,GIAC_CONTEXT); gen _lncollect(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_lncollect; gen _powexpand(const gen & args,GIAC_CONTEXT); gen powexpand(const gen & e,GIAC_CONTEXT); gen exp2pow(const gen & e,GIAC_CONTEXT); extern const unary_function_ptr * const at_powexpand; gen _exp2pow(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_exp2pow; gen _pow2exp(const gen & e,GIAC_CONTEXT); gen pow2expln(const gen & e,GIAC_CONTEXT); gen simplifyfactorial(const gen & g,GIAC_CONTEXT); gen pow2expln(const gen & e,const identificateur & x,GIAC_CONTEXT); gen gamma2factorial(const gen & g,GIAC_CONTEXT); gen gammatofactorial(const gen & g,GIAC_CONTEXT); gen factorial2gamma(const gen & g,GIAC_CONTEXT); gen factorialtogamma(const gen & g,GIAC_CONTEXT); gen factor_xn(const gen & args,const gen & x,GIAC_CONTEXT); gen factor_xn(const gen & args,GIAC_CONTEXT); gen _factor_xn(const gen & args,GIAC_CONTEXT); extern const unary_function_ptr * const at_factor_xn; gen Heavisidetosign(const gen & args,GIAC_CONTEXT); gen _Heavisidetosign(const gen & args,GIAC_CONTEXT); gen Heavisidetopiecewise(const gen & args,GIAC_CONTEXT); gen _Heavisidetopiecewise(const gen & args,GIAC_CONTEXT); gen expln2trig(const gen & g,GIAC_CONTEXT); gen _mult_conjugate(const gen & g0,GIAC_CONTEXT); gen _mult_c_conjugate(const gen & g0,GIAC_CONTEXT); gen _combine(const gen & args,const context * contextptr); gen _rectangular2polar(const gen & args,const context * contextptr); gen _polar2rectangular(const gen & args,const context * contextptr); gen sin2tan2(const gen & e,GIAC_CONTEXT); gen cos2tan2(const gen & e,GIAC_CONTEXT); gen tan2tan2(const gen & e,GIAC_CONTEXT); gen sinh2exp(const gen & e,GIAC_CONTEXT); gen cosh2exp(const gen & e,GIAC_CONTEXT); gen tanh2exp(const gen & e,GIAC_CONTEXT); gen inv_test_exp(const gen & e,GIAC_CONTEXT); gen sin2exp(const gen & e,GIAC_CONTEXT); gen cos2exp(const gen & e,GIAC_CONTEXT); gen tan2exp(const gen & e,GIAC_CONTEXT); gen exp2sincos(const gen & e,GIAC_CONTEXT); gen tantosincos(const gen & e,GIAC_CONTEXT); gen tantosincos2(const gen & e,GIAC_CONTEXT); gen tantocossin2(const gen & e,GIAC_CONTEXT); gen asintoacos(const gen & e,GIAC_CONTEXT); gen acostoasin(const gen & e,GIAC_CONTEXT); gen asintoatan(const gen & e,GIAC_CONTEXT); gen atantoasin(const gen & e,GIAC_CONTEXT); gen acostoatan(const gen & e,GIAC_CONTEXT); gen atantoacos(const gen & e,GIAC_CONTEXT); gen trigcospow(const gen & g,GIAC_CONTEXT); gen trigsinpow(const gen & g,GIAC_CONTEXT); gen trigtanpow(const gen & g,GIAC_CONTEXT); gen powtopowexpand(const gen & g,GIAC_CONTEXT); gen pownegtoinvpow(const gen & g0,GIAC_CONTEXT); gen powneg2invpow(const gen & e,GIAC_CONTEXT); gen exptopower(const gen & g,GIAC_CONTEXT); gen asin2ln(const gen & g_orig,GIAC_CONTEXT); gen acos2ln(const gen & g_orig,GIAC_CONTEXT); gen atan2ln(const gen & g_orig,GIAC_CONTEXT); gen _atrig2ln(const gen & args,GIAC_CONTEXT); #ifndef NO_NAMESPACE_GIAC } // namespace giac #endif // ndef NO_NAMESPACE_GIAC #endif // _GIAC_SUBST_H