summaryrefslogtreecommitdiff
path: root/demos
diff options
context:
space:
mode:
authortege <tege@gmplib.org>2002-04-22 21:04:37 +0200
committertege <tege@gmplib.org>2002-04-22 21:04:37 +0200
commitac1901dde6354bdaa8645c7b7460e69debf5eda5 (patch)
treef64c266032803defeb1397ed567bb6d0f63e6eed /demos
parent1f8abae58224d9e312a025bbb4aafedaee972c94 (diff)
downloadgmp-ac1901dde6354bdaa8645c7b7460e69debf5eda5.tar.gz
Handle "binomial" operator.
Diffstat (limited to 'demos')
-rw-r--r--demos/pexpr.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/demos/pexpr.c b/demos/pexpr.c
index 34f5cbbda..3a9562b9f 100644
--- a/demos/pexpr.c
+++ b/demos/pexpr.c
@@ -103,7 +103,7 @@ jmp_buf errjmpbuf;
enum op_t {NOP, LIT, NEG, NOT, PLUS, MINUS, MULT, DIV, MOD, REM, INVMOD, POW,
AND, IOR, XOR, SLL, SRA, POPCNT, HAMDIST, GCD, LCM, SQRT, ROOT, FAC,
- LOG, LOG2, FERMAT, MERSENNE, FIBONACCI, RANDOM, NEXTPRIME};
+ LOG, LOG2, FERMAT, MERSENNE, FIBONACCI, RANDOM, NEXTPRIME, BINOM};
/* Type for the expression tree. */
struct expr
@@ -722,6 +722,8 @@ struct functions fns[] =
{"Fib", FIBONACCI, 1},
{"random", RANDOM, 1},
{"nextprime", NEXTPRIME, 1},
+ {"binom", BINOM, 2},
+ {"binomial", BINOM, 2},
{"", NOP, 0}
};
@@ -1264,6 +1266,23 @@ mpz_eval_expr (mpz_ptr r, expr_t e)
mpz_nextprime (r, r);
}
return;
+ case BINOM:
+ mpz_init (lhs); mpz_init (rhs);
+ mpz_eval_expr (lhs, e->operands.ops.lhs);
+ mpz_eval_expr (rhs, e->operands.ops.rhs);
+ {
+ unsigned long int k;
+ if (mpz_cmp_ui (rhs, ~(unsigned long int) 0) > 0)
+ {
+ error = "k too large in (n over k) expression";
+ mpz_clear (lhs); mpz_clear (rhs);
+ longjmp (errjmpbuf, 1);
+ }
+ k = mpz_get_ui (rhs);
+ mpz_bin_ui (r, lhs, k);
+ }
+ mpz_clear (lhs); mpz_clear (rhs);
+ return;
default:
abort ();
}