Example #1
0
 def _eval_(self, x):
     """
     EXAMPLES::
     
         sage: [dickman_rho(n) for n in [1..10]]
         [1.00000000000000, 0.306852819440055, 0.0486083882911316, 0.00491092564776083, 0.000354724700456040, 0.0000196496963539553, 8.74566995329392e-7, 3.23206930422610e-8, 1.01624828273784e-9, 2.77017183772596e-11]
         sage: dickman_rho(0)
         1.00000000000000
     """
     if not is_RealNumber(x):
         try:
             x = RR(x)
         except (TypeError, ValueError):
             return None  #PrimitiveFunction.__call__(self, SR(x))
     if x < 0:
         return x.parent()(0)
     elif x <= 1:
         return x.parent()(1)
     elif x <= 2:
         return 1 - x.log()
     n = x.floor()
     if self._cur_prec < x.parent().prec() or not self._f.has_key(n):
         self._cur_prec = rel_prec = x.parent().prec()
         # Go a bit beyond so we're not constantly re-computing.
         max = x.parent()(1.1) * x + 10
         abs_prec = (-self.approximate(max).log2() + rel_prec +
                     2 * max.log2()).ceil()
         self._f = {}
         if sys.getrecursionlimit() < max + 10:
             sys.setrecursionlimit(int(max) + 10)
         self._compute_power_series(max.floor(),
                                    abs_prec,
                                    cache_ring=x.parent())
     return self._f[n](2 * (x - n - x.parent()(0.5)))
Example #2
0
    def _coerce_(self, x):
        """
        EXAMPLES::

            >>> s = server(); c = client(s.port)
            >>> c._coerce_(False)
            0
            >>> c._coerce_(True)
            1
            >>> c._coerce_('lkjdf')
            'lkjdf'
            >>> c._coerce_(2.5)
            2.5
            >>> c._coerce_([1,2])
            '__pickleeJxrYIot...'
        """
        if isinstance(x, bool):
            x = int(x)
        elif isinstance(x, (str, int, long, float)):
            pass
        elif is_Integer(x) and x.nbits()<32:
            x = int(x)
        elif is_RealNumber(x) and x.prec()==53:
            return float(x)
        elif isinstance(x, unicode):
            return str(x)
        else:
            x = '__pickle' + base64.b64encode(zlib.compress(cPickle.dumps(x, 2)))
        return x
Example #3
0
    def _eval_(self, x):
        """
        EXAMPLES::

            sage: [dickman_rho(n) for n in [1..10]]
            [1.00000000000000, 0.306852819440055, 0.0486083882911316, 0.00491092564776083, 0.000354724700456040, 0.0000196496963539553, 8.74566995329392e-7, 3.23206930422610e-8, 1.01624828273784e-9, 2.77017183772596e-11]
            sage: dickman_rho(0)
            1.00000000000000
        """
        if not is_RealNumber(x):
            try:
                x = RR(x)
            except (TypeError, ValueError):
                return None #PrimitiveFunction.__call__(self, SR(x))
        if x < 0:
            return x.parent()(0)
        elif x <= 1:
            return x.parent()(1)
        elif x <= 2:
            return 1 - x.log()
        n = x.floor()
        if self._cur_prec < x.parent().prec() or not self._f.has_key(n):
            self._cur_prec = rel_prec = x.parent().prec()
            # Go a bit beyond so we're not constantly re-computing.
            max = x.parent()(1.1)*x + 10
            abs_prec = (-self.approximate(max).log2() + rel_prec + 2*max.log2()).ceil()
            self._f = {}
            if sys.getrecursionlimit() < max + 10:
                sys.setrecursionlimit(int(max) + 10)
            self._compute_power_series(max.floor(), abs_prec, cache_ring=x.parent())
        return self._f[n](2*(x-n-x.parent()(0.5)))
Example #4
0
    def _coerce_(self, x):
        """
        EXAMPLES::

            >>> s = server(); c = client(s.port)
            >>> c._coerce_(False)
            0
            >>> c._coerce_(True)
            1
            >>> c._coerce_('lkjdf')
            'lkjdf'
            >>> c._coerce_(2.5)
            2.5
            >>> c._coerce_([1,2])
            '__pickleeJxrYIot...'
        """
        if isinstance(x, bool):
            x = int(x)
        elif isinstance(x, (str, int, long, float)):
            pass
        elif x is None:
            pass
        elif is_Integer(x) and x.nbits() < 32:
            x = int(x)
        elif is_RealNumber(x) and x.prec() == 53:
            return float(x)
        elif isinstance(x, unicode):
            return str(x)
        else:
            x = '__pickle' + base64.b64encode(
                zlib.compress(cPickle.dumps(x, 2)))
        return x
Example #5
0
def zeta_symmetric(s):
    r"""
    Completed function `\xi(s)` that satisfies
    `\xi(s) = \xi(1-s)` and has zeros at the same points as the
    Riemann zeta function.
    
    INPUT:
    
    
    -  ``s`` - real or complex number
    
    
    If s is a real number the computation is done using the MPFR
    library. When the input is not real, the computation is done using
    the PARI C library.
    
    More precisely,
    
    .. math::
    
                xi(s) = \gamma(s/2 + 1) * (s-1) * \pi^{-s/2} * \zeta(s).     
    
    
    
    EXAMPLES::
    
        sage: zeta_symmetric(0.7)
        0.497580414651127
        sage: zeta_symmetric(1-0.7)
        0.497580414651127
        sage: RR = RealField(200)
        sage: zeta_symmetric(RR(0.7))
        0.49758041465112690357779107525638385212657443284080589766062
        sage: C.<i> = ComplexField()
        sage: zeta_symmetric(0.5 + i*14.0)
        0.000201294444235258 + 1.49077798716757e-19*I
        sage: zeta_symmetric(0.5 + i*14.1)
        0.0000489893483255687 + 4.40457132572236e-20*I
        sage: zeta_symmetric(0.5 + i*14.2)
        -0.0000868931282620101 + 7.11507675693612e-20*I
    
    REFERENCE:

    - I copied the definition of xi from
      http://www.math.ubc.ca/~pugh/RiemannZeta/RiemannZetaLong.html
    """
    if not (is_ComplexNumber(s) or is_RealNumber(s)):
        s = ComplexField()(s)

    R = s.parent()
    if s == 1:  # deal with poles, hopefully
        return R(0.5)

    return (s / 2 + 1).gamma() * (s - 1) * (R.pi()**(-s / 2)) * s.zeta()
Example #6
0
def zeta_symmetric(s):
    r"""
    Completed function `\xi(s)` that satisfies
    `\xi(s) = \xi(1-s)` and has zeros at the same points as the
    Riemann zeta function.

    INPUT:


    -  ``s`` - real or complex number


    If s is a real number the computation is done using the MPFR
    library. When the input is not real, the computation is done using
    the PARI C library.

    More precisely,

    .. math::

                xi(s) = \gamma(s/2 + 1) * (s-1) * \pi^{-s/2} * \zeta(s).



    EXAMPLES::

        sage: zeta_symmetric(0.7)
        0.497580414651127
        sage: zeta_symmetric(1-0.7)
        0.497580414651127
        sage: RR = RealField(200)
        sage: zeta_symmetric(RR(0.7))
        0.49758041465112690357779107525638385212657443284080589766062
        sage: C.<i> = ComplexField()
        sage: zeta_symmetric(0.5 + i*14.0)
        0.000201294444235258 + 1.49077798716757e-19*I
        sage: zeta_symmetric(0.5 + i*14.1)
        0.0000489893483255687 + 4.40457132572236e-20*I
        sage: zeta_symmetric(0.5 + i*14.2)
        -0.0000868931282620101 + 7.11507675693612e-20*I

    REFERENCE:

    - I copied the definition of xi from
      http://web.viu.ca/pughg/RiemannZeta/RiemannZetaLong.html
    """
    if not (is_ComplexNumber(s) or is_RealNumber(s)):
        s = ComplexField()(s)

    R = s.parent()
    if s == 1:  # deal with poles, hopefully
        return R(0.5)

    return (s/2 + 1).gamma()   *    (s-1)   * (R.pi()**(-s/2))  *  s.zeta()