Hex Artifact Content
Not logged in

Artifact d2d88125c0bd92e8766fb44248bac7566e4b3079:


0000: 2f 2a 20 6d 70 7a 20 65 78 70 72 65 73 73 69 6f  /* mpz expressio
0010: 6e 20 65 76 61 6c 75 61 74 69 6f 6e 2c 20 73 69  n evaluation, si
0020: 6d 70 6c 65 20 70 61 72 74 20 2a 2f 0a 0a 2f 2a  mple part */../*
0030: 0a 43 6f 70 79 72 69 67 68 74 20 32 30 30 30 2c  .Copyright 2000,
0040: 20 32 30 30 31 20 46 72 65 65 20 53 6f 66 74 77   2001 Free Softw
0050: 61 72 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20  are Foundation, 
0060: 49 6e 63 2e 0a 0a 54 68 69 73 20 66 69 6c 65 20  Inc...This file 
0070: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 47  is part of the G
0080: 4e 55 20 4d 50 20 4c 69 62 72 61 72 79 2e 0a 0a  NU MP Library...
0090: 54 68 65 20 47 4e 55 20 4d 50 20 4c 69 62 72 61  The GNU MP Libra
00a0: 72 79 20 69 73 20 66 72 65 65 20 73 6f 66 74 77  ry is free softw
00b0: 61 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64  are; you can red
00c0: 69 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64  istribute it and
00d0: 2f 6f 72 20 6d 6f 64 69 66 79 0a 69 74 20 75 6e  /or modify.it un
00e0: 64 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  der the terms of
00f0: 20 74 68 65 20 47 4e 55 20 4c 65 73 73 65 72 20   the GNU Lesser 
0100: 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c  General Public L
0110: 69 63 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73  icense as publis
0120: 68 65 64 20 62 79 0a 74 68 65 20 46 72 65 65 20  hed by.the Free 
0130: 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74  Software Foundat
0140: 69 6f 6e 3b 20 65 69 74 68 65 72 20 76 65 72 73  ion; either vers
0150: 69 6f 6e 20 32 2e 31 20 6f 66 20 74 68 65 20 4c  ion 2.1 of the L
0160: 69 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79  icense, or (at y
0170: 6f 75 72 0a 6f 70 74 69 6f 6e 29 20 61 6e 79 20  our.option) any 
0180: 6c 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 0a  later version...
0190: 54 68 65 20 47 4e 55 20 4d 50 20 4c 69 62 72 61  The GNU MP Libra
01a0: 72 79 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ry is distribute
01b0: 64 20 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68  d in the hope th
01c0: 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73  at it will be us
01d0: 65 66 75 6c 2c 20 62 75 74 0a 57 49 54 48 4f 55  eful, but.WITHOU
01e0: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
01f0: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0200: 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74   implied warrant
0210: 79 20 6f 66 20 4d 45 52 43 48 41 4e 54 41 42 49  y of MERCHANTABI
0220: 4c 49 54 59 0a 6f 72 20 46 49 54 4e 45 53 53 20  LITY.or FITNESS 
0230: 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 52  FOR A PARTICULAR
0240: 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74   PURPOSE.  See t
0250: 68 65 20 47 4e 55 20 4c 65 73 73 65 72 20 47 65  he GNU Lesser Ge
0260: 6e 65 72 61 6c 20 50 75 62 6c 69 63 0a 4c 69 63  neral Public.Lic
0270: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0280: 74 61 69 6c 73 2e 0a 0a 59 6f 75 20 73 68 6f 75  tails...You shou
0290: 6c 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64  ld have received
02a0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47   a copy of the G
02b0: 4e 55 20 4c 65 73 73 65 72 20 47 65 6e 65 72 61  NU Lesser Genera
02c0: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65  l Public License
02d0: 0a 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20  .along with the 
02e0: 47 4e 55 20 4d 50 20 4c 69 62 72 61 72 79 3b 20  GNU MP Library; 
02f0: 73 65 65 20 74 68 65 20 66 69 6c 65 20 43 4f 50  see the file COP
0300: 59 49 4e 47 2e 4c 49 42 2e 20 20 49 66 20 6e 6f  YING.LIB.  If no
0310: 74 2c 20 77 72 69 74 65 20 74 6f 0a 74 68 65 20  t, write to.the 
0320: 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f  Free Software Fo
0330: 75 6e 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20  undation, Inc., 
0340: 35 39 20 54 65 6d 70 6c 65 20 50 6c 61 63 65 20  59 Temple Place 
0350: 2d 20 53 75 69 74 65 20 33 33 30 2c 20 42 6f 73  - Suite 330, Bos
0360: 74 6f 6e 2c 0a 4d 41 20 30 32 31 31 31 2d 31 33  ton,.MA 02111-13
0370: 30 37 2c 20 55 53 41 2e 0a 2a 2f 0a 0a 23 69 6e  07, USA..*/..#in
0380: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0390: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
03a0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 67 6d 70  h>.#include "gmp
03b0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 65 78  .h".#include "ex
03c0: 70 72 2d 69 6d 70 6c 2e 68 22 0a 0a 0a 2f 2a 20  pr-impl.h".../* 
03d0: 43 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 22  Change this to "
03e0: 23 64 65 66 69 6e 65 20 54 52 41 43 45 28 78 29  #define TRACE(x)
03f0: 20 78 22 20 74 6f 20 67 65 74 20 73 6f 6d 65 20   x" to get some 
0400: 74 72 61 63 65 73 2e 20 2a 2f 0a 23 64 65 66 69  traces. */.#defi
0410: 6e 65 20 54 52 41 43 45 28 78 29 0a 0a 0a 2f 2a  ne TRACE(x).../*
0420: 20 54 68 65 73 65 20 61 72 65 20 6d 61 63 72 6f   These are macro
0430: 73 2c 20 73 6f 20 6e 65 65 64 20 66 75 6e 63 74  s, so need funct
0440: 69 6f 6e 20 77 72 61 70 70 65 72 73 2e 20 2a 2f  ion wrappers. */
0450: 0a 73 74 61 74 69 63 20 69 6e 74 0a 65 5f 6d 70  .static int.e_mp
0460: 7a 5f 73 67 6e 20 28 6d 70 7a 5f 73 72 63 70 74  z_sgn (mpz_srcpt
0470: 72 20 78 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20  r x).{.  return 
0480: 6d 70 7a 5f 73 67 6e 20 28 78 29 3b 0a 7d 0a 73  mpz_sgn (x);.}.s
0490: 74 61 74 69 63 20 69 6e 74 0a 65 5f 6d 70 7a 5f  tatic int.e_mpz_
04a0: 6f 64 64 5f 70 20 28 6d 70 7a 5f 73 72 63 70 74  odd_p (mpz_srcpt
04b0: 72 20 78 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20  r x).{.  return 
04c0: 6d 70 7a 5f 6f 64 64 5f 70 20 28 78 29 3b 0a 7d  mpz_odd_p (x);.}
04d0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 65 5f 6d 70  .static int.e_mp
04e0: 7a 5f 65 76 65 6e 5f 70 20 28 6d 70 7a 5f 73 72  z_even_p (mpz_sr
04f0: 63 70 74 72 20 78 29 0a 7b 0a 20 20 72 65 74 75  cptr x).{.  retu
0500: 72 6e 20 6d 70 7a 5f 65 76 65 6e 5f 70 20 28 78  rn mpz_even_p (x
0510: 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 73 65 20 77  );.}../* These w
0520: 72 61 70 70 65 64 20 62 65 63 61 75 73 65 20 4d  rapped because M
0530: 50 45 58 50 52 5f 54 59 50 45 5f 49 5f 20 66 75  PEXPR_TYPE_I_ fu
0540: 6e 63 74 69 6f 6e 73 20 61 72 65 20 65 78 70 65  nctions are expe
0550: 63 74 65 64 20 74 6f 20 72 65 74 75 72 6e 0a 20  cted to return. 
0560: 20 20 22 69 6e 74 22 20 77 68 65 72 65 61 73 20    "int" whereas 
0570: 74 68 65 73 65 20 72 65 74 75 72 6e 20 22 75 6e  these return "un
0580: 73 69 67 6e 65 64 20 6c 6f 6e 67 22 2e 20 20 2a  signed long".  *
0590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 65 5f  /.static void.e_
05a0: 6d 70 7a 5f 68 61 6d 64 69 73 74 20 28 6d 70 7a  mpz_hamdist (mpz
05b0: 5f 70 74 72 20 77 2c 20 6d 70 7a 5f 73 72 63 70  _ptr w, mpz_srcp
05c0: 74 72 20 78 2c 20 6d 70 7a 5f 73 72 63 70 74 72  tr x, mpz_srcptr
05d0: 20 79 29 0a 7b 0a 20 20 6d 70 7a 5f 73 65 74 5f   y).{.  mpz_set_
05e0: 75 69 20 28 77 2c 20 6d 70 7a 5f 68 61 6d 64 69  ui (w, mpz_hamdi
05f0: 73 74 20 28 78 2c 20 79 29 29 3b 0a 7d 0a 73 74  st (x, y));.}.st
0600: 61 74 69 63 20 76 6f 69 64 0a 65 5f 6d 70 7a 5f  atic void.e_mpz_
0610: 70 6f 70 63 6f 75 6e 74 20 28 6d 70 7a 5f 70 74  popcount (mpz_pt
0620: 72 20 77 2c 20 6d 70 7a 5f 73 72 63 70 74 72 20  r w, mpz_srcptr 
0630: 78 29 0a 7b 0a 20 20 6d 70 7a 5f 73 65 74 5f 75  x).{.  mpz_set_u
0640: 69 20 28 77 2c 20 6d 70 7a 5f 70 6f 70 63 6f 75  i (w, mpz_popcou
0650: 6e 74 20 28 78 29 29 3b 0a 7d 0a 73 74 61 74 69  nt (x));.}.stati
0660: 63 20 76 6f 69 64 0a 65 5f 6d 70 7a 5f 73 63 61  c void.e_mpz_sca
0670: 6e 30 20 28 6d 70 7a 5f 70 74 72 20 77 2c 20 6d  n0 (mpz_ptr w, m
0680: 70 7a 5f 73 72 63 70 74 72 20 78 2c 20 75 6e 73  pz_srcptr x, uns
0690: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74  igned long start
06a0: 29 0a 7b 0a 20 20 6d 70 7a 5f 73 65 74 5f 75 69  ).{.  mpz_set_ui
06b0: 20 28 77 2c 20 6d 70 7a 5f 73 63 61 6e 30 20 28   (w, mpz_scan0 (
06c0: 78 2c 20 73 74 61 72 74 29 29 3b 0a 7d 0a 73 74  x, start));.}.st
06d0: 61 74 69 63 20 76 6f 69 64 0a 65 5f 6d 70 7a 5f  atic void.e_mpz_
06e0: 73 63 61 6e 31 20 28 6d 70 7a 5f 70 74 72 20 77  scan1 (mpz_ptr w
06f0: 2c 20 6d 70 7a 5f 73 72 63 70 74 72 20 78 2c 20  , mpz_srcptr x, 
0700: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74  unsigned long st
0710: 61 72 74 29 0a 7b 0a 20 20 6d 70 7a 5f 73 65 74  art).{.  mpz_set
0720: 5f 75 69 20 28 77 2c 20 6d 70 7a 5f 73 63 61 6e  _ui (w, mpz_scan
0730: 31 20 28 78 2c 20 73 74 61 72 74 29 29 3b 0a 7d  1 (x, start));.}
0740: 0a 0a 2f 2a 20 54 68 65 73 65 20 77 72 61 70 70  ../* These wrapp
0750: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 79 27  ed because they'
0760: 72 65 20 69 6e 2d 70 6c 61 63 65 20 77 68 65 72  re in-place wher
0770: 65 61 73 20 4d 50 45 58 50 52 5f 54 59 50 45 5f  eas MPEXPR_TYPE_
0780: 42 49 4e 41 52 59 5f 55 49 0a 20 20 20 65 78 70  BINARY_UI.   exp
0790: 65 63 74 73 20 61 20 73 65 70 61 72 61 74 65 20  ects a separate 
07a0: 73 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74 69  source and desti
07b0: 6e 61 74 69 6f 6e 2e 20 20 41 63 74 75 61 6c 6c  nation.  Actuall
07c0: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 69 6c  y the parser wil
07d0: 6c 0a 20 20 20 6e 6f 72 6d 61 6c 6c 79 20 70 61  l.   normally pa
07e0: 73 73 20 77 3d 3d 78 20 61 6e 79 77 61 79 2e 20  ss w==x anyway. 
07f0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a   */.static void.
0800: 65 5f 6d 70 7a 5f 73 65 74 62 69 74 20 28 6d 70  e_mpz_setbit (mp
0810: 7a 5f 70 74 72 20 77 2c 20 6d 70 7a 5f 73 72 63  z_ptr w, mpz_src
0820: 70 74 72 20 78 2c 20 75 6e 73 69 67 6e 65 64 20  ptr x, unsigned 
0830: 6c 6f 6e 67 20 6e 29 0a 7b 0a 20 20 69 66 20 28  long n).{.  if (
0840: 77 20 21 3d 20 78 29 0a 20 20 20 20 6d 70 7a 5f  w != x).    mpz_
0850: 73 65 74 20 28 77 2c 20 78 29 3b 0a 20 20 6d 70  set (w, x);.  mp
0860: 7a 5f 73 65 74 62 69 74 20 28 77 2c 20 6e 29 3b  z_setbit (w, n);
0870: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 65  .}.static void.e
0880: 5f 6d 70 7a 5f 63 6c 72 62 69 74 20 28 6d 70 7a  _mpz_clrbit (mpz
0890: 5f 70 74 72 20 77 2c 20 6d 70 7a 5f 73 72 63 70  _ptr w, mpz_srcp
08a0: 74 72 20 78 2c 20 75 6e 73 69 67 6e 65 64 20 6c  tr x, unsigned l
08b0: 6f 6e 67 20 6e 29 0a 7b 0a 20 20 69 66 20 28 77  ong n).{.  if (w
08c0: 20 21 3d 20 78 29 0a 20 20 20 20 6d 70 7a 5f 73   != x).    mpz_s
08d0: 65 74 20 28 77 2c 20 78 29 3b 0a 20 20 6d 70 7a  et (w, x);.  mpz
08e0: 5f 63 6c 72 62 69 74 20 28 77 2c 20 6e 29 3b 0a  _clrbit (w, n);.
08f0: 7d 0a 0a 73 74 61 74 69 63 20 5f 5f 67 6d 70 5f  }..static __gmp_
0900: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 6d 70 65  const struct mpe
0910: 78 70 72 5f 6f 70 65 72 61 74 6f 72 5f 74 20 20  xpr_operator_t  
0920: 5f 6d 70 7a 5f 65 78 70 72 5f 73 74 61 6e 64 61  _mpz_expr_standa
0930: 72 64 5f 74 61 62 6c 65 5b 5d 20 3d 20 7b 0a 0a  rd_table[] = {..
0940: 20 20 7b 20 22 2a 2a 22 2c 20 20 28 6d 70 65 78    { "**",  (mpex
0950: 70 72 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f 70 6f  pr_fun_t) mpz_po
0960: 77 5f 75 69 2c 0a 20 20 20 20 4d 50 45 58 50 52  w_ui,.    MPEXPR
0970: 5f 54 59 50 45 5f 42 49 4e 41 52 59 5f 55 49 20  _TYPE_BINARY_UI 
0980: 7c 20 4d 50 45 58 50 52 5f 54 59 50 45 5f 52 49  | MPEXPR_TYPE_RI
0990: 47 48 54 41 53 53 4f 43 2c 20 20 20 20 20 20 20  GHTASSOC,       
09a0: 20 20 20 20 20 20 20 20 20 20 20 32 32 30 20 7d             220 }
09b0: 2c 0a 20 20 0a 20 20 7b 20 22 7e 22 2c 20 20 20  ,.  .  { "~",   
09c0: 28 6d 70 65 78 70 72 5f 66 75 6e 5f 74 29 20 6d  (mpexpr_fun_t) m
09d0: 70 7a 5f 63 6f 6d 2c 20 0a 20 20 20 20 4d 50 45  pz_com, .    MPE
09e0: 58 50 52 5f 54 59 50 45 5f 55 4e 41 52 59 20 7c  XPR_TYPE_UNARY |
09f0: 20 4d 50 45 58 50 52 5f 54 59 50 45 5f 50 52 45   MPEXPR_TYPE_PRE
0a00: 46 49 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  FIX,            
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 31                21
0a20: 30 20 7d 2c 0a 20 20 7b 20 22 21 22 2c 20 20 20  0 },.  { "!",   
0a30: 28 6d 70 65 78 70 72 5f 66 75 6e 5f 74 29 20 65  (mpexpr_fun_t) e
0a40: 5f 6d 70 7a 5f 73 67 6e 2c 0a 20 20 20 20 4d 50  _mpz_sgn,.    MP
0a50: 45 58 50 52 5f 54 59 50 45 5f 4c 4f 47 49 43 41  EXPR_TYPE_LOGICA
0a60: 4c 5f 4e 4f 54 20 7c 20 4d 50 45 58 50 52 5f 54  L_NOT | MPEXPR_T
0a70: 59 50 45 5f 50 52 45 46 49 58 2c 20 20 20 20 20  YPE_PREFIX,     
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
0a90: 31 30 20 7d 2c 0a 20 20 7b 20 22 2d 22 2c 20 20  10 },.  { "-",  
0aa0: 20 28 6d 70 65 78 70 72 5f 66 75 6e 5f 74 29 20   (mpexpr_fun_t) 
0ab0: 6d 70 7a 5f 6e 65 67 2c 0a 20 20 20 20 4d 50 45  mpz_neg,.    MPE
0ac0: 58 50 52 5f 54 59 50 45 5f 55 4e 41 52 59 20 7c  XPR_TYPE_UNARY |
0ad0: 20 4d 50 45 58 50 52 5f 54 59 50 45 5f 50 52 45   MPEXPR_TYPE_PRE
0ae0: 46 49 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  FIX,            
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 31                21
0b00: 30 20 7d 2c 0a 0a 20 20 7b 20 22 2a 22 2c 20 20  0 },..  { "*",  
0b10: 20 28 6d 70 65 78 70 72 5f 66 75 6e 5f 74 29 20   (mpexpr_fun_t) 
0b20: 6d 70 7a 5f 6d 75 6c 2c 20 20 20 20 20 20 20 20  mpz_mul,        
0b30: 20 20 4d 50 45 58 50 52 5f 54 59 50 45 5f 42 49    MPEXPR_TYPE_BI
0b40: 4e 41 52 59 2c 20 20 20 20 20 20 32 30 30 20 7d  NARY,      200 }
0b50: 2c 0a 20 20 7b 20 22 2f 22 2c 20 20 20 28 6d 70  ,.  { "/",   (mp
0b60: 65 78 70 72 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f  expr_fun_t) mpz_
0b70: 74 64 69 76 5f 71 2c 20 20 20 20 20 20 20 4d 50  tdiv_q,       MP
0b80: 45 58 50 52 5f 54 59 50 45 5f 42 49 4e 41 52 59  EXPR_TYPE_BINARY
0b90: 2c 20 20 20 20 20 20 32 30 30 20 7d 2c 0a 20 20  ,      200 },.  
0ba0: 7b 20 22 25 22 2c 20 20 20 28 6d 70 65 78 70 72  { "%",   (mpexpr
0bb0: 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f 74 64 69 76  _fun_t) mpz_tdiv
0bc0: 5f 72 2c 20 20 20 20 20 20 20 4d 50 45 58 50 52  _r,       MPEXPR
0bd0: 5f 54 59 50 45 5f 42 49 4e 41 52 59 2c 20 20 20  _TYPE_BINARY,   
0be0: 20 20 20 32 30 30 20 7d 2c 0a 0a 20 20 7b 20 22     200 },..  { "
0bf0: 2b 22 2c 20 20 20 28 6d 70 65 78 70 72 5f 66 75  +",   (mpexpr_fu
0c00: 6e 5f 74 29 20 6d 70 7a 5f 61 64 64 2c 20 20 20  n_t) mpz_add,   
0c10: 20 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54 59         MPEXPR_TY
0c20: 50 45 5f 42 49 4e 41 52 59 2c 20 20 20 20 20 20  PE_BINARY,      
0c30: 31 39 30 20 7d 2c 0a 20 20 7b 20 22 2d 22 2c 20  190 },.  { "-", 
0c40: 20 20 28 6d 70 65 78 70 72 5f 66 75 6e 5f 74 29    (mpexpr_fun_t)
0c50: 20 6d 70 7a 5f 73 75 62 2c 20 20 20 20 20 20 20   mpz_sub,       
0c60: 20 20 20 4d 50 45 58 50 52 5f 54 59 50 45 5f 42     MPEXPR_TYPE_B
0c70: 49 4e 41 52 59 2c 20 20 20 20 20 20 31 39 30 20  INARY,      190 
0c80: 7d 2c 0a 0a 20 20 7b 20 22 3c 3c 22 2c 20 20 28  },..  { "<<",  (
0c90: 6d 70 65 78 70 72 5f 66 75 6e 5f 74 29 20 6d 70  mpexpr_fun_t) mp
0ca0: 7a 5f 6d 75 6c 5f 32 65 78 70 2c 20 20 20 20 20  z_mul_2exp,     
0cb0: 4d 50 45 58 50 52 5f 54 59 50 45 5f 42 49 4e 41  MPEXPR_TYPE_BINA
0cc0: 52 59 5f 55 49 2c 20 20 20 31 38 30 20 7d 2c 0a  RY_UI,   180 },.
0cd0: 20 20 7b 20 22 3e 3e 22 2c 20 20 28 6d 70 65 78    { ">>",  (mpex
0ce0: 70 72 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f 74 64  pr_fun_t) mpz_td
0cf0: 69 76 5f 71 5f 32 65 78 70 2c 20 20 4d 50 45 58  iv_q_2exp,  MPEX
0d00: 50 52 5f 54 59 50 45 5f 42 49 4e 41 52 59 5f 55  PR_TYPE_BINARY_U
0d10: 49 2c 20 20 20 31 38 30 20 7d 2c 0a 0a 20 20 7b  I,   180 },..  {
0d20: 20 22 3c 3d 22 2c 20 20 28 6d 70 65 78 70 72 5f   "<=",  (mpexpr_
0d30: 66 75 6e 5f 74 29 20 6d 70 7a 5f 63 6d 70 2c 20  fun_t) mpz_cmp, 
0d40: 20 20 20 20 20 20 20 20 20 4d 50 45 58 50 52 5f           MPEXPR_
0d50: 54 59 50 45 5f 43 4d 50 5f 4c 45 2c 20 20 20 20  TYPE_CMP_LE,    
0d60: 20 20 31 37 30 20 7d 2c 0a 20 20 7b 20 22 3c 22    170 },.  { "<"
0d70: 2c 20 20 20 28 6d 70 65 78 70 72 5f 66 75 6e 5f  ,   (mpexpr_fun_
0d80: 74 29 20 6d 70 7a 5f 63 6d 70 2c 20 20 20 20 20  t) mpz_cmp,     
0d90: 20 20 20 20 20 4d 50 45 58 50 52 5f 54 59 50 45       MPEXPR_TYPE
0da0: 5f 43 4d 50 5f 4c 54 2c 20 20 20 20 20 20 31 37  _CMP_LT,      17
0db0: 30 20 7d 2c 0a 20 20 7b 20 22 3e 3d 22 2c 20 20  0 },.  { ">=",  
0dc0: 28 6d 70 65 78 70 72 5f 66 75 6e 5f 74 29 20 6d  (mpexpr_fun_t) m
0dd0: 70 7a 5f 63 6d 70 2c 20 20 20 20 20 20 20 20 20  pz_cmp,         
0de0: 20 4d 50 45 58 50 52 5f 54 59 50 45 5f 43 4d 50   MPEXPR_TYPE_CMP
0df0: 5f 47 45 2c 20 20 20 20 20 20 31 37 30 20 7d 2c  _GE,      170 },
0e00: 0a 20 20 7b 20 22 3e 22 2c 20 20 20 28 6d 70 65  .  { ">",   (mpe
0e10: 78 70 72 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f 63  xpr_fun_t) mpz_c
0e20: 6d 70 2c 20 20 20 20 20 20 20 20 20 20 4d 50 45  mp,          MPE
0e30: 58 50 52 5f 54 59 50 45 5f 43 4d 50 5f 47 54 2c  XPR_TYPE_CMP_GT,
0e40: 20 20 20 20 20 20 31 37 30 20 7d 2c 0a 0a 20 20        170 },..  
0e50: 7b 20 22 3d 3d 22 2c 20 20 28 6d 70 65 78 70 72  { "==",  (mpexpr
0e60: 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f 63 6d 70 2c  _fun_t) mpz_cmp,
0e70: 20 20 20 20 20 20 20 20 20 20 4d 50 45 58 50 52            MPEXPR
0e80: 5f 54 59 50 45 5f 43 4d 50 5f 45 51 2c 20 20 20  _TYPE_CMP_EQ,   
0e90: 20 20 20 31 36 30 20 7d 2c 0a 20 20 7b 20 22 21     160 },.  { "!
0ea0: 3d 22 2c 20 20 28 6d 70 65 78 70 72 5f 66 75 6e  =",  (mpexpr_fun
0eb0: 5f 74 29 20 6d 70 7a 5f 63 6d 70 2c 20 20 20 20  _t) mpz_cmp,    
0ec0: 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54 59 50        MPEXPR_TYP
0ed0: 45 5f 43 4d 50 5f 4e 45 2c 20 20 20 20 20 20 31  E_CMP_NE,      1
0ee0: 36 30 20 7d 2c 0a 0a 20 20 7b 20 22 26 22 2c 20  60 },..  { "&", 
0ef0: 20 20 28 6d 70 65 78 70 72 5f 66 75 6e 5f 74 29    (mpexpr_fun_t)
0f00: 20 6d 70 7a 5f 61 6e 64 2c 20 20 20 20 20 20 20   mpz_and,       
0f10: 20 20 20 4d 50 45 58 50 52 5f 54 59 50 45 5f 42     MPEXPR_TYPE_B
0f20: 49 4e 41 52 59 2c 20 20 20 20 20 20 31 35 30 20  INARY,      150 
0f30: 7d 2c 0a 20 20 7b 20 22 5e 22 2c 20 20 20 28 6d  },.  { "^",   (m
0f40: 70 65 78 70 72 5f 66 75 6e 5f 74 29 20 6d 70 7a  pexpr_fun_t) mpz
0f50: 5f 78 6f 72 2c 20 20 20 20 20 20 20 20 20 20 4d  _xor,          M
0f60: 50 45 58 50 52 5f 54 59 50 45 5f 42 49 4e 41 52  PEXPR_TYPE_BINAR
0f70: 59 2c 20 20 20 20 20 20 31 34 30 20 7d 2c 0a 20  Y,      140 },. 
0f80: 20 7b 20 22 7c 22 2c 20 20 20 28 6d 70 65 78 70   { "|",   (mpexp
0f90: 72 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f 69 6f 72  r_fun_t) mpz_ior
0fa0: 2c 20 20 20 20 20 20 20 20 20 20 4d 50 45 58 50  ,          MPEXP
0fb0: 52 5f 54 59 50 45 5f 42 49 4e 41 52 59 2c 20 20  R_TYPE_BINARY,  
0fc0: 20 20 20 20 31 33 30 20 7d 2c 0a 20 20 7b 20 22      130 },.  { "
0fd0: 26 26 22 2c 20 20 28 6d 70 65 78 70 72 5f 66 75  &&",  (mpexpr_fu
0fe0: 6e 5f 74 29 20 65 5f 6d 70 7a 5f 73 67 6e 2c 20  n_t) e_mpz_sgn, 
0ff0: 4d 50 45 58 50 52 5f 54 59 50 45 5f 4c 4f 47 49  MPEXPR_TYPE_LOGI
1000: 43 41 4c 5f 41 4e 44 2c 20 31 32 30 20 7d 2c 0a  CAL_AND, 120 },.
1010: 20 20 7b 20 22 7c 7c 22 2c 20 20 28 6d 70 65 78    { "||",  (mpex
1020: 70 72 5f 66 75 6e 5f 74 29 20 65 5f 6d 70 7a 5f  pr_fun_t) e_mpz_
1030: 73 67 6e 2c 20 4d 50 45 58 50 52 5f 54 59 50 45  sgn, MPEXPR_TYPE
1040: 5f 4c 4f 47 49 43 41 4c 5f 4f 52 2c 20 20 31 31  _LOGICAL_OR,  11
1050: 30 20 7d 2c 0a 0a 20 20 7b 20 22 3a 22 2c 20 20  0 },..  { ":",  
1060: 20 4e 55 4c 4c 2c 20 20 20 20 20 20 20 20 20 20   NULL,          
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 20 20 4d 50 45 58 50 52 5f 54 59 50 45 5f 43 4f    MPEXPR_TYPE_CO
1090: 4c 4f 4e 2c 20 20 20 20 20 20 20 31 30 31 20 7d  LON,       101 }
10a0: 2c 0a 20 20 7b 20 22 3f 22 2c 20 20 20 28 6d 70  ,.  { "?",   (mp
10b0: 65 78 70 72 5f 66 75 6e 5f 74 29 20 65 5f 6d 70  expr_fun_t) e_mp
10c0: 7a 5f 73 67 6e 2c 20 4d 50 45 58 50 52 5f 54 59  z_sgn, MPEXPR_TY
10d0: 50 45 5f 51 55 45 53 54 49 4f 4e 2c 20 20 20 20  PE_QUESTION,    
10e0: 31 30 30 20 7d 2c 0a 0a 20 20 7b 20 22 29 22 2c  100 },..  { ")",
10f0: 20 20 20 4e 55 4c 4c 2c 20 20 20 20 20 20 20 20     NULL,        
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 20 4d 50 45 58 50 52 5f 54 59 50 45 5f      MPEXPR_TYPE_
1120: 43 4c 4f 53 45 50 41 52 45 4e 2c 20 20 20 34 20  CLOSEPAREN,   4 
1130: 7d 2c 0a 20 20 7b 20 22 28 22 2c 20 20 20 4e 55  },.  { "(",   NU
1140: 4c 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  LL,             
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
1160: 50 45 58 50 52 5f 54 59 50 45 5f 4f 50 45 4e 50  PEXPR_TYPE_OPENP
1170: 41 52 45 4e 2c 20 20 20 20 33 20 7d 2c 0a 20 20  AREN,    3 },.  
1180: 7b 20 22 2c 22 2c 20 20 20 4e 55 4c 4c 2c 20 20  { ",",   NULL,  
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 20 20 20 20 20 20 20 20 4d 50 45 58 50 52            MPEXPR
11b0: 5f 54 59 50 45 5f 41 52 47 53 45 50 2c 20 20 20  _TYPE_ARGSEP,   
11c0: 20 20 20 20 32 20 7d 2c 0a 20 20 7b 20 22 24 22      2 },.  { "$"
11d0: 2c 20 20 20 4e 55 4c 4c 2c 20 20 20 20 20 20 20  ,   NULL,       
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 20 20 20 20 4d 50 45 58 50 52 5f 54 59 50 45       MPEXPR_TYPE
1200: 5f 56 41 52 49 41 42 4c 45 2c 20 20 20 20 20 31  _VARIABLE,     1
1210: 20 7d 2c 0a 0a 20 20 7b 20 22 61 62 73 22 2c 20   },..  { "abs", 
1220: 20 20 20 20 20 20 28 6d 70 65 78 70 72 5f 66 75        (mpexpr_fu
1230: 6e 5f 74 29 20 6d 70 7a 5f 61 62 73 2c 20 20 20  n_t) mpz_abs,   
1240: 20 20 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54          MPEXPR_T
1250: 59 50 45 5f 55 4e 41 52 59 20 20 20 20 20 20 20  YPE_UNARY       
1260: 20 20 7d 2c 0a 20 20 7b 20 22 62 69 6e 22 2c 20    },.  { "bin", 
1270: 20 20 20 20 20 20 28 6d 70 65 78 70 72 5f 66 75        (mpexpr_fu
1280: 6e 5f 74 29 20 6d 70 7a 5f 62 69 6e 5f 75 69 2c  n_t) mpz_bin_ui,
1290: 20 20 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54          MPEXPR_T
12a0: 59 50 45 5f 42 49 4e 41 52 59 5f 55 49 20 20 20  YPE_BINARY_UI   
12b0: 20 20 7d 2c 0a 20 20 7b 20 22 63 6c 72 62 69 74    },.  { "clrbit
12c0: 22 2c 20 20 20 20 28 6d 70 65 78 70 72 5f 66 75  ",    (mpexpr_fu
12d0: 6e 5f 74 29 20 65 5f 6d 70 7a 5f 63 6c 72 62 69  n_t) e_mpz_clrbi
12e0: 74 2c 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54  t,      MPEXPR_T
12f0: 59 50 45 5f 42 49 4e 41 52 59 5f 55 49 20 20 20  YPE_BINARY_UI   
1300: 20 20 7d 2c 0a 20 20 7b 20 22 63 6d 70 22 2c 20    },.  { "cmp", 
1310: 20 20 20 20 20 20 28 6d 70 65 78 70 72 5f 66 75        (mpexpr_fu
1320: 6e 5f 74 29 20 6d 70 7a 5f 63 6d 70 2c 20 20 20  n_t) mpz_cmp,   
1330: 20 20 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54          MPEXPR_T
1340: 59 50 45 5f 49 5f 42 49 4e 41 52 59 20 20 20 20  YPE_I_BINARY    
1350: 20 20 7d 2c 0a 20 20 7b 20 22 63 6d 70 61 62 73    },.  { "cmpabs
1360: 22 2c 20 20 20 20 28 6d 70 65 78 70 72 5f 66 75  ",    (mpexpr_fu
1370: 6e 5f 74 29 20 6d 70 7a 5f 63 6d 70 61 62 73 2c  n_t) mpz_cmpabs,
1380: 20 20 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54          MPEXPR_T
1390: 59 50 45 5f 49 5f 42 49 4e 41 52 59 20 20 20 20  YPE_I_BINARY    
13a0: 20 20 7d 2c 0a 20 20 7b 20 22 63 6f 6e 67 72 75    },.  { "congru
13b0: 65 6e 74 5f 70 22 2c 28 6d 70 65 78 70 72 5f 66  ent_p",(mpexpr_f
13c0: 75 6e 5f 74 29 6d 70 7a 5f 63 6f 6e 67 72 75 65  un_t)mpz_congrue
13d0: 6e 74 5f 70 2c 20 20 20 4d 50 45 58 50 52 5f 54  nt_p,   MPEXPR_T
13e0: 59 50 45 5f 49 5f 54 45 52 4e 41 52 59 20 20 20  YPE_I_TERNARY   
13f0: 20 20 7d 2c 0a 20 20 7b 20 22 64 69 76 69 73 69    },.  { "divisi
1400: 62 6c 65 5f 70 22 2c 28 6d 70 65 78 70 72 5f 66  ble_p",(mpexpr_f
1410: 75 6e 5f 74 29 6d 70 7a 5f 64 69 76 69 73 69 62  un_t)mpz_divisib
1420: 6c 65 5f 70 2c 20 20 20 4d 50 45 58 50 52 5f 54  le_p,   MPEXPR_T
1430: 59 50 45 5f 49 5f 42 49 4e 41 52 59 20 20 20 20  YPE_I_BINARY    
1440: 20 20 7d 2c 0a 20 20 7b 20 22 65 76 65 6e 5f 70    },.  { "even_p
1450: 22 2c 20 20 20 20 28 6d 70 65 78 70 72 5f 66 75  ",    (mpexpr_fu
1460: 6e 5f 74 29 20 65 5f 6d 70 7a 5f 65 76 65 6e 5f  n_t) e_mpz_even_
1470: 70 2c 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54  p,      MPEXPR_T
1480: 59 50 45 5f 49 5f 55 4e 41 52 59 20 20 20 20 20  YPE_I_UNARY     
1490: 20 20 7d 2c 0a 20 20 7b 20 22 66 69 62 22 2c 20    },.  { "fib", 
14a0: 20 20 20 20 20 20 28 6d 70 65 78 70 72 5f 66 75        (mpexpr_fu
14b0: 6e 5f 74 29 20 6d 70 7a 5f 66 69 62 5f 75 69 2c  n_t) mpz_fib_ui,
14c0: 20 20 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54          MPEXPR_T
14d0: 59 50 45 5f 55 4e 41 52 59 5f 55 49 20 20 20 20  YPE_UNARY_UI    
14e0: 20 20 7d 2c 0a 20 20 7b 20 22 66 61 63 22 2c 20    },.  { "fac", 
14f0: 20 20 20 20 20 20 28 6d 70 65 78 70 72 5f 66 75        (mpexpr_fu
1500: 6e 5f 74 29 20 6d 70 7a 5f 66 61 63 5f 75 69 2c  n_t) mpz_fac_ui,
1510: 20 20 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54          MPEXPR_T
1520: 59 50 45 5f 55 4e 41 52 59 5f 55 49 20 20 20 20  YPE_UNARY_UI    
1530: 20 20 7d 2c 0a 20 20 7b 20 22 67 63 64 22 2c 20    },.  { "gcd", 
1540: 20 20 20 20 20 20 28 6d 70 65 78 70 72 5f 66 75        (mpexpr_fu
1550: 6e 5f 74 29 20 6d 70 7a 5f 67 63 64 2c 20 20 20  n_t) mpz_gcd,   
1560: 20 20 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54          MPEXPR_T
1570: 59 50 45 5f 42 49 4e 41 52 59 0a 20 20 20 20 20  YPE_BINARY.     
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
15b0: 4d 50 45 58 50 52 5f 54 59 50 45 5f 50 41 49 52  MPEXPR_TYPE_PAIR
15c0: 57 49 53 45 20 20 20 20 7d 2c 0a 20 20 7b 20 22  WISE    },.  { "
15d0: 68 61 6d 64 69 73 74 22 2c 20 20 20 28 6d 70 65  hamdist",   (mpe
15e0: 78 70 72 5f 66 75 6e 5f 74 29 20 65 5f 6d 70 7a  xpr_fun_t) e_mpz
15f0: 5f 68 61 6d 64 69 73 74 2c 20 20 20 20 20 4d 50  _hamdist,     MP
1600: 45 58 50 52 5f 54 59 50 45 5f 42 49 4e 41 52 59  EXPR_TYPE_BINARY
1610: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
1620: 69 6e 76 65 72 74 22 2c 20 20 20 20 28 6d 70 65  invert",    (mpe
1630: 78 70 72 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f 69  xpr_fun_t) mpz_i
1640: 6e 76 65 72 74 2c 20 20 20 20 20 20 20 20 4d 50  nvert,        MP
1650: 45 58 50 52 5f 54 59 50 45 5f 42 49 4e 41 52 59  EXPR_TYPE_BINARY
1660: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
1670: 6a 61 63 6f 62 69 22 2c 20 20 20 20 28 6d 70 65  jacobi",    (mpe
1680: 78 70 72 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f 6a  xpr_fun_t) mpz_j
1690: 61 63 6f 62 69 2c 20 20 20 20 20 20 20 20 4d 50  acobi,        MP
16a0: 45 58 50 52 5f 54 59 50 45 5f 49 5f 42 49 4e 41  EXPR_TYPE_I_BINA
16b0: 52 59 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22  RY      },.  { "
16c0: 6b 72 6f 6e 65 63 6b 65 72 22 2c 20 28 6d 70 65  kronecker", (mpe
16d0: 78 70 72 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f 6b  xpr_fun_t) mpz_k
16e0: 72 6f 6e 65 63 6b 65 72 2c 20 20 20 20 20 4d 50  ronecker,     MP
16f0: 45 58 50 52 5f 54 59 50 45 5f 49 5f 42 49 4e 41  EXPR_TYPE_I_BINA
1700: 52 59 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22  RY      },.  { "
1710: 6c 63 6d 22 2c 20 20 20 20 20 20 20 28 6d 70 65  lcm",       (mpe
1720: 78 70 72 5f 66 75 6e 5f 74 29 20 6d 70 7a 5f 6c  xpr_fun_t) mpz_l
1730: 63 6d 2c 20 20 20 20 20 20 20 20 20 20 20 4d 50  cm,           MP
1740: 45 58 50 52 5f 54 59 50 45 5f 42 49 4e 41 52 59  EXPR_TYPE_BINARY
1750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 20 20 20 7c 20 4d 50 45 58 50 52 5f 54 59 50      | MPEXPR_TYP
1790: 45 5f 50 41 49 52 57 49 53 45 20 20 20 20 7d 2c  E_PAIRWISE    },
17a0: 0a 20 20 7b 20 22 6c 75 63 6e 75 6d 22 2c 20 20  .  { "lucnum",  
17b0: 20 20 28 6d 70 65 78 70 72 5f 66 75 6e 5f 74 29    (mpexpr_fun_t)
17c0: 20 6d 70 7a 5f 6c 75 63 6e 75 6d 5f 75 69 2c 20   mpz_lucnum_ui, 
17d0: 20 20 20 20 4d 50 45 58 50 52 5f 54 59 50 45 5f      MPEXPR_TYPE_
17e0: 55 4e 41 52 59 5f 55 49 20 20 20 20 20 20 7d 2c  UNARY_UI      },
17f0: 0a 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 20  .  { "max",     
1800: 20 20 28 6d 70 65 78 70 72 5f 66 75 6e 5f 74 29    (mpexpr_fun_t)
1810: 20 6d 70 7a 5f 63 6d 70 2c 20 20 20 20 20 20 20   mpz_cmp,       
1820: 20 20 20 20 4d 50 45 58 50 52 5f 54 59 50 45 5f      MPEXPR_TYPE_
1830: 4d 41 58 0a 20 20 20 20 20 20 20 20 20 20 20 20  MAX.            
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 20 20 20 20 7c 20 4d 50 45 58 50 52 5f         | MPEXPR_
1870: 54 59 50 45 5f 50 41 49 52 57 49 53 45 20 20 20  TYPE_PAIRWISE   
1880: 20 7d 2c 0a 20 20 7b 20 22 6d 69 6e 22 2c 20 20   },.  { "min",  
1890: 20 20 20 20 20 28 6d 70 65 78 70 72 5f 66 75 6e       (mpexpr_fun
18a0: 5f 74 29 20 6d 70 7a 5f 63 6d 70 2c 20 20 20 20  _t) mpz_cmp,    
18b0: 20 20 20 20 20 20 20 4d 50 45 58 50 52 5f 54 59         MPEXPR_TY
18c0: 50 45 5f 4d 49 4e 0a 20 20 20 20 20 20 20 20 20  PE_MIN.         
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 7c 20 4d 50 45 58            | MPEX
1900: 50 52 5f 54 59 50 45 5f 50 41 49 52 57 49 53 45  PR_TYPE_PAIRWISE
1910: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6e 65 78 74      },.  { "next
1920: 70 72 69 6d 65 22 2c 20 28 6d 70 65 78 70 72 5f  prime", (mpexpr_
1930: 66 75 6e 5f 74 29 20 6d 70 7a 5f 6e 65 78 74 70  fun_t) mpz_nextp
1940: 72 69 6d 65 2c 20 20 20 20 20 4d 50 45 58 50 52  rime,     MPEXPR
1950: 5f 54 59 50 45 5f 55 4e 41 52 59 20 20 20 20 20  _TYPE_UNARY     
1960: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6f 64 64 5f      },.  { "odd_
1970: 70 22 2c 20 20 20 20 20 28 6d 70 65 78 70 72 5f  p",     (mpexpr_
1980: 66 75 6e 5f 74 29 20 65 5f 6d 70 7a 5f 6f 64 64  fun_t) e_mpz_odd
1990: 5f 70 2c 20 20 20 20 20 20 20 4d 50 45 58 50 52  _p,       MPEXPR
19a0: 5f 54 59 50 45 5f 49 5f 55 4e 41 52 59 20 20 20  _TYPE_I_UNARY   
19b0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 70 65 72 66      },.  { "perf
19c0: 65 63 74 5f 70 6f 77 65 72 5f 70 22 2c 20 28 6d  ect_power_p", (m
19d0: 70 65 78 70 72 5f 66 75 6e 5f 74 29 6d 70 7a 5f  pexpr_fun_t)mpz_
19e0: 70 65 72 66 65 63 74 5f 70 6f 77 65 72 5f 70 2c  perfect_power_p,
19f0: 20 4d 50 45 58 50 52 5f 54 59 50 45 5f 49 5f 55   MPEXPR_TYPE_I_U
1a00: 4e 41 52 59 7d 2c 0a 20 20 7b 20 22 70 65 72 66  NARY},.  { "perf
1a10: 65 63 74 5f 73 71 75 61 72 65 5f 70 22 2c 28 6d  ect_square_p",(m
1a20: 70 65 78 70 72 5f 66 75 6e 5f 74 29 6d 70 7a 5f  pexpr_fun_t)mpz_
1a30: 70 65 72 66 65 63 74 5f 73 71 75 61 72 65 5f 70  perfect_square_p
1a40: 2c 4d 50 45 58 50 52 5f 54 59 50 45 5f 49 5f 55  ,MPEXPR_TYPE_I_U
1a50: 4e 41 52 59 7d 2c 0a 20 20 7b 20 22 70 6f 70 63  NARY},.  { "popc
1a60: 6f 75 6e 74 22 2c 20 20 28 6d 70 65 78 70 72 5f  ount",  (mpexpr_
1a70: 66 75 6e 5f 74 29 20 65 5f 6d 70 7a 5f 70 6f 70  fun_t) e_mpz_pop
1a80: 63 6f 75 6e 74 2c 20 20 20 20 4d 50 45 58 50 52  count,    MPEXPR
1a90: 5f 54 59 50 45 5f 55 4e 41 52 59 20 20 20 20 20  _TYPE_UNARY     
1aa0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 70 6f 77 6d      },.  { "powm
1ab0: 22 2c 20 20 20 20 20 20 28 6d 70 65 78 70 72 5f  ",      (mpexpr_
1ac0: 66 75 6e 5f 74 29 20 6d 70 7a 5f 70 6f 77 6d 2c  fun_t) mpz_powm,
1ad0: 20 20 20 20 20 20 20 20 20 20 4d 50 45 58 50 52            MPEXPR
1ae0: 5f 54 59 50 45 5f 54 45 52 4e 41 52 59 20 20 20  _TYPE_TERNARY   
1af0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 70 72 6f 62      },.  { "prob
1b00: 61 62 5f 70 72 69 6d 65 5f 70 22 2c 20 20 28 6d  ab_prime_p",  (m
1b10: 70 65 78 70 72 5f 66 75 6e 5f 74 29 6d 70 7a 5f  pexpr_fun_t)mpz_
1b20: 70 72 6f 62 61 62 5f 70 72 69 6d 65 5f 70 2c 20  probab_prime_p, 
1b30: 20 4d 50 45 58 50 52 5f 54 59 50 45 5f 49 5f 55   MPEXPR_TYPE_I_U
1b40: 4e 41 52 59 7d 2c 0a 20 20 7b 20 22 72 6f 6f 74  NARY},.  { "root
1b50: 22 2c 20 20 20 20 20 20 28 6d 70 65 78 70 72 5f  ",      (mpexpr_
1b60: 66 75 6e 5f 74 29 20 6d 70 7a 5f 72 6f 6f 74 2c  fun_t) mpz_root,
1b70: 20 20 20 20 20 20 20 20 20 20 4d 50 45 58 50 52            MPEXPR
1b80: 5f 54 59 50 45 5f 42 49 4e 41 52 59 5f 55 49 20  _TYPE_BINARY_UI 
1b90: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 63 61 6e      },.  { "scan
1ba0: 30 22 2c 20 20 20 20 20 28 6d 70 65 78 70 72 5f  0",     (mpexpr_
1bb0: 66 75 6e 5f 74 29 20 65 5f 6d 70 7a 5f 73 63 61  fun_t) e_mpz_sca
1bc0: 6e 30 2c 20 20 20 20 20 20 20 4d 50 45 58 50 52  n0,       MPEXPR
1bd0: 5f 54 59 50 45 5f 42 49 4e 41 52 59 5f 55 49 20  _TYPE_BINARY_UI 
1be0: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 63 61 6e      },.  { "scan
1bf0: 31 22 2c 20 20 20 20 20 28 6d 70 65 78 70 72 5f  1",     (mpexpr_
1c00: 66 75 6e 5f 74 29 20 65 5f 6d 70 7a 5f 73 63 61  fun_t) e_mpz_sca
1c10: 6e 31 2c 20 20 20 20 20 20 20 4d 50 45 58 50 52  n1,       MPEXPR
1c20: 5f 54 59 50 45 5f 42 49 4e 41 52 59 5f 55 49 20  _TYPE_BINARY_UI 
1c30: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 65 74 62      },.  { "setb
1c40: 69 74 22 2c 20 20 20 20 28 6d 70 65 78 70 72 5f  it",    (mpexpr_
1c50: 66 75 6e 5f 74 29 20 65 5f 6d 70 7a 5f 73 65 74  fun_t) e_mpz_set
1c60: 62 69 74 2c 20 20 20 20 20 20 4d 50 45 58 50 52  bit,      MPEXPR
1c70: 5f 54 59 50 45 5f 42 49 4e 41 52 59 5f 55 49 20  _TYPE_BINARY_UI 
1c80: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 74 73 74 62      },.  { "tstb
1c90: 69 74 22 2c 20 20 20 20 28 6d 70 65 78 70 72 5f  it",    (mpexpr_
1ca0: 66 75 6e 5f 74 29 20 6d 70 7a 5f 74 73 74 62 69  fun_t) mpz_tstbi
1cb0: 74 2c 20 20 20 20 20 20 20 20 4d 50 45 58 50 52  t,        MPEXPR
1cc0: 5f 54 59 50 45 5f 49 5f 42 49 4e 41 52 59 5f 55  _TYPE_I_BINARY_U
1cd0: 49 20 20 20 7d 2c 0a 20 20 7b 20 22 73 67 6e 22  I   },.  { "sgn"
1ce0: 2c 20 20 20 20 20 20 20 28 6d 70 65 78 70 72 5f  ,       (mpexpr_
1cf0: 66 75 6e 5f 74 29 20 65 5f 6d 70 7a 5f 73 67 6e  fun_t) e_mpz_sgn
1d00: 2c 20 20 20 20 20 20 20 20 20 4d 50 45 58 50 52  ,         MPEXPR
1d10: 5f 54 59 50 45 5f 49 5f 55 4e 41 52 59 20 20 20  _TYPE_I_UNARY   
1d20: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 71 72 74      },.  { "sqrt
1d30: 22 2c 20 20 20 20 20 20 28 6d 70 65 78 70 72 5f  ",      (mpexpr_
1d40: 66 75 6e 5f 74 29 20 6d 70 7a 5f 73 71 72 74 2c  fun_t) mpz_sqrt,
1d50: 20 20 20 20 20 20 20 20 20 20 4d 50 45 58 50 52            MPEXPR
1d60: 5f 54 59 50 45 5f 55 4e 41 52 59 20 20 20 20 20  _TYPE_UNARY     
1d70: 20 20 20 20 7d 2c 0a 20 20 7b 20 4e 55 4c 4c 20      },.  { NULL 
1d80: 7d 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 74 61 62  }.};../* The tab
1d90: 6c 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  le is available 
1da0: 67 6c 6f 62 61 6c 6c 79 20 6f 6e 6c 79 20 74 68  globally only th
1db0: 72 6f 75 67 68 20 61 20 70 6f 69 6e 74 65 72 2c  rough a pointer,
1dc0: 20 73 6f 20 74 68 65 20 74 61 62 6c 65 20 73 69   so the table si
1dd0: 7a 65 0a 20 20 20 63 61 6e 20 63 68 61 6e 67 65  ze.   can change
1de0: 20 77 69 74 68 6f 75 74 20 62 72 65 61 6b 69 6e   without breakin
1df0: 67 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 74 69  g binary compati
1e00: 62 69 6c 69 74 79 2e 20 2a 2f 0a 5f 5f 67 6d 70  bility. */.__gmp
1e10: 5f 63 6f 6e 73 74 20 73 74 72 75 63 74 20 6d 70  _const struct mp
1e20: 65 78 70 72 5f 6f 70 65 72 61 74 6f 72 5f 74 20  expr_operator_t 
1e30: 2a 20 5f 5f 67 6d 70 5f 63 6f 6e 73 74 20 6d 70  * __gmp_const mp
1e40: 7a 5f 65 78 70 72 5f 73 74 61 6e 64 61 72 64 5f  z_expr_standard_
1e50: 74 61 62 6c 65 0a 3d 20 5f 6d 70 7a 5f 65 78 70  table.= _mpz_exp
1e60: 72 5f 73 74 61 6e 64 61 72 64 5f 74 61 62 6c 65  r_standard_table
1e70: 3b 0a 0a 0a 69 6e 74 0a 23 69 66 20 48 41 56 45  ;...int.#if HAVE
1e80: 5f 53 54 44 41 52 47 0a 6d 70 7a 5f 65 78 70 72  _STDARG.mpz_expr
1e90: 20 28 6d 70 7a 5f 70 74 72 20 72 65 73 2c 20 69   (mpz_ptr res, i
1ea0: 6e 74 20 62 61 73 65 2c 20 5f 5f 67 6d 70 5f 63  nt base, __gmp_c
1eb0: 6f 6e 73 74 20 63 68 61 72 20 2a 65 2c 20 2e 2e  onst char *e, ..
1ec0: 2e 29 0a 23 65 6c 73 65 0a 6d 70 7a 5f 65 78 70  .).#else.mpz_exp
1ed0: 72 20 28 76 61 5f 61 6c 69 73 74 29 0a 20 20 20  r (va_alist).   
1ee0: 20 20 76 61 5f 64 63 6c 0a 23 65 6e 64 69 66 0a    va_dcl.#endif.
1ef0: 7b 0a 20 20 6d 70 7a 5f 73 72 63 70 74 72 20 20  {.  mpz_srcptr  
1f00: 76 61 72 5b 4d 50 45 58 50 52 5f 56 41 52 49 41  var[MPEXPR_VARIA
1f10: 42 4c 45 53 5d 3b 0a 20 20 76 61 5f 6c 69 73 74  BLES];.  va_list
1f20: 20 20 20 20 20 61 70 3b 0a 20 20 69 6e 74 20 20       ap;.  int  
1f30: 20 20 20 20 20 20 20 72 65 74 3b 0a 23 69 66 20         ret;.#if 
1f40: 48 41 56 45 5f 53 54 44 41 52 47 0a 20 20 76 61  HAVE_STDARG.  va
1f50: 5f 73 74 61 72 74 20 28 61 70 2c 20 65 29 3b 0a  _start (ap, e);.
1f60: 23 65 6c 73 65 0a 20 20 6d 70 7a 5f 70 74 72 20  #else.  mpz_ptr 
1f70: 20 20 20 20 20 20 20 20 20 20 72 65 73 3b 0a 20            res;. 
1f80: 20 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20   int            
1f90: 20 20 20 62 61 73 65 3b 0a 20 20 5f 5f 67 6d 70     base;.  __gmp
1fa0: 5f 63 6f 6e 73 74 20 63 68 61 72 20 20 2a 65 3b  _const char  *e;
1fb0: 0a 20 20 76 61 5f 73 74 61 72 74 20 28 61 70 29  .  va_start (ap)
1fc0: 3b 0a 20 20 72 65 73 20 20 3d 20 76 61 5f 61 72  ;.  res  = va_ar
1fd0: 67 20 28 61 70 2c 20 6d 70 7a 5f 70 74 72 29 3b  g (ap, mpz_ptr);
1fe0: 0a 20 20 62 61 73 65 20 3d 20 76 61 5f 61 72 67  .  base = va_arg
1ff0: 20 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 65 20   (ap, int);.  e 
2000: 20 20 20 3d 20 76 61 5f 61 72 67 20 28 61 70 2c     = va_arg (ap,
2010: 20 5f 5f 67 6d 70 5f 63 6f 6e 73 74 20 63 68 61   __gmp_const cha
2020: 72 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  r *);.#endif..  
2030: 54 52 41 43 45 20 28 70 72 69 6e 74 66 20 28 22  TRACE (printf ("
2040: 6d 70 7a 5f 65 78 70 72 28 29 3a 20 62 61 73 65  mpz_expr(): base
2050: 20 25 64 2c 20 25 73 5c 6e 22 2c 20 62 61 73 65   %d, %s\n", base
2060: 2c 20 65 29 29 3b 0a 20 20 72 65 74 20 3d 20 6d  , e));.  ret = m
2070: 70 65 78 70 72 5f 76 61 5f 74 6f 5f 76 61 72 20  pexpr_va_to_var 
2080: 28 28 76 6f 69 64 20 2a 2a 29 20 76 61 72 2c 20  ((void **) var, 
2090: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 20 28 61  ap);.  va_end (a
20a0: 70 29 3b 0a 0a 20 20 69 66 20 28 72 65 74 20 21  p);..  if (ret !
20b0: 3d 20 4d 50 45 58 50 52 5f 52 45 53 55 4c 54 5f  = MPEXPR_RESULT_
20c0: 4f 4b 29 0a 20 20 20 20 72 65 74 75 72 6e 20 72  OK).    return r
20d0: 65 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6d 70  et;..  return mp
20e0: 7a 5f 65 78 70 72 5f 61 20 28 6d 70 7a 5f 65 78  z_expr_a (mpz_ex
20f0: 70 72 5f 73 74 61 6e 64 61 72 64 5f 74 61 62 6c  pr_standard_tabl
2100: 65 2c 20 72 65 73 2c 20 62 61 73 65 2c 20 65 2c  e, res, base, e,
2110: 20 73 74 72 6c 65 6e 28 65 29 2c 20 76 61 72 29   strlen(e), var)
2120: 3b 0a 7d 0a 0a                                   ;.}..