Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Testing latest pari + WASM + node.js... and it works?! Wow.

28495 views
License: GPL3
ubuntu2004
1
/* Copyright (C) 2000 The PARI group.
2
3
This file is part of the PARI/GP package.
4
5
PARI/GP is free software; you can redistribute it and/or modify it under the
6
terms of the GNU General Public License as published by the Free Software
7
Foundation; either version 2 of the License, or (at your option) any later
8
version. It is distributed in the hope that it will be useful, but WITHOUT
9
ANY WARRANTY WHATSOEVER.
10
11
Check the License for details. You should have received a copy of it, along
12
with the package; see the file 'COPYING'. If not, write to the Free Software
13
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
14
15
/* This file contains memory and I/O management definitions */
16
17
typedef struct {
18
long s, us;
19
} pari_timer;
20
21
typedef struct pari_str {
22
char *string; /* start of the output buffer */
23
char *end; /* end of the output buffer */
24
char *cur; /* current writing place in the output buffer */
25
size_t size; /* buffer size */
26
int use_stack; /* use stack_malloc instead of malloc ? */
27
} pari_str;
28
29
typedef unsigned char *byteptr;
30
typedef ulong pari_sp;
31
32
struct pari_sieve
33
{
34
ulong start, end, maxpos;
35
ulong c, q;
36
unsigned char* sieve;
37
};
38
39
/* iterator over primes */
40
typedef struct {
41
int strategy; /* 1 to 4 */
42
GEN bb; /* iterate through primes <= bb */
43
ulong c, q; /* congruent to c (mod q) */
44
45
/* strategy 1: private prime table */
46
byteptr d; /* diffptr + n */
47
ulong p; /* current p = n-th prime */
48
ulong b; /* min(bb, ULONG_MAX) */
49
50
/* strategy 2: sieve, use p */
51
struct pari_sieve *psieve;
52
unsigned char *sieve, *isieve;
53
ulong cache[9]; /* look-ahead primes already computed */
54
ulong chunk; /* # of odd integers in sieve */
55
ulong a, end, sieveb; /* [a,end] interval currently being sieved,
56
* end <= sieveb = min(bb, maxprime^2, ULONG_MAX) */
57
ulong pos, maxpos; /* current cell and max cell */
58
59
/* strategy 3: unextprime, use p */
60
61
/* strategy 4: nextprime */
62
GEN pp;
63
} forprime_t;
64
65
typedef struct {
66
int first;
67
GEN b, n, p;
68
forprime_t T;
69
} forcomposite_t;
70
71
typedef struct forvec_t {
72
long first;
73
GEN *a, *m, *M; /* current n-uplet, minima, Maxima */
74
long n; /* length */
75
GEN (*next)(struct forvec_t *);
76
} forvec_t;
77
78
/* Iterate over partitions */
79
typedef struct
80
{
81
long k;
82
long amax, amin, nmin, nmax, strip;
83
GEN v;
84
} forpart_t;
85
86
/* Iterate over permutations */
87
typedef struct
88
{
89
long k, first;
90
GEN v;
91
} forperm_t;
92
93
/* Iterate over subsets */
94
typedef struct
95
{
96
long n, k, all, first;
97
GEN v;
98
} forsubset_t;
99
100
/* Plot engines */
101
typedef struct PARI_plot {
102
void (*draw)(struct PARI_plot *T, GEN w, GEN x, GEN y);
103
long width;
104
long height;
105
long hunit;
106
long vunit;
107
long fwidth;
108
long fheight;
109
long dwidth;
110
long dheight;
111
} PARI_plot;
112
113
/* binary I/O */
114
typedef struct GENbin {
115
size_t len; /* gsizeword(x) */
116
GEN x; /* binary copy of x */
117
GEN base; /* base address of p->x */
118
void (*rebase)(GEN,long);
119
} GENbin;
120
121
struct pari_mainstack
122
{
123
pari_sp top, bot, vbot;
124
size_t size, rsize, vsize, memused;
125
};
126
127
typedef struct pariFILE {
128
FILE *file;
129
int type;
130
const char *name;
131
struct pariFILE* prev;
132
struct pariFILE* next;
133
} pariFILE;
134
/* pariFILE.type */
135
enum { mf_IN = 1, mf_PIPE = 2, mf_FALSE = 4, mf_OUT = 8, mf_PERM = 16 };
136
137
typedef struct entree {
138
const char *name;
139
ulong valence;
140
void *value;
141
long menu;
142
const char *code;
143
const char *help;
144
void *pvalue;
145
long arity;
146
ulong hash;
147
struct entree *next;
148
} entree;
149
150
struct pari_parsestate
151
{
152
long node;
153
int once;
154
long discarded;
155
const char *lex_start;
156
GEN lasterror;
157
};
158
159
struct pari_compilestate
160
{
161
long opcode, operand, accesslex, data, localvars, frames, dbginfo;
162
long offset, nblex;
163
const char *dbgstart;
164
};
165
166
struct pari_mtstate
167
{
168
long pending_threads;
169
long is_thread;
170
long trace_level;
171
};
172
173
struct pari_evalstate
174
{
175
pari_sp avma;
176
long sp;
177
long rp;
178
long var;
179
long lvars;
180
long locks;
181
long prec;
182
long trace;
183
struct pari_mtstate mt;
184
struct pari_compilestate comp;
185
};
186
187
struct pari_varstate
188
{
189
long nvar, max_avail, min_priority, max_priority;
190
};
191
192
struct pari_filestate
193
{
194
pariFILE *file;
195
long serial;
196
};
197
198
struct gp_context
199
{
200
long listloc;
201
long prettyp;
202
struct pari_varstate var;
203
struct pari_evalstate eval;
204
struct pari_parsestate parse;
205
struct pari_filestate file;
206
jmp_buf *iferr_env;
207
GEN err_data;
208
};
209
210
extern THREAD struct pari_mainstack *pari_mainstack;
211
212
struct pari_global_state
213
{
214
long bitprec;
215
GEN primetab;
216
GEN seadata;
217
long *varpriority;
218
struct pari_varstate varstate;
219
};
220
221
struct pari_thread
222
{
223
struct pari_mainstack st;
224
struct pari_global_state gs;
225
GEN data;
226
};
227
228
struct mt_state
229
{
230
GEN worker;
231
GEN pending;
232
long workid;
233
};
234
235
struct pari_mt
236
{
237
struct mt_state mt;
238
GEN (*get)(struct mt_state *mt, long *workid, long *pending);
239
void (*submit)(struct mt_state *mt, long workid, GEN work);
240
void (*end)(void);
241
};
242
243
struct parfor_iter
244
{
245
long pending;
246
GEN worker;
247
struct pari_mt pt;
248
};
249
250
typedef struct
251
{
252
GEN a, b;
253
struct parfor_iter iter;
254
} parfor_t;
255
256
typedef struct
257
{
258
GEN x, W;
259
long i, l;
260
struct parfor_iter iter;
261
} parforeach_t;
262
263
typedef struct
264
{
265
GEN v;
266
forprime_t forprime;
267
struct parfor_iter iter;
268
} parforprime_t;
269
270
typedef struct
271
{
272
GEN v;
273
forvec_t forvec;
274
struct parfor_iter iter;
275
} parforvec_t;
276
277
typedef struct PariOUT {
278
void (*putch)(char);
279
void (*puts)(const char*);
280
void (*flush)(void);
281
} PariOUT;
282
283
/* hashtables */
284
typedef struct hashentry {
285
void *key, *val;
286
ulong hash; /* hash(key) */
287
struct hashentry *next;
288
} hashentry;
289
290
typedef struct hashtable {
291
ulong len; /* table length */
292
hashentry **table; /* the table */
293
ulong nb, maxnb; /* number of entries stored and max nb before enlarging */
294
ulong pindex; /* prime index */
295
ulong (*hash) (void *k); /* hash function */
296
int (*eq) (void *k1, void *k2); /* equality test */
297
int use_stack; /* use stack_malloc instead of malloc ? */
298
} hashtable;
299
300
typedef struct {
301
void **data;
302
long n;
303
long alloc;
304
size_t size;
305
} pari_stack;
306
307
/* GP_DATA */
308
typedef struct {
309
GEN z; /* result */
310
time_t t; /* time to obtain result */
311
time_t r; /* realtime to obtain result */
312
} gp_hist_cell;
313
typedef struct {
314
gp_hist_cell *v; /* array of previous results, FIFO */
315
size_t size; /* # res */
316
ulong total; /* # of results computed since big bang */
317
} gp_hist; /* history */
318
319
typedef struct {
320
pariFILE *file;
321
char *cmd;
322
} gp_pp; /* prettyprinter */
323
324
typedef struct {
325
char *PATH;
326
char **dirs;
327
} gp_path; /* path */
328
typedef struct {
329
char format; /* e,f,g */
330
long sigd; /* -1 (all) or number of significant digits printed */
331
int sp; /* 0 = suppress whitespace from output */
332
int prettyp; /* output style: raw, prettyprint, etc */
333
int TeXstyle;
334
} pariout_t; /* output format */
335
336
enum { gpd_QUIET=1, gpd_TEST=2, gpd_EMACS=256, gpd_TEXMACS=512};
337
enum { DO_MATCHED_INSERT = 2, DO_ARGS_COMPLETE = 4 };
338
typedef struct {
339
gp_hist *hist;
340
gp_pp *pp;
341
gp_path *path, *sopath;
342
pariout_t *fmt;
343
ulong lim_lines, flags, linewrap, readline_state, echo;
344
int breakloop, recover, use_readline;
345
char *help, *histfile, *prompt, *prompt_cont, *prompt_comment;
346
GEN colormap, graphcolors, plothsizes;
347
348
int secure, simplify, strictmatch, strictargs, chrono;
349
pari_timer *T, *Tw;
350
ulong primelimit; /* deprecated */
351
ulong threadsizemax, threadsize;
352
} gp_data;
353
extern gp_data *GP_DATA;
354
355
/* Common global variables: */
356
357
extern PariOUT *pariOut, *pariErr;
358
extern FILE *pari_outfile, *pari_logfile, *pari_infile, *pari_errfile;
359
extern ulong pari_logstyle;
360
361
enum pari_logstyles {
362
logstyle_none, /* 0 */
363
logstyle_plain, /* 1 */
364
logstyle_color, /* 2 */
365
logstyle_TeX /* 3 */
366
};
367
368
enum { c_ERR, c_HIST, c_PROMPT, c_INPUT, c_OUTPUT, c_HELP, c_TIME, c_LAST,
369
c_NONE = 0xffffUL };
370
371
enum { TEXSTYLE_PAREN=2, TEXSTYLE_BREAK=4 };
372
373
extern THREAD pari_sp avma;
374
#define DISABLE_MEMUSED (size_t)-1
375
extern byteptr diffptr;
376
extern char *current_psfile, *pari_datadir;
377
378
#define gcopyifstack(x,y) STMT_START {pari_sp _t=(pari_sp)(x); \
379
(y)=(_t>=pari_mainstack->bot &&_t<pari_mainstack->top)? \
380
gcopy((GEN)_t): (GEN)_t;} STMT_END
381
#define copyifstack(x,y) STMT_START {pari_sp _t=(pari_sp)(x); \
382
(y)=(_t>=pari_mainstack->bot &&_t<pari_mainstack->top)? \
383
gcopy((GEN)_t): (GEN)_t;} STMT_END
384
#define icopyifstack(x,y) STMT_START {pari_sp _t=(pari_sp)(x); \
385
(y)=(_t>=pari_mainstack->bot &&_t<pari_mainstack->top)? \
386
icopy((GEN)_t): (GEN)_t;} STMT_END
387
388
/* Define this to thoroughly check "random" garbage collecting */
389
#ifdef DEBUG_LOWSTACK
390
# define low_stack(x,l) 1
391
# define gc_needed(av,n) 1
392
#else
393
# define low_stack(x,l) ((void)(x),avma < (pari_sp)(l))
394
# define gc_needed(av,n) (avma < (pari_sp)stack_lim(av,n))
395
#endif
396
397
#define stack_lim(av,n) (pari_mainstack->bot+(((av)-pari_mainstack->bot)>>(n)))
398
399
#ifndef SIG_IGN
400
# define SIG_IGN (void(*)())1
401
#endif
402
#ifndef SIGINT
403
# define SIGINT 2
404
#endif
405
406