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)))
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
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)))
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
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()
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()