rpn.h
14.3 KB
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
// -*- mode:C++ ; compile-command: "g++ -I.. -g -c rpn.cc" -*-
/*
* Copyright (C) 2001,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_RPN_H
#define _GIAC_RPN_H
#include "first.h"
#include "gen.h"
#include "vecteur.h"
#include <string>
#include <ctype.h>
#ifndef NO_NAMESPACE_GIAC
namespace giac {
#endif // ndef NO_NAMESPACE_GIAC
std::string printasconstant(const gen & feuille,const char * sommetstr,GIAC_CONTEXT);
extern const unary_function_ptr * const at_INTERSECT;
extern const unary_function_ptr * const at_MINUS;
extern const unary_function_ptr * const at_UNION;
extern const unary_function_ptr * const at_rpn;
gen _rpn(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_alg;
gen _alg(const gen & args,GIAC_CONTEXT);
std::string enmajuscule(const std::string & s);
gen _PERCENT(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_PERCENT;
void roll(int i,vecteur & v);
void ROLL(int i,GIAC_CONTEXT);
gen _ROLL(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_ROLL;
void rolld(int i,vecteur & v);
void ROLLD(int i,GIAC_CONTEXT);
gen _ROLLD(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_ROLLD;
void stack_swap(vecteur & v);
void SWAP(GIAC_CONTEXT);
gen _SWAP(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_SWAP;
void dup(vecteur & v);
gen _DUP(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_DUP;
void over(vecteur & v);
gen _OVER(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_OVER;
void pick(int i,vecteur & v);
gen _PICK(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_PICK;
void drop(vecteur & v);
gen _DROP(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_DROP;
gen _NOP(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_NOP;
gen _IFTE(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_IFTE;
gen _RPN_LOCAL(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RPN_LOCAL;
gen _RPN_FOR(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RPN_FOR;
gen _RPN_WHILE(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RPN_WHILE;
gen _RPN_UNTIL(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RPN_UNTIL;
gen _RPN_CASE(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RPN_CASE;
gen _RCL(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_RCL;
gen _VARS(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_VARS;
gen purgenoassume(const gen & args,const context * contextptr);
gen _purge(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_purge;
gen _rpn_prog(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_rpn_prog;
vecteur rpn_eval(const vecteur & prog,vecteur & pile,GIAC_CONTEXT);
vecteur rpn_eval(const gen & prog,vecteur & pile,GIAC_CONTEXT);
gen _division(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_division;
gen _binary_minus(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_binary_minus;
vecteur tab2vecteur(gen tab[]);
extern const unary_function_ptr * const at_SIN ;
extern const unary_function_ptr * const at_COS ;
extern const unary_function_ptr * const at_TAN ;
extern const unary_function_ptr * const at_EXP ;
extern const unary_function_ptr * const at_LN ;
extern const unary_function_ptr * const at_DELTALIST ;
extern const unary_function_ptr * const at_PILIST ;
extern const unary_function_ptr * const at_HPSUM ;
extern const unary_function_ptr * const at_SIGMALIST ;
extern const unary_function_ptr * const at_HPDIFF ;
extern const unary_function_ptr * const at_HPINT ;
extern const unary_function_ptr * const at_Fahrenheit2Celsius;
extern const unary_function_ptr * const at_Celsius2Fahrenheit;
extern const unary_function_ptr * const at_polar_complex;
extern const unary_function_ptr * const at_ggb_ang;
extern const unary_function_ptr * const at_HDigits;
extern const unary_function_ptr * const at_HFormat;
extern const unary_function_ptr * const at_HComplex;
extern const unary_function_ptr * const at_HAngle;
extern const unary_function_ptr * const at_HLanguage;
// extern const unary_function_ptr * const at_testfunc;
extern const unary_function_ptr * const at_FREEZE;
extern const unary_function_ptr * const at_LINE;
extern const unary_function_ptr * const at_RECT;
extern const unary_function_ptr * const at_TEXTOUT;
extern const unary_function_ptr * const at_EDITMAT;
extern const unary_function_ptr * const at_INT;
#ifdef GIAC_HAS_STO_38
extern const unary_function_ptr * const at_INVERT;
extern const unary_function_ptr * const at_BLIT;
extern const unary_function_ptr * const at_GETPIX;
extern const unary_function_ptr * const at_DIMGROB;
extern const unary_function_ptr * const at_SUBGROB;
extern const unary_function_ptr * const at_GETPIX_P;
extern const unary_function_ptr * const at_PIXON_P;
extern const unary_function_ptr * const at_PIXOFF_P;
extern const unary_function_ptr * const at_LINE_P;
extern const unary_function_ptr * const at_RECT_P;
extern const unary_function_ptr * const at_INVERT_P;
extern const unary_function_ptr * const at_BLIT_P;
extern const unary_function_ptr * const at_TEXTOUT_P;
extern const unary_function_ptr * const at_DIMGROB_P;
extern const unary_function_ptr * const at_ARC_P;
extern const unary_function_ptr * const at_SUBGROB_P;
extern const unary_function_ptr * const at_GROBH;
extern const unary_function_ptr * const at_GROBW;
extern const unary_function_ptr * const at_GROBH_P;
extern const unary_function_ptr * const at_GROBW_P;
extern const unary_function_ptr * const at_ISKEYDOWN;
extern const unary_function_ptr * const at_STARTAPP;
extern const unary_function_ptr * const at_STARTVIEW;
#endif
gen _hp38(const gen & args,GIAC_CONTEXT);
gen _ABS(const gen & args,GIAC_CONTEXT);
gen _MODULO(const gen & args,GIAC_CONTEXT);
gen _RANDOM(const gen & g,GIAC_CONTEXT);
std::string printasRANDOM(const gen & feuille,const char * s,GIAC_CONTEXT);
gen _MAXREAL(const gen & g,GIAC_CONTEXT);
gen _MINREAL(const gen & g,GIAC_CONTEXT);
gen _EXPM1(const gen & g,GIAC_CONTEXT);
gen _LNP1(const gen & g,GIAC_CONTEXT);
gen _ADDROW(const gen & args,GIAC_CONTEXT);
gen _ADDCOL(const gen & args,GIAC_CONTEXT);
gen _SCALE(const gen & g,GIAC_CONTEXT);
gen _SCALEADD(const gen & g,GIAC_CONTEXT);
gen _SWAPCOL(const gen & args,GIAC_CONTEXT);
gen _SUB(const gen & args,GIAC_CONTEXT);
gen _RANDMAT(const gen & args,GIAC_CONTEXT);
gen _REDIM(const gen & args,GIAC_CONTEXT);
gen _REPLACE(const gen & args,GIAC_CONTEXT);
gen _EIGENVAL(const gen & args,GIAC_CONTEXT);
gen _EIGENVV(const gen & args,GIAC_CONTEXT);
gen _SIZE(const gen& args,GIAC_CONTEXT);
gen _INT(const gen & g,GIAC_CONTEXT);
gen _HPDIFF(const gen & args,GIAC_CONTEXT);
gen _HPINT(const gen & args,GIAC_CONTEXT);
gen _HPSUM(const gen & args,GIAC_CONTEXT);
gen _TAYLOR(const gen & args,GIAC_CONTEXT);
gen _POLYFORM(const gen & args,GIAC_CONTEXT);
gen _IS_LINEAR(const gen & args,GIAC_CONTEXT);
gen _SVD(const gen & args0,GIAC_CONTEXT);
gen _SVL(const gen & args0,GIAC_CONTEXT);
gen _SPECRAD(const gen & args0,GIAC_CONTEXT);
gen _SPECNORM(const gen & args0,GIAC_CONTEXT);
gen _COND(const gen & args0,GIAC_CONTEXT);
gen _rank(const gen & args,GIAC_CONTEXT);
gen _SCHUR(const gen & args,GIAC_CONTEXT);
gen _LQ(const gen & args0,GIAC_CONTEXT);
gen _LU(const gen & args0,GIAC_CONTEXT);
gen _QR(const gen & args0,GIAC_CONTEXT);
gen _XPON(const gen & g,GIAC_CONTEXT);
gen _MANT(const gen & g,GIAC_CONTEXT);
gen _HMSX(const gen & g0,GIAC_CONTEXT);
gen _XHMS(const gen & g0,GIAC_CONTEXT);
gen _DEGXRAD(const gen & g,GIAC_CONTEXT);
gen _RADXDEG(const gen & g,GIAC_CONTEXT);
gen _PERCENT(const gen & g,GIAC_CONTEXT);
gen _PERCENTCHANGE(const gen & g,GIAC_CONTEXT);
gen _PERCENTTOTAL(const gen & g,GIAC_CONTEXT);
gen _ITERATE(const gen & args,GIAC_CONTEXT);
// gen _RECURSE(const gen & args,GIAC_CONTEXT);
gen _MAKEMAT(const gen & args,GIAC_CONTEXT);
gen _LSQ(const gen & args,GIAC_CONTEXT);
gen _idivis(const gen & args0,GIAC_CONTEXT);
gen _isprime(const gen & args0,GIAC_CONTEXT);
gen _ithprime(const gen & args0,GIAC_CONTEXT);
gen _euler(const gen & args0,GIAC_CONTEXT);
gen _numer(const gen & args0,GIAC_CONTEXT);
gen _denom(const gen & args0,GIAC_CONTEXT);
gen _ifactors(const gen & args0,GIAC_CONTEXT);
gen _binomial_icdf(const gen & args0,GIAC_CONTEXT);
gen _poisson_icdf(const gen & args0,GIAC_CONTEXT);
gen symb_RPN_LOCAL(const gen & a,const gen & b);
gen symb_RPN_FOR(const gen & a,const gen & b);
gen symb_RPN_WHILE(const gen & a,const gen & b);
gen symb_RPN_CASE(const gen & a);
gen symb_RPN_UNTIL(const gen & a,const gen & b);
gen symb_IFTE(const gen & args);
gen symb_NOP(const gen & args);
gen symb_rpn_prog(const gen & args);
gen _NTHROOT(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_NTHROOT;
extern gen * extern gen * rpn_ans() ;() extern gen * rpn_ans() ;
gen _Ans(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_Ans;
bool is_Ans(const gen & g);
gen _EXPORT(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_EXPORT;
gen _VIEWS(const gen & args,GIAC_CONTEXT);
extern const unary_function_ptr * const at_VIEWS;
extern const unary_function_ptr * const at_POLYFORM;
extern const unary_function_ptr * const at_colSwap;
extern const unary_function_ptr * const at_replace;
extern const unary_function_ptr * const at_scale;
extern const unary_function_ptr * const at_scaleadd;
extern const unary_function_ptr * const at_schur;
extern const unary_function_ptr * const at_svl;
extern const unary_function_ptr * const at_swapcol;
extern const unary_function_ptr * const at_swaprow;
int is_known_name_home_38(const char * idname);
// 1 and 2 app or program variable, 3 home variable
int is_known_name_home_38(const char * name_space,const char * idname);
// add progname qualifier to variables in v and replace in g
void qualify(gen & g,const vecteur & v,const gen & prog,GIAC_CONTEXT);
// parse_program description: result is parsed, should be evaled
// assignation_by_equal: warning for probable misuse of = instead of :=
// undeclared_global_vars: regular 38 global variables used but not declared
// declared_global_vars: regular 38 global variables that were declared
// exported_function_names: list of exported function
// may contain description strings
// exported_variable_names: same as above but variables
// unknown_exported: function or variable exported but not used
// unexported: function local to source, re-qualified with progname namespace
// unexported_declared_global_vars: non regular 38 global variables,
// re-qualified with progname namespace
// views: is a matrix: column1 is the function name (no param) or integer,
// column2 is a comment string
// errors: exported names that are regular 38 home variables,
// and undeclared global variables that are not regular 38 variables
// return value is 0: ok, -1: invalid VIEWS, >0: #errors
// int parse_program(const wchar_t * source,const wchar_t * progname,vecteur & assignation_by_equal,vecteur & undeclared_global_vars,vecteur & declared_global_vars,vecteur & exported_function_names,vecteur & exported_variable_names,vecteur & unknown_exported,vecteur & unexported,vecteur & unexported_declared_global_vars,vecteur & views,vecteur & errors,gen & parsed,GIAC_CONTEXT);
// Prepares app sequence for computing a recurrence relation
// Valid if 1 sequence is checked and does not depend on other sequences
// Given expr_un, the expression of UK(N) in terms of UK(N-1) and UK(N-2)
// write the recurrence relation as UK(N)=subst(expr,vars,[N,UK(N-1),UK(N-2)])
// Return 0 if expr_un is invalid, 1 if it does not depend on UK(N-2)
// 2 otherwise
int seqapp_prepare(const gen & expr_un,gen & expr,vecteur & vars,GIAC_CONTEXT,int seqno=-1);
// Compute UK(N) for K=k to m, where UK(k) and UK(k+1) are given
// If the recurrence relation does not depend on UK(N-2), set UK(k+1) to undef
vecteur seqapp_compute(const gen & expr,const vecteur & vars,const gen & UK_k,const gen &UK_kp1,int k,int m,GIAC_CONTEXT);
// Prepares app sequence for computing all recurrences relations
// expr_un should contain the expression for U0(N) to UK(N) for K<=9
// undef may be used if the sequence is not checked
// Rewrite the recurrence relation as [U0(N),...,UK(N)]=subst(expr,vars,[N,U0(N-1),U0(N-2),...])
// Return 0 if expr_un is invalid, -10-val if Uval should be checked
// Return 1 if it does not depend on UK(N-2), 2 otherwise
int seqapp_prepare(const vecteur & expr_un,vecteur & expr,vecteur & vars,GIAC_CONTEXT);
// Compute UK(N) for K=k to m, where UK(k) and UK(k+1) are given
// If the recurrence relation does not depend on UK(N-2), set UK_kp1 to vecteur(0)
vecteur seqapp_compute(const vecteur & expr,const vecteur & vars,const vecteur & UK_k,const vecteur &UK_kp1,int k,int m,GIAC_CONTEXT);
// check if a lowercase commandname should be uppercased
// returns 0 if not, returns a statically pointer valid up to next call if so
char * hp38_display_in_maj(const char * s);
#ifndef NO_NAMESPACE_GIAC
} // namespace giac
#endif // ndef NO_NAMESPACE_GIAC
#endif // _GIAC_RPN_H