def _volume_from_shape(z): """ Computes the Bloch-Wigner dilogarithm for z which gives the volume of a tetrahedron of the given shape. """ if _within_sage: CIF = z.parent() if is_ComplexIntervalField(CIF): # A different bug in sage: # Depending on the sage version, an element in a # ComplexIntervalField wouldn't support dilog/polylog, or, even # worse, would convert the element to ComplexField first!!! # # Thus, we convert to ComplexBallField here since the arblib # supports a verified interval polylog (albeit giving an interval # that seems to be 300 times larger than necessary). CBF = ComplexBallField(CIF.precision()) RIF = RealIntervalField(CIF.precision()) return RIF(_unprotected_volume_from_shape(CBF(z))) else: z = Number(z) # Use implementation in number.py that overcomes the cypari bug that you # have to explicitly give a precision to dilog, otherwise you lose # precision. return z.volume()
def _coerce_map_from_(self, P): r""" Return whether ``P`` coerces into this symbolic subring. INPUT: - ``P`` -- a parent. OUTPUT: A boolean or ``None``. TESTS:: sage: from sage.symbolic.subring import GenericSymbolicSubring sage: GenericSymbolicSubring(vars=tuple()).has_coerce_map_from(SR) # indirect doctest # not tested see #19231 False :: sage: from sage.symbolic.subring import SymbolicSubring sage: C = SymbolicSubring(no_variables=True) sage: C.has_coerce_map_from(ZZ) # indirect doctest True sage: C.has_coerce_map_from(QQ) # indirect doctest True sage: C.has_coerce_map_from(RR) # indirect doctest True sage: C.has_coerce_map_from(RIF) # indirect doctest True sage: C.has_coerce_map_from(CC) # indirect doctest True sage: C.has_coerce_map_from(CIF) # indirect doctest True sage: C.has_coerce_map_from(AA) # indirect doctest True sage: C.has_coerce_map_from(QQbar) # indirect doctest True sage: C.has_coerce_map_from(SR) # indirect doctest False """ if P == SR: # Workaround; can be deleted once #19231 is fixed return False from sage.rings.real_mpfr import mpfr_prec_min from sage.rings.all import (ComplexField, RLF, CLF, AA, QQbar, InfinityRing) from sage.rings.real_mpfi import is_RealIntervalField from sage.rings.complex_interval_field import is_ComplexIntervalField if isinstance(P, type): return SR._coerce_map_from_(P) elif RLF.has_coerce_map_from(P) or \ CLF.has_coerce_map_from(P) or \ AA.has_coerce_map_from(P) or \ QQbar.has_coerce_map_from(P): return True elif (P is InfinityRing or is_RealIntervalField(P) or is_ComplexIntervalField(P)): return True elif ComplexField(mpfr_prec_min()).has_coerce_map_from(P): return P not in (RLF, CLF, AA, QQbar)