// -*- mode:C++ ; compile-command: "g++ -I.. -g -c usual.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_USUAL_H
#define _GIAC_USUAL_H
#include "first.h"
#include
#ifndef NO_NAMESPACE_GIAC
namespace giac {
#endif // ndef NO_NAMESPACE_GIAC
bool check_vect_38(const std::string & s); // check if s is a string identifier of a vector, matrix or list
// Global vectors of tractable functions and equivalents
std::vector & limit_tractable_functions();
typedef gen ( * gen_op ) (const gen & arg);
std::vector & limit_tractable_replace();
#ifdef HAVE_SIGNAL_H_OLD
extern std::string messages_to_print ;
#endif
// declare here pointers to rational operators
// These are global variables but that's normal for functional obj
class gen;
struct unary_function_ptr;
class unary_function_eval;
gen frac_neg_out(const gen & g,GIAC_CONTEXT);
gen _constant_one(const gen & args,GIAC_CONTEXT);
gen _constant_zero(const gen & args,GIAC_CONTEXT);
gen _rm_a_z(const gen & args,GIAC_CONTEXT);
gen _rm_all_vars(const gen & args,const context * contextptr);
bool is_equal(const gen & g);
gen apply_to_equal(const gen & g,const gen_op & f);
gen apply_to_equal(const gen & g,gen (* f) (const gen &, GIAC_CONTEXT),GIAC_CONTEXT);
gen apply_unit(const gen & args,const gen_op_context & f,GIAC_CONTEXT);
gen _id(const gen & args,GIAC_CONTEXT);
gen _not(const gen & args,GIAC_CONTEXT);
gen _neg(const gen & args,GIAC_CONTEXT);
gen _inv(const gen & args,GIAC_CONTEXT);
gen ln(const gen & e,GIAC_CONTEXT);
gen log(const gen & e,GIAC_CONTEXT);
gen log10(const gen & e,GIAC_CONTEXT);
gen alog10(const gen & e,GIAC_CONTEXT);
gen atan(const gen & e0,GIAC_CONTEXT);
gen exp(const gen & e0,GIAC_CONTEXT);
// convert a gen to a string, format=0 (normal), 1 (tex)
std::string gen2string(const gen & g,int format,GIAC_CONTEXT);
// Demodularize
gen unmod(const gen & g);
gen unmodunprod(const gen & g);
gen double2gen(double d);
bool is_equal(const gen & g);
gen apply_to_equal(const gen & g,const gen_op & f);
gen apply_to_equal(const gen & g,gen (* f) (const gen &, GIAC_CONTEXT),GIAC_CONTEXT);
std::string print_with_parenthesis_if_required(const gen & g,int format,GIAC_CONTEXT);
// usual zero args
extern const unary_function_ptr * const at_zero;
extern const unary_function_ptr * const at_one;
extern const unary_function_ptr * const at_id;
extern const unary_function_ptr * const at_rm_a_z;
extern const unary_function_ptr * const at_rm_all_vars;
// usual unary function related declarations (extended unary)
extern const unary_function_ptr * const at_neg ;
extern const unary_function_ptr * const at_inv ;
extern const unary_function_ptr * const at_not;
extern const unary_function_ptr * const at_exp ;
extern const unary_function_ptr * const at_ln ;
extern const unary_function_ptr * const at_log10 ;
extern const unary_function_ptr * const at_alog10 ;
extern const unary_function_ptr * const at_atan ;
// e = +/- simpl*doubl^d
void zint2simpldoublpos(const gen & e,gen & simpl,gen & doubl,bool & pos,int d,GIAC_CONTEXT);
gen sqrt_noabs(const gen & e,GIAC_CONTEXT);
gen sqrt(const gen & e,GIAC_CONTEXT);
gen sqrt_mod(const gen & a,const gen & b,bool isprime,GIAC_CONTEXT); // set isprime to true if b is prime
extern const unary_function_ptr * const at_sqrt ;
gen _sq(const gen & e);
extern const unary_function_ptr * const at_sq ;
gen sin(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_sin ;
gen cos(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_cos ;
gen tan(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_tan ;
gen asin(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_asin ;
gen acos(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_acos ;
gen sinh(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_sinh ;
gen cosh(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_cosh ;
gen tanh(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_tanh ;
gen asinh(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_asinh ;
gen acosh(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_acosh ;
gen atanh(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_atanh ;
symbolic symb_inv(const gen & e);
symbolic symb_exp(const gen & e);
symbolic symb_ln(const gen & e);
symbolic symb_cos(const gen & e);
symbolic symb_sin(const gen & e);
symbolic symb_cosh(const gen & e);
symbolic symb_sinh(const gen & e);
symbolic symb_tan(const gen & e);
symbolic symb_atan(const gen & e);
symbolic symb_not(const gen & e);
symbolic symb_asin(const gen & e);
symbolic symb_quote(const gen & arg);
gen quote(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_quote ;
gen unquote(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_unquote ;
gen re(const gen & a,GIAC_CONTEXT);
gen im(const gen & a,GIAC_CONTEXT);
gen conj(const gen & a,GIAC_CONTEXT);
gen _sign(const gen & g,GIAC_CONTEXT);
gen order_size(const gen & e,GIAC_CONTEXT);
extern const unary_function_ptr * const at_order_size ;
symbolic symb_and(const gen & a,const gen & b);
gen _and(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_and;
gen and2(const gen & a,const gen & b);
symbolic symb_ou(const gen & a,const gen & b);
gen _ou(const gen & args,GIAC_CONTEXT);
gen ou2(const gen & a,const gen & b);
extern const unary_function_ptr * const at_ou;
gen _xor(const gen & args,GIAC_CONTEXT);
gen xor2(const gen & a,const gen & b,GIAC_CONTEXT);
extern const unary_function_ptr * const at_xor;
symbolic symb_min(const gen & a,const gen & b);
gen _min(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_min;
symbolic symb_max(const gen & a,const gen & b);
gen _max(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_max;
gen _gcd(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_gcd;
gen _lcm(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_lcm;
gen _egcd(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_egcd;
gen _iegcd(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_iegcd;
// check that indice is integral, if required convert float/double to int
bool is_integral(gen & indice);
gen Iquo(const gen & a,const gen & b);
gen _iquo(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_iquo;
gen _irem(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_irem;
gen _mods(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_mods;
gen _quote_pow(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_quote_pow;
gen _iquorem(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_iquorem;
gen _smod(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_smod;
gen _rdiv(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_rdiv;
gen _is_prime(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_is_prime;
gen _is_pseudoprime(const gen & args,GIAC_CONTEXT);
gen nextprime1(const gen & a,GIAC_CONTEXT);
gen prevprime1(const gen & a,GIAC_CONTEXT);
gen _nextprime(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_nextprime;
gen _prevprime(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_prevprime;
gen _jacobi_symbol(const gen & args,GIAC_CONTEXT);
gen _legendre_symbol(const gen & args,GIAC_CONTEXT);
gen _floor(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_floor;
gen _ceil(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_ceil;
gen ceil2floor(const gen & g,GIAC_CONTEXT,bool quotesubst=false);
gen _round(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_round;
gen _print(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_print;
#if !defined RTOS_THREADX && !defined NSPIRE
extern const unary_function_eval __print;
#endif
extern const unary_function_ptr * const at_jacobi_symbol;
extern const unary_function_ptr * const at_legendre_symbol;
gen ichinrem2(const gen & a_orig,const gen & b_orig);
gen _ichinrem(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_ichinrem;
gen double_is_int(const gen & g,GIAC_CONTEXT);
gen _fracmod(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_fracmod;
gen _factorial(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_factorial;
gen _perm(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_perm;
gen comb(const gen & n,const gen &k,GIAC_CONTEXT);
gen _comb(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_comb;
gen _chinrem(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_chinrem;
extern const unary_function_ptr * const at_re;
extern const unary_function_ptr * const at_im;
symbolic symb_conj(const gen & e);
extern const unary_function_ptr * const at_conj ;
gen _abs(const gen & args,GIAC_CONTEXT);
symbolic symb_abs(const gen & e);
extern const unary_function_ptr * const at_abs ;
symbolic symb_arg(const gen & e);
extern const unary_function_ptr * const at_arg ;
extern const unary_function_ptr * const at_sign;
gen _cyclotomic(const gen & a,GIAC_CONTEXT);
extern const unary_function_ptr * const at_cyclotomic ;
gen _calc_mode(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_quo ;
extern const unary_function_ptr * const at_rem ;
gen _quorem(const gen & args,GIAC_CONTEXT);
gen quorem(const gen & a,const gen & b);
gen _quo(const gen & args,GIAC_CONTEXT);
gen _rem(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_quorem ;
extern const unary_function_ptr * const at_normalmod;
symbolic symb_sto(const gen & a,gen & b,bool in_place=false);
symbolic symb_sto(const gen & e);
extern const unary_function_ptr * const at_sto ;
extern const unary_function_ptr * const at_array_sto ;
extern const unary_function_ptr * const at_increment;
extern const unary_function_ptr * const at_decrement;
extern const unary_function_ptr * const at_multcrement;
extern const unary_function_ptr * const at_divcrement;
gen sto(const gen & a,const gen & b,GIAC_CONTEXT);
gen sto(const gen & a,const gen & b,bool in_place,GIAC_CONTEXT);
gen _sto(const gen & g,const context * contextptr);
gen _array_sto(const gen & a,const context * contextptr);
bool is_assumed_real(const gen & g,GIAC_CONTEXT);
bool is_assumed_integer(const gen & g,GIAC_CONTEXT);
bool is_numericv(const vecteur & v, int withfracint = 0);
bool is_numericm(const vecteur & v, int withfracint = 0);
bool check_vect_38(const std::string & s);
// check value type for storing value in s using 38 compatibility mode
bool check_sto_38(gen & value,const char * s);
extern bool (*storcl_38)(gen & value,const char * name_space,const char * idname,gen indice,bool at_of,GIAC_CONTEXT, gen const *sto,bool OnlyLocal);
extern int (*is_known_name_38)(const char * name_space,const char * idname);
extern gen (*of_pointer_38)(const void * appptr,const void * varptr,const gen & args);
extern gen_op_context * interactive_op_tab;
// if this pointer is non NULL, it should point to a table of gen_op_context replacing
// { _input,_inputform,_interactive,_click,_getKey,
// _current_sheet,_Row,_Col,_xyztrange,_widget_size}
// leave an individual pointer to 0 if you don't want to redefine it's action
gen _increment(const gen & a,const context * contextptr);
gen _decrement(const gen & a,const context * contextptr);
gen _multcrement(const gen & a,const context * contextptr);
gen _divcrement(const gen & a,const context * contextptr);
// assume format _VECT of subtype _ASSUME__VECT
// [ _DOUBLE_ , list of intervals, excluded ]
// [ _INT_, ]
extern const unary_function_ptr * const at_assume ;
gen giac_assume(const gen & a,GIAC_CONTEXT);
extern const unary_function_ptr * const at_additionally ;
gen giac_additionally(const gen & a,GIAC_CONTEXT);
// returns the assumed idnt name
// used if assumptions are in OR conjonction
gen assumesymbolic(const gen & a,gen idnt_must_be,GIAC_CONTEXT);
// v = previous assumptions, a=the real value, direction
// is positive for [a,+inf[, negative for ]-inf,a]
// |direction| = 1 (large) or 2 (strict)
gen doubleassume_and(const vecteur & v,const gen & a,int direction,bool or_assumption,GIAC_CONTEXT);
gen _equal(const gen & args,GIAC_CONTEXT);
gen symb_equal(const gen & a,const gen & b);
extern const unary_function_ptr * const at_equal;
extern const unary_function_ptr * const at_equal2;
gen symb_same(const gen & a);
symbolic symb_same(const gen & a,const gen & b);
gen _same(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_same;
symbolic symb_inferieur_strict(const gen & a);
symbolic symb_inferieur_strict(const gen & a,const gen & b);
gen _inferieur_strict(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_inferieur_strict;
symbolic symb_inferieur_egal(const gen & a);
symbolic symb_inferieur_egal(const gen & a,const gen & b);
gen _inferieur_egal(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_inferieur_egal;
symbolic symb_superieur_strict(const gen & a);
symbolic symb_superieur_strict(const gen & a,const gen & b);
gen _superieur_strict(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_superieur_strict;
symbolic symb_superieur_egal(const gen & a);
symbolic symb_superieur_egal(const gen & a,const gen & b);
gen _superieur_egal(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_superieur_egal;
int is_inequality(const gen & g);
gen _different(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_different;
symbolic symb_of(const gen & a);
symbolic symb_of(const gen & a,const gen & b);
gen check_symb_of(const gen & a,const gen & b,GIAC_CONTEXT);
gen _of(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_of;
symbolic symb_at(const gen & a);
symbolic symb_at(const gen & a,const gen & b,GIAC_CONTEXT);
gen _at(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_at;
gen _table(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_table;
// usual multiargs
// for multiargs we use _name for the corresponding "unary" function
// to avoid confusion of pointers since name is used
symbolic symb_plus(const gen & a,const gen & b);
gen _plus(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_plus ;
extern const unary_function_ptr * const at_pointplus ;
extern const unary_function_ptr * const at_pointminus ;
gen symb_prod(const gen & a,const gen & b);
gen _prod(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_prod ;
symbolic symb_pow(const gen & a,const gen & b);
std::string cprintaspow(const gen & feuille,const char * sommetstr_orig,GIAC_CONTEXT);
#ifndef GIAC_HAS_STO_38
#ifdef NSPIRE
extern const alias_unary_function_eval __pow;
#else
extern unary_function_eval __pow;
#endif
#endif
gen _pow(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_pow ;
extern const char _pow_s[];
gen _powmod(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_powmod ;
symbolic symb_tran(const gen & a);
symbolic symb_trace(const gen & a);
symbolic symb_rref(const gen & a);
symbolic symb_idn(const gen & e);
symbolic symb_ranm(const gen & e);
symbolic symb_det(const gen & a);
symbolic symb_pcar(const gen & a);
symbolic symb_ker(const gen & a);
symbolic symb_image(const gen & a);
symbolic symb_moyal(const gen & a,const gen & b, const gen &vars,const gen & order);
extern const unary_function_ptr * const at_evalf;
gen _eval(const gen & a,GIAC_CONTEXT);
gen _evalf(const gen &,GIAC_CONTEXT);
extern const unary_function_ptr * const at_eval;
extern const unary_function_ptr * const at_evalm;
symbolic symb_eval(const gen & a);
symbolic symb_evalf(const gen & a);
symbolic symb_subst(const gen & e);
gen _subst(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_subst;
gen _subs(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_subs;
gen _maple_subs(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_maple_subs;
gen _ampersand_times(const gen & g,GIAC_CONTEXT);
extern const unary_function_ptr * const at_ampersand_times;
extern const unary_function_ptr * const at_version;
std::string version();
gen _version(const gen & a,GIAC_CONTEXT);
gen Gamma(const gen & x,GIAC_CONTEXT);
gen _Gamma(const gen & args,GIAC_CONTEXT);
gen _lower_incomplete_gamma(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_lower_incomplete_gamma ;
extern const unary_function_ptr * const at_igamma_exp ;
double lngamma(double x);
gen lngamma(const gen & x,GIAC_CONTEXT);
extern const unary_function_ptr * const at_Gamma;
extern const unary_function_ptr * const at_lnGamma_minus;
extern const unary_function_ptr * const at_erfs;
extern const unary_function_ptr * const at_SiCi_f ;
extern const unary_function_ptr * const at_SiCi_g ;
extern const unary_function_ptr * const at_Si;
extern const unary_function_ptr * const at_Ei ;
extern const unary_function_ptr * const at_Ei_f ;
gen Psi(const gen & x,GIAC_CONTEXT);
gen Psi(const gen & x,int n,GIAC_CONTEXT);
gen _Psi(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_Psi;
gen Zeta(const gen & x,GIAC_CONTEXT);
gen _Zeta(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_Zeta;
extern const unary_function_ptr * const at_Eta;
gen _erf(const gen & args,GIAC_CONTEXT);
gen erf(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_erf ;
gen _erfc(const gen & args,GIAC_CONTEXT);
gen erfc(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_erfc ;
extern const unary_function_ptr * const at_Si;
extern const unary_function_ptr * const at_Ci;
extern const unary_function_ptr * const at_Ci0;
gen _Ci(const gen & g,GIAC_CONTEXT);
gen _Si(const gen & g,GIAC_CONTEXT);
gen _Ei(const gen & g,GIAC_CONTEXT);
extern const unary_function_ptr * const at_Ei;
extern const unary_function_ptr * const at_Ei0;
extern const unary_function_ptr * const at_Heaviside ;
extern const unary_function_ptr * const at_Dirac ;
gen _Heaviside(const gen & args,GIAC_CONTEXT);
gen _Dirac(const gen & args,GIAC_CONTEXT);
#if defined(GIAC_GENERIC_CONSTANTS) // || (defined(VISUALC) && !defined(RTOS_THREADX)) || defined(x86_64)
extern const gen zero;
extern const gen plus_one;
extern const gen minus_one;
extern const gen plus_two;
extern const gen plus_three;
extern const gen cst_i;
#else
extern const alias_gen alias_zero;
extern const gen & zero;
extern const alias_gen alias_plus_one;
extern const gen & plus_one;
extern const alias_gen alias_plus_two;
extern const gen & plus_two;
extern const alias_gen alias_plus_three;
extern const gen & plus_three;
extern const alias_gen alias_minus_one;
extern const gen & minus_one;
extern const int cst_i_refcount;
extern const int cst_i_display;
extern const alias_gen alias_cst_i;
extern const gen & cst_i;
#endif
extern const vecteur null_vetor;
extern const double rad2deg_d;
extern const double deg2rad_d;
extern const gen & rad2deg_g;
extern const gen & deg2rad_g;
//grad
extern const double rad2grad_d;
extern const double grad2rad_d;
extern const gen & rad2grad_g;
extern const gen & grad2rad_g;
#if defined(GIAC_GENERIC_CONSTANTS) // || (defined(VISUALC) && !defined(RTOS_THREADX)) || defined(x86_64)
extern gen cst_two_pi;
extern gen cst_pi_over_2;
extern gen plus_inf;
extern gen minus_inf;
extern gen plus_one_half;
extern gen minus_one_half;
extern gen plus_sqrt3;
extern gen plus_sqrt2;
extern gen plus_sqrt6;
extern gen minus_sqrt3;
extern gen minus_sqrt2;
extern gen minus_sqrt6;
extern gen minus_sqrt3_2;
extern gen minus_sqrt2_2;
extern gen minus_sqrt3_3;
extern gen plus_sqrt2_2;
extern gen plus_sqrt3_2;
extern gen plus_sqrt3_3;
extern gen cos_pi_12;
extern gen sin_pi_12;
extern gen minus_cos_pi_12;
extern gen minus_sin_pi_12;
extern gen tan_pi_12;
extern gen minus_tan_pi_12;
extern gen tan_5pi_12;
extern gen minus_tan_5pi_12;
extern gen rad2deg_e;
extern gen deg2rad_e;
//grad
extern gen rad2grad_e;
extern gen grad2rad_e;
extern const gen * const table_cos[];
extern const gen * const table_tan[];
#else
extern const alias_gen alias_cst_two_pi_tab[];
extern const alias_ref_vecteur cst_two_pi_refv;
extern const alias_ref_symbolic cst_two_pi_symb;
extern const gen & cst_two_pi;
extern const alias_gen alias_cst_pi_over_2_tab[];
extern const gen & cst_pi_over_2;
extern const alias_ref_symbolic inv_2_symb;
extern const alias_gen alias_inv_2;
extern const alias_ref_symbolic inv_3_symb;
extern const alias_gen alias_inv_3;
extern const alias_ref_symbolic inv_4_symb;
extern const alias_gen alias_inv_4;
extern const alias_gen alias_cst_pi_over_2_tab[];
extern const alias_ref_vecteur cst_pi_over_2_refv;
extern const alias_ref_symbolic cst_pi_over_2_symb ;
extern const alias_gen alias_cst_pi_over_2;
extern const gen & cst_pi_over_2 ;
extern const alias_ref_symbolic plus_inf_symb ;
extern const alias_gen alias_plus_inf;
extern const gen & plus_inf ;
extern const alias_ref_symbolic minus_inf_symb ;
extern const alias_gen alias_minus_inf;
extern const gen & minus_inf ;
extern const alias_ref_fraction plus_one_half_ref;
extern const alias_gen alias_plus_one_half1;
extern const alias_gen alias_plus_one_half2;
// extern const alias_ref_fraction plus_one_half_ref;
extern const alias_gen alias_plus_one_half;
extern const gen & plus_one_half ;
extern const alias_ref_symbolic minus_one_half_symb ;
extern const alias_gen alias_minus_one_half;
extern const gen & minus_one_half ;
extern const alias_gen alias_plus_sqrt3_tab[];
extern const alias_ref_vecteur plus_sqrt3_refv;
extern const alias_ref_symbolic plus_sqrt3_symb ;
extern const alias_gen alias_plus_sqrt3;
extern const gen & plus_sqrt3 ;
extern const alias_gen alias_plus_sqrt2_tab[];
extern const alias_ref_vecteur plus_sqrt2_refv;
extern const alias_ref_symbolic plus_sqrt2_symb ;
extern const alias_gen alias_plus_sqrt2;
extern const gen & plus_sqrt2 ;
extern const alias_gen alias_plus_sqrt6_tab[];
extern const alias_ref_vecteur plus_sqrt6_refv;
extern const alias_ref_symbolic plus_sqrt6_symb ;
extern const alias_gen alias_plus_sqrt6;
extern const gen & plus_sqrt6 ;
extern const alias_ref_symbolic minus_sqrt2_symb ;
extern const alias_gen alias_minus_sqrt2;
extern const gen & minus_sqrt2 ;
extern const alias_ref_symbolic minus_sqrt3_symb ;
extern const alias_gen alias_minus_sqrt3;
extern const gen & minus_sqrt3 ;
extern const alias_ref_symbolic minus_sqrt6_symb ;
extern const alias_gen alias_minus_sqrt6;
extern const gen & minus_sqrt6 ;
extern const alias_gen alias_minus_sqrt3_2_tab[];
extern const alias_ref_vecteur minus_sqrt3_2_refv;
extern const alias_ref_symbolic minus_sqrt3_2_symb ;
extern const alias_gen alias_minus_sqrt3_2;
extern const gen & minus_sqrt3_2 ;
extern const alias_gen alias_minus_sqrt2_2_tab[];
extern const alias_ref_vecteur minus_sqrt2_2_refv;
extern const alias_ref_symbolic minus_sqrt2_2_symb ;
extern const alias_gen alias_minus_sqrt2_2;
extern const gen & minus_sqrt2_2 ;
extern const alias_gen alias_minus_sqrt3_3_tab[];
extern const alias_ref_vecteur minus_sqrt3_3_refv;
extern const alias_ref_symbolic minus_sqrt3_3_symb ;
extern const alias_gen alias_minus_sqrt3_3;
extern const gen & minus_sqrt3_3 ;
extern const alias_gen alias_plus_sqrt3_2_tab[];
extern const alias_ref_vecteur plus_sqrt3_2_refv;
extern const alias_ref_symbolic plus_sqrt3_2_symb ;
extern const alias_gen alias_plus_sqrt3_2;
extern const gen & plus_sqrt3_2 ;
extern const alias_gen alias_plus_sqrt2_2_tab[];
extern const alias_ref_vecteur plus_sqrt2_2_refv;
extern const alias_ref_symbolic plus_sqrt2_2_symb ;
extern const alias_gen alias_plus_sqrt2_2;
extern const gen & plus_sqrt2_2 ;
extern const alias_gen alias_plus_sqrt3_3_tab[];
extern const alias_ref_vecteur plus_sqrt3_3_refv;
extern const alias_ref_symbolic plus_sqrt3_3_symb ;
extern const alias_gen alias_plus_sqrt3_3;
extern const gen & plus_sqrt3_3 ;
extern const alias_gen alias_cos_pi_12_4_tab[];
extern const alias_ref_vecteur cos_pi_12_4_refv;
extern const alias_ref_symbolic cos_pi_12_4_symb ;
extern const alias_gen alias_cos_pi_12_4;
extern const alias_gen alias_cos_pi_12_tab1;
extern const alias_ref_vecteur cos_pi_12_refv;
extern const alias_ref_symbolic cos_pi_12_symb ;
extern const alias_gen alias_cos_pi_12;
extern const gen & cos_pi_12 ;
extern const alias_gen alias_minus_cos_pi_12_4_tab[];
extern const alias_ref_vecteur minus_cos_pi_12_4_refv;
extern const alias_ref_symbolic minus_cos_pi_12_4_symb ;
extern const alias_gen alias_minus_cos_pi_12_4;
extern const alias_gen alias_minus_cos_pi_12_tab1;
extern const alias_ref_vecteur minus_cos_pi_12_refv;
extern const alias_ref_symbolic minus_cos_pi_12_symb ;
extern const alias_gen alias_minus_cos_pi_12;
extern const gen & minus_cos_pi_12 ;
extern const alias_gen alias_sin_pi_12_4_tab[];
extern const alias_ref_vecteur sin_pi_12_4_refv;
extern const alias_ref_symbolic sin_pi_12_4_symb ;
extern const alias_gen alias_sin_pi_12_4;
extern const alias_gen alias_sin_pi_12_tab1;
extern const alias_ref_vecteur sin_pi_12_refv;
extern const alias_ref_symbolic sin_pi_12_symb ;
extern const alias_gen alias_sin_pi_12;
extern const gen & sin_pi_12 ;
extern const alias_gen alias_minus_sin_pi_12_4_tab[];
extern const alias_ref_vecteur minus_sin_pi_12_4_refv;
extern const alias_ref_symbolic minus_sin_pi_12_4_symb ;
extern const alias_gen alias_minus_sin_pi_12_4;
extern const alias_gen alias_minus_sin_pi_12_tab1;
extern const alias_ref_vecteur minus_sin_pi_12_refv;
extern const alias_ref_symbolic minus_sin_pi_12_symb ;
extern const alias_gen alias_minus_sin_pi_12;
extern const gen & minus_sin_pi_12 ;
extern const alias_gen alias_tan_pi_12_tab[];
extern const alias_ref_vecteur tan_pi_12_refv;
extern const alias_ref_symbolic tan_pi_12_symb ;
extern const alias_gen alias_tan_pi_12;
extern const gen & tan_pi_12 ;
extern const alias_gen alias_tan_5pi_12_tab[];
extern const alias_ref_vecteur tan_5pi_12_refv;
extern const alias_ref_symbolic tan_5pi_12_symb ;
extern const alias_gen alias_tan_5pi_12;
extern const gen & tan_5pi_12 ;
extern const alias_ref_symbolic minus_tan_pi_12_symb ;
extern const alias_gen alias_minus_tan_pi_12;
extern const gen & minus_tan_pi_12 ;
extern const alias_ref_symbolic minus_tan_5pi_12_symb ;
extern const alias_gen alias_minus_tan_5pi_12;
extern const gen & minus_tan_5pi_12 ;
extern const alias_ref_symbolic inv_pi_symb;
extern const alias_gen alias_inv_pi;
extern const gen & cst_inv_pi;
extern const alias_ref_symbolic inv_180_symb;
extern const alias_gen alias_inv_180;
extern const gen & cst_inv_180;
extern const alias_gen alias_rad2deg_e_tab[];
extern const alias_ref_vecteur rad2deg_e_refv;
extern const alias_ref_symbolic rad2deg_e_symb ;
extern const alias_gen alias_rad2deg_e;
extern const gen & rad2deg_e ;
extern const alias_gen alias_deg2rad_e_tab[];
extern const alias_ref_vecteur deg2rad_e_refv;
extern const alias_ref_symbolic deg2rad_e_symb ;
extern const alias_gen alias_deg2rad_e;
extern const gen & deg2rad_e ;
//grad
extern const alias_gen alias_rad2grad_e_tab[];
extern const alias_ref_vecteur rad2grad_e_refv;
extern const alias_ref_symbolic rad2grad_e_symb;
extern const alias_gen alias_rad2grad_e;
extern const gen & rad2grad_e;
extern const alias_gen alias_grad2rad_e_tab[];
extern const alias_ref_vecteur grad2rad_e_refv;
extern const alias_ref_symbolic grad2rad_e_symb;
extern const alias_gen alias_grad2rad_e;
extern const gen & grad2rad_e;
extern const gen * const * table_cos;
extern const gen * const * table_tan;
#endif
// for subst.cc
// extern std::vector sincostan_v;
// extern std::vector asinacosatan_v,sinhcoshtanh_v,sincostansinhcoshtanh_v;
extern const unary_function_ptr * const exp_tab;
extern const unary_function_ptr * const tan_tab;
extern const unary_function_ptr * const asin_tab;
extern const unary_function_ptr * const acos_tab;
extern const unary_function_ptr * const atan_tab;
extern const unary_function_ptr * const pow_tab;
extern const unary_function_ptr * const Heaviside_tab;
extern const unary_function_ptr * const invpowtan_tab;
extern const gen_op_context halftan_tab[];
extern const gen_op_context hyp2exp_tab[];
extern const gen_op_context hypinv2exp_tab[];
extern const gen_op_context trig2exp_tab[];
extern const gen_op_context atrig2ln_tab[];
// extern std::vector< gen_op_context > halftan_v;
// extern std::vector< gen_op_context > hyp2exp_v;
// extern std::vector< gen_op_context > trig2exp_v;
extern const gen_op_context halftan_hyp2exp_tab[];
extern const gen_op_context exp2sincos_tab[];
extern const gen_op_context tan2sincos_tab[];
extern const gen_op_context tan2sincos2_tab[];
extern const gen_op_context tan2cossin2_tab[];
extern const gen_op_context asin2acos_tab[];
extern const gen_op_context asin2atan_tab[];
extern const gen_op_context acos2asin_tab[];
extern const gen_op_context acos2atan_tab[];
extern const gen_op_context atan2asin_tab[];
extern const gen_op_context atan2acos_tab[];
extern const gen_op_context atrig2ln_tab[];
extern const gen_op_context trigcos_tab[];
extern const gen_op_context trigsin_tab[];
extern const gen_op_context trigtan_tab[];
extern const gen_op_context powexpand_tab[];
extern const gen_op_context powneg2invpow_tab[];
extern const gen_op_context exp2power_tab[];
extern const unary_function_ptr * const gamma_tab;
extern const gen_op_context gamma2factorial_tab[];
extern const unary_function_ptr * const factorial_tab;
extern const gen_op_context factorial2gamma_tab[];
// extern std::vector sign_floor_ceil_round_tab;
extern const unary_function_ptr * const analytic_sommets;
extern const unary_function_ptr * const primitive_tab_op;
extern const unary_function_ptr * const inverse_tab_op;
extern const unary_function_ptr * const inequality_tab;
extern const unary_function_ptr * const solve_fcns_tab;
extern const unary_function_ptr * const sincostan_tab;
extern const unary_function_ptr * const sincostansinhcoshtanh_tab;
extern const unary_function_ptr * const asinacosatan_tab;
extern const unary_function_ptr * const sinhcoshtanh_tab;
extern const unary_function_ptr * const sinhcoshtanhinv_tab;
extern const unary_function_ptr * const sign_floor_ceil_round_tab;
extern const unary_function_ptr * const reim_op;
extern const unary_function_ptr * const limit_tab;
extern const gen_op_context limit_replace[];
bool need_parenthesis(const gen & g);
void prod2frac(const gen & g,vecteur & num,vecteur & den);
gen vecteur2prod(const vecteur & num);
gen _multistring(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_multistring;
std::string unquote(const std::string & s);
gen Gamma(const gen & x,GIAC_CONTEXT);
gen _Gamma(const gen & args,GIAC_CONTEXT) ;
extern const unary_function_ptr * const at_Psi_minus_ln;
gen Psi(const gen & x,GIAC_CONTEXT);
gen Psi(const gen & x,int n,GIAC_CONTEXT);
gen _Psi(const gen & args,GIAC_CONTEXT) ;
gen _normalmod(const gen & g,GIAC_CONTEXT);
// a=expression, x variable, n=number of terms,
// compute an approx value of sum((-1)^k*a(k),k,0,+infinity)
// using Chebychev polynomials
gen alternate_series(const gen & a,const gen & x,int n,GIAC_CONTEXT);
gen Eta(const gen & s,int ndiff,GIAC_CONTEXT);
gen Eta(const gen & s0,GIAC_CONTEXT);
gen Zeta(const gen & x,int ndiff,GIAC_CONTEXT);
gen Zeta(const gen & x,GIAC_CONTEXT);
gen _Zeta(const gen & args,GIAC_CONTEXT) ;
gen _Eta(const gen & args,GIAC_CONTEXT) ;
gen _erfs(const gen & g,GIAC_CONTEXT);
gen erf(const gen & x,GIAC_CONTEXT);
gen _erf(const gen & args,GIAC_CONTEXT);
gen erfc(const gen & x,GIAC_CONTEXT);
gen _erfc(const gen & args,GIAC_CONTEXT);
gen _SiCi_f(const gen & args,GIAC_CONTEXT);
gen _SiCi_g(const gen & args,GIAC_CONTEXT);
gen _Si(const gen & args,GIAC_CONTEXT);
gen _Ci(const gen & args,GIAC_CONTEXT);
gen _Ci0(const gen & args,GIAC_CONTEXT);
gen _Ei_f(const gen & args,GIAC_CONTEXT);
gen Ei(const gen & args,GIAC_CONTEXT);
gen Ei(const gen & args,int n,GIAC_CONTEXT);
gen _Ei(const gen & args,GIAC_CONTEXT);
gen _Ei0(const gen & args,GIAC_CONTEXT);
gen Ci_replace0(const gen & g,GIAC_CONTEXT);
gen Ei_replace0(const gen & g,GIAC_CONTEXT);
gen _Dirac(const gen & args,GIAC_CONTEXT);
gen _Heaviside(const gen & args,GIAC_CONTEXT);
std::string printasexp(const gen & g,const char * s,GIAC_CONTEXT);
std::string printassubs(const gen & feuille,const char * sommetstr,GIAC_CONTEXT);
std::string printasmaple_subs(const gen & feuille,const char * sommetstr,GIAC_CONTEXT);
void fonction_bidon();
std::string printassto(const gen & feuille,const char * sommetstr,GIAC_CONTEXT);
gen fast_icontent(const gen & g); // fast compute integer content of g
gen fast_divide_by_icontent(const gen & g,const gen & z);
#ifdef NO_UNARY_FUNCTION_COMPOSE // STATIC_BUILTIN_LEXER_FUNCTIONS
extern const alias_unary_function_eval __sto;
#else
extern const unary_function_eval __sto;
#endif
extern const unary_function_ptr * const at_step_infolevel;
#ifndef VISUALC
gen * normal_sin_pi_12_ptr_();
gen * normal_cos_pi_12_ptr_();
#endif
#ifndef NO_NAMESPACE_GIAC
} // namespace giac
#endif // ndef NO_NAMESPACE_GIAC
#endif // _GIAC_USUAL_H