Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
/* Copyright (C) 2004 The PARI group.12This file is part of the PARI/GP package.34PARI/GP is free software; you can redistribute it and/or modify it under the5terms of the GNU General Public License as published by the Free Software6Foundation; either version 2 of the License, or (at your option) any later7version. It is distributed in the hope that it will be useful, but WITHOUT8ANY WARRANTY WHATSOEVER.910Check the License for details. You should have received a copy of it, along11with the package; see the file 'COPYING'. If not, write to the Free Software12Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */1314BEGINEXTERN1516/* for qsort */17typedef int (*QSCOMP)(const void *, const void *);1819#define uel(a,i) (((ulong*)(a))[i])20#define ucoeff(a,i,j) (((ulong**)(a))[j][i])21#define umael(a,i,j) (((ulong**)(a))[i][j])22#define umael2(a,i,j) (((ulong**)(a))[i][j])23#define umael3(a,i,j,k) (((ulong***)(a))[i][j][k])24#define umael4(a,i,j,k,l) (((ulong****)(a))[i][j][k][l])25#define umael5(a,i,j,k,l,m) (((ulong*****)(a))[i][j][k][l][m])2627#define numberof(x) (sizeof(x) / sizeof((x)[0]))2829/* to manipulate 'blocs' */30#define BL_HEAD 831#define bl_base(x) (void*)((x) - BL_HEAD)32#define bl_height(x) (((GEN)x)[-8])33#define bl_left(x) (((GEN*)x)[-7])34#define bl_right(x) (((GEN*)x)[-6])35#define bl_size(x) (((GEN)x)[-5])36#define bl_refc(x) (((GEN)x)[-4])37#define bl_next(x) (((GEN*)x)[-3])38#define bl_prev(x) (((GEN*)x)[-2])39#define bl_num(x) (((GEN)x)[-1])4041void clone_lock(GEN C);42void clone_unlock(GEN C);43void clone_unlock_deep(GEN C);4445/* swap */46#define lswap(x,y) {long _z=x; x=y; y=_z;}47#define pswap(x,y) {GEN *_z=x; x=y; y=_z;}48#define swap(x,y) {GEN _z=x; x=y; y=_z;}49#define dswap(x,y) { double _t=x; x=y; y=_t; }50#define pdswap(x,y) { double* _t=x; x=y; y=_t; }51#define swapspec(x,y, nx,ny) {swap(x,y); lswap(nx,ny);}5253/* loops */54GEN incloop(GEN a);55GEN resetloop(GEN a, GEN b);56GEN setloop(GEN a);5758/* parser */5960/* GP control structures */61#define EXPR_WRAP(code, call) \62{ GEN z; GEN __E = code; \63push_lex(gen_0, __E); z = call; pop_lex(1); return z; }64#define EXPRVOID_WRAP(code, call) \65{ GEN __E = code; \66push_lex(gen_0, __E); call; pop_lex(1); }67#define EXPR_ARG __E, &gp_eval68#define EXPR_ARGPREC __E, &gp_evalprec69#define EXPR_ARGUPTO __E, &gp_evalupto70#define EXPR_ARGBOOL __E, &gp_evalbool71#define EXPR_ARGVOID __E, &gp_evalvoid7273GEN iferrpari(GEN a, GEN b, GEN c);74void forfactored(GEN a, GEN b, GEN code);75void forpari(GEN a, GEN b, GEN node);76void foreachpari(GEN a, GEN node);77void forsquarefree(GEN a, GEN b, GEN code);78void untilpari(GEN a, GEN b);79void whilepari(GEN a, GEN b);80GEN ifpari(GEN g, GEN a, GEN b);81GEN andpari(GEN a, GEN b);82GEN orpari(GEN a, GEN b);83void ifpari_void(GEN g, GEN a, GEN b);84GEN ifpari_multi(GEN g, GEN a);85GEN geval_gp(GEN x, GEN t);8687GEN gadde(GEN *x, GEN y);88GEN gadd1e(GEN *x);89GEN gdive(GEN *x, GEN y);90GEN gdivente(GEN *x, GEN y);91GEN gdivrounde(GEN *x, GEN y);92GEN gmode(GEN *x, GEN y);93GEN gmule(GEN *x, GEN y);94GEN gshiftle(GEN *x, long n);95GEN gshiftre(GEN *x, long n);96GEN gsube(GEN *x, GEN y);97GEN gsub1e(GEN *x);98GEN gshift_right(GEN x, long n);99100GEN asympnum0(GEN u, GEN alpha, long prec);101GEN asympnumraw0(GEN u, long LIM, GEN alpha, long prec);102GEN derivnum0(GEN a, GEN code, GEN ind, long prec);103GEN derivfun0(GEN args, GEN def, GEN code, long k, long prec);104GEN direuler0(GEN a, GEN b, GEN code, GEN c);105GEN direuler_bad(void *E, GEN (*eval)(void *, GEN, long), GEN a, GEN b, GEN c, GEN Sbad);106void forcomposite(GEN a, GEN b, GEN code);107void fordiv(GEN a, GEN code);108void fordivfactored(GEN a, GEN code);109void forell0(long a, long b, GEN code, long flag);110void forperm0(GEN k, GEN code);111void forprime(GEN a, GEN b, GEN code);112void forprimestep(GEN a, GEN b, GEN q, GEN code);113void forstep(GEN a, GEN b, GEN s, GEN code);114void forsubgroup0(GEN cyc, GEN bound, GEN code);115void forsubset0(GEN nk, GEN code);116void forvec(GEN x, GEN code, long flag);117void forpart0(GEN k, GEN code , GEN nbound, GEN abound);118GEN intcirc0(GEN a, GEN R, GEN code, GEN tab, long prec);119GEN intfuncinit0(GEN a, GEN b, GEN code, long m, long prec);120GEN intnum0(GEN a, GEN b, GEN code, GEN tab, long prec);121GEN intnumgauss0(GEN a, GEN b, GEN code, GEN tab, long prec);122GEN intnumromb0_bitprec(GEN a, GEN b, GEN code, long flag, long bit);123GEN laurentseries0(GEN f, long M, long v, long prec);124GEN limitnum0(GEN u, GEN alpha, long prec);125GEN matrice(GEN nlig, GEN ncol, GEN code);126void pariplot0(GEN a, GEN b, GEN code, GEN ysmlu, GEN ybigu, long prec);127GEN prodeuler0(GEN a, GEN b, GEN code, long prec);128GEN prodinf0(GEN a, GEN code, long flag, long prec);129GEN produit(GEN a, GEN b, GEN code, GEN x);130GEN somme(GEN a, GEN b, GEN code, GEN x);131GEN sumalt0(GEN a, GEN code,long flag, long prec);132GEN sumdivexpr(GEN num, GEN code);133GEN sumdivmultexpr0(GEN num, GEN code);134GEN suminf0_bitprec(GEN a, GEN code, long bit);135GEN sumnum0(GEN a, GEN code, GEN tab, long prec);136GEN sumnumap0(GEN a, GEN code, GEN tab, long prec);137GEN sumnumlagrange0(GEN a, GEN code, GEN tab, long prec);138GEN sumnummonien0(GEN a, GEN code, GEN tab, long prec);139GEN sumpos0(GEN a, GEN code, long flag,long prec);140GEN vecexpr0(GEN nmax, GEN code, GEN pred);141GEN vecexpr1(GEN nmax, GEN code, GEN pred);142GEN vecteursmall(GEN nmax, GEN code);143GEN vecteur(GEN nmax, GEN n);144GEN vvecteur(GEN nmax, GEN n);145GEN zbrent0(GEN a, GEN b, GEN code, long prec);146GEN solvestep0(GEN a, GEN b, GEN step, GEN code, long flag, long prec);147148GEN ploth0(GEN a, GEN b, GEN code, long flag, long n, long prec);149GEN plothexport0(GEN fmt, GEN a, GEN b, GEN code, long flags, long n, long prec);150GEN psploth0(GEN a,GEN b,GEN code,long flag,long n,long prec);151GEN plotrecth0(long ne,GEN a,GEN b,GEN code,ulong flags,long n,long prec);152153GEN listcreate_gp(long n);154155/* mt */156void mt_sigint(void);157void mt_err_recover(long er);158void mt_export_add(const char *str, GEN val);159void mt_export_del(const char *str);160void mt_init_stack(size_t s);161int mt_is_thread(void);162163GEN eisker_worker(GEN Ei, GEN M, GEN D, GEN co, GEN CD);164GEN pareval_worker(GEN code);165GEN parselect_worker(GEN d, GEN code);166void parfor0(GEN a, GEN b, GEN code, GEN code2);167GEN parfor_worker(GEN i, GEN C);168void parforeach0(GEN x, GEN code, GEN code2);169void parforprime0(GEN a, GEN b, GEN code, GEN code2);170void parforprimestep0(GEN a, GEN b, GEN q, GEN code, GEN code2);171void parforvec0(GEN a, GEN code, GEN code2, long flag);172GEN parvector_worker(GEN i, GEN C);173GEN polmodular_worker(GEN pt, ulong L, GEN hilb, GEN factu,174GEN vne, GEN vinfo, long compute_derivs, GEN j_powers, GEN fdb);175GEN nmV_polint_center_tree_worker(GEN Va, GEN T, GEN R, GEN xa, GEN m2);176GEN nmV_chinese_center_tree_seq(GEN A, GEN P, GEN T, GEN R);177GEN nxMV_polint_center_tree_worker(GEN Va, GEN T, GEN R, GEN xa, GEN m2);178GEN nxMV_chinese_center_tree_seq(GEN A, GEN P, GEN T, GEN R);179GEN F2xq_log_Coppersmith_worker(GEN u, long i, GEN V, GEN R);180GEN Flxq_log_Coppersmith_worker(GEN u, long i, GEN V, GEN R);181GEN Fp_log_sieve_worker(long a, long prmax, GEN C, GEN c, GEN Ci, GEN ci, GEN pr, GEN sz);182GEN QM_charpoly_ZX_worker(GEN P, GEN M, GEN dM);183GEN QXQ_div_worker(GEN P, GEN A, GEN B, GEN C);184GEN QXQ_inv_worker(GEN P, GEN A, GEN B);185GEN ZX_resultant_worker(GEN P, GEN A, GEN B, GEN dB);186GEN ZXQX_resultant_worker(GEN P, GEN A, GEN B, GEN T, GEN dB);187GEN ZX_ZXY_resultant_worker(GEN P, GEN A, GEN B, GEN dB, GEN v);188GEN ZX_direct_compositum_worker(GEN P, GEN A, GEN B);189GEN ZXQX_direct_compositum_worker(GEN P, GEN A, GEN B, GEN C);190GEN ZX_gcd_worker(GEN P, GEN A, GEN B, GEN g);191GEN ZXQ_minpoly_worker(GEN P, GEN A, GEN B, long d);192GEN ZM_det_worker(GEN P, GEN A);193GEN ZM_inv_worker(GEN P, GEN A);194GEN ZM_ker_worker(GEN P, GEN A);195GEN ZM_mul_worker(GEN P, GEN A, GEN B);196GEN ZabM_inv_worker(GEN P, GEN A, GEN Q);197GEN aprcl_step4_worker(ulong q, GEN pC, GEN N, GEN v);198GEN aprcl_step6_worker(GEN r, long t, GEN N, GEN N1, GEN et);199GEN ecpp_sqrt_worker(GEN g, GEN N, GEN p);200GEN ecpp_ispsp_worker(GEN N);201GEN ecpp_step2_worker(GEN S, GEN HD, GEN primelist, long dbg);202GEN primecertisvalid_ecpp_worker(GEN certi);203GEN lfuninit_worker(long r, GEN K, GEN L, GEN peh2d, GEN vroots, GEN dr, GEN di, GEN an, GEN bn);204GEN lfuninit_theta2_worker(long r, GEN L, GEN qk, GEN a, GEN di, GEN an, GEN bn);205GEN gen_parapply(GEN worker, GEN D);206GEN parapply_slice_worker(GEN worker, GEN D);207GEN gen_parapply_slice(GEN worker, GEN D, long mmin);208GEN gen_crt(const char *str, GEN worker, forprime_t *S, GEN dB, ulong bound, long mmin, GEN *pt_mod,209GEN crt(GEN, GEN, GEN*), GEN center(GEN, GEN, GEN));210void gen_inccrt(const char *str, GEN worker, GEN dB, long n, long mmin,211forprime_t *S, GEN *pt_H, GEN *pt_mod, GEN crt(GEN, GEN, GEN*),212GEN center(GEN, GEN, GEN));213void gen_inccrt_i(const char *str, GEN worker, GEN dB, long n, long mmin,214forprime_t *S, GEN *pH, GEN *pmod, GEN crt(GEN, GEN, GEN*),215GEN center(GEN, GEN, GEN));216GEN direllnf_worker(GEN P, ulong X, GEN E);217GEN dirartin_worker(GEN P, ulong X, GEN nf, GEN G, GEN V, GEN aut);218GEN direllsympow_worker(GEN P, ulong X, GEN E, ulong m);219GEN dirgenus2_worker(GEN P, ulong X, GEN Q);220GEN pardireuler(GEN worker, GEN a, GEN b, GEN c, GEN Sbad);221GEN FpM_ratlift_worker(GEN A, GEN mod, GEN B);222GEN ellQ_factorback_worker(GEN P, GEN E, GEN A, GEN L, ulong l);223GEN chinese_unit_worker(GEN P, GEN A, GEN U, GEN B, GEN D, GEN C);224225/* Relative number fields */226enum { rnf_NFABS = 1, rnf_MAPS };227228/* Finite fields */229enum { t_FF_FpXQ = 0, t_FF_Flxq = 1, t_FF_F2xq = 2 };230GEN FF_ellinit(GEN E, GEN fg);231GEN FF_elldata(GEN E, GEN fg);232233/* L functions */234enum { t_LFUN_GENERIC, t_LFUN_ZETA, t_LFUN_NF, t_LFUN_ELL, t_LFUN_KRONECKER,235t_LFUN_CHIZ, t_LFUN_CHIGEN, t_LFUN_ETA,236t_LFUN_DIV, t_LFUN_MUL, t_LFUN_CONJ,237t_LFUN_SYMPOW_ELL, t_LFUN_QF, t_LFUN_ARTIN, t_LFUN_MFCLOS,238t_LFUN_GENUS2, t_LFUN_TWIST, t_LFUN_CLOSURE0, t_LFUN_SHIFT};239enum { t_LDESC_INIT, t_LDESC_THETA, t_LDESC_PRODUCT };240241/* Elliptic curves */242/* common to Q and Rg */243enum { R_PERIODS = 1, R_ETA, R_ROOTS, R_AB };244245enum { Qp_ROOT = 1, Qp_TATE };246enum { Q_GROUPGEN = 5, Q_GLOBALRED, Q_ROOTNO, Q_MINIMALMODEL };247enum { NF_MINIMALMODEL = 1, NF_GLOBALRED, NF_MINIMALPRIMES, NF_ROOTNO, NF_NF };248249/* common to Fp and Fq */250enum { FF_CARD = 1, FF_GROUP, FF_GROUPGEN, FF_O };251252/* for Buchall_param */253enum { fupb_NONE = 0, fupb_RELAT, fupb_LARGE, fupb_PRECI };254255/* Polycyclic presentation for the classgroup of discriminant D */256typedef struct {257long D; /* Negative discriminant */258long h; /* Size of classgroup */259long enum_cnt; /* Either h or h/2 (if L0 is set) */260/* If nonzero, L0=L[0] and n[0]=2 and classpoly is a perfect square261* (and we enumerate each double root just once), default is 0 */262long L0;263/* Product of primes L that are prohibited as norms of generators or264* auxilliary prime forms (by default, primes that make enumeration hard) */265long Lfilter;266/* Norms of implicit generators (primeforms a=(L*x^2+b*x*y+c*y^2)267* with norm L and b >=0) */268long *L;269long *m; /* products of relative orders: m[i] is the order of <g_1,...,g_i> */270long *n; /* Relative orders */271long *o; /* Absolute orders */272/* Power relations (a[i]^n[i] = a[0]^e[0]*...*a[i-1]^e[i-1], where e273* is an exponent vector of length i stored at offset binom(i,2) of r) */274long *r;275long *orient_p; /* Optional list of norms of orienting primes p ... */276long *orient_q; /* or product of primes p*q (q=1 when only p is needed) */277long *orient_reps; /* Representation of orienting norm p*q in terms of Ls */278long inv; /* Attached invariant */279long k; /* Number of generators */280GEN _data; /* Storage space for the above arrays */281} classgp_pcp_struct;282typedef classgp_pcp_struct classgp_pcp_t[1];283284/* Represents the data in the equation(s)285* 4p = t^2 - v^2 D = t^2 - v^2 u^2 D_K = w^2 D_K.286* t is the absolute trace, so always > 0.287* T is a twisting parameter, which satisfies (T|p) == -1. */288typedef struct {289long D, t, u, v;290ulong p, pi, s2, T;291} norm_eqn_struct;292typedef norm_eqn_struct norm_eqn_t[1];293294#define zv_to_longptr(v) (&((v)[1]))295#define zv_to_ulongptr(v) ((ulong *)&((v)[1]))296297/* Modular invariants */298#define INV_J 0299#define INV_F 1300#define INV_F2 2301#define INV_F3 3302#define INV_F4 4303#define INV_G2 5304#define INV_W2W3 6305#define INV_F8 8306#define INV_W3W3 9307#define INV_W2W5 10308#define INV_W2W7 14309#define INV_W3W5 15310#define INV_W3W7 21311#define INV_W2W3E2 23312#define INV_W2W5E2 24313#define INV_W2W13 26314#define INV_W2W7E2 27315#define INV_W3W3E2 28316#define INV_W5W7 35317#define INV_W3W13 39318319/* Get coefficient of x^d in f, assuming f is nonzero. */320INLINE ulong Flx_coeff(GEN f, long d) { return f[d + 2]; }321/* Return the root of f, assuming deg(f) = 1. */322INLINE ulong Flx_deg1_root(GEN f, ulong p) {323if (degpol(f) != 1) pari_err_BUG("Flx_deg1_root");324return Fl_div(Fl_neg(Flx_coeff(f, 0), p), Flx_coeff(f, 1), p);325}326327/* Allocation / gerepile */328long getdebugvar(void);329void setdebugvar(long n);330void debug_stack(void);331void fill_stack(void);332void minim_alloc(long n, double ***q, GEN *x, double **y, double **z, double **v);333int pop_entree_block(entree *ep, long loc);334int pop_val_if_newer(entree *ep, long loc);335336/* general printing */337void print_errcontext(PariOUT *out, const char *msg, const char *s, const char *entry);338void print_prefixed_text(PariOUT *out, const char *s, const char *prefix, const char *str);339INLINE void340print_text(const char *s) { print_prefixed_text(pariOut, s,NULL,NULL); }341INLINE void342out_print_text(PariOUT *out, const char *s) { print_prefixed_text(out, s,NULL,NULL); }343INLINE long344is_keyword_char(char c) { return (isalnum((int)c) || c=='_'); }345346/* Interfaces (GP, etc.) */347hashtable *hash_from_link(GEN e, GEN names, int use_stack);348void gen_relink(GEN x, hashtable *table);349entree* do_alias(entree *ep);350char* get_sep(const char *t);351long get_int(const char *s, long dflt);352ulong get_uint(const char *s);353void gp_initrc(pari_stack *p_A);354355void pari_sigint(const char *s);356void* get_stack(double fraction, long min);357void free_graph(void);358void initout(int initerr);359void resetout(int initerr);360void init_linewrap(long w);361void print_functions_hash(const char *s);362GEN readbin(const char *name, FILE *f, int *vector);363int term_height(void);364int term_width(void);365/* gp_colors */366void decode_color(long n, long *c);367368/* defaults */369extern long precreal;370371void lim_lines_output(char *s, long n, long max);372int tex2mail_output(GEN z, long n);373void gen_output(GEN x);374void fputGEN_pariout(GEN x, pariout_t *T, FILE *out);375376void parsestate_reset(void);377void parsestate_save(struct pari_parsestate *state);378void parsestate_restore(struct pari_parsestate *state);379380void compilestate_reset(void);381void compilestate_save(struct pari_compilestate *comp);382void compilestate_restore(struct pari_compilestate *comp);383384void filestate_save(struct pari_filestate *file);385void filestate_restore(struct pari_filestate *file);386void tmp_restore(pariFILE *F);387388long evalstate_get_trace(void);389void evalstate_set_trace(long lvl);390void evalstate_clone(void);391void evalstate_reset(void);392void evalstate_restore(struct pari_evalstate *state);393GEN evalstate_restore_err(struct pari_evalstate *state);394void evalstate_save(struct pari_evalstate *state);395void varstate_save(struct pari_varstate *s);396void varstate_restore(struct pari_varstate *s);397398void mtstate_save(struct pari_mtstate *s);399void mtstate_reset(void);400void mtstate_restore(struct pari_mtstate *s);401402void debug_context(void);403404typedef struct {405const char *s;406size_t ls;407char **dir;408} forpath_t;409void forpath_init(forpath_t *T, gp_path *path, const char *s);410char *forpath_next(forpath_t *T);411412/* GP output && output format */413void gpwritebin(const char *s, GEN x);414extern char *current_logfile;415416/* colors */417extern long gp_colors[];418extern int disable_color;419420/* entrees */421#define EpVALENCE(ep) ((ep)->valence & 0xFF)422#define EpSTATIC(ep) ((ep)->valence & 0x100)423#define EpSETSTATIC(ep) ((ep)->valence |= 0x100)424enum { EpNEW = 100, EpALIAS, EpVAR, EpINSTALL };425#define initial_value(ep) ((ep)+1)426427/* functions lists */428extern const long functions_tblsz; /* hashcodes table size */429extern entree **functions_hash; /* functions hashtable */430extern entree **defaults_hash; /* defaults hashtable */431432/* buffers */433typedef struct Buffer {434char *buf;435ulong len;436jmp_buf env;437} Buffer;438Buffer *new_buffer(void);439void delete_buffer(Buffer *b);440void fix_buffer(Buffer *b, long newlbuf);441442typedef struct {443const char *s; /* source */444char *t, *end; /* target, last char read */445int in_string, in_comment, more_input, wait_for_brace;446Buffer *buf;447} filtre_t;448void init_filtre(filtre_t *F, Buffer *buf);449Buffer *filtered_buffer(filtre_t *F);450void kill_buffers_upto_including(Buffer *B);451void pop_buffer(void);452void kill_buffers_upto(Buffer *B);453int gp_read_line(filtre_t *F, const char *PROMPT);454void parse_key_val(char *src, char **ps, char **pt);455extern int (*cb_pari_get_line_interactive)(const char*, const char*, filtre_t *F);456extern char *(*cb_pari_fgets_interactive)(char *s, int n, FILE *f);457int get_line_from_file(const char *prompt, filtre_t *F, FILE *file);458void pari_skip_space(char **s);459void pari_skip_alpha(char **s);460char *pari_translate_string(const char *src, char *s, char *entry);461462gp_data *default_gp_data(void);463464typedef char *(*fgets_t)(char *, int, void*);465466typedef struct input_method {467/* optional */468fgets_t myfgets; /* like libc fgets() but last argument is (void*) */469/* mandatory */470char * (*getline)(char**, int f, struct input_method*, filtre_t *F);471int free; /* boolean: must we free the output of getline() ? */472/* optional */473const char *prompt, *prompt_cont;474void *file; /* can be used as last argument for fgets() */475} input_method;476477int input_loop(filtre_t *F, input_method *IM);478char *file_input(char **s0, int junk, input_method *IM, filtre_t *F);479char *file_getline(Buffer *b, char **s0, input_method *IM);480481/* readline */482typedef struct {483/* pointers to readline variables/functions */484char **line_buffer;485int *point;486int *end;487char **(*completion_matches)(const char *, char *(*)(const char*, int));488char *(*filename_completion_function)(const char *, int);489char *(*username_completion_function)(const char *, int);490int (*insert)(int, int);491int *completion_append_character;492493/* PARI-specific */494int back; /* rewind the cursor by this number of chars */495} pari_rl_interface;496497/* Code which wants to use readline needs to do the following:498499#include <readline.h>500#include <paripriv.h>501pari_rl_interface pari_rl;502pari_use_readline(pari_rl);503504This will initialize the pari_rl structure. A pointer to this structure505must be given as first argument to all PARI readline functions. */506507/* IMPLEMENTATION NOTE: this really must be a macro (not a function),508* since we refer to readline symbols. */509#define pari_use_readline(pari_rl) do {\510(pari_rl).line_buffer = &rl_line_buffer; \511(pari_rl).point = &rl_point; \512(pari_rl).end = &rl_end; \513(pari_rl).completion_matches = &rl_completion_matches; \514(pari_rl).filename_completion_function = &rl_filename_completion_function; \515(pari_rl).username_completion_function = &rl_username_completion_function; \516(pari_rl).insert = &rl_insert; \517(pari_rl).completion_append_character = &rl_completion_append_character; \518(pari_rl).back = 0; } while(0)519520/* FIXME: EXPORT AND DOCUMENT THE FOLLOWING */521522/* PROBABLY NOT IN THE RIGHT FILE, SORT BY THEME */523524/* multiprecision */525GEN adduispec_offset(ulong s, GEN x, long offset, long nx);526int lgcdii(ulong* d, ulong* d1, ulong* u, ulong* u1, ulong* v, ulong* v1, ulong vmax);527ulong rgcduu(ulong d, ulong d1, ulong vmax, ulong* u, ulong* u1, ulong* v, ulong* v1, long *s);528ulong xgcduu(ulong d, ulong d1, int f, ulong* v, ulong* v1, long *s);529ulong xxgcduu(ulong d, ulong d1, int f, ulong* u, ulong* u1, ulong* v, ulong* v1, long *s);530GEN divgunu(GEN x, ulong i);531GEN divrunu(GEN x, ulong i);532GEN muliispec(GEN x, GEN y, long nx, long ny);533GEN red_montgomery(GEN T, GEN N, ulong inv);534GEN sqrispec(GEN x, long nx);535ulong *convi(GEN x, long *l);536537int approx_0(GEN x, GEN y);538539/* powers */540GEN rpowuu(ulong a, ulong n, long prec);541542/* floats */543double dabs(double s, double t);544double darg(double s, double t);545void dcxlog(double s, double t, double *a, double *b);546double dnorm(double s, double t);547double dbllog2(GEN z);548double dbllambertW0(double a);549double dbllambertW_1(double a);550551/* hnf */552GEN hnfadd(GEN m,GEN p,GEN* ptdep,GEN* ptA,GEN* ptC,GEN extramat,GEN extraC);553GEN hnfadd_i(GEN m,GEN p,GEN* ptdep,GEN* ptA,GEN* ptC,GEN extramat,GEN extraC);554GEN hnfspec_i(GEN m,GEN p,GEN* ptdep,GEN* ptA,GEN* ptC,long k0);555GEN hnfspec(GEN m,GEN p,GEN* ptdep,GEN* ptA,GEN* ptC,long k0);556GEN mathnfspec(GEN x, GEN *ptperm, GEN *ptdep, GEN *ptB, GEN *ptC);557GEN ZM_hnfmodall_i(GEN x, GEN dm, long flag);558559GEN LLL_check_progress(GEN Bnorm, long n0, GEN m, int final, long *ti_LLL);560561/* integer factorization / discrete log */562ulong is_kth_power(GEN x, ulong p, GEN *pt);563GEN mpqs(GEN N);564565/* Polynomials */566/* a) Arithmetic/conversions */567GEN lift_if_rational(GEN x);568GEN monomial(GEN a, long degpol, long v);569GEN monomialcopy(GEN a, long degpol, long v);570GEN ser2pol_i(GEN x, long lx);571GEN ser2rfrac_i(GEN x);572GEN swap_vars(GEN b0, long v);573GEN RgX_recipspec_shallow(GEN x, long l, long n);574575/* b) Modular */576GEN bezout_lift_fact(GEN T, GEN Tmod, GEN p, long e);577GEN polsym_gen(GEN P, GEN y0, long n, GEN T, GEN N);578GEN ZXQ_charpoly_sqf(GEN A, GEN B, long *lambda, long v);579GEN ZX_disc_all(GEN,ulong);580GEN ZX_resultant_all(GEN A, GEN B, GEN dB, ulong bound);581GEN ZX_ZXY_resultant_all(GEN A, GEN B, long *lambda, GEN *LPRS);582583GEN FlxqM_mul_Kronecker(GEN A, GEN B, GEN T, ulong p);584GEN FqM_mul_Kronecker(GEN x, GEN y, GEN T, GEN p);585586/* c) factorization */587GEN chk_factors_get(GEN lt, GEN famod, GEN c, GEN T, GEN N);588long cmbf_maxK(long nb);589GEN ZX_DDF(GEN x);590GEN initgaloisborne(GEN T, GEN dn, long prec, GEN *pL, GEN *pprep, GEN *pdis);591592/* number fields */593GEN nflist_C3_worker(GEN gv, GEN T);594GEN nflist_C4vec_worker(GEN gm, GEN X, GEN Xinf, GEN gs);595GEN nflist_V4_worker(GEN D1, GEN X, GEN Xinf, GEN gs);596GEN nflist_D4_worker(GEN D, GEN X, GEN Xinf, GEN listarch);597GEN nflist_A4S4_worker(GEN P3, GEN X, GEN Xinf, GEN cards);598GEN nflist_C5_worker(GEN N, GEN bnfC5);599GEN nflist_CL_worker(GEN Fcond, GEN bnf, GEN ellprec);600GEN nflist_DL_worker(GEN P2, GEN X1pow, GEN X0pow, GEN X, GEN Xinf, GEN ells);601GEN nflist_Mgen_worker(GEN field, GEN X, GEN Xinf, GEN ella);602GEN nflist_C6_worker(GEN P3, GEN X, GEN Xinf, GEN M, GEN T);603GEN nflist_D612_worker(GEN P3, GEN X, GEN Xinf, GEN limd2s2);604GEN nflist_A46S46P_worker(GEN P3, GEN Xinf, GEN sqX, GEN cards);605GEN nflist_S46M_worker(GEN P3, GEN X, GEN Xinf, GEN gs);606GEN nflist_A462_worker(GEN P3, GEN X, GEN Xinf, GEN listarch, GEN GAL);607GEN nflist_S3C3_worker(GEN D2, GEN X, GEN Xinf);608GEN nflist_S462_worker(GEN P3, GEN X, GEN Xinf, GEN listarch13, GEN GAL);609GEN nflist_S36_worker(GEN pol, GEN X, GEN Xinf);610GEN nflist_C32C4_worker(GEN P4, GEN X, GEN Xinf, GEN GAL);611GEN nflist_C32D4_worker(GEN P, GEN X, GEN Xinf, GEN gs);612GEN nflist_C9_worker(GEN P, GEN X, GEN Xinf);613GEN nflist_C3C3_worker(GEN gi, GEN V3, GEN V3D, GEN X);614GEN nflist_S3R_worker(GEN ga, GEN ALLCTS);615GEN nflist_S3I_worker(GEN ga, GEN ALLCTS);616GEN nflist_D9_worker(GEN P2, GEN X, GEN Xinf);617GEN nflist_S32_worker(GEN all1, GEN X, GEN Xinf, GEN V3, GEN gs);618619/* pari_init / pari_close */620void pari_close_compiler(void);621void pari_close_evaluator(void);622void pari_close_files(void);623void pari_close_floats(void);624void pari_close_homedir(void);625void pari_close_parser(void);626void pari_close_paths(void);627void pari_close_primes(void);628void pari_init_buffers(void);629void pari_init_compiler(void);630void pari_init_defaults(void);631void pari_init_ellcondfile(void);632void pari_init_evaluator(void);633void pari_init_files(void);634void pari_init_floats(void);635void pari_init_homedir(void);636void pari_init_graphics(void);637void pari_init_parser(void);638void pari_init_rand(void);639void pari_init_paths(void);640void pari_init_primetab(void);641void pari_init_seadata(void);642GEN pari_get_seadata(void);643void pari_set_primetab(GEN global_primetab);644void pari_set_seadata(GEN seadata);645void pari_set_varstate(long *vp, struct pari_varstate *vs);646void pari_thread_close_files(void);647648void export_add(const char *str, GEN val);649void export_del(const char *str);650GEN export_get(const char *str);651void exportall(void);652void unexportall(void);653654/* BY FILES */655656/* parinf.h */657658GEN fincke_pohst(GEN a,GEN BOUND,long stockmax,long PREC, FP_chk_fun *CHECK);659void init_zlog(zlog_S *S, GEN bid);660GEN log_gen_arch(zlog_S *S, long index);661GEN log_gen_pr(zlog_S *S, long index, GEN nf, long e);662GEN sprk_log_gen_pr(GEN nf, GEN sprk, long e);663GEN sprk_log_prk1(GEN nf, GEN a, GEN sprk);664GEN poltobasis(GEN nf,GEN x);665GEN coltoalg(GEN nf,GEN x);666667GEN rnfdisc_get_T(GEN nf, GEN P, GEN *lim);668GEN make_integral(GEN nf, GEN L0, GEN f, GEN listpr);669GEN rnfallbase(GEN nf, GEN pol, GEN lim, GEN rnfeq, GEN *pD, GEN *pfi,670GEN *pdKP);671GEN subgroupcondlist(GEN cyc, GEN bound, GEN listKer);672673/* Qfb.c */674675GEN redimagsl2(GEN q, GEN *U);676677/* alglin1.c */678679typedef long (*pivot_fun)(GEN,GEN,long,GEN);680GEN ZM_pivots(GEN x0, long *rr);681GEN RgM_pivots(GEN x0, GEN data, long *rr, pivot_fun pivot);682void RgMs_structelim_col(GEN M, long nbcol, long nbrow, GEN A, GEN *p_col, GEN *p_lin);683684/* arith1.c */685686int is_gener_Fp(GEN x, GEN p, GEN p_1, GEN L);687int is_gener_Fl(ulong x, ulong p, ulong p_1, GEN L);688689/* arith2.c */690691int divisors_init(GEN n, GEN *pP, GEN *pE);692long set_optimize(long what, GEN g);693694/* base1.c */695696GEN zk_galoisapplymod(GEN nf, GEN z, GEN S, GEN p);697698/* base2.c */699700GEN dim1proj(GEN prh);701GEN gen_if_principal(GEN bnf, GEN x);702703/* base3.c */704705void check_nfelt(GEN x, GEN *den);706GEN zk_ei_mul(GEN nf, GEN x, long i);707GEN log_prk(GEN nf, GEN a, GEN sprk, GEN mod);708GEN log_prk_units(GEN nf, GEN D, GEN sprk);709GEN log_prk_units_init(GEN bnf);710GEN veclog_prk(GEN nf, GEN v, GEN sprk);711GEN log_prk_init(GEN nf, GEN pr, long k, GEN mod);712713/* base4.c */714715GEN factorbackprime(GEN nf, GEN L, GEN e);716717/* bb_group.c */718719GEN producttree_scheme(long n);720721/* bern.c */722long bernbitprec(long N);723724/* bibli2.c */725726GEN sort_factor_pol(GEN y, int (*cmp)(GEN,GEN));727728/* buch1.c */729730long bnf_increase_LIMC(long LIMC, long LIMCMAX);731732/* buch2.c */733734typedef struct GRHprime_t { ulong p; double logp; GEN dec; } GRHprime_t;735typedef struct GRHcheck_t { double cD, cN; GRHprime_t *primes; long clone, nprimes, maxprimes; ulong limp; forprime_t P; } GRHcheck_t;736void free_GRHcheck(GRHcheck_t *S);737void init_GRHcheck(GRHcheck_t *S, long N, long R1, double LOGD);738void GRH_ensure(GRHcheck_t *S, long nb);739ulong GRH_last_prime(GRHcheck_t *S);740int GRHok(GRHcheck_t *S, double L, double SA, double SB);741GEN extract_full_lattice(GEN x);742GEN init_red_mod_units(GEN bnf, long prec);743GEN isprincipalarch(GEN bnf, GEN col, GEN kNx, GEN e, GEN dx, long *pe);744GEN red_mod_units(GEN col, GEN z);745746/* buch3.c */747748GEN minkowski_bound(GEN D, long N, long r2, long prec);749int subgroup_conductor_ok(GEN H, GEN L);750GEN subgrouplist_cond_sub(GEN bnr, GEN C, GEN bound);751752/* crvwtors.c */753754void random_curves_with_m_torsion(ulong *a4, ulong *a6, ulong *tx, ulong *ty, long ncurves, long m, ulong p);755756/* dirichlet.c */757758GEN direuler_factor(GEN s, long n);759760/* ellanal.c */761762GEN hnaive_max(GEN ell, GEN ht);763764/* elliptic.c */765766GEN ellQ_genreduce(GEN E, GEN G, GEN M, long prec);767GEN ellQ_isdivisible(GEN E, GEN P, ulong l);768GEN ellintegralbmodel(GEN e, GEN *pv);769void ellprint(GEN e);770771/* ellrank.c */772773GEN ell2selmer_basis(GEN ell, GEN *cb, long prec);774775/* es.c */776777void killallfiles(void);778pariFILE* newfile(FILE *f, const char *name, int type);779int popinfile(void);780pariFILE* try_pipe(const char *cmd, int flag);781782/* F2m.c */783784GEN F2m_gauss_pivot(GEN x, long *rr);785GEN F2m_gauss_sp(GEN a, GEN b);786GEN F2m_invimage_i(GEN A, GEN B);787788/* Fle.c */789790void FleV_add_pre_inplace(GEN P, GEN Q, GEN a4, ulong p, ulong pi);791void FleV_dbl_pre_inplace(GEN P, GEN a4, ulong p, ulong pi);792void FleV_mulu_pre_inplace(GEN P, ulong n, GEN a4, ulong p, ulong pi);793void FleV_sub_pre_inplace(GEN P, GEN Q, GEN a4, ulong p, ulong pi);794795/* Flv.c */796797GEN Flm_gauss_sp(GEN a, GEN b, ulong *detp, ulong p);798GEN Flm_invimage_i(GEN A, GEN B, ulong p);799GEN Flm_inv_sp(GEN a, ulong *detp, ulong p);800GEN Flm_pivots(GEN x, ulong p, long *rr, long inplace);801802/* Flxq_log.c */803804GEN Flxq_log_index(GEN a0, GEN b0, GEN m, GEN T0, ulong p);805int Flxq_log_use_index(GEN m, GEN T0, ulong p);806807/* FlxqE.c */808809GEN ZpXQ_norm_pcyc(GEN x, GEN T, GEN q, GEN p);810long zx_is_pcyc(GEN T);811812/* FpV.c */813814GEN FpMs_leftkernel_elt_col(GEN M, long nbcol, long nbrow, GEN p);815GEN FpX_to_mod_raw(GEN z, GEN p);816817/* FpX.c */818819GEN ZlXQXn_expint(GEN h, long e, GEN T, GEN p, ulong pp);820821/* FpX_factor.c */822823GEN ddf_to_ddf2(GEN V);824long ddf_to_nbfact(GEN D);825GEN vddf_to_simplefact(GEN V, long d);826827/* FpXQX_factor.c */828829GEN FpXQX_factor_Berlekamp(GEN x, GEN T, GEN p);830831/* forprime.c*/832833void init_modular_big(forprime_t *S);834void init_modular_small(forprime_t *S);835836/* galconj.c */837838GEN galoiscosets(GEN O, GEN perm);839GEN matrixnorm(GEN M, long prec);840841/* gen1.c */842843GEN gred_rfrac_simple(GEN n, GEN d);844GEN sqr_ser_part(GEN x, long l1, long l2);845846/* hash.c */847848hashtable *hashstr_import_static(hashentry *e, ulong size);849850/* hyperell.c */851852GEN ZlXQX_hyperellpadicfrobenius(GEN H, GEN T, ulong p, long n);853GEN hyperell_redsl2(GEN Q);854855/* ifactor1.c */856857ulong snextpr(ulong p, byteptr *d, long *rcn, long *q, int (*ispsp)(ulong));858859/* intnum.c */860861GEN contfraceval_inv(GEN CF, GEN tinv, long nlim);862863/* mftrace.c */864865void pari_close_mf(void);866long polishomogeneous(GEN P);867GEN sertocol(GEN S);868GEN mfrhopol(long n);869GEN mfrhopol_u_eval(GEN Q, ulong t2);870GEN mfrhopol_eval(GEN Q, GEN t2);871872/* prime.c */873874long BPSW_psp_nosmalldiv(GEN N);875int MR_Jaeschke(GEN n);876long isanypower_nosmalldiv(GEN N, GEN *px);877void prime_table_next_p(ulong a, byteptr *pd, ulong *pp, ulong *pn);878879/* perm.c */880881long cosets_perm_search(GEN C, GEN p);882GEN perm_generate(GEN S, GEN H, long o);883long perm_relorder(GEN p, GEN S);884GEN vecperm_extendschreier(GEN C, GEN v, long n);885886/* polclass.c */887888GEN polclass0(long D, long inv, long xvar, GEN *db);889890/* polmodular.c */891892GEN polmodular0_ZM(long L, long inv, GEN J, GEN Q, int compute_derivs, GEN *db);893GEN Flm_Fl_polmodular_evalx(GEN phi, long L, ulong j, ulong p, ulong pi);894GEN polmodular_db_init(long inv);895void polmodular_db_clear(GEN db);896void polmodular_db_add_level(GEN *db, long L, long inv);897void polmodular_db_add_levels(GEN *db, long *levels, long k, long inv);898GEN polmodular_db_for_inv(GEN db, long inv);899GEN polmodular_db_getp(GEN fdb, long L, ulong p);900901long modinv_level(long inv);902long modinv_degree(long *p1, long *p2, long inv);903long modinv_ramified(long D, long inv);904long modinv_j_from_2double_eta(GEN F, long inv, ulong x0, ulong x1, ulong p, ulong pi);905GEN double_eta_raw(long inv);906ulong modfn_root(ulong j, norm_eqn_t ne, long inv);907long modfn_unambiguous_root(ulong *r, long inv, ulong j0, norm_eqn_t ne, GEN jdb);908GEN qfb_nform(long D, long n);909910/* Fle.c */911912ulong Flj_order_ufact(GEN P, ulong n, GEN F, ulong a4, ulong p, ulong pi);913914/* polarit3.c */915916GEN Flm_Frobenius_pow(GEN M, long d, GEN T, ulong p);917GEN FpM_Frobenius_pow(GEN M, long d, GEN T, GEN p);918GEN FpX_compositum(GEN A, GEN B, GEN p);919GEN Flx_direct_compositum(GEN A, GEN B, ulong p);920GEN FlxV_direct_compositum(GEN V, ulong p);921GEN FlxqX_direct_compositum(GEN P, GEN Q, GEN T, ulong p);922GEN FpX_direct_compositum(GEN A, GEN B, GEN p);923GEN FpXV_direct_compositum(GEN V, GEN p);924GEN nf_direct_compositum(GEN nf, GEN A, GEN B);925ulong ZX_ZXY_ResBound(GEN A, GEN B, GEN dB);926GEN ffinit_Artin_Schreier(ulong p, long l);927GEN ffinit_rand(GEN p, long n);928929/* nflistQT.c */930931GEN nflistQT(long n, long k, long v);932933/* ramanujantau.c */934GEN ramanujantau_worker(GEN gt, GEN p2_7, GEN p_9, GEN p);935GEN taugen_n_worker(GEN t, GEN pol, GEN p4);936937/* readline.c */938939char** pari_completion(pari_rl_interface *pari_rl, char *text, int START, int END);940char** pari_completion_matches(pari_rl_interface *pari_rl, const char *s, long pos, long *wordpos);941942/* RgX.c */943944GEN RgX_homogenous_evalpow(GEN P, GEN A, GEN B);945GEN QXQX_homogenous_evalpow(GEN P, GEN A, GEN B, GEN T);946947/* subcyclo.c */948949GEN galoiscyclo(long n, long v);950GEN znstar_bits(long n, GEN H);951long znstar_conductor(GEN H);952long znstar_conductor_bits(GEN bits);953GEN znstar_cosets(long n, long phi_n, GEN H);954GEN znstar_elts(long n, GEN H);955GEN znstar_generate(long n, GEN V);956GEN znstar_hnf(GEN Z, GEN M);957GEN znstar_hnf_elts(GEN Z, GEN H);958GEN znstar_hnf_generators(GEN Z, GEN M);959GEN znstar_reduce_modulus(GEN H, long n);960GEN znstar_small(GEN zn);961962/* trans1.c */963964struct abpq { GEN *a, *b, *p, *q; };965struct abpq_res { GEN P, Q, B, T; };966void abpq_init(struct abpq *A, long n);967void abpq_sum(struct abpq_res *r, long n1, long n2, struct abpq *A);968GEN logagmcx(GEN q, long prec);969GEN zellagmcx(GEN a0, GEN b0, GEN r, GEN t, long prec);970971/* trans2.c */972973GEN trans_fix_arg(long *prec, GEN *s0, GEN *sig, GEN *tau, pari_sp *av, GEN *res);974975/* trans3.c */976977GEN double_eta_quotient(GEN a, GEN w, GEN D, long p, long q, GEN pq, GEN sqrtD);978GEN inv_szeta_euler(long n, long prec);979980/* volcano.c */981982long j_level_in_volcano(GEN phi, ulong j, ulong p, ulong pi, long L, long depth);983ulong ascend_volcano(GEN phi, ulong j, ulong p, ulong pi, long level, long L, long depth, long steps);984ulong descend_volcano(GEN phi, ulong j, ulong p, ulong pi, long level, long L, long depth, long steps);985long next_surface_nbr(ulong *nJ, GEN phi, long L, long h, ulong J, const ulong *pJ, ulong p, ulong pi);986GEN enum_roots(ulong j, norm_eqn_t ne, GEN fdb, classgp_pcp_t G);987988/* pic.c */989GEN ZpXQMinv(GEN A, GEN T, GEN pe, GEN p, long e);990GEN ZpXQ_FrobMat(GEN T, GEN p, long e, GEN pe);991GEN JgetT(GEN J);992GEN Jgetp(GEN J);993GEN JgetLp(GEN J);994GEN DivMul(GEN f, GEN W, GEN T, GEN p);995GEN DivAdd1(GEN WA, GEN WB, ulong d, GEN T, GEN pe, GEN p, ulong excess, long flag);996GEN PicRefreshPairings(GEN J, GEN FRparams, GEN T, GEN Pairings, GEN UsedNames, GEN Want, GEN WantNames);997GEN PicTors_UpdatePairings(GEN J, GEN FRparams, GEN BT, GEN R, GEN Tnew, GEN TnewPairings, int* replace);998GEN VecExtend1_shallow(GEN V, GEN X);999GEN PicTorsGalRep_from_basis(GEN J, GEN J1, GEN l, GEN B);10001001ENDEXTERN100210031004