*
* 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
*
* 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
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @exception GiNaC::pole_error("lgamma_eval(): logarithmic pole",0) */
static ex lgamma_eval(const ex & x)
*
* @exception GiNaC::pole_error("lgamma_eval(): logarithmic pole",0) */
static ex lgamma_eval(const ex & x)
// trap positive x==(n+1/2)
// tgamma(n+1/2) -> Pi^(1/2)*(1*3*..*(2*n-1))/(2^n)
if (two_x.is_positive()) {
// trap positive x==(n+1/2)
// tgamma(n+1/2) -> Pi^(1/2)*(1*3*..*(2*n-1))/(2^n)
if (two_x.is_positive()) {
- const numeric n = ex_to<numeric>(x).sub(_num1_2);
- return (doublefactorial(n.mul(_num2).sub(_num1)).div(pow(_num2,n))) * sqrt(Pi);
+ const numeric n = ex_to<numeric>(x).sub(*_num1_2_p);
+ return (doublefactorial(n.mul(*_num2_p).sub(*_num1_p)).div(pow(*_num2_p,n))) * sqrt(Pi);
- const numeric n = abs(ex_to<numeric>(x).sub(_num1_2));
- return (pow(_num_2, n).div(doublefactorial(n.mul(_num2).sub(_num1))))*sqrt(Pi);
+ const numeric n = abs(ex_to<numeric>(x).sub(*_num1_2_p));
+ return (pow(*_num_2_p, n).div(doublefactorial(n.mul(*_num2_p).sub(*_num1_p))))*sqrt(Pi);
if (nx.is_positive()) {
// use the recurrence relation
// psi(n,m) == psi(n,m+1) - (-)^n * n! / m^(n+1)
if (nx.is_positive()) {
// use the recurrence relation
// psi(n,m) == psi(n,m+1) - (-)^n * n! / m^(n+1)
- recur += pow(p, -nn+_num_1);
- recur *= factorial(nn)*pow(_num_1, nn);
+ recur += pow(p, -nn+(*_num_1_p));
+ recur *= factorial(nn)*pow((*_num_1_p), nn);
return recur+psi(n,_ex1);
} else {
// for non-positive integers there is a pole:
throw (pole_error("psi2_eval(): pole",1));
}
}
return recur+psi(n,_ex1);
} else {
// for non-positive integers there is a pole:
throw (pole_error("psi2_eval(): pole",1));
}
}
- return pow(_num_1,nn+_num1)*factorial(nn)*(pow(_num2,nn+_num1) + _num_1)*zeta(ex(nn+_num1));
+ return pow(*_num_1_p,nn+(*_num1_p))*factorial(nn)*(pow(*_num2_p,nn+(*_num1_p)) + (*_num_1_p))*zeta(ex(nn+(*_num1_p)));
// use the multiplication formula
// psi(n,2*m) == (psi(n,m) + psi(n,m+1/2)) / 2^(n+1)
// to revert to positive integer case
// use the multiplication formula
// psi(n,2*m) == (psi(n,m) + psi(n,m+1/2)) / 2^(n+1)
// to revert to positive integer case
- return psi(n,_num2*m)*pow(_num2,nn+_num1)-psi(n,m);
+ return psi(n,(*_num2_p)*m)*pow((*_num2_p),nn+(*_num1_p))-psi(n,m);
} else {
// use the recurrence relation
// psi(n,-m-1/2) == psi(n,-m-1/2+1) - (-)^n * n! / (-m-1/2)^(n+1)
} else {
// use the recurrence relation
// psi(n,-m-1/2) == psi(n,-m-1/2+1) - (-)^n * n! / (-m-1/2)^(n+1)
// where r == (-)^(n+1) * n! * ((-1/2)^(-n-1) + ... + (-m-1/2)^(-n-1))
numeric recur = 0;
for (numeric p = nx; p<0; ++p)
// where r == (-)^(n+1) * n! * ((-1/2)^(-n-1) + ... + (-m-1/2)^(-n-1))
numeric recur = 0;
for (numeric p = nx; p<0; ++p)
- recur += pow(p, -nn+_num_1);
- recur *= factorial(nn)*pow(_num_1, nn+_num_1);
+ recur += pow(p, -nn+(*_num_1_p));
+ recur *= factorial(nn)*pow(*_num_1_p, nn+(*_num_1_p));