summaryrefslogtreecommitdiff
path: root/demos
diff options
context:
space:
mode:
authortege <tege@gmplib.org>1999-05-04 04:51:21 +0200
committertege <tege@gmplib.org>1999-05-04 04:51:21 +0200
commit82249a5ddab3c66d128b5c6960aff195a5af33da (patch)
treefc0e42548b4c5ea9eb734216d072d053f7d2fbc3 /demos
parent5c25eedf7d111bd01546e47e494543ab69b3494e (diff)
downloadgmp-82249a5ddab3c66d128b5c6960aff195a5af33da.tar.gz
* (fns): Fix typo '#if #if'.
* (mpz_eval_expr): Implement FERMAT and MERSENNE.
Diffstat (limited to 'demos')
-rw-r--r--demos/pexpr.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/demos/pexpr.c b/demos/pexpr.c
index 5d8fca9c2..45e0da489 100644
--- a/demos/pexpr.c
+++ b/demos/pexpr.c
@@ -569,7 +569,7 @@ struct functions fns[] =
#endif
{"and", AND, 0},
{"ior", IOR, 0},
-#if #if __GNU_MP_VERSION > 2 || __GNU_MP_VERSION_MINOR >= 1
+#if __GNU_MP_VERSION > 2 || __GNU_MP_VERSION_MINOR >= 1
{"xor", XOR, 0},
#endif
{"plus", PLUS, 0},
@@ -982,6 +982,38 @@ mpz_eval_expr (mpz_ptr r, expr_t e)
mpz_clear (lhs); mpz_clear (rhs);
}
return;
+ case FERMAT:
+ {
+ unsigned long int t;
+ mpz_init (lhs);
+ mpz_eval_expr (lhs, e->operands.ops.lhs);
+ t = (unsigned long int) 1 << mpz_get_ui (lhs);
+ if (mpz_cmp_ui (lhs, ~(unsigned long int) 0) > 0 || t == 0)
+ {
+ error = "too large Mersenne number index";
+ mpz_clear (lhs);
+ longjmp (errjmpbuf, 1);
+ }
+ mpz_set_ui (r, 1);
+ mpz_mul_2exp (r, r, t);
+ mpz_add_ui (r, r, 1);
+ mpz_clear (lhs);
+ }
+ return;
+ case MERSENNE:
+ mpz_init (lhs);
+ mpz_eval_expr (lhs, e->operands.ops.lhs);
+ if (mpz_cmp_ui (lhs, ~(unsigned long int) 0) > 0)
+ {
+ error = "too large Mersenne number index";
+ mpz_clear (lhs);
+ longjmp (errjmpbuf, 1);
+ }
+ mpz_set_ui (r, 1);
+ mpz_mul_2exp (r, r, mpz_get_ui (lhs));
+ mpz_sub_ui (r, r, 1);
+ mpz_clear (lhs);
+ return;
case FIBONACCI:
{ mpz_t t;
unsigned long int n, i;