Example #1
0
    def eval(cls, n, z):
        n, z = map(sympify, (n, z))

        if n.is_integer:
            if n.is_negative:
                return loggamma(z)
            else:
                if z.is_Number:
                    if z is S.NaN:
                        return S.NaN
                    elif z is S.Infinity:
                        if n.is_Number:
                            if n is S.Zero:
                                return S.Infinity
                            else:
                                return S.Zero
                    elif z.is_Integer:
                        if z.is_nonpositive:
                            return S.ComplexInfinity
                        else:
                            if n is S.Zero:
                                return -S.EulerGamma + C.harmonic(z - 1, 1)
                            elif n.is_odd:
                                return (-1)**(n + 1) * C.Factorial(n) * zeta(
                                    n + 1, z)
Example #2
0
    def eval(cls, n, z):
        n, z = map(sympify, (n, z))
        from sympy import unpolarify

        if n.is_integer:
            if n.is_nonnegative:
                nz = unpolarify(z)
                if z != nz:
                    return polygamma(n, nz)

            if n == -1:
                return loggamma(z)
            else:
                if z.is_Number:
                    if z is S.NaN:
                        return S.NaN
                    elif z is S.Infinity:
                        if n.is_Number:
                            if n is S.Zero:
                                return S.Infinity
                            else:
                                return S.Zero
                    elif z.is_Integer:
                        if z.is_nonpositive:
                            return S.ComplexInfinity
                        else:
                            if n is S.Zero:
                                return -S.EulerGamma + C.harmonic(z - 1, 1)
                            elif n.is_odd:
                                return (-1)**(n + 1) * C.factorial(n) * zeta(
                                    n + 1, z)

        if n == 0 and z.is_Rational:
            # TODO actually *any* n/m can be done, but that is messy
            lookup = {
                S(1) / 2: -2 * log(2) - S.EulerGamma,
                S(1) / 3: -S.Pi / 2 / sqrt(3) - 3 * log(3) / 2 - S.EulerGamma,
                S(1) / 4: -S.Pi / 2 - 3 * log(2) - S.EulerGamma,
                S(3) / 4: -3 * log(2) - S.EulerGamma + S.Pi / 2,
                S(2) / 3: -3 * log(3) / 2 + S.Pi / 2 / sqrt(3) - S.EulerGamma
            }
            if z > 0:
                n = floor(z)
                z0 = z - n
                if z0 in lookup:
                    return lookup[z0] + Add(*[1 / (z0 + k) for k in range(n)])
            elif z < 0:
                n = floor(1 - z)
                z0 = z + n
                if z0 in lookup:
                    return lookup[z0] - Add(
                        *[1 / (z0 - 1 - k) for k in range(n)])
Example #3
0
    def eval(cls, n, z):
        n, z = map(sympify, (n, z))
        from sympy import unpolarify

        if n.is_integer:
            if n.is_nonnegative:
                nz = unpolarify(z)
                if z != nz:
                    return polygamma(n, nz)

            if n == -1:
                return loggamma(z)
            else:
                if z.is_Number:
                    if z is S.NaN:
                        return S.NaN
                    elif z is S.Infinity:
                        if n.is_Number:
                            if n is S.Zero:
                                return S.Infinity
                            else:
                                return S.Zero
                    elif z.is_Integer:
                        if z.is_nonpositive:
                            return S.ComplexInfinity
                        else:
                            if n is S.Zero:
                                return -S.EulerGamma + C.harmonic(z-1, 1)
                            elif n.is_odd:
                                return (-1)**(n+1)*C.factorial(n)*zeta(n+1, z)

        if n == 0 and z.is_Rational:
            # TODO actually *any* n/m can be done, but that is messy
            lookup = {S(1)/2: -2*log(2) - S.EulerGamma,
                      S(1)/3: -S.Pi/2/sqrt(3) - 3*log(3)/2 - S.EulerGamma,
                      S(1)/4: -S.Pi/2 - 3*log(2) - S.EulerGamma,
                      S(3)/4: -3*log(2) - S.EulerGamma + S.Pi/2,
                      S(2)/3: -3*log(3)/2 + S.Pi/2/sqrt(3) - S.EulerGamma}
            if z > 0:
                n = floor(z)
                z0 = z - n
                if z0 in lookup:
                    return lookup[z0] + Add(*[1/(z0 + k) for k in range(n)])
            elif z < 0:
                n = floor(1 - z)
                z0 = z + n
                if z0 in lookup:
                    return lookup[z0] - Add(*[1/(z0 - 1 - k) for k in range(n)])
Example #4
0
    def eval(cls, n, z):
        n, z = map(sympify, (n, z))

        if n.is_integer:
            if n.is_negative:
                return loggamma(z)
            else:
                if z.is_Number:
                    if z is S.NaN:
                        return S.NaN
                    elif z is S.Infinity:
                        if n.is_Number:
                            if n is S.Zero:
                                return S.Infinity
                            else:
                                return S.Zero
                    elif z.is_Integer:
                        if z.is_nonpositive:
                            return S.ComplexInfinity
                        else:
                            if n is S.Zero:
                                return -S.EulerGamma + C.harmonic(z-1, 1)
                            elif n.is_odd:
                                return (-1)**(n+1)*C.Factorial(n)*zeta(n+1, z)
Example #5
0
    def _eval_apply(cls, n, z):
        n, z = map(Basic.sympify, (n, z))

        if n.is_integer:
            if n.is_negative:
                return loggamma(z)
            else:
                if isinstance(z, Basic.Number):
                    if isinstance(z, Basic.NaN):
                        return S.NaN
                    elif isinstance(z, Basic.Infinity):
                        if isinstance(n, Basic.Number):
                            if isinstance(n, Basic.Zero):
                                return S.Infinity
                            else:
                                return S.Zero
                    elif isinstance(z, Basic.Integer):
                        if z.is_nonpositive:
                            return S.ComplexInfinity
                        else:
                            if isinstance(n, Basic.Zero):
                                return -S.EulerGamma + Basic.harmonic(z-1, 1)
                            elif n.is_odd:
                                return (-1)**(n+1)*Basic.Factorial(n)*zeta(n+1, z)
Example #6
0
 def _eval_rewrite_as_zeta(self, n, z):
     return (-1)**(n + 1) * C.Factorial(n) * zeta(n + 1, z - 1)
Example #7
0
 def _eval_rewrite_as_zeta(self, n, z):
     return (-1)**(n+1)*C.Factorial(n)*zeta(n+1, z-1)
Example #8
0
 def _eval_rewrite_as_zeta(self, n, z):
     if n >= S.One:
         return (-1)**(n + 1)*C.factorial(n)*zeta(n + 1, z)
     else:
         return self
Example #9
0
 def _eval_rewrite_as_zeta(self, n, z):
     if n >= S.One:
         return (-1)**(n + 1) * C.factorial(n) * zeta(n + 1, z)
     else:
         return self