diff options
author | tege <tege@gmplib.org> | 1999-05-04 04:51:21 +0200 |
---|---|---|
committer | tege <tege@gmplib.org> | 1999-05-04 04:51:21 +0200 |
commit | 82249a5ddab3c66d128b5c6960aff195a5af33da (patch) | |
tree | fc0e42548b4c5ea9eb734216d072d053f7d2fbc3 /demos | |
parent | 5c25eedf7d111bd01546e47e494543ab69b3494e (diff) | |
download | gmp-82249a5ddab3c66d128b5c6960aff195a5af33da.tar.gz |
* (fns): Fix typo '#if #if'.
* (mpz_eval_expr): Implement FERMAT and MERSENNE.
Diffstat (limited to 'demos')
-rw-r--r-- | demos/pexpr.c | 34 |
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; |