B
    'kº[Â  ã               @   sV  d Z dZddlZddlmZ ddlmZmZ ddlm	Z	 ddl	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]mZ dd	lm^Z^ dd
lm_Z_ e`jaZbe cd¡ZdedkrìddlemfZg ddlemh  mi  mjZk nddllmmZg ddlmlZk ddllmnZnmoZompZp G dd„ degeƒZqG dd„ dƒZresdkrRddltZtet u¡  dS )z[
This module defines the mpf, mpc classes, and standard functions for
operating with them.
Z	plaintexté    Né   )ÚStandardBaseContext)Ú
basestringÚBACKEND)Úlibmp)UÚMPZÚMPZ_ZEROÚMPZ_ONEÚ	int_typesÚrepr_dpsÚround_floorÚround_ceilingÚdps_to_precÚround_nearestÚprec_to_dpsÚComplexResultÚto_pickableÚfrom_pickableÚ	normalizeÚfrom_intÚ
from_floatÚfrom_strÚto_intÚto_floatÚto_strÚfrom_rationalÚfrom_man_expÚfoneÚfzeroÚfinfÚfninfÚfnanÚmpf_absÚmpf_posÚmpf_negÚmpf_addÚmpf_subÚmpf_mulÚmpf_mul_intÚmpf_divÚmpf_rdiv_intÚmpf_pow_intÚmpf_modÚmpf_eqÚmpf_cmpÚmpf_ltÚmpf_gtÚmpf_leÚmpf_geÚmpf_hashÚmpf_randÚmpf_sumÚbitcountÚto_fixedÚ
mpc_to_strÚmpc_to_complexÚmpc_hashÚmpc_posÚmpc_is_nonzeroÚmpc_negÚmpc_conjugateÚmpc_absÚmpc_addÚmpc_add_mpfÚmpc_subÚmpc_sub_mpfÚmpc_mulÚmpc_mul_mpfÚmpc_mul_intÚmpc_divÚmpc_div_mpfÚmpc_powÚmpc_pow_mpfÚmpc_pow_intÚmpc_mpf_divÚmpf_powÚmpf_piÚ
mpf_degreeÚmpf_eÚmpf_phiÚmpf_ln2Úmpf_ln10Ú	mpf_eulerÚmpf_catalanÚ	mpf_aperyÚmpf_khinchinÚmpf_glaisherÚmpf_twinprimeÚmpf_mertensr
   )Úfunction_docs)ÚrationalzX^\(?(?P<re>[\+\-]?\d*\.?\d*(e[\+\-]?\d+)?)??(?P<im>[\+\-]?\d*\.?\d*(e[\+\-]?\d+)?j)?\)?$Zsage)ÚContext)ÚPythonMPContext)Úctx_mp_python)Ú_mpfÚ_mpcÚ	mpnumericc               @   sÀ  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdmdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zed/d0„ ƒZed1d2„ ƒZdnd4d5„Zdod6d7„Zdpd8d9„Zdqd:d;„Z drd>d?„Z!dsdAdB„Z"dCdD„ Z#dEdF„ Z$dGdH„ Z%dIZ&dJZ'dtdLdM„Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3ddde„ Z4dfdg„ Z5dhdi„ Z6djgd3fdkdl„Z7d<S )uÚ	MPContextzH
    Context for multiprecision arithmetic with a global precision.
    c             C   sü   t  | ¡ d| _d| _| j| j| jg| _tj	| _
|  ¡  t | ¡ tj	| _	|  ¡  i | _|  ¡  y4tj| jj_tj| jj_tj| jj_tj| jj_W nD tk
rØ   tj| jj_tj| jj_tj| jj_tj| jj_Y nX tj| j_tj| j_tj| j_d S )NF)ÚBaseMPContextÚ__init__Útrap_complexZprettyÚmpfÚmpcÚconstantÚtypesr\   ÚmpqZ_mpqÚdefaultr   Úinit_builtinsÚhyp_summatorsZ_init_aliasesr[   Ú	bernoulliZim_funcZfunc_docZprimepiÚpsiÚatan2ÚAttributeErrorÚ__func__ÚdigammaÚcospiÚsinpi)Úctx© rx   ú,lib/python3.7/site-packages/mpmath/ctx_mp.pyre   =   s0    



zMPContext.__init__c             C   sÌ  | j }| j}|  t¡| _|  t¡| _|  ttf¡| _|  t	¡| _
|  t¡| _|  t¡| _|  dd„ dd¡}|| _|  tdd¡| _|  tdd¡| _|  tdd	¡| _|  td
d¡| _|  tdd¡| _|  tdd¡| _|  tdd¡| _|  tdd¡| _ |  t!dd¡| _"|  t#dd¡| _$|  t%dd¡| _&|  t'dd¡| _(|  t)dd¡| _*|  +t,j-t,j.¡| _/|  +t,j0t,j1¡| _2|  +t,j3t,j4¡| _5|  +t,j6t,j7¡| _8|  +t,j9t,j:¡| _;|  +t,j<t,j=¡| _>|  +t,j?t,j@¡| _A|  +t,jBt,jC¡| _D|  +t,jEt,jF¡| _G|  +t,jHt,jI¡| _J|  +t,jKt,jL¡| _M|  +t,jNt,jO¡| _P|  +t,jQt,jR¡| _S|  +t,jTt,jU¡| _V|  +t,jWt,jX¡| _Y|  +t,j6t,j7¡| _8|  +t,jZt,j[¡| _\|  +t,j]t,j^¡| __|  +t,j`t,ja¡| _b|  +t,jct,jd¡| _e|  +t,jft,jg¡| _h|  +t,jit,jj¡| _k|  +t,jlt,jm¡| _n|  +t,jot,jp¡| _q|  +t,jrt,js¡| _t|  +t,jut,jv¡ | _w| _x|  +t,jyt,jz¡| _{|  +t,j|t,j}¡| _~|  +t,jt,j€¡| _|  +t,j‚t,jƒ¡ | _„| _…|  +t,j†t,j‡¡| _ˆ|  +t,j‰t,jŠ¡ | _‹| _Œ|  +t,jt,jŽ¡| _|  +t,jt,j‘¡| _’|  +t,j“t,j”¡| _•|  +t,j–t,j—¡| _˜|  +t,j™t,jš¡| _›|  +t,jœt,j¡| _ž|  +t,jŸt,j ¡| _¡|  +t,j¢t,j£¡| _¤|  +t,j¥t,j¦¡| _§|  +t,j¨d ¡| _©|  +t,jªd ¡| _«|  +t,j¬t,j­¡| _®|  +t,j¯t,j°¡| _±t²| d| j/ƒ| _/t²| d| j;ƒ| _;t²| d | j5ƒ| _5t²| d!| jGƒ| _Gt²| d"| jDƒ| _Dd S )#Nc             S   s   dt d|  dfS )Nr   r   )r	   )ÚprecÚrndrx   rx   ry   Ú<lambda>k   s    z)MPContext.init_builtins.<locals>.<lambda>zepsilon of working precisionÚepsÚpizln(2)Úln2zln(10)Úln10zGolden ratio phiÚphiz
e = exp(1)ÚezEuler's constantÚeulerzCatalan's constantÚcatalanzKhinchin's constantÚkhinchinzGlaisher's constantÚglaisherzApery's constantÚaperyz1 deg = pi / 180ÚdegreezTwin prime constantÚ	twinprimezMertens' constantÚmertensZ
_sage_sqrtZ	_sage_expZ_sage_lnZ	_sage_cosZ	_sage_sin)³rg   rh   Úmake_mpfr   Úoner   ÚzeroÚmake_mpcÚjr   Úinfr    Úninfr!   Únanri   r}   rN   r~   rR   r   rS   r€   rQ   r   rP   r‚   rT   rƒ   rU   r„   rW   r…   rX   r†   rV   r‡   rO   rˆ   rY   r‰   rZ   rŠ   Z_wrap_libmp_functionr   Zmpf_sqrtZmpc_sqrtZsqrtZmpf_cbrtZmpc_cbrtZcbrtZmpf_logZmpc_logZlnZmpf_atanZmpc_atanZatanZmpf_expZmpc_expÚexpZmpf_expjZmpc_expjZexpjZ
mpf_expjpiZ
mpc_expjpiZexpjpiZmpf_sinZmpc_sinÚsinZmpf_cosZmpc_cosÚcosZmpf_tanZmpc_tanZtanZmpf_sinhZmpc_sinhZsinhZmpf_coshZmpc_coshZcoshZmpf_tanhZmpc_tanhZtanhZmpf_asinZmpc_asinZasinZmpf_acosZmpc_acosZacosZ	mpf_asinhZ	mpc_asinhZasinhZ	mpf_acoshZ	mpc_acoshZacoshZ	mpf_atanhZ	mpc_atanhZatanhZ
mpf_sin_piZ
mpc_sin_pirv   Z
mpf_cos_piZ
mpc_cos_piru   Z	mpf_floorZ	mpc_floorZfloorZmpf_ceilZmpc_ceilZceilZmpf_nintZmpc_nintZnintZmpf_fracZmpc_fracZfracZmpf_fibonacciZmpc_fibonacciZfibZ	fibonacciZ	mpf_gammaZ	mpc_gammaÚgammaZ
mpf_rgammaZ
mpc_rgammaZrgammaZmpf_loggammaZmpc_loggammaZloggammaZmpf_factorialZmpc_factorialZfacZ	factorialZmpf_gamma_oldZmpc_gamma_oldZ	gamma_oldZmpf_factorial_oldZmpc_factorial_oldZfac_oldZfactorial_oldZmpf_psi0Zmpc_psi0rt   Zmpf_harmonicZmpc_harmonicZharmonicZmpf_eiZmpc_eiZeiZmpf_e1Zmpc_e1Úe1Zmpf_ciZmpc_ciZ_ciZmpf_siZmpc_siZ_siZ
mpf_ellipkZ
mpc_ellipkZellipkZ
mpf_ellipeZ
mpc_ellipeZ_ellipeZmpf_agm1Zmpc_agm1Zagm1Zmpf_erfZ_erfZmpf_erfcZ_erfcZmpf_zetaZmpc_zetaZ_zetaZmpf_altzetaZmpc_altzetaZ_altzetaÚgetattr)rw   rg   rh   r}   rx   rx   ry   rm   ^   s”    
zMPContext.init_builtinsc             C   s
   |  |¡S )N)r7   )rw   Úxrz   rx   rx   ry   r7   ¶   s    zMPContext.to_fixedc             C   s2   |   |¡}|   |¡}|  tj|j|jf| jžŽ ¡S )z€
        Computes the Euclidean norm of the vector `(x, y)`, equal
        to `\sqrt{x^2 + y^2}`. Both `x` and `y` must be real.)Úconvertr‹   r   Z	mpf_hypotÚ_mpf_Ú_prec_rounding)rw   r™   Úyrx   rx   ry   Úhypot¹   s    

zMPContext.hypotc             C   sv   t |  |¡ƒ}|dkr |  |¡S t|dƒs.t‚| j\}}tj||j||dd\}}|d krd|  	|¡S |  
||f¡S d S )Nr   r›   T)r–   )ÚintZ_rer—   ÚhasattrÚNotImplementedErrorrœ   r   Ú
mpf_expintr›   r‹   rŽ   )rw   ÚnÚzrz   ÚroundingÚrealÚimagrx   rx   ry   Ú_gamma_upper_intÁ   s    



zMPContext._gamma_upper_intc             C   sl   t |ƒ}|dkr|  |¡S t|dƒs(t‚| j\}}t ||j||¡\}}|d krZ|  |¡S |  	||f¡S d S )Nr   r›   )
rŸ   r—   r    r¡   rœ   r   r¢   r›   r‹   rŽ   )rw   r£   r¤   rz   r¥   r¦   r§   rx   rx   ry   Ú_expint_intÎ   s    



zMPContext._expint_intc             C   sr   t |dƒrRy|  tj|j|f| jžŽ ¡S  tk
rN   | jr>‚ |jtjf}Y qXX n|j	}|  
tj||f| jžŽ ¡S )Nr›   )r    r‹   r   Zmpf_nthrootr›   rœ   r   rf   r   Ú_mpc_rŽ   Zmpc_nthroot)rw   r™   r£   rx   rx   ry   Ú_nthrootÛ   s    
zMPContext._nthrootc             C   sR   | j \}}t|dƒr,|  t ||j||¡¡S t|dƒrN|  t ||j||¡¡S d S )Nr›   rª   )	rœ   r    r‹   r   Zmpf_besseljnr›   rŽ   Zmpc_besseljnrª   )rw   r£   r¤   rz   r¥   rx   rx   ry   Ú_besseljç   s
    


zMPContext._besseljr   c             C   s¤   | j \}}t|dƒrRt|dƒrRyt |j|j||¡}|  |¡S  tk
rP   Y nX t|dƒrj|jtjf}n|j}t|dƒrˆ|jtjf}n|j}|  	t 
||||¡¡S )Nr›   )rœ   r    r   Zmpf_agmr›   r‹   r   r   rª   rŽ   Zmpc_agm)rw   ÚaÚbrz   r¥   Úvrx   rx   ry   Ú_agmî   s    


 
 zMPContext._agmc             C   s   |   tjt|ƒf| jžŽ ¡S )N)r‹   r   Zmpf_bernoullirŸ   rœ   )rw   r£   rx   rx   ry   ro   ü   s    zMPContext.bernoullic             C   s   |   tjt|ƒf| jžŽ ¡S )N)r‹   r   Zmpf_zeta_intrŸ   rœ   )rw   r£   rx   rx   ry   Ú	_zeta_intÿ   s    zMPContext._zeta_intc             C   s2   |   |¡}|   |¡}|  tj|j|jf| jžŽ ¡S )N)rš   r‹   r   Z	mpf_atan2r›   rœ   )rw   r   r™   rx   rx   ry   rq     s    

zMPContext.atan2c             C   sX   |   |¡}t|ƒ}|  |¡r8|  tj||jf| jžŽ ¡S |  tj	||j
f| jžŽ ¡S d S )N)rš   rŸ   Ú_is_real_typer‹   r   Zmpf_psir›   rœ   rŽ   Zmpc_psirª   )rw   Úmr¤   rx   rx   ry   rp     s
    

zMPContext.psic             K   sª   t |ƒ| jkr|  |¡}|  |¡\}}t|dƒrXt |j||¡\}}|  |¡|  |¡fS t|dƒrŠt 	|j
||¡\}}|  |¡|  |¡fS | j|f|Ž| j|f|ŽfS d S )Nr›   rª   )Útyperj   rš   Ú_parse_precr    r   Zmpf_cos_sinr›   r‹   Zmpc_cos_sinrª   rŽ   r•   r”   )rw   r™   Úkwargsrz   r¥   ÚcÚsrx   rx   ry   Úcos_sin  s    


zMPContext.cos_sinc             K   sª   t |ƒ| jkr|  |¡}|  |¡\}}t|dƒrXt |j||¡\}}|  |¡|  |¡fS t|dƒrŠt 	|j
||¡\}}|  |¡|  |¡fS | j|f|Ž| j|f|ŽfS d S )Nr›   rª   )r´   rj   rš   rµ   r    r   Zmpf_cos_sin_pir›   r‹   Zmpc_cos_sin_pirª   rŽ   r•   r”   )rw   r™   r¶   rz   r¥   r·   r¸   rx   rx   ry   Úcospi_sinpi  s    


zMPContext.cospi_sinpic             C   s   |   ¡ }| j|_|S )zP
        Create a copy of the context, with the same working precision.
        )Ú	__class__rz   )rw   r­   rx   rx   ry   Úclone)  s    zMPContext.clonec             C   s   t |dƒst|ƒtkrdS dS )Nrª   FT)r    r´   Úcomplex)rw   r™   rx   rx   ry   r²   4  s    zMPContext._is_real_typec             C   s   t |dƒst|ƒtkrdS dS )Nrª   TF)r    r´   r½   )rw   r™   rx   rx   ry   Ú_is_complex_type9  s    zMPContext._is_complex_typec             C   sv   t |dƒr|jtkS t |dƒr(t|jkS t|tƒs>t|tjƒrBdS |  |¡}t |dƒs`t |dƒrj|  	|¡S t
dƒ‚dS )a¢  
        Return *True* if *x* is a NaN (not-a-number), or for a complex
        number, whether either the real or complex part is NaN;
        otherwise return *False*::

            >>> from mpmath import *
            >>> isnan(3.14)
            False
            >>> isnan(nan)
            True
            >>> isnan(mpc(3.14,2.72))
            False
            >>> isnan(mpc(3.14,nan))
            True

        r›   rª   Fzisnan() needs a number as inputN)r    r›   r!   rª   Ú
isinstancer
   r\   rk   rš   ÚisnanÚ	TypeError)rw   r™   rx   rx   ry   rÀ   >  s    





zMPContext.isnanc             C   s   |   |¡s|  |¡rdS dS )aè  
        Return *True* if *x* is a finite number, i.e. neither
        an infinity or a NaN.

            >>> from mpmath import *
            >>> isfinite(inf)
            False
            >>> isfinite(-inf)
            False
            >>> isfinite(3)
            True
            >>> isfinite(nan)
            False
            >>> isfinite(3+4j)
            True
            >>> isfinite(mpc(3,inf))
            False
            >>> isfinite(mpc(nan,3))
            False

        FT)ZisinfrÀ   )rw   r™   rx   rx   ry   ÚisfiniteZ  s    zMPContext.isfinitec             C   sœ   |sdS t |dƒr,|j\}}}}|o*|dkS t |dƒrJ|j oH|  |j¡S t|ƒtkr^|dkS t|| jƒrŒ|j	\}}|s|dS |dkoŠ|dkS |  |  
|¡¡S )z<
        Determine if *x* is a nonpositive integer.
        Tr›   r   rª   r   )r    r›   r§   Úisnpintr¦   r´   r
   r¿   rk   Ú_mpq_rš   )rw   r™   ÚsignÚmanr“   ÚbcÚpÚqrx   rx   ry   rÃ   t  s    


zMPContext.isnpintc             C   sF   dd| j   d¡d d| j  d¡d d| j  d¡d g}d	 |¡S )
NzMpmath settings:z  mp.prec = %sé   z[default: 53]z  mp.dps = %sz[default: 15]z  mp.trap_complex = %sz[default: False]Ú
)rz   ÚljustÚdpsrf   Újoin)rw   Úlinesrx   rx   ry   Ú__str__ˆ  s
    zMPContext.__str__c             C   s
   t | jƒS )N)r   Ú_prec)rw   rx   rx   ry   Ú_repr_digits  s    zMPContext._repr_digitsc             C   s   | j S )N)Z_dps)rw   rx   rx   ry   Ú_str_digits”  s    zMPContext._str_digitsFc                s   t | ‡ fdd„d|ƒS )aÛ  
        The block

            with extraprec(n):
                <code>

        increases the precision n bits, executes <code>, and then
        restores the precision.

        extraprec(n)(f) returns a decorated version of the function f
        that increases the working precision by n bits before execution,
        and restores the parent precision afterwards. With
        normalize_output=True, it rounds the return value to the parent
        precision.
        c                s   | ˆ  S )Nrx   )rÈ   )r£   rx   ry   r|   ¨  s    z%MPContext.extraprec.<locals>.<lambda>N)ÚPrecisionManager)rw   r£   Únormalize_outputrx   )r£   ry   Ú	extraprec˜  s    zMPContext.extraprecc                s   t | d‡ fdd„|ƒS )z–
        This function is analogous to extraprec (see documentation)
        but changes the decimal precision instead of the number of bits.
        Nc                s   | ˆ  S )Nrx   )Úd)r£   rx   ry   r|   ¯  s    z$MPContext.extradps.<locals>.<lambda>)rÔ   )rw   r£   rÕ   rx   )r£   ry   Úextradpsª  s    zMPContext.extradpsc                s   t | ‡ fdd„d|ƒS )a»  
        The block

            with workprec(n):
                <code>

        sets the precision to n bits, executes <code>, and then restores
        the precision.

        workprec(n)(f) returns a decorated version of the function f
        that sets the precision to n bits before execution,
        and restores the precision afterwards. With normalize_output=True,
        it rounds the return value to the parent precision.
        c                s   ˆ S )Nrx   )rÈ   )r£   rx   ry   r|   À  s    z$MPContext.workprec.<locals>.<lambda>N)rÔ   )rw   r£   rÕ   rx   )r£   ry   Úworkprec±  s    zMPContext.workprecc                s   t | d‡ fdd„|ƒS )z•
        This function is analogous to workprec (see documentation)
        but changes the decimal precision instead of the number of bits.
        Nc                s   ˆ S )Nrx   )r×   )r£   rx   ry   r|   Ç  s    z#MPContext.workdps.<locals>.<lambda>)rÔ   )rw   r£   rÕ   rx   )r£   ry   ÚworkdpsÂ  s    zMPContext.workdpsNrx   c                s   ‡ ‡‡‡‡fdd„}|S )a‹
  
        Return a wrapped copy of *f* that repeatedly evaluates *f*
        with increasing precision until the result converges to the
        full precision used at the point of the call.

        This heuristically protects against rounding errors, at the cost of
        roughly a 2x slowdown compared to manually setting the optimal
        precision. This method can, however, easily be fooled if the results
        from *f* depend "discontinuously" on the precision, for instance
        if catastrophic cancellation can occur. Therefore, :func:`~mpmath.autoprec`
        should be used judiciously.

        **Examples**

        Many functions are sensitive to perturbations of the input arguments.
        If the arguments are decimal numbers, they may have to be converted
        to binary at a much higher precision. If the amount of required
        extra precision is unknown, :func:`~mpmath.autoprec` is convenient::

            >>> from mpmath import *
            >>> mp.dps = 15
            >>> mp.pretty = True
            >>> besselj(5, 125 * 10**28)    # Exact input
            -8.03284785591801e-17
            >>> besselj(5, '1.25e30')   # Bad
            7.12954868316652e-16
            >>> autoprec(besselj)(5, '1.25e30')   # Good
            -8.03284785591801e-17

        The following fails to converge because `\sin(\pi) = 0` whereas all
        finite-precision approximations of `\pi` give nonzero values::

            >>> autoprec(sin)(pi) # doctest: +IGNORE_EXCEPTION_DETAIL
            Traceback (most recent call last):
              ...
            NoConvergence: autoprec: prec increased to 2910 without convergence

        As the following example shows, :func:`~mpmath.autoprec` can protect against
        cancellation, but is fooled by too severe cancellation::

            >>> x = 1e-10
            >>> exp(x)-1; expm1(x); autoprec(lambda t: exp(t)-1)(x)
            1.00000008274037e-10
            1.00000000005e-10
            1.00000000005e-10
            >>> x = 1e-50
            >>> exp(x)-1; expm1(x); autoprec(lambda t: exp(t)-1)(x)
            0.0
            1.0e-50
            0.0

        With *catch*, an exception or list of exceptions to intercept
        may be specified. The raised exception is interpreted
        as signaling insufficient precision. This permits, for example,
        evaluating a function where a too low precision results in a
        division by zero::

            >>> f = lambda x: 1/(exp(x)-1)
            >>> f(1e-30)
            Traceback (most recent call last):
              ...
            ZeroDivisionError
            >>> autoprec(f, catch=ZeroDivisionError)(1e-30)
            1.0e+30


        c                 s  ˆj }ˆd krˆ |¡}nˆ}zð|d ˆ_ yˆ| |Ž}W n ˆ k
rR   ˆj}Y nX |d }x®|ˆ_ yˆ| |Ž}W n ˆ k
rŒ   ˆj}Y nX ||kr˜P ˆ || ¡ˆ |¡ }|| k r¼P ˆrÔtd||| f ƒ |}||krîˆ d| ¡‚|t|d ƒ7 }t||ƒ}q^W W d |ˆ_ X |
 S )Né
   é   z)autoprec: target=%s, prec=%s, accuracy=%sz2autoprec: prec increased to %i without convergenceé   )rz   Ú_default_hyper_maxprecr’   ÚmagÚprintZNoConvergencerŸ   Úmin)Úargsr¶   rz   Zmaxprec2Zv1Zprec2Zv2Úerr)Úcatchrw   ÚfÚmaxprecÚverboserx   ry   Úf_autoprec_wrapped  sD    

z.MPContext.autoprec.<locals>.f_autoprec_wrappedrx   )rw   rå   ræ   rä   rç   rè   rx   )rä   rw   rå   ræ   rç   ry   ÚautoprecÉ  s    D%zMPContext.autoprecé   c                sÄ   t |tƒr*dd ‡ ‡‡fdd„|D ƒ¡ S t |tƒrTdd ‡ ‡‡fdd„|D ƒ¡ S t|dƒrnt|jˆfˆŽS t|dƒrd	t|jˆfˆŽ d
 S t |t	ƒr¢t
|ƒS t |ˆ jƒr¼|jˆfˆŽS t|ƒS )a3  
        Convert an ``mpf`` or ``mpc`` to a decimal string literal with *n*
        significant digits. The small default value for *n* is chosen to
        make this function useful for printing collections of numbers
        (lists, matrices, etc).

        If *x* is a list or tuple, :func:`~mpmath.nstr` is applied recursively
        to each element. For unrecognized classes, :func:`~mpmath.nstr`
        simply returns ``str(x)``.

        The companion function :func:`~mpmath.nprint` prints the result
        instead of returning it.

        The keyword arguments *strip_zeros*, *min_fixed*, *max_fixed*
        and *show_zero_exponent* are forwarded to :func:`~mpmath.libmp.to_str`.

        The number will be printed in fixed-point format if the position
        of the leading digit is strictly between min_fixed
        (default = min(-dps/3,-5)) and max_fixed (default = dps).

        To force fixed-point format always, set min_fixed = -inf,
        max_fixed = +inf. To force floating-point format, set
        min_fixed >= max_fixed.

            >>> from mpmath import *
            >>> nstr([+pi, ldexp(1,-500)])
            '[3.14159, 3.05494e-151]'
            >>> nprint([+pi, ldexp(1,-500)])
            [3.14159, 3.05494e-151]
            >>> nstr(mpf("5e-10"), 5)
            '5.0e-10'
            >>> nstr(mpf("5e-10"), 5, strip_zeros=False)
            '5.0000e-10'
            >>> nstr(mpf("5e-10"), 5, strip_zeros=False, min_fixed=-11)
            '0.00000000050000'
            >>> nstr(mpf(0), 5, show_zero_exponent=True)
            '0.0e+0'

        z[%s]z, c             3   s   | ]}ˆ j |ˆfˆŽV  qd S )N)Únstr)Ú.0r·   )rw   r¶   r£   rx   ry   ú	<genexpr>]  s    z!MPContext.nstr.<locals>.<genexpr>z(%s)c             3   s   | ]}ˆ j |ˆfˆŽV  qd S )N)rë   )rì   r·   )rw   r¶   r£   rx   ry   rí   _  s    r›   rª   ú(ú))r¿   ÚlistrÎ   Útupler    r   r›   r8   rª   r   ÚreprZmatrixZ__nstr__Ústr)rw   r™   r£   r¶   rx   )rw   r¶   r£   ry   rë   4  s    (
 
 


zMPContext.nstrc             C   s°   |rnt |tƒrnd| ¡ krn| ¡  dd¡}t |¡}| d¡}|sFd}| d¡ d¡}|  |  	|¡|  	|¡¡S t
|dƒrœ|j\}}||kr”|  |¡S tdƒ‚td	t|ƒ ƒ‚d S )
Nr   ú Ú Úrer   ÚimÚ_mpi_z,can only create mpf from zero-width intervalzcannot create mpf from )r¿   r   ÚlowerÚreplaceÚget_complexÚmatchÚgroupÚrstriprh   rš   r    rø   r‹   Ú
ValueErrorrÁ   rò   )rw   r™   Zstringsrü   rö   r÷   r­   r®   rx   rx   ry   Ú_convert_fallbackj  s    




zMPContext._convert_fallbackc             O   s   | j ||ŽS )N)rš   )rw   râ   r¶   rx   rx   ry   Ú	mpmathify|  s    zMPContext.mpmathifyc             C   sˆ   |r‚|  d¡rdS | j\}}d|kr,|d }d|krT|d }|| jkrJdS t|ƒ}n&d|krz|d }|| jkrrdS t|ƒ}||fS | jS )NÚexact)r   rå   r¥   rz   rÍ   )Úgetrœ   r   rŸ   r   )rw   r¶   rz   r¥   rÍ   rx   rx   ry   rµ     s$    




zMPContext._parse_precz'the exact result does not fit in memoryzœhypsum() failed to converge to the requested %i bits of accuracy
using a working precision of %i bits. Try with a higher maxprec,
maxterms, or set zeroprec.Tc       !      K   sà  t |dƒr|||df}|j}	nt |dƒr:|||df}|j}	|| jkrXt |¡d | j|< | j| }
| j}| d|  |¡¡}d}d}i }d	}x t	|ƒD ]ô\}}|| d
kr||kr–|d	kr–d}x<t	|d |… ƒD ](\}}|| d
krÒ|d	krÒ||krÒd}qÒW |s–t
dƒ‚q–|  |¡\}}t|ƒ }| }||kr~|d	kr~|dkr~||krd||  |7  < n|||< t||| d ƒ}|t|ƒ7 }q–W x||kr²t| j||| f ƒ‚|| }|rÔtdd„ |D ƒƒ}ni }|
||	||||f|Ž\}}}| }d}||k r6x,| ¡ D ] }|d ks*||k rd}P qW ||d d k pL| }|r|r\P | d¡} | d k	r|| kr|rŠ|  d	¡S | jS |d9 }|d7 }|d7 }q’W t|ƒtkrØ|rÌ|  |¡S |  |¡S n|S d S )Nr›   ÚRrª   ÚCr   ræ   é2   é   r   ÚZFTzpole in hypergeometric seriesé   é<   c             s   s   | ]}|d fV  qd S )Nrx   )rì   r£   rx   rx   ry   rí   Ç  s    z#MPContext.hypsum.<locals>.<genexpr>é   ÚzeroprecrÝ   )r    r›   rª   rn   r   Zmake_hyp_summatorrz   r  rÞ   Ú	enumerateÚZeroDivisionErrorÚnint_distancerŸ   ÚmaxÚabsrÿ   Ú_hypsum_msgÚdictÚvaluesrh   r   r´   rñ   rŽ   r‹   )!rw   rÈ   rÉ   ÚflagsZcoeffsr¤   Zaccurate_smallr¶   Úkeyr¯   Zsummatorrz   ræ   rÖ   ZepsshiftZmagnitude_checkZmax_total_jumpÚir·   ÚokZiiZccr£   r×   ZwpZmag_dictZzvZhave_complexZ	magnitudeZcancelZjumps_resolvedZaccurater  rx   rx   ry   Úhypsumš  sˆ    













zMPContext.hypsumc             C   s   |   |¡}|  t |j|¡¡S )a–  
        Computes `x 2^n` efficiently. No rounding is performed.
        The argument `x` must be a real floating-point number (or
        possible to convert into one) and `n` must be a Python ``int``.

            >>> from mpmath import *
            >>> mp.dps = 15; mp.pretty = False
            >>> ldexp(1, 10)
            mpf('1024.0')
            >>> ldexp(1, -3)
            mpf('0.125')

        )rš   r‹   r   Z	mpf_shiftr›   )rw   r™   r£   rx   rx   ry   Úldexpï  s    
zMPContext.ldexpc             C   s(   |   |¡}t |j¡\}}|  |¡|fS )a=  
        Given a real number `x`, returns `(y, n)` with `y \in [0.5, 1)`,
        `n` a Python integer, and such that `x = y 2^n`. No rounding is
        performed.

            >>> from mpmath import *
            >>> mp.dps = 15; mp.pretty = False
            >>> frexp(7.5)
            (mpf('0.9375'), 3)

        )rš   r   Z	mpf_frexpr›   r‹   )rw   r™   r   r£   rx   rx   ry   Úfrexp   s    
zMPContext.frexpc             K   s`   |   |¡\}}|  |¡}t|dƒr6|  t|j||ƒ¡S t|dƒrT|  t|j||ƒ¡S t	dƒ‚dS )a  
        Negates the number *x*, giving a floating-point result, optionally
        using a custom precision and rounding mode.

        See the documentation of :func:`~mpmath.fadd` for a detailed description
        of how to specify precision and rounding.

        **Examples**

        An mpmath number is returned::

            >>> from mpmath import *
            >>> mp.dps = 15; mp.pretty = False
            >>> fneg(2.5)
            mpf('-2.5')
            >>> fneg(-5+2j)
            mpc(real='5.0', imag='-2.0')

        Precise control over rounding is possible::

            >>> x = fadd(2, 1e-100, exact=True)
            >>> fneg(x)
            mpf('-2.0')
            >>> fneg(x, rounding='f')
            mpf('-2.0000000000000004')

        Negating with and without roundoff::

            >>> n = 200000000000000000000001
            >>> print(int(-mpf(n)))
            -200000000000000016777216
            >>> print(int(fneg(n)))
            -200000000000000016777216
            >>> print(int(fneg(n, prec=log(n,2)+1)))
            -200000000000000000000001
            >>> print(int(fneg(n, dps=log(n,10)+1)))
            -200000000000000000000001
            >>> print(int(fneg(n, prec=inf)))
            -200000000000000000000001
            >>> print(int(fneg(n, dps=inf)))
            -200000000000000000000001
            >>> print(int(fneg(n, exact=True)))
            -200000000000000000000001

        r›   rª   z2Arguments need to be mpf or mpc compatible numbersN)
rµ   rš   r    r‹   r$   r›   rŽ   r=   rª   rÿ   )rw   r™   r¶   rz   r¥   rx   rx   ry   Úfneg  s    .


zMPContext.fnegc          	   K   sò   |   |¡\}}|  |¡}|  |¡}y t|dƒrrt|dƒrP|  t|j|j||ƒ¡S t|dƒrr|  t|j|j||ƒ¡S t|dƒrÀt|dƒrž|  t|j|j||ƒ¡S t|dƒrÀ|  t	|j|j||ƒ¡S W n" t
tfk
rä   t| jƒ‚Y nX t
dƒ‚dS )a“  
        Adds the numbers *x* and *y*, giving a floating-point result,
        optionally using a custom precision and rounding mode.

        The default precision is the working precision of the context.
        You can specify a custom precision in bits by passing the *prec* keyword
        argument, or by providing an equivalent decimal precision with the *dps*
        keyword argument. If the precision is set to ``+inf``, or if the flag
        *exact=True* is passed, an exact addition with no rounding is performed.

        When the precision is finite, the optional *rounding* keyword argument
        specifies the direction of rounding. Valid options are ``'n'`` for
        nearest (default), ``'f'`` for floor, ``'c'`` for ceiling, ``'d'``
        for down, ``'u'`` for up.

        **Examples**

        Using :func:`~mpmath.fadd` with precision and rounding control::

            >>> from mpmath import *
            >>> mp.dps = 15; mp.pretty = False
            >>> fadd(2, 1e-20)
            mpf('2.0')
            >>> fadd(2, 1e-20, rounding='u')
            mpf('2.0000000000000004')
            >>> nprint(fadd(2, 1e-20, prec=100), 25)
            2.00000000000000000001
            >>> nprint(fadd(2, 1e-20, dps=15), 25)
            2.0
            >>> nprint(fadd(2, 1e-20, dps=25), 25)
            2.00000000000000000001
            >>> nprint(fadd(2, 1e-20, exact=True), 25)
            2.00000000000000000001

        Exact addition avoids cancellation errors, enforcing familiar laws
        of numbers such as `x+y-x = y`, which don't hold in floating-point
        arithmetic with finite precision::

            >>> x, y = mpf(2), mpf('1e-1000')
            >>> print(x + y - x)
            0.0
            >>> print(fadd(x, y, prec=inf) - x)
            1.0e-1000
            >>> print(fadd(x, y, exact=True) - x)
            1.0e-1000

        Exact addition can be inefficient and may be impossible to perform
        with large magnitude differences::

            >>> fadd(1, '1e-100000000000000000000', prec=inf)
            Traceback (most recent call last):
              ...
            OverflowError: the exact result does not fit in memory

        r›   rª   z2Arguments need to be mpf or mpc compatible numbersN)rµ   rš   r    r‹   r%   r›   rŽ   rA   rª   r@   rÿ   ÚOverflowErrorÚ_exact_overflow_msg)rw   r™   r   r¶   rz   r¥   rx   rx   ry   ÚfaddF  s"    8







zMPContext.faddc          	   K   sö   |   |¡\}}|  |¡}|  |¡}y¤t|dƒrvt|dƒrP|  t|j|j||ƒ¡S t|dƒrv|  t|jtf|j	||ƒ¡S t|dƒrÄt|dƒr¢|  t
|j	|j||ƒ¡S t|dƒrÄ|  t|j	|j	||ƒ¡S W n" ttfk
rè   t| jƒ‚Y nX tdƒ‚dS )a  
        Subtracts the numbers *x* and *y*, giving a floating-point result,
        optionally using a custom precision and rounding mode.

        See the documentation of :func:`~mpmath.fadd` for a detailed description
        of how to specify precision and rounding.

        **Examples**

        Using :func:`~mpmath.fsub` with precision and rounding control::

            >>> from mpmath import *
            >>> mp.dps = 15; mp.pretty = False
            >>> fsub(2, 1e-20)
            mpf('2.0')
            >>> fsub(2, 1e-20, rounding='d')
            mpf('1.9999999999999998')
            >>> nprint(fsub(2, 1e-20, prec=100), 25)
            1.99999999999999999999
            >>> nprint(fsub(2, 1e-20, dps=15), 25)
            2.0
            >>> nprint(fsub(2, 1e-20, dps=25), 25)
            1.99999999999999999999
            >>> nprint(fsub(2, 1e-20, exact=True), 25)
            1.99999999999999999999

        Exact subtraction avoids cancellation errors, enforcing familiar laws
        of numbers such as `x-y+y = x`, which don't hold in floating-point
        arithmetic with finite precision::

            >>> x, y = mpf(2), mpf('1e1000')
            >>> print(x - y + y)
            0.0
            >>> print(fsub(x, y, prec=inf) + y)
            2.0
            >>> print(fsub(x, y, exact=True) + y)
            2.0

        Exact addition can be inefficient and may be impossible to perform
        with large magnitude differences::

            >>> fsub(1, '1e-100000000000000000000', prec=inf)
            Traceback (most recent call last):
              ...
            OverflowError: the exact result does not fit in memory

        r›   rª   z2Arguments need to be mpf or mpc compatible numbersN)rµ   rš   r    r‹   r&   r›   rŽ   rB   r   rª   rC   rÿ   r  r  )rw   r™   r   r¶   rz   r¥   rx   rx   ry   Úfsub  s"    0







zMPContext.fsubc          	   K   sò   |   |¡\}}|  |¡}|  |¡}y t|dƒrrt|dƒrP|  t|j|j||ƒ¡S t|dƒrr|  t|j|j||ƒ¡S t|dƒrÀt|dƒrž|  t|j|j||ƒ¡S t|dƒrÀ|  t	|j|j||ƒ¡S W n" t
tfk
rä   t| jƒ‚Y nX t
dƒ‚dS )a¥  
        Multiplies the numbers *x* and *y*, giving a floating-point result,
        optionally using a custom precision and rounding mode.

        See the documentation of :func:`~mpmath.fadd` for a detailed description
        of how to specify precision and rounding.

        **Examples**

        The result is an mpmath number::

            >>> from mpmath import *
            >>> mp.dps = 15; mp.pretty = False
            >>> fmul(2, 5.0)
            mpf('10.0')
            >>> fmul(0.5j, 0.5)
            mpc(real='0.0', imag='0.25')

        Avoiding roundoff::

            >>> x, y = 10**10+1, 10**15+1
            >>> print(x*y)
            10000000001000010000000001
            >>> print(mpf(x) * mpf(y))
            1.0000000001e+25
            >>> print(int(mpf(x) * mpf(y)))
            10000000001000011026399232
            >>> print(int(fmul(x, y)))
            10000000001000011026399232
            >>> print(int(fmul(x, y, dps=25)))
            10000000001000010000000001
            >>> print(int(fmul(x, y, exact=True)))
            10000000001000010000000001

        Exact multiplication with complex numbers can be inefficient and may
        be impossible to perform with large magnitude differences between
        real and imaginary parts::

            >>> x = 1+2j
            >>> y = mpc(2, '1e-100000000000000000000')
            >>> fmul(x, y)
            mpc(real='2.0', imag='4.0')
            >>> fmul(x, y, rounding='u')
            mpc(real='2.0', imag='4.0000000000000009')
            >>> fmul(x, y, exact=True)
            Traceback (most recent call last):
              ...
            OverflowError: the exact result does not fit in memory

        r›   rª   z2Arguments need to be mpf or mpc compatible numbersN)rµ   rš   r    r‹   r'   r›   rŽ   rE   rª   rD   rÿ   r  r  )rw   r™   r   r¶   rz   r¥   rx   rx   ry   ÚfmulÒ  s"    3







zMPContext.fmulc             K   sÚ   |   |¡\}}|stdƒ‚|  |¡}|  |¡}t|dƒr€t|dƒrZ|  t|j|j||ƒ¡S t|dƒr€|  t|jt	f|j
||ƒ¡S t|dƒrÎt|dƒr¬|  t|j
|j||ƒ¡S t|dƒrÎ|  t|j
|j
||ƒ¡S tdƒ‚dS )a©  
        Divides the numbers *x* and *y*, giving a floating-point result,
        optionally using a custom precision and rounding mode.

        See the documentation of :func:`~mpmath.fadd` for a detailed description
        of how to specify precision and rounding.

        **Examples**

        The result is an mpmath number::

            >>> from mpmath import *
            >>> mp.dps = 15; mp.pretty = False
            >>> fdiv(3, 2)
            mpf('1.5')
            >>> fdiv(2, 3)
            mpf('0.66666666666666663')
            >>> fdiv(2+4j, 0.5)
            mpc(real='4.0', imag='8.0')

        The rounding direction and precision can be controlled::

            >>> fdiv(2, 3, dps=3)    # Should be accurate to at least 3 digits
            mpf('0.6666259765625')
            >>> fdiv(2, 3, rounding='d')
            mpf('0.66666666666666663')
            >>> fdiv(2, 3, prec=60)
            mpf('0.66666666666666667')
            >>> fdiv(2, 3, rounding='u')
            mpf('0.66666666666666674')

        Checking the error of a division by performing it at higher precision::

            >>> fdiv(2, 3) - fdiv(2, 3, prec=100)
            mpf('-3.7007434154172148e-17')

        Unlike :func:`~mpmath.fadd`, :func:`~mpmath.fmul`, etc., exact division is not
        allowed since the quotient of two floating-point numbers generally
        does not have an exact floating-point representation. (In the
        future this might be changed to allow the case where the division
        is actually exact.)

            >>> fdiv(2, 3, exact=True)
            Traceback (most recent call last):
              ...
            ValueError: division is not an exact operation

        z"division is not an exact operationr›   rª   z2Arguments need to be mpf or mpc compatible numbersN)rµ   rÿ   rš   r    r‹   r)   r›   rŽ   rG   r   rª   rH   )rw   r™   r   r¶   rz   r¥   rx   rx   ry   Úfdiv  s     1







zMPContext.fdivc             C   s  t |ƒ}|tkrt|ƒ| jfS |tjkrˆ|j\}}t||ƒ\}}d| |krV|d7 }n|sd|| jfS tt	|||  ƒƒt|ƒ }||fS t
|dƒr |j}| j}	n|t
|dƒrè|j\}}
|
\}}}}|rÎ|| }	n|
tkrÞ| j}	ntdƒ‚n4|  |¡}t
|dƒs
t
|dƒr|  |¡S tdƒ‚|\}}}}|| }|dk rDd}|}nº|rà|dkrd||> }| j}nn|dkr€|d? d }d}nR| d }||? }|d@ r²|d7 }||> | }n|||> 8 }|d? }|t|ƒ }|rþ| }n|tkrö| j}d}ntdƒ‚|t||	ƒfS )	aº  
        Return `(n,d)` where `n` is the nearest integer to `x` and `d` is
        an estimate of `\log_2(|x-n|)`. If `d < 0`, `-d` gives the precision
        (measured in bits) lost to cancellation when computing `x-n`.

            >>> from mpmath import *
            >>> n, d = nint_distance(5)
            >>> print(n); print(d)
            5
            -inf
            >>> n, d = nint_distance(mpf(5))
            >>> print(n); print(d)
            5
            -inf
            >>> n, d = nint_distance(mpf(5.00000001))
            >>> print(n); print(d)
            5
            -26
            >>> n, d = nint_distance(mpf(4.99999999))
            >>> print(n); print(d)
            5
            -26
            >>> n, d = nint_distance(mpc(5,10))
            >>> print(n); print(d)
            5
            4
            >>> n, d = nint_distance(mpc(5,0.000001))
            >>> print(n); print(d)
            5
            -19

        rÝ   r   r›   rª   zrequires a finite numberzrequires an mpf/mpcr   éÿÿÿÿ)r´   r
   rŸ   r‘   r\   rk   rÄ   Údivmodr6   r  r    r›   rª   r   rÿ   rš   r  rÁ   r  )rw   r™   ZtypxrÈ   rÉ   r£   Úrr×   rö   Zim_distr÷   ZisignZimanZiexpZibcrÅ   rÆ   r“   rÇ   rß   Zre_distÚtrx   rx   ry   r  Y  sl    !
















zMPContext.nint_distancec             C   s6   | j }z | j}x|D ]}||9 }qW W d|| _ X |
 S )aT  
        Calculates a product containing a finite number of factors (for
        infinite products, see :func:`~mpmath.nprod`). The factors will be
        converted to mpmath numbers.

            >>> from mpmath import *
            >>> mp.dps = 15; mp.pretty = False
            >>> fprod([1, 2, 0.5, 7])
            mpf('7.0')

        N)rz   rŒ   )rw   ZfactorsÚorigr¯   rÈ   rx   rx   ry   Úfprod»  s    
zMPContext.fprodc             C   s   |   t| jƒ¡S )z·
        Returns an ``mpf`` with value chosen randomly from `[0, 1)`.
        The number of randomly generated bits in the mantissa is equal
        to the working precision.
        )r‹   r4   rÑ   )rw   rx   rx   ry   ÚrandÐ  s    zMPContext.randc                s   |   ‡ ‡fdd„dˆ ˆf ¡S )a  
        Given Python integers `(p, q)`, returns a lazy ``mpf`` representing
        the fraction `p/q`. The value is updated with the precision.

            >>> from mpmath import *
            >>> mp.dps = 15
            >>> a = fraction(1,100)
            >>> b = mpf(1)/100
            >>> print(a); print(b)
            0.01
            0.01
            >>> mp.dps = 30
            >>> print(a); print(b)      # a will be accurate
            0.01
            0.0100000000000000002081668171172
            >>> mp.dps = 15
        c                s   t ˆ ˆ| |ƒS )N)r   )rz   r{   )rÈ   rÉ   rx   ry   r|   ê  s    z$MPContext.fraction.<locals>.<lambda>z%s/%s)ri   )rw   rÈ   rÉ   rx   )rÈ   rÉ   ry   ÚfractionØ  s    zMPContext.fractionc             C   s   t |  |¡ƒS )N)r  rš   )rw   r™   rx   rx   ry   Úabsminí  s    zMPContext.absminc             C   s   t |  |¡ƒS )N)r  rš   )rw   r™   rx   rx   ry   Úabsmaxð  s    zMPContext.absmaxc             C   s,   t |dƒr(|j\}}|  |¡|  |¡gS |S )Nrø   )r    rø   r‹   )rw   r™   r­   r®   rx   rx   ry   Ú
_as_pointsó  s    

zMPContext._as_pointsr   c       	         sl   ˆ   |¡rt|dƒst‚t|ƒ}ˆ j}t |j|||||¡\}}‡ fdd„|D ƒ}‡ fdd„|D ƒ}||fS )Nrª   c                s   g | ]}ˆ   |¡‘qS rx   )rŽ   )rì   r™   )rw   rx   ry   ú
<listcomp>  s    z+MPContext._zetasum_fast.<locals>.<listcomp>c                s   g | ]}ˆ   |¡‘qS rx   )rŽ   )rì   r   )rw   rx   ry   r.    s    )Zisintr    r¡   rŸ   rÑ   r   Zmpc_zetasumrª   )	rw   r¸   r­   r£   ZderivativesZreflectrz   ZxsZysrx   )rw   ry   Ú_zetasum_fast  s    zMPContext._zetasum_fast)r   )F)F)F)F)Nrx   F)rê   )T)8Ú__name__Ú
__module__Ú__qualname__Ú__doc__re   rm   r7   rž   r¨   r©   r«   r¬   r°   ro   r±   rq   rp   r¹   rº   r¼   r²   r¾   rÀ   rÂ   rÃ   rÐ   ÚpropertyrÒ   rÓ   rÖ   rØ   rÙ   rÚ   ré   rë   r   r  rµ   r  r  r  r  r  r  r  r   r!  r"  r  r(  r)  r*  r+  r,  r-  r/  rx   rx   rx   ry   rc   8   sh   !X





k
6
U6JBEBbrc   c               @   s.   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
S )rÔ   Fc             C   s   || _ || _|| _|| _d S )N)rw   ÚprecfunÚdpsfunrÕ   )Úselfrw   r5  r6  rÕ   rx   rx   ry   re     s    zPrecisionManager.__init__c                s"   ‡ ‡fdd„}ˆ j |_ ˆ j|_|S )Nc                 s†   ˆj j}znˆjr$ˆ ˆj j¡ˆj _nˆ ˆj j¡ˆj _ˆjrjˆ | |Ž}t|ƒtkrdtdd„ |D ƒƒS |
 S ˆ | |ŽS W d |ˆj _X d S )Nc             S   s   g | ]
}|
 ‘qS rx   rx   )rì   r­   rx   rx   ry   r.  &  s    z8PrecisionManager.__call__.<locals>.g.<locals>.<listcomp>)rw   rz   r5  r6  rÍ   rÕ   r´   rñ   )râ   r¶   r'  r¯   )rå   r7  rx   ry   Úg  s    
z$PrecisionManager.__call__.<locals>.g)r0  r3  )r7  rå   r8  rx   )rå   r7  ry   Ú__call__  s    zPrecisionManager.__call__c             C   s:   | j j| _| jr$|  | j j¡| j _n|  | j j¡| j _d S )N)rw   rz   Úorigpr5  r6  rÍ   )r7  rx   rx   ry   Ú	__enter__/  s    
zPrecisionManager.__enter__c             C   s   | j | j_dS )NF)r:  rw   rz   )r7  Úexc_typeZexc_valZexc_tbrx   rx   ry   Ú__exit__5  s    
zPrecisionManager.__exit__N)F)r0  r1  r2  re   r9  r;  r=  rx   rx   rx   ry   rÔ     s   
rÔ   Ú__main__)vr3  Z__docformat__rö   Zctx_baser   Zlibmp.backendr   r   rõ   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   ÚobjectÚ__new__ÚnewÚcompilerû   Zsage.libs.mpmath.ext_mainr]   rd   ZlibsZmpmathZext_mainZ_mpf_moduler_   r^   r`   ra   rb   rc   rÔ   r0  ZdoctestZtestmodrx   rx   rx   ry   Ú<module>   s>   ÿ ]

         f%
