diff options
author | tege <tege@gmplib.org> | 2002-04-22 21:04:37 +0200 |
---|---|---|
committer | tege <tege@gmplib.org> | 2002-04-22 21:04:37 +0200 |
commit | ac1901dde6354bdaa8645c7b7460e69debf5eda5 (patch) | |
tree | f64c266032803defeb1397ed567bb6d0f63e6eed /demos/pexpr.c | |
parent | 1f8abae58224d9e312a025bbb4aafedaee972c94 (diff) | |
download | gmp-ac1901dde6354bdaa8645c7b7460e69debf5eda5.tar.gz |
Handle "binomial" operator.
Diffstat (limited to 'demos/pexpr.c')
-rw-r--r-- | demos/pexpr.c | 21 |
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 (); } |