]> www.ginac.de Git - ginac.git/blobdiff - ginac/inifcns_gamma.cpp
added example for namespace bracing
[ginac.git] / ginac / inifcns_gamma.cpp
index 1beab9eaffb2d33faab5efda09fa0e4d14014ab3..6bf85621d8e6f8f216edcb182b44fa4b7d2ddeb0 100644 (file)
@@ -4,7 +4,7 @@
  *  some related stuff. */
 
 /*
- *  GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -30,6 +30,7 @@
 #include "numeric.h"
 #include "power.h"
 #include "relational.h"
+#include "operators.h"
 #include "symbol.h"
 #include "symmetry.h"
 #include "utils.h"
@@ -97,7 +98,7 @@ static ex lgamma_series(const ex & arg,
        // from which follows
        //   series(lgamma(x),x==-m,order) ==
        //   series(lgamma(x+m+1)-log(x)...-log(x+m)),x==-m,order);
-       const ex arg_pt = arg.subs(rel);
+       const ex arg_pt = arg.subs(rel, subs_options::no_pattern);
        if (!arg_pt.info(info_flags::integer) || arg_pt.info(info_flags::positive))
                throw do_taylor();  // caught by function::series()
        // if we got here we have to care for a simple pole of tgamma(-m):
@@ -193,7 +194,7 @@ static ex tgamma_series(const ex & arg,
        // from which follows
        //   series(tgamma(x),x==-m,order) ==
        //   series(tgamma(x+m+1)/(x*(x+1)*...*(x+m)),x==-m,order+1);
-       const ex arg_pt = arg.subs(rel);
+       const ex arg_pt = arg.subs(rel, subs_options::no_pattern);
        if (!arg_pt.info(info_flags::integer) || arg_pt.info(info_flags::positive))
                throw do_taylor();  // caught by function::series()
        // if we got here we have to care for a simple pole at -m:
@@ -230,6 +231,10 @@ static ex beta_evalf(const ex & x, const ex & y)
 
 static ex beta_eval(const ex & x, const ex & y)
 {
+       if (x.is_equal(_ex1))
+               return 1/y;
+       if (y.is_equal(_ex1))
+               return 1/x;
        if (x.info(info_flags::numeric) && y.info(info_flags::numeric)) {
                // treat all problematic x and y that may not be passed into tgamma,
                // because they would throw there although beta(x,y) is well-defined
@@ -289,8 +294,8 @@ static ex beta_series(const ex & arg1,
        // Taylor series where there is no pole of one of the tgamma functions
        // falls back to beta function evaluation.  Otherwise, fall back to
        // tgamma series directly.
-       const ex arg1_pt = arg1.subs(rel);
-       const ex arg2_pt = arg2.subs(rel);
+       const ex arg1_pt = arg1.subs(rel, subs_options::no_pattern);
+       const ex arg2_pt = arg2.subs(rel, subs_options::no_pattern);
        GINAC_ASSERT(is_a<symbol>(rel.lhs()));
        const symbol &s = ex_to<symbol>(rel.lhs());
        ex arg1_ser, arg2_ser, arg1arg2_ser;
@@ -406,7 +411,7 @@ static ex psi1_series(const ex & arg,
        // from which follows
        //   series(psi(x),x==-m,order) ==
        //   series(psi(x+m+1) - 1/x - 1/(x+1) - 1/(x+m)),x==-m,order);
-       const ex arg_pt = arg.subs(rel);
+       const ex arg_pt = arg.subs(rel, subs_options::no_pattern);
        if (!arg_pt.info(info_flags::integer) || arg_pt.info(info_flags::positive))
                throw do_taylor();  // caught by function::series()
        // if we got here we have to care for a simple pole at -m:
@@ -417,7 +422,7 @@ static ex psi1_series(const ex & arg,
        return (psi(arg+m+_ex1)-recur).series(rel, order, options);
 }
 
-const unsigned function_index_psi1 =
+unsigned psi1_SERIAL::serial =
        function::register_new(function_options("psi").
                               eval_func(psi1_eval).
                               evalf_func(psi1_evalf).
@@ -533,7 +538,7 @@ static ex psi2_series(const ex & n,
        //   series(psi(x),x==-m,order) == 
        //   series(psi(x+m+1) - (-1)^n * n! * ((x)^(-n-1) + (x+1)^(-n-1) + ...
        //                                      ... + (x+m)^(-n-1))),x==-m,order);
-       const ex arg_pt = arg.subs(rel);
+       const ex arg_pt = arg.subs(rel, subs_options::no_pattern);
        if (!arg_pt.info(info_flags::integer) || arg_pt.info(info_flags::positive))
                throw do_taylor();  // caught by function::series()
        // if we got here we have to care for a pole of order n+1 at -m:
@@ -545,7 +550,7 @@ static ex psi2_series(const ex & n,
        return (psi(n, arg+m+_ex1)-recur).series(rel, order, options);
 }
 
-const unsigned function_index_psi2 =
+unsigned psi2_SERIAL::serial =
        function::register_new(function_options("psi").
                               eval_func(psi2_eval).
                               evalf_func(psi2_evalf).