1 /* $Id: paripriv.h 8483 2007-03-29 08:58:00Z kb $
2 
3 Copyright (C) 2004  The PARI group.
4 
5 This file is part of the PARI/GP package.
6 
7 PARI/GP is free software; you can redistribute it and/or modify it under the
8 terms of the GNU General Public License as published by the Free Software
9 Foundation. It is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY WHATSOEVER.
11 
12 Check the License for details. You should have received a copy of it, along
13 with the package; see the file 'COPYING'. If not, write to the Free Software
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
15 
16 BEGINEXTERN
17 
18 /* for qsort */
19 typedef int (*QSCOMP)(const void *, const void *);
20 
21 /* swap */
22 #define lswap(x,y) {long _z=x; x=y; y=_z;}
23 #define pswap(x,y) {GEN *_z=x; x=y; y=_z;}
24 #define swap(x,y)  {GEN  _z=x; x=y; y=_z;}
25 #define dswap(x,y) { double _t=x; x=y; y=_t; }
26 #define pdswap(x,y) { double* _t=x; x=y; y=_t; }
27 #define swapspec(x,y, nx,ny) {swap(x,y); lswap(nx,ny);}
28 
29 /* */
30 #define both_odd(x,y) ((x)&(y)&1)
31 
32 /* unused */
33 GEN ellheightoo(GEN e, GEN z, long prec);
34 void ellprint(GEN e);
35 GEN mpinv(GEN b);
36 
37 /* generic */
38 GEN arith_proto(long f(GEN), GEN x, int do_error);
39 GEN arith_proto2(long f(GEN,GEN), GEN x, GEN n);
40 GEN arith_proto2gs(long f(GEN,long), GEN x, long y);
41 GEN gassoc_proto(GEN f(GEN,GEN),GEN,GEN);
42 GEN garith_proto(GEN f(GEN), GEN x, int do_error);
43 GEN garith_proto2gs(GEN f(GEN,long), GEN x, long y);
44 GEN trans_fix_arg(long *prec, GEN *s0, GEN *sig, pari_sp *av, GEN *res);
45 GEN transc(GEN (*f) (GEN, long), GEN x, long prec);
46 GEN sort_factor(GEN y, int (*cmp)(GEN,GEN));
47 GEN sort_factor_gen(GEN y, int (*cmp)(GEN,GEN));
48 GEN sort_factor_gen_aux(GEN y, void *data, int (*cmp)(void *,GEN,GEN));
49 GEN sort_vecpol(GEN a, int (*cmp)(GEN,GEN));
50 
51 /* loops */
52 GEN incloop(GEN a);
53 GEN resetloop(GEN a, GEN b);
54 GEN setloop(GEN a);
55 
56 /* multiprecision */
57 GEN   icopy_spec(GEN x, long nx);
58 GEN   addrex01(GEN x);
59 GEN   addumului(ulong a, ulong b, GEN Y);
60 void  affr_fixlg(GEN z, GEN y);
61 GEN   cxnorm(GEN x);
62 int   lgcdii(ulong* d, ulong* d1, ulong* u, ulong* u1, ulong* v, ulong* v1, ulong vmax);
63 ulong rgcduu(ulong d, ulong d1, ulong vmax, ulong* u, ulong* u1, ulong* v, ulong* v1, long *s);
64 ulong xgcduu(ulong d, ulong d1, int f, ulong* v, ulong* v1, long *s);
65 GEN   quadnorm(GEN x);
66 ulong xxgcduu(ulong d, ulong d1, int f, ulong* u, ulong* u1, ulong* v, ulong* v1, long *s);
67 GEN   divgsns(GEN x, long i);
68 GEN   divrsns(GEN x, long i);
69 GEN   init_remiimul(GEN M);
70 GEN   ishiftr_lg(GEN x, long lx, long n);
71 GEN   logagmcx(GEN q, long prec);
72 GEN   muliispec(GEN x, GEN y, long nx, long ny);
73 GEN   padic_to_Fp(GEN x, GEN Y);
74 ulong padic_to_Fl(GEN x, ulong p);
75 GEN   red_montgomery(GEN T, GEN N, ulong inv);
76 GEN   remiimul(GEN x, GEN sy);
77 GEN   sqrispec(GEN x, long nx);
78 GEN   subrex01(GEN x);
79 GEN   mulcxI(GEN x);
80 GEN   mulcxmI(GEN x);
81 
82 int approx_0(GEN x, GEN y);
83 GEN bernfrac_using_zeta(long n);
84 int OK_bern(long nb, long prec);
85 
86 /* FIXME: adapt/use mpn_[lr]shift instead */
87 #define shift_left(z2,z1,imin,imax,f, sh) {\
88   register const ulong _m = BITS_IN_LONG - (sh);\
89   shift_left2((z2),(z1),(imin),(imax),(f),(sh),(_m)); }
90 
91 #define shift_right(z2,z1,imin,imax,f, sh) {\
92   register const ulong _m = BITS_IN_LONG - (sh);\
93   shift_right2((z2),(z1),(imin),(imax),(f),(sh),(_m)); }
94 
95 /* powers */
96 #define sqrs(b) mulss((b),(b))
97 #define sqru(b) muluu((b),(b))
98 GEN    rpowuu(ulong a, ulong n, long prec);
99 GEN    powrshalf(GEN x, long s);
100 GEN    powrfrac(GEN x, long n, long d);
101 ulong  u_pow10(int n);
102 
103 /* floats */
104 double dabs(double s, double t);
105 long   dblexpo(double x);
106 ulong  dblmantissa(double x);
107 void   dcxlog(double s, double t, double *a, double *b);
108 double dnorm(double s, double t);
109 double dbllog2(GEN z);
110 ulong  usqrtsafe(ulong a);
111 
112 /* "abs" routines for t_REAL ( disregard sign ) */
113 int absrnz_egal1(GEN x);
114 int absrnz_egal2n(GEN x);
115 GEN exp1r_abs(GEN x);
116 GEN logagmr_abs(GEN q);
117 GEN logr_abs(GEN x);
118 GEN sqrtr_abs(GEN x);
119 
120 /* hnf */
121 GEN gauss_triangle_i(GEN A, GEN B,GEN t);
122 GEN hnfadd(GEN m,GEN p,GEN* ptdep,GEN* ptA,GEN* ptC,GEN extramat,GEN extraC);
123 GEN hnfadd_i(GEN m,GEN p,GEN* ptdep,GEN* ptA,GEN* ptC,GEN extramat,GEN extraC);
124 GEN hnf_gauss(GEN A, GEN B);
125 GEN hnf_invimage(GEN A, GEN b);
126 GEN hnfmerge_get_1(GEN A, GEN B);
127 GEN hnfperm_i(GEN A, GEN *ptU, GEN *ptperm);
128 GEN hnfspec_i(long** m,GEN p,GEN* ptdep,GEN* ptA,GEN* ptC,long k0);
129 GEN hnfspec(long** m,GEN p,GEN* ptdep,GEN* ptA,GEN* ptC,long k0);
130 GEN mathnfspec(GEN x, GEN *ptperm, GEN *ptdep, GEN *ptB, GEN *ptC);
131 
132 /* LLL */
133 GEN lllint_fp_ip(GEN x, long D);
134 GEN lllfp_marked(long *M, GEN x, long D, long flag, long prec, int gram);
135 GEN lllint_marked(long *M, GEN x, long D, int g, GEN *h, GEN *f, GEN *B);
136 GEN LLL_check_progress(GEN Bnorm, long n0, GEN m, int final, long *ti_LLL);
137 GEN extendedgcd(GEN A);
138 GEN sqred1intern(GEN a);
139 GEN lllgramintern(GEN x, long alpha, long flag, long prec);
140 GEN lllintern(GEN x, long D, long flag, long prec);
141 
142 /* miscellaneous linear algebra */
143 GEN  diagonal_i(GEN x);
144 GEN  F2V_red_ip(GEN v);
145 GEN  gauss_realimag(GEN x, GEN y);
146 GEN  imagecomplspec(GEN x, long *nlze);
147 GEN  R_from_QR(GEN x, long prec);
148 void rowselect_p(GEN A, GEN B, GEN p, long init);
149 GEN  split_realimag(GEN x, long r1, long r2);
150 GEN  sqred1_from_QR(GEN x, long prec);
151 GEN  supnorm(GEN L, long prec);
152 GEN  znstar_hnf_elts(GEN Z, GEN H);
153 GEN  ZV_lincomb(GEN u, GEN v, GEN X, GEN Y);
154 GEN  vec_setconst(GEN v, GEN x);
155 
156 GEN  GS_norms(GEN B, long prec);
157 GEN  dim1proj(GEN prh);
158 GEN  detcyc(GEN cyc, long *L);
159 GEN  close_modinvertible(GEN x, GEN y);
160 GEN  colreducemodHNF(GEN x, GEN y, GEN *Q);
161 GEN  col_to_ff(GEN x, long v);
162 
163 /* famat */
164 GEN factorback_i(GEN fa, GEN e, GEN nf, int red);
165 GEN factorbackprime(GEN nf, GEN L, GEN e);
166 GEN famat_inv(GEN f);
167 GEN famat_makecoprime(GEN nf, GEN g, GEN e, GEN pr, GEN prk, GEN EX);
168 GEN famat_mul(GEN f, GEN g);
169 GEN famat_pow(GEN f, GEN n);
170 GEN famat_reduce(GEN fa);
171 GEN famat_to_arch(GEN nf, GEN fa, long prec);
172 GEN famat_to_nf_modideal_coprime(GEN nf, GEN g, GEN e, GEN id, GEN EX);
173 GEN famat_to_nf_modidele(GEN nf, GEN g, GEN e, GEN bid);
174 GEN merge_factor_i(GEN f, GEN g);
175 GEN to_famat_all(GEN x, GEN y);
176 GEN to_famat(GEN g, GEN e);
177 GEN trivfact(void);
178 
179 /* integer factorization / discrete log */
180 int   BSW_isprime(GEN x);
181 int   BSW_isprime_small(GEN x);
182 GEN   coprime_part(GEN x, GEN f);
183 GEN   Z_factor_limit(GEN n, GEN limit);
184 GEN   Fp_PHlog(GEN a, GEN g, GEN p, GEN ord);
185 GEN   Fp_shanks(GEN x,GEN g0,GEN p, GEN q);
186 ulong is_kth_power(GEN x, ulong p, GEN *pt, byteptr d);
187 long  ifac_decomp_break(GEN n, long (*B)(GEN,GEN,GEN,GEN), GEN s, long hint);
188 long  ifac_moebius(GEN n, long hint);
189 long  ifac_issquarefree(GEN n, long hint);
190 long  ifac_omega(GEN n, long hint);
191 long  ifac_bigomega(GEN n, long hint);
192 GEN   ifac_totient(GEN n, long hint);
193 GEN   ifac_numdiv(GEN n, long hint);
194 GEN   ifac_sumdiv(GEN n, long hint);
195 GEN   ifac_sumdivk(GEN n, long k, long hint);
196 int   miller(GEN n, long k);
197 GEN   mpqs(GEN N);
198 ulong ugcd(ulong x, ulong y);
199 long  Z_lvalrem_stop(GEN n, ulong p, int *stop);
200 
201 /* quadratic forms, quadratic numbers */
202 long cornacchia(GEN d, GEN p, GEN *px, GEN *py);
203 long cornacchia2(GEN d, GEN p, GEN *px, GEN *py);
204 GEN  primeform_u(GEN x, ulong p);
205 GEN  qf_disc(GEN x);
206 void qfb_comp(GEN z,GEN x,GEN y);
207 GEN  qfr_to_qfr5(GEN x, long prec);
208 GEN  qfr3_comp(GEN x, GEN y, GEN D, GEN isqrtD);
209 GEN  qfr3_pow(GEN x, GEN n, GEN D, GEN isqrtD);
210 GEN  qfr3_red(GEN x, GEN D, GEN isqrtD);
211 GEN  qfr3_rho(GEN x, GEN D, GEN isqrtD);
212 GEN  qfr3_to_qfr(GEN x, GEN z);
213 GEN  qfr5_dist(GEN e, GEN d, long prec);
214 GEN  qfr5_comp(GEN x, GEN y, GEN D, GEN sqrtD, GEN isqrtD);
215 GEN  qfr5_pow(GEN x, GEN n, GEN D, GEN sqrtD, GEN isqrtD);
216 GEN  qfr5_red(GEN x, GEN D, GEN sqrtD, GEN isqrtD);
217 GEN  qfr5_rho(GEN x, GEN D, GEN sqrtD, GEN isqrtD);
218 GEN  qfr_pow(GEN x, GEN n);
219 GEN  qfr_unit(GEN x);
220 GEN  qfi_unit(GEN x);
221 GEN  quad_polmod_conj(GEN x, GEN y);
222 GEN  quad_polmod_norm(GEN x, GEN y);
223 
224 /* Polynomials */
225 /* a) Arithmetic/conversions */
226 GEN  addmulXn(GEN x, GEN y, long d);
227 GEN  addshiftpol(GEN x, GEN y, long d);
228 GEN  lift_if_rational(GEN x);
229 GEN  monomial(GEN a, long degpol, long v);
230 GEN  monomialcopy(GEN a, long degpol, long v);
231 GEN  mulmat_pol(GEN A, GEN x);
232 long polegal_spec(GEN x, GEN y);
233 GEN  polrecip_i(GEN x);
234 GEN  pol_to_monic(GEN pol, GEN *lead);
235 GEN  revpol(GEN x);
236 GEN  ser2pol_i(GEN x, long lx);
237 GEN  ser2rfrac_i(GEN x);
238 GEN  shiftpol_i(GEN x, long v);
239 GEN  swap_vars(GEN b0, long v);
240 GEN  translate_pol(GEN P, GEN c);
241 
242 /* b) Modular */
243 GEN  bezout_lift_fact(GEN T, GEN Tmod, GEN p, long e);
244 GEN  caractducos(GEN p, GEN x, long v);
245 GEN  FpXQX_from_Kronecker(GEN z, GEN pol, GEN p);
246 GEN  FpX_quad_root(GEN x, GEN p, int unknown);
247 long FpX_split_Berlekamp(GEN *t, GEN pp);
248 GEN  FqX_split_all(GEN z, GEN T, GEN p);
249 long FqX_split_by_degree(GEN *pz, GEN u, GEN q, GEN T, GEN p);
250 long FqX_split_deg1(GEN *pz, GEN u, GEN q, GEN T, GEN p);
251 GEN  FqX_split_roots(GEN z, GEN T, GEN p, GEN pol);
252 GEN  polratlift(GEN P, GEN mod, GEN amax, GEN bmax, GEN denom);
253 GEN  polsym_gen(GEN P, GEN y0, long n, GEN T, GEN N);
254 GEN  ZX_caract_sqf(GEN A, GEN B, long *lambda, long v);
255 GEN  ZX_disc_all(GEN,ulong);
256 long ZX_get_prec(GEN x);
257 GEN  ZX_resultant_all(GEN A, GEN B, GEN dB, ulong bound);
258 GEN  ZY_ZXY_resultant_all(GEN A, GEN B0, long *lambda, GEN *LPRS);
259 GEN  ZY_ZXY_rnfequation(GEN A, GEN B0, long *lambda);
260 GEN  RgXQ_u_pow(GEN x, ulong n, GEN T);
261 GEN  RgX_gcd_simple(GEN x, GEN y);
262 GEN  RgX_extgcd_simple(GEN a, GEN b, GEN *pu, GEN *pv);
263 GEN  RgXQ_minpoly_naive(GEN y, GEN P);
264 GEN lift_intern0(GEN x,long v);
265 #define lift_intern(x) (lift_intern0((x),-1))
266 
267 /* b') Chinese Remainder Theorem */
268 GEN ZM_init_CRT(GEN Hp, ulong p);
269 int ZM_incremental_CRT(GEN H, GEN Hp, GEN q, GEN qp, ulong p);
270 
271 /* c) factorization */
272 double cauchy_bound(GEN p);
273 GEN chk_factors_get(GEN lt, GEN famod, GEN c, GEN T, GEN N);
274 int cmbf_precs(GEN q, GEN A, GEN B, long *a, long *b, GEN *qa, GEN *qb);
275 GEN ZX_DDF(GEN x, long hint);
276 GEN fact_from_DDF(GEN fa, GEN e, long n);
277 GEN initgaloisborne(GEN T, GEN dn, long prec, GEN *pL, GEN *pprep, GEN *pdis);
278 GEN logmax_modulus_bound(GEN p);
279 GEN polint_i(GEN xa, GEN ya, GEN x, long n, GEN *ptdy);
280 GEN quicktrace(GEN x, GEN sym);
281 GEN roots_to_pol_intern(GEN L, GEN a, long v, int plus);
282 GEN roots_to_pol_r1r2(GEN a, long r1, long v);
283 GEN special_pivot(GEN x);
284 GEN vandermondeinversemod(GEN L, GEN T, GEN den, GEN mod);
285 GEN ZX_monic_factorpadic(GEN f, GEN p, long prec);
286 
287 #include "parinf.h"
288 
289 /* Allocation / gerepile */
290 void   debug_stack(void);
291 void   fill_stack(void);
292 void   init_dalloc();
293 double *dalloc(size_t n);
294 void   gerepilecoeffs2(pari_sp av, GEN x, int n, GEN y, int o);
295 void   minim_alloc(long n, double ***q, GEN *x, double **y,  double **z, double **v);
296 int    pop_entree_bloc(entree *ep, long loc);
297 int    pop_val_if_newer(entree *ep, long loc);
298 void   gclone_refc(GEN x);
299 void   free_ep_args(entree *ep);
300 
301 /* naive grow-arrays */
302 typedef struct {
303   void **v;
304   long len; /* len cells allocated */
305   long n; /* first n cells occupied */
306 } __pari_growarray;
307 typedef __pari_growarray growarray[1];
308 
309 growarray *pari_get_modules();
310 growarray *pari_get_oldmodules();
311 void    grow_append(growarray A, void *e);
312 void    grow_copy(growarray A, growarray B);
313 void    grow_init(growarray A);
314 void    grow_kill(growarray A);
315 
316 /* Interfaces (GP, etc.) */
317 void  errcontext(char *msg, char *s, char *entry);
318 GEN   geni(void);
319 void* get_stack(double fraction, long min);
320 GEN   gpreadseq(char *c, int strict);
321 void  initout(int initerr);
322 void  init80col(long n);
323 char* itostr(GEN x, int minus);
324 void  kill_from_hashlist(entree *ep, long n);
325 void  member_err(char *s);
326 int   pari_kernel_init(void);
327 int   pari_last_was_newline(void);
328 void  pari_set_last_newline(int last);
329 void  print_functions_hash(const char *s);
330 void  print_user_fun(entree *ep);
331 void  print_user_member(entree *ep);
332 void  print_all_user_fun(void);
333 void  print_all_user_member(void);
334 void  pop_val(entree *ep);
335 void  push_val(entree *ep, GEN a);
336 GEN   readbin(const char *name, FILE *f, int *vector);
337 void  recover(int flag);
338 int   term_height(void);
339 int   term_width(void);
340 void  var_make_safe();
341 void  whatnow_new_syntax(char *f, long n);
342 
343 /* defaults */
344 #define is_default(s) setdefault((s),"",d_EXISTS) == gen_1
345 enum { d_SILENT, d_ACKNOWLEDGE, d_INITRC, d_RETURN, d_EXISTS };
346 extern ulong precreal;
347 
348 GEN sd_TeXstyle(const char *v, long flag);
349 GEN sd_colors(char *v, long flag);
350 GEN sd_compatible(const char *v, long flag);
351 GEN sd_datadir(char *v, long flag);
352 GEN sd_debug(const char *v, long flag);
353 GEN sd_debugfiles(const char *v, long flag);
354 GEN sd_debugmem(const char *v, long flag);
355 GEN sd_echo(const char *v, long flag);
356 GEN sd_factor_add_primes(char *v, long flag);
357 GEN sd_filename(const char *v, long flag, char *s, char **f);
358 GEN sd_format(const char *v, long flag);
359 GEN sd_help(char *v, long flag);
360 GEN sd_histsize(const char *v, long flag);
361 GEN sd_lines(const char *v, long flag);
362 GEN sd_log(const char *v, long flag);
363 GEN sd_logfile(const char *v, long flag);
364 GEN sd_new_galois_format(char *v, long flag);
365 GEN sd_output(const char *v, long flag);
366 GEN sd_parisize(const char *v, long flag);
367 GEN sd_path(char *v, long flag);
368 GEN sd_prettyprinter(char *v, long flag);
369 GEN sd_primelimit(const char *v, long flag);
370 GEN sd_prompt(const char *v, long flag);
371 GEN sd_prompt_cont(const char *v, long flag);
372 GEN sd_psfile(const char *v, long flag);
373 GEN sd_realprecision(const char *v, long flag);
374 GEN sd_rl(const char *v, long flag);
375 GEN sd_secure(const char *v, long flag);
376 GEN sd_seriesprecision(const char *v, long flag);
377 GEN sd_simplify(const char *v, long flag);
378 GEN sd_strictmatch(const char *v, long flag);
379 GEN sd_timer(const char *v, long flag);
380 GEN setdefault(const char *s, const char *v, long flag);
381 
382 /* history */
383 typedef struct {
384   GEN *res;    /* array of previous results, FIFO */
385   size_t size; /* # res */
386   ulong total; /* # of results computed since big bang */
387 } gp_hist;
388 
389 /* prettyprinter */
390 typedef struct {
391   pariFILE *file;
392   char *cmd;
393 } gp_pp;
394 
395 /* path */
396 typedef struct {
397   char *PATH;
398   char **dirs;
399 } gp_path;
400 
401 /* for output */
402 typedef struct {
403   char format; /* e,f,g */
404   long fieldw; /* 0 (ignored) or field width */
405   long sigd;   /* -1 (all) or number of significant digits printed */
406   int sp;      /* 0 = suppress whitespace from output */
407   int prettyp; /* output style: raw, prettyprint, etc */
408   int TeXstyle;
409 } pariout_t;
410 
411 char *GENtostr0(GEN x, pariout_t *T, void (*do_out)(GEN, pariout_t*));
412 void lim_lines_output(GEN z, pariout_t *fmt, long n, long max);
413 void gen_output(GEN x, pariout_t *T);
414 
415 /* GP_DATA */
416 typedef struct {
417   ulong primelimit;
418   jmp_buf env;
419   gp_hist *hist;
420   gp_pp *pp;
421   gp_path *path;
422   pariout_t *fmt;
423   ulong flags, lim_lines;
424   char *help, *prompt, *prompt_cont;
425   pari_timer *T;
426 } gp_data;
427   /* GP_DATA->flags */
428 enum { QUIET=1, TEST=2, SIMPLIFY=4, CHRONO=8, ECHO=16, STRICTMATCH=32,
429        USE_READLINE=64, SECURE=128, EMACS=256, TEXMACS=512};
430 
431 extern gp_data *GP_DATA;
432 
433 typedef struct Buffer {
434   char *buf;
435   ulong len;
436   jmp_buf env;
437 } Buffer;
438 Buffer *new_buffer(void);
439 void delete_buffer(Buffer *b);
440 void fix_buffer(Buffer *b, long newlbuf);
441 
442 typedef struct {
443   char *s, *t, *end; /* source, target, last char read */
444   int in_string, in_comment, more_input, wait_for_brace, downcase;
445   Buffer *buf;
446 } filtre_t;
447 void init_filtre(filtre_t *F, Buffer *buf);
448 char *filtre(char *s, int flag);
449 void check_filtre(filtre_t *F);
450 
451 gp_data *default_gp_data(void);
452 GEN  gp_history(gp_hist *H, long p, char *old, char *entry);
453 GEN  set_hist_entry(gp_hist *H, GEN x);
454 
455 void delete_dirs(gp_path *p);
456 void gp_expand_path(gp_path *p);
457 const char *pari_default_path();
458 char *expand_prompt(char *prompt, filtre_t *F);
459 
460 typedef struct input_method {
461 /* mandatory */
462   char * (*fgets)(char *,int,FILE*);
463   char * (*getline)(char**, int f, struct input_method*, filtre_t *F);
464   int free; /* boolean: must we free the output of getline() ? */
465 /* for interactive methods */
466   char *prompt, *prompt_cont;
467 /* for non-interactive methods */
468   FILE *file;
469 } input_method;
470 
471 int input_loop(filtre_t *F, input_method *IM);
472 char *file_input(char **s0, int junk, input_method *IM, filtre_t *F);
473 
474 /* By files */
475 
476 /* Flx.c */
477 
478 GEN     FlxX_recipspec(GEN x, long l, long n, long vs);
479 GEN     FlxX_sub(GEN x, GEN y, ulong p);
480 GEN     FlxX_subspec(GEN x, GEN y, ulong p, long lx, long ly);
481 GEN     FlxX_swap(GEN x, long n, long ws);
482 GEN     FlxX_to_Kronecker(GEN P, GEN Q);
483 GEN     FlxX_to_Kronecker_spec(GEN P, long lp, GEN Q);
484 GEN     Flx_addshift(GEN x, GEN y, ulong p, long d);
485 GEN     Flx_addspec(GEN x, GEN y, ulong p, long lx, long ly);
486 GEN     Flx_even_odd_comb(GEN P, ulong u, ulong v, ulong p);
487 GEN     Flx_mulspec(GEN a, GEN b, ulong p, long na, long nb);
488 GEN     Flx_negspec(GEN x, ulong p, long l);
489 GEN     Flx_recipspec(GEN x, long l, long n);
490 GEN     Flx_sqrspec(GEN a, ulong p, long na);
491 GEN     Flx_subspec(GEN x, GEN y, ulong p, long lx, long ly);
492 GEN     FlxqX_from_Kronecker(GEN z, GEN T, ulong p);
493 GEN     FlxqX_invmontgomery(GEN T, GEN Q, ulong p);
494 GEN     FlxqX_mulspec(GEN x, GEN y, GEN T, ulong p, long lx, long ly);
495 GEN     FlxqX_rem_montgomery(GEN x, GEN mg, GEN T, GEN Q, ulong p);
496 
497 /* Qfb.c */
498 
499 GEN     powimagraw(GEN x, long n);
500 GEN     redimagsl2(GEN q, GEN *U);
501 GEN     redrealsl2(GEN V);
502 GEN     redrealsl2step(GEN A);
503 GEN     sqcompimagraw(GEN x);
504 GEN     sqcomprealraw(GEN x);
505 
506 /* RgX.c */
507 
508 GEN     RgXQ_matrix_pow(GEN y, long n, long m, GEN P);
509 GEN     RgX_copy_spec(GEN x, long nx);
510 GEN     zx_copy_spec(GEN x, long nx);
511 
512 /* alglin1.c */
513 
514 GEN     Flm_Fl_mul_inplace(GEN y, ulong x, ulong p);
515 GEN     gauss_get_col(GEN a, GEN b, GEN p, long li);
516 GEN     gauss_intern(GEN a, GEN b);
517 GEN     matid_intern(long n,GEN myun,GEN myzero);
518 void    vecselect_p(GEN A, GEN B, GEN p, long init, long lB);
519 
520 /* alglin2.c */
521 
522 GEN     Frobeniusform(GEN V, long n);
523 GEN     ZM_copy(GEN x);
524 GEN     ZV_Z_mul(GEN X, GEN c);
525 GEN     ZV_copy(GEN x);
526 void    ZV_neg_ip(GEN M);
527 GEN     hnf0(GEN A, int remove);
528 GEN     hnf_special(GEN x, long remove);
529 GEN     hnfall0(GEN A, long remove);
530 
531 /* anal.c */
532 
533 long unsigned int  parse_option_string(char *arg, char *tmplate, long flag, char **failure, char **failure_arg);
534 GEN     readexpr(char *t);
535 
536 /* aprcl.c */
537 
538 GEN     aprcl(GEN N);
539 
540 /* arith1.c */
541 
542 GEN     Z_chinese_coprime(GEN a, GEN b, GEN A, GEN B, GEN C);
543 GEN     bestappr_mod(GEN x, GEN A, GEN B);
544 long    hilii(GEN x, GEN y, GEN p);
545 long    krouu_s(ulong x, ulong y, long s);
546 
547 /* arith2.c */
548 
549 GEN     ibitand(GEN x, GEN y);
550 GEN     ibitnegimply(GEN x, GEN y);
551 GEN     ibitor(GEN x, GEN y);
552 GEN     ibitxor(GEN x, GEN y);
553 byteptr initprimes0(ulong maxnum, long *lenp, ulong *lastp);
554 long    set_optimize(long what, GEN g);
555 
556 /* base1.c */
557 
558 void    nfbasic_init(GEN x, long flag, GEN fa, nfbasic_t *T);
559 GEN     nffromhnfbasis(GEN nf, GEN x);
560 GEN     nftohnfbasis(GEN nf, GEN x);
561 GEN     polgaloisnames(long a, long b);
562 GEN     primitive_pol_to_monic(GEN pol, GEN *ptlead);
563 
564 /* base2.c */
565 
566 long    FpX_val(GEN x0, GEN t, GEN p, GEN *py);
567 GEN     fast_respm(GEN f, GEN g, GEN p, long M);
568 GEN     gen_if_principal(GEN bnf, GEN x);
569 int     nfissquarefree(GEN nf, GEN x);
570 GEN     nfreducemodpr_i(GEN x, GEN prh);
571 GEN     polsymmodp(GEN g, GEN p);
572 GEN     respm(GEN x, GEN y, GEN pm);
573 GEN     rnfdet0(GEN nf, GEN x, GEN y);
574 
575 /* base3.c */
576 
577 GEN     FpXQ_gener(GEN T, GEN p);
578 void    check_nfelt(GEN x, GEN *den);
579 GEN     ff_PHlog(GEN a, GEN g, GEN T, GEN p);
580 GEN     nf_PHlog(GEN nf, GEN a, GEN g, GEN pr);
581 
582 /* base4.c */
583 
584 GEN     arch_inv(GEN x);
585 GEN     arch_pow(GEN x, GEN n);
586 void    check_listpr(GEN x);
587 GEN     factor_norm(GEN x);
588 GEN     famat_to_nf(GEN nf, GEN f);
589 long    val_norm(GEN x, GEN p, long *vz);
590 
591 /* base5.c */
592 
593 GEN     check_and_build_nfabs(GEN rnf);
594 GEN     check_and_build_norms(GEN rnf);
595 GEN     checkrnfeq(GEN x);
596 GEN     hnfcenter_ip(GEN M);
597 
598 /* bibli1.c */
599 
600 GEN     gscal(GEN x, GEN y);
601 GEN     lll_scaled(long MARKED, GEN X0, long D);
602 GEN     lllall(GEN x, long D, int gram, long flag);
603 GEN     lllintpartialall(GEN m, long flag);
604 GEN     plindep(GEN x);
605 GEN     pslq(GEN x);
606 GEN     pslqL2(GEN x);
607 GEN     sqscal(GEN x);
608 
609 /* bibli2.c */
610 
611 long    ZV_search(GEN x, GEN y);
612 GEN     ZV_sort_uniq(GEN L);
613 GEN     gen_vecsort(GEN x, GEN k, long flag);
614 
615 /* buch1.c */
616 
617 GEN     buchquad(GEN D, double cbach, double cbach2, long RELSUP, long prec);
618 GEN     form_to_ideal(GEN x);
619 GEN     getallforms(GEN D, long *pth, GEN *ptz);
620 
621 /* buch2.c */
622 
623 GEN     check_and_build_matal(GEN bnf);
624 GEN     extract_full_lattice(GEN x);
625 GEN     init_red_mod_units(GEN bnf, long prec);
626 GEN     isprincipalarch(GEN bnf, GEN col, GEN kNx, GEN e, GEN dx, long *pe);
627 GEN     red_mod_units(GEN col, GEN z, long prec);
628 int     trunc_error(GEN x);
629 
630 /* buch3.c */
631 
632 GEN     minkowski_bound(GEN D, long N, long r2, long prec);
633 
634 /* elliptic.c */
635 
636 GEN     CM_CardEFp(GEN E, GEN p);
637 GEN     CM_ellap(GEN E, GEN p);
638 GEN     apell1(GEN e, GEN p);
639 void    checkpt(GEN z);
640 GEN     multi_invmod(GEN x, GEN p);
641 GEN     ratroot(GEN p);
642 GEN     weipell0(GEN e, long prec, long PREC);
643 
644 /* es.c */
645 
646 GEN     Str0(GEN g, long flag);
647 void    bruti(GEN g, pariout_t *T, int addsign);
648 const char * eng_ord(long i);
649 char *  env_ok(char *s);
650 void    matbruti(GEN g, pariout_t *T);
651 int     pari_is_dir(char *name);
652 GEN     readobj(FILE *f, int *ptc);
653 void    sori(GEN g, pariout_t *T);
654 void    texi(GEN g, pariout_t *T, int addsign);
655 void    writeGEN(GEN x, FILE *f);
656 void    writenamedGEN(GEN x, char *s, FILE *f);
657 
658 /* galconj.c */
659 
660 GEN     fixedfieldfactmod(GEN Sp, GEN p, GEN Tmod);
661 GEN     fixedfieldfactor(GEN L, GEN O, GEN perm, GEN M, GEN den, GEN mod, long x, long y);
662 GEN     fixedfieldinclusion(GEN O, GEN PL);
663 GEN     fixedfieldorbits(GEN O, GEN L);
664 GEN     fixedfieldsympol(GEN O, GEN mod, GEN l, GEN p, long v);
665 GEN     galoisconj2pol(GEN x, long nbmax, long prec);
666 GEN     galoiscosets(GEN O, GEN perm);
667 long    intheadlong(GEN x, GEN mod);
668 long    isomborne(GEN P, GEN den, GEN p);
669 GEN     listznstarelts(long m, long p);
670 GEN     matheadlong(GEN W, GEN mod);
671 GEN     matrixnorm(GEN M, long prec);
672 GEN     monomorphismlift(GEN P, GEN S, GEN Q, GEN p, long e);
673 long    polheadlong(GEN P, long n, GEN mod);
674 GEN     sympol_aut_evalmod(GEN sym, long g, GEN sigma, GEN Tp, GEN p);
675 GEN     sympol_eval(GEN v, GEN NS);
676 GEN     vandermondeinverseprep(GEN L);
677 
678 /* galois.c */
679 
680 GEN     partitions(long n);
681 GEN     polgaloisnamesbig(long n, long k);
682 
683 /* gen1.c */
684 
685 int     ff_poltype(GEN *x, GEN *p, GEN *pol);
686 GEN     gred_frac2(GEN x1, GEN x2);
687 GEN     gred_rfrac2(GEN x1, GEN x2);
688 GEN     gred_rfrac_simple(GEN n, GEN d);
689 
690 /* gen2.c */
691 
692 void    gopsg2z(GEN (*f) (GEN, GEN), long s, GEN y, GEN z);
693 
694 /* gen3.c */
695 
696 GEN     gsubst_expr(GEN pol, GEN from, GEN to);
697 GEN     inv_ser(GEN b);
698 GEN     mul_real(GEN x, GEN y);
699 GEN     poltoser(GEN x, long v, long prec);
700 GEN     qfbeval(GEN q, GEN x, GEN y);
701 GEN     rfractoser(GEN x, long v, long prec);
702 
703 /* groupid.c */
704 
705 long    group_ident_i(GEN G, GEN S);
706 long    group_ident_trans(GEN G, GEN S);
707 long    groupelts_sumorders(GEN S);
708 GEN     vecgroup_idxlist(GEN L, long order);
709 long    vecgroup_sumorders(GEN L);
710 
711 /* ifactor1.c */
712 
713 GEN     ellfacteur(GEN n, int insist);
714 long    ifac_decomp(GEN n, long hint);
715 GEN     ifac_primary_factor(GEN *partial, long *exponent);
716 void    ifac_realloc(GEN *partial, GEN *where, long new_lg);
717 GEN     ifac_start(GEN n, long moebius, long hint);
718 GEN     pollardbrent(GEN n);
719 ulong   snextpr(ulong p, byteptr *d, long *rcn, long *q, long k);
720 GEN     squfof(GEN n);
721 
722 /* init.c */
723 
724 void    err_recover(long numerr);
725 GEN     gcopy_av(GEN x, GEN *AVMA);
726 int     ok_gerepileupto(GEN x);
727 void    pari_init_defaults(void);
728 
729 /* nffactor.c */
730 
731 long    ZM_get_prec(GEN x);
732 int     nfissplit(GEN nf, GEN x);
733 
734 /* perm.c */
735 
736 long    cosets_perm_search(GEN C, GEN p);
737 GEN     group_export_GAP(GEN G);
738 GEN     group_export_MAGMA(GEN G);
739 GEN     perm_conj(GEN s, GEN t);
740 GEN     perm_generate(GEN S, GEN H, long o);
741 long    perm_relorder(GEN p, GEN S);
742 GEN     perm_to_GAP(GEN p);
743 GEN     quotient_subgroup_lift(GEN C, GEN H, GEN S);
744 
745 /* polarit1.c */
746 
747 GEN     Flx_Berlekamp_ker(GEN u, ulong p);
748 GEN     FpX_Berlekamp_ker(GEN u, GEN p);
749 GEN     FpX_factcantor(GEN f, GEN pp, long flag);
750 GEN     FqX_Berlekamp_ker(GEN u, GEN T, GEN q, GEN p);
751 GEN     FqX_rand(long d1, long v, GEN T, GEN p);
752 long    FqX_split_Berlekamp(GEN *t, GEN q, GEN T, GEN p);
753 GEN     Zp_appr(GEN f, GEN a);
754 int     cmp_padic(GEN x, GEN y);
755 GEN     factcantor0(GEN f, GEN pp, long flag);
756 GEN     zrhqr(GEN a, long prec);
757 
758 /* polarit2.c */
759 
760 GEN     DDF_roots(GEN pol, GEN polp, GEN p);
761 GEN     Q_divmuli_to_int(GEN x, GEN d, GEN n);
762 long    checkdeflate(GEN x);
763 void    factor_quad(GEN x, GEN res, long *ptcnt);
764 GEN     factorback_aux(GEN fa, GEN e, GEN (*_mul) (void *, GEN, GEN), GEN (*_pow) (void *, GEN, GEN), void *data);
765 GEN     matratlift(GEN M, GEN mod, GEN amax, GEN bmax, GEN denom);
766 GEN     pseudodiv(GEN x, GEN y, GEN *ptr);
767 long    s_centermod(long x, ulong pp, ulong pps2);
768 GEN     sort_vecpol_gen(GEN a, int (*cmp) (GEN, GEN));
769 GEN     sylvestermatrix_i(GEN x, GEN y);
770 
771 /* polarit3.c */
772 
773 GEN     Flm_Frobenius_pow(GEN M, long d, GEN T, ulong p);
774 GEN     Flxq_matrix_pow(GEN y, long n, long m, GEN P, ulong l);
775 GEN     FpM_Frobenius_pow(GEN M, long d, GEN T, GEN p);
776 GEN     FpXQ_sqrtl(GEN a, GEN l, GEN T, GEN p, GEN q, long e, GEN r, GEN y, GEN m);
777 GEN     FpXYQQ_pow(GEN x, GEN n, GEN S, GEN T, GEN p);
778 GEN     FpX_compositum(GEN A, GEN B, GEN p);
779 GEN     FpX_direct_compositum(GEN A, GEN B, GEN p);
780 GEN     FpX_div_by_X_x(GEN a, GEN x, GEN p, GEN *r);
781 GEN     FpX_gcd_check(GEN x, GEN y, GEN p);
782 GEN     RgX_to_FpXQX(GEN x, GEN T, GEN p);
783 GEN     Rg_to_FpXQ(GEN x, GEN T, GEN p);
784 int     ZX_incremental_CRT(GEN *ptH, GEN Hp, GEN q, GEN qp, ulong p);
785 GEN     ZX_init_CRT(GEN Hp, ulong p, long v);
786 ulong   ZY_ZXY_ResBound(GEN A, GEN B, GEN dB);
787 int     Z_incremental_CRT(GEN *H, ulong Hp, GEN q, GEN qp, ulong p);
788 GEN     ffinit_Artin_Shreier(GEN ip, long l);
789 GEN     ffinit_rand(GEN p, long n);
790 byteptr init_modular(ulong *p);
791 GEN     polint_triv(GEN xa, GEN ya);
792 
793 /* rootpol.c */
794 
795 GEN     FFT(GEN x, GEN Omega);
796 GEN     FFTinit(long k, long prec);
797 
798 /* subcyclo.c */
799 
800 GEN     bnr_to_znstar(GEN bnr, long *complex);
801 GEN     galoiscyclo(long n, long v);
802 GEN     subcyclo_complex_bound(pari_sp ltop, GEN V, long prec);
803 GEN     subcyclo_complex_roots(long n, long real, long prec);
804 GEN     subcyclo_cyclic(long n, long d, long m, long z, long g, GEN powz, GEN le);
805 GEN     subcyclo_orbits(long n, GEN H, GEN O, GEN powz, GEN le);
806 GEN     subcyclo_roots(long n, GEN zl);
807 GEN     subcyclo_start(long n, long d, long o, GEN borne, long *ptr_val, long *ptr_l);
808 GEN     znstar_bits(long n, GEN H);
809 long    znstar_conductor(long n, GEN H);
810 GEN     znstar_coset_bits(long n, GEN H, long c);
811 void    znstar_coset_bits_inplace(long n, GEN H, GEN bits, long c);
812 void    znstar_coset_func(long n, GEN H, void (*func) (void *, long), void *data, long c);
813 GEN     znstar_cosets(long n, long phi_n, GEN H);
814 GEN     znstar_elts(long n, GEN H);
815 GEN     znstar_generate(long n, GEN V);
816 GEN     znstar_hnf(GEN Z, GEN M);
817 GEN     znstar_hnf_generators(GEN Z, GEN M);
818 GEN     znstar_partial_bits(long n, GEN H, long d);
819 GEN     znstar_partial_coset_bits(long n, GEN H, long d, long c);
820 void    znstar_partial_coset_bits_inplace(long n, GEN H, GEN bits, long d, long c);
821 void    znstar_partial_coset_func(long n, GEN H, void (*func) (void *, long), void *data, long d, long c);
822 GEN     znstar_reduce_modulus(GEN H, long n);
823 
824 /* thue.c */
825 
826 GEN     bnfisintnormabs(GEN bnf, GEN a);
827 
828 /* trans1.c */
829 
830 GEN     constlog2(long prec);
831 GEN     padic_sqrt(GEN x);
832 GEN     padic_sqrtn(GEN x, GEN n, GEN *zetan);
833 GEN     padic_sqrtn_ram(GEN x, long e);
834 GEN     padic_sqrtn_unram(GEN x, GEN n, GEN *zetan);
835 void    pari_init_floats(void);
836 GEN     rootsof1complex(GEN n, long prec);
837 GEN     rootsof1padic(GEN n, GEN y);
838 
839 /* trans2.c */
840 
841 GEN     cxpsi(GEN s0, long prec);
842 double  darg(double s, double t);
843 
844 /* trans3.c */
845 
846 GEN     bernreal_using_zeta(long n, GEN iz, long prec);
847 GEN     czeta(GEN s0, long prec);
848 GEN     inv_szeta_euler(long n, double lba, long prec);
849 GEN     kbesselnew(GEN n, GEN z, long prec);
850 GEN     polylogd0(long m, GEN x, long flag, long prec);
851 GEN     twistpartialzeta(GEN p, GEN q, long f, long c, GEN va, GEN cff);
852 
853 ENDEXTERN
854