B
    <Zk                 @   sT  d 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)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z< dd Z=eefZ>eefZ?dd	 Z@d
d ZAdd ZBdd ZCdd ZDdd ZEdddZFdddZGdd ZHdd ZIdd ZJddd ZKdd!d"ZLd#d$ ZMd%d& ZNdd'd(ZOdd)d*ZPd+d, ZQd-d. ZRd/d0 ZSd1d2 ZTd3d4 ZUd5d6 ZVd7d8 ZWd9d: ZXd;d< ZYd=d> ZZd?d@ Z[dAdB Z\dCdD Z]dEdF Z^dGdH Z_dIdJ Z`dKdL ZadMdN ZbddSdTZcdUdV ZddWdX ZeddYdZZfd[d\ Zgd]d^ Zhd_d` Zidadb Zjdcdd Zkdedf Zldgdh Zmdidj Zndkdl Zodmdn Zpdodp Zqdqdr Zrdsdt Zsdudv Ztdwdx ZuedyZvedzZwevewfZxed{Zyed|Zzd}d~ Z{dddZ|dddZ}dd Z~dd Zdd Zdd Zdd Zdd ZdS )z3
Computational functions for interval arithmetic.

   )xrange)+ComplexResult
round_downround_upround_floorround_ceilinground_nearestprec_to_dpsrepr_dpsdps_to_precbitcount
from_floatfnanfinffninffzerofhalffonefnonempf_signmpf_ltmpf_lempf_gtmpf_gempf_eqmpf_cmpmpf_min_max	mpf_floorfrom_intto_intto_strfrom_strmpf_absmpf_negmpf_posmpf_addmpf_submpf_mulmpf_mul_intmpf_div	mpf_shiftmpf_pow_intfrom_man_expMPZ_ONE)mpf_logmpf_expmpf_sqrtmpf_atan	mpf_atan2mpf_pimod_pi2mpf_cos_sin)	mpf_gamma
mpf_rgammampf_loggammampc_loggammac             C   s,   | \}}t |d }dt||t||f S )N   z[%s, %s])r	   r    )sprecsasbdps r@   2lib/python3.7/site-packages/mpmath/libmp/libmpi.pympi_str   s    rB   c             C   s   | |kS )Nr@   )r;   tr@   r@   rA   mpi_eq)   s    rD   c             C   s   | |kS )Nr@   )r;   rC   r@   r@   rA   mpi_ne,   s    rE   c             C   s0   | \}}|\}}t ||rdS t||r,dS d S )NTF)r   r   )r;   rC   r=   r>   tatbr@   r@   rA   mpi_lt/   s    
 
 rH   c             C   s0   | \}}|\}}t ||rdS t||r,dS d S )NTF)r   r   )r;   rC   r=   r>   rF   rG   r@   r@   rA   mpi_le6   s    
 
 rI   c             C   s
   t || S )N)rH   )r;   rC   r@   r@   rA   mpi_gt=   s    rJ   c             C   s
   t || S )N)rI   )r;   rC   r@   r@   rA   mpi_ge>   s    rK       c       	      C   sL   | \}}|\}}t |||t}t |||t}|tkr8t}|tkrDt}||fS )N)r%   r   r   r   r   r   )	r;   rC   r<   r=   r>   rF   rG   abr@   r@   rA   mpi_add@   s      rO   c       	      C   sL   | \}}|\}}t |||t}t |||t}|tkr8t}|tkrDt}||fS )N)r&   r   r   r   r   r   )	r;   rC   r<   r=   r>   rF   rG   rM   rN   r@   r@   rA   mpi_subI   s      rP   c             C   s   | \}}t |||tS )N)r&   r   )r;   r<   r=   r>   r@   r@   rA   	mpi_deltaR   s    rQ   c             C   s   | \}}t t|||tdS )N)r*   r%   r   )r;   r<   r=   r>   r@   r@   rA   mpi_midV   s    rS   c             C   s(   | \}}t ||t}t ||t}||fS )N)r$   r   r   )r;   r<   r=   r>   rM   rN   r@   r@   rA   mpi_posZ   s    rT   c             C   s(   | \}}t ||t}t ||t}||fS )N)r#   r   r   )r;   r<   r=   r>   rM   rN   r@   r@   rA   mpi_neg`   s    rU   c       	      C   s   | \}}t |}t |}|dkr:t||t}t||t}nR|dkrtt}t|}t||rft||t}qt||t}nt||t}t||t}||fS )NrL   )r   r$   r   r   r   r#   r   )	r;   r<   r=   r>   sassbsrM   rN   Znegsar@   r@   rA   mpi_absf   s    
rX   c             C   s   t | ||f|S )N)mpi_mul)r;   rC   r<   r@   r@   rA   mpi_mul_mpf}   s    rZ   c             C   s   t | ||f|S )N)mpi_div)r;   rC   r<   r@   r@   rA   mpi_div_mpf   s    r\   c             C   s  | \}}|\}}t |}t |}t |}	t |}
||  krDdkrhn n |tksX|tkr`ttfS ttfS |	|
  kr|dkrn n |tks|tkrttfS ttfS |dkrh|	dkrt|||t}t|||t}|tkrt}|tkrt}n||
dkr,t|||t}t|||t}|tkrt}|tkrdt}n8t|||t}t|||t}|tkrVt}|tkrt}n*|dkr4|	dkrt|||t}t|||t}|tkrt}|tkr2t}n||
dkrt|||t}t|||t}|tkrt}|tkr2t}n8t|||t}t|||t}|tkr$t}|tkrt}n^t||t||t||t||g}t|krntt }}n$t|\}}t	||t}t	||t}||fS )NrL   )
r   r   r   r   r'   r   r   r   r   r$   )r;   rC   r<   r=   r>   rF   rG   rV   rW   tastbsrM   rN   Zcasesr@   r@   rA   rY      s~    
  

 
 
 
 


 
 

 
 
 
 $
rY   c             C   s   | \}}t |tr0t|||t}t|||t}nRt|trXt|||t}t|||t}n*t|}t||g\}}t}t|||t}||fS )N)r   r   r'   r   r   r   r#   r   )r;   r<   r=   r>   rM   rN   r@   r@   rA   
mpi_square   s    

r_   c             C   s  | \}}|\}}t |}t |}t |}	t |}
||  krDdkrxn n0|	dk rX|
dksh|	dksh|
dkrpttfS ttfS |	dk r|
dkrttfS |	dk rtt| t||S |	dkr|dk r|dkrttfS |	|
krttfS |dkrt|||t}t}|dkrt}t|||t}n|dkrZt|||t}t|||t}|t	krJt}|t	krt}n||dkrt|||t}t|||t}|t	krt}|t	krt}n8t|||t}t|||t}|t	krt}|t	krt}||fS )NrL   )
r   r   r   r   r[   rU   r)   r   r   r   )r;   rC   r<   r=   r>   rF   rG   rV   rW   r]   r^   rM   rN   r@   r@   rA   r[      s\     



 
 

 
 
 
 r[   c             C   s   t | t}t | t}||fS )N)r3   r   r   )r<   rM   rN   r@   r@   rA   mpi_pi  s    

r`   c             C   s(   | \}}t ||t}t ||t}||fS )N)r/   r   r   )r;   r<   r=   r>   rM   rN   r@   r@   rA   mpi_exp  s    ra   c             C   s(   | \}}t ||t}t ||t}||fS )N)r.   r   r   )r;   r<   r=   r>   rM   rN   r@   r@   rA   mpi_log  s    rb   c             C   s(   | \}}t ||t}t ||t}||fS )N)r0   r   r   )r;   r<   r=   r>   rM   rN   r@   r@   rA   mpi_sqrt$  s    rc   c             C   s(   | \}}t ||t}t ||t}||fS )N)r1   r   r   )r;   r<   r=   r>   rM   rN   r@   r@   rA   mpi_atan+  s    rd   c       	      C   s  | \}}|dk r.t ttft| | |d |S |dkr>ttfS |dkrJ| S |dkr\t| |S |d@ rt|||t}t|||t}nt|}t|}|dkrt|||t}t|||t}n\|dkrt|||t}t|||t}n6t}t	|}t
||rt|||t}nt|||t}||fS )NrL      r      )r[   r   mpi_pow_intr_   r+   r   r   r   r   r#   r   )	r;   nr<   r=   r>   rM   rN   rV   rW   r@   r@   rA   rg   1  s4    
rg   c             C   sv   |\}}||krN|t tfkrN|tt|kr<t| t||S |tkrNt| |S t| |d }t|||d }t	||S )Nre   )
r   r   r   r   rg   r   rc   rb   rY   ra   )r;   rC   r<   rF   rG   uvr@   r@   rA   mpi_powV  s    
rk   c             C   s   t | |r| S |S )N)r   )xyr@   r@   rA   MINa  s    
rn   c             C   s   t | |r| S |S )N)r   )rl   rm   r@   r@   rA   MAXf  s    
ro   c             C   sZ   | \}}}}| t krtt dfS t| |\}}t|||| d\}}	}
|rPd|	 }	|||	fS )NrL      rR   )r   r   r5   r4   )rl   wpsignmanexpbccr;   rC   rh   Zwp_r@   r@   rA   cos_sin_quadrantk  s    
rw   c                s  | \}}||  krt kr0n nttft t ffS t| ks@t| krPttfttffS d }t||\}}}t||\}}	}
t||g\}}t||	g\}}	||
krn|
| dkrttfttffS |d |
d krt}|d d |
d d krt}|d d |
d d krt}	|d d |
d d kr*t}tt|> td>  | tt|> td>  |   fdd}||t	}||t
}||t	}||	t
}	||f||	ffS )	Nre      rf   r      
   c                sT   t | d |tkkr}n }t| ||} | \}}}}|| dkrP|rLtS tS | S )NrL   r   )boolr   r'   r   r   )rj   Zroundingprr   rs   rt   ru   )lessmorer<   r@   rA   finalize  s    zmpi_cos_sin.<locals>.finalize)r   r   r   r   r   rw   r   r,   r-   r   r   )rl   r<   rM   rN   rq   Zcar=   Znacbr>   Znbr   r@   )r}   r~   r<   rA   mpi_cos_sinv  s<    



r   c             C   s   t | |d S )NrL   )r   )rl   r<   r@   r@   rA   mpi_cos  s    r   c             C   s   t | |d S )Nr   )r   )rl   r<   r@   r@   rA   mpi_sin  s    r   c             C   s   t | |d \}}t|||S )Nre   )r   r[   )rl   r<   cossinr@   r@   rA   mpi_tan  s    r   c             C   s   t | |d \}}t|||S )Nre   )r   r[   )rl   r<   r   r   r@   r@   rA   mpi_cot  s    r   c       	      C   s   |d }t | |t}t | |t}t ||t}t|ts:t|rlttt|t|||t}t	|t
d|t}t|||t}t|||t}||fS )Nre   d   )r!   r   r   r   r   AssertionErrorr'   ro   r"   r)   r   r&   r%   )	rl   rm   percentr<   rq   xaxbrM   rN   r@   r@   rA   mpi_from_str_a_b  s    r   c       
      C   s  t d|  }| dd} |d }d| krD| d\}}t||d|S d| kr| d dks`d	| krd|| d	d} d}d
| kr| d d
kr|d}| d
d} | d\}}t||||S d| krd| ksd| kr|| d dkr*| dd} | dd} | d\}}t||t}t||t}||fS | d\}}|d\}}	d| kr`|	d\}	}n|	dd }	}t|| | |t}t||	 | |t}||fS n t| |t}t| |t}||fS dS )a  
    Parse an interval number given as a string.

    Allowed forms are

    "-1.23e-27"
        Any single decimal floating-point literal.
    "a +- b"  or  "a (b)"
        a is the midpoint of the interval and b is the half-width
    "a +- b%"  or  "a (b%)"
        a is the midpoint of the interval and the half-width
        is b percent of a (`a 	imes b / 100`).
    "[a, b]"
        The interval indicated directly.
    "x[y,z]e"
        x are shared digits, y and z are unequal digits, e is the exponent.

    z&Improperly formed interval number '%s'  re   z+-F(rL   )%rR   T,[]eN)
ValueErrorreplacesplitr   r!   r   r   rstrip)
r;   r<   r   rq   rl   rm   r   rM   rN   zr@   r@   rA   mpi_from_str  sN    


r   T[]bracketsrx   c             K   s  t |}|d }| \}	}
t| |}t| |}t|	|f|}t|
|f|}t||f|}d}|rbd}|\}}|dkrtt|d|f|}|| d | | }n|dkr|tkrt}n$t|td}t|t|td	|}|| d
 t|| d }n|dkr|| d | | | }n|dkr||krTt|	|d f|}t|
|d f|}|	d}	t
|	dkrv|	d |	d}
t
|
dkr|
d |	d |
d kr|	d |
d krXx:tt
|	d d D ]"}|	d | |
d | krP qW |	d d| | |	d |d  d | |
d |d  | dtt
|	d d  |	d  }n.|	d | | dtt
|	d d  |	d  }n$|d|	 d | d|
 | }ntd| |S )a  
    Convert a mpi interval to a string.

    **Arguments**

    *dps*
        decimal places to use for printing
    *use_spaces*
        use spaces for more readable output, defaults to true
    *brackets*
        pair of strings (or two-character string) giving left and right brackets
    *mode*
        mode of display: 'plusminus', 'percent', 'brackets' (default) or 'diff'
    *error_dps*
        limit the error to *error_dps* digits (mode 'plusminus and 'percent')

    Additional keyword arguments are forwarded to the mpf-to-string conversion
    for the components of the output.

    **Examples**

        >>> from mpmath import mpi, mp
        >>> mp.dps = 30
        >>> x = mpi(1, 2)._mpi_
        >>> mpi_to_str(x, 2, mode='plusminus')
        '1.5 +- 0.5'
        >>> mpi_to_str(x, 2, mode='percent')
        '1.5 (33.33%)'
        >>> mpi_to_str(x, 2, mode='brackets')
        '[1.0, 2.0]'
        >>> mpi_to_str(x, 2, mode='brackets' , brackets=('<', '>'))
        '<1.0, 2.0>'
        >>> x = mpi('5.2582327113062393041', '5.2582327113062749951')._mpi_
        >>> mpi_to_str(x, 15, mode='diff')
        '5.2582327113062[4, 7]'
        >>> mpi_to_str(mpi(0)._mpi_, 2, mode='percent')
        '0.0 (0.0%)'

    re   r   r   Z	plusminusrR   z+-r   r   rf   r   z%)r   r   Zdiffry   r   r   rL   Nz%'%s' is unknown mode for printing mpi)r   rS   rQ   r    r*   r   r'   r   r)   r   lenappendr   minjoinr   )rl   r?   Z
use_spacesr   modeZ	error_dpskwargsr<   rq   rM   rN   ZmidZdeltaZa_strZb_strZmid_strZspZbr1Zbr2Z	delta_strr;   r|   ir@   r@   rA   
mpi_to_str  sV    (








`0&r   c             C   s(   | \}}|\}}t |||t |||fS )N)rO   )rl   rm   r<   rM   rN   rv   dr@   r@   rA   mpci_addd  s    r   c             C   s(   | \}}|\}}t |||t |||fS )N)rP   )rl   rm   r<   rM   rN   rv   r   r@   r@   rA   mpci_subi  s    r   c             C   s   | \}}t ||t ||fS )N)rU   )rl   r<   rM   rN   r@   r@   rA   mpci_negn  s    r   c             C   s   | \}}t ||t ||fS )N)rT   )rl   r<   rM   rN   r@   r@   rA   mpci_posr  s    r   c             C   sX   | \}}|\}}t ||}t ||}t|||}	t ||}
t ||}t|
||}|	|fS )N)rY   rP   rO   )rl   rm   r<   rM   rN   rv   r   Zr1Zr2reZi1Zi2imr@   r@   rA   mpci_mulv  s    



r   c             C   s   | \}}|\}}|d }t |}t |}	t||	|}
tt||t|||}tt||t|||}t||
|}t||
|}||fS )Nre   )r_   rO   rY   rP   r[   )rl   rm   r<   rM   rN   rv   r   rq   Zm1Zm2mr   r   r@   r@   rA   mpci_div  s    r   c             C   sH   | \}}|d }t ||}t||\}}t|||}t|||}||fS )Nre   )ra   r   rY   )rl   r<   rM   rN   rq   rrv   r;   r@   r@   rA   mpci_exp  s    
r   c             C   s   | \}}t ||t ||fS )N)r*   )rl   rh   rM   rN   r@   r@   rA   	mpi_shift  s    r   c             C   sR   |d }t | |}tt||}t|||}t|||}t|d}t|d}||fS )Nre   rR   )ra   r[   mpi_onerO   rP   r   )rl   r<   rq   Ze1Ze2rv   r;   r@   r@   rA   mpi_cosh_sinh  s    


r   c             C   sP   | \}}|d }t ||\}}t||\}}t|||}	t|||}
|	t|
fS )Nrz   )r   r   rY   rU   )rl   r<   rM   rN   rq   rv   r;   chshr   r   r@   r@   rA   mpci_cos  s    r   c             C   sL   | \}}|d }t ||\}}t||\}}t|||}	t|||}
|	|
fS )Nrz   )r   r   rY   )rl   r<   rM   rN   rq   rv   r;   r   r   r   r   r@   r@   rA   mpci_sin  s    r   c             C   sR   | \}}|t krt|S |t kr(t|S t|}t|}t|||d }t||S )Nre   )mpi_zerorX   r_   rO   rc   )rl   r<   rM   rN   rC   r@   r@   rA   mpci_abs  s    r   c       	      C   s<  | \}}|\}}||  kr$t kr>n nt|t r6tS t|S t|t rt|t rbt|||t}nt|||t}t|t rt|||t}nt|||t}nt|t rt|||t}t|t rt|||t}nt|||t}nXt|t r"t|||t}t|t rt|||t}nt|||t}nt|t}t	|}||fS )N)
r   r   r   r`   r2   r   r   r   r3   r#   )	rm   rl   r<   yaybr   r   rM   rN   r@   r@   rA   	mpi_atan2  s4    






r   c             C   s   | \}}t |||S )N)r   )r   r<   rl   rm   r@   r@   rA   mpci_arg  s    r   c             C   s.   | \}}t t| |d |}t| |}||fS )Nre   )rb   r   r   )r   r<   rl   rm   r   r   r@   r@   rA   mpci_log  s    
r   c             C   s   |\}}|t krh|\}}||krh|\}}}	}
|rT|	dkrTt| d| t||	>  |S |tkrht| d|S |d }tt|t| |||S )NrL   rR   re   )r   mpci_pow_intintr   r   r   r   )rl   rm   r<   ZyreZyimr   r   rr   rs   rt   ru   rq   r@   r@   rA   mpci_pow  s    r   c             C   s:   | \}}t t|t||}t|||}t|d}||fS )Nr   )rP   r_   rY   r   )rl   r<   rM   rN   r   r   r@   r@   rA   mpci_square  s
    
r   c             C   s   |dk r&t ttft| | |d |S |dkr6ttfS |dkrHt| |S |dkrZt| |S |d }ttf}x6|r|d@ rt|| |}|d8 }t| |} |dL }qlW t||S )NrL   re   r   rf   )r   r   r   r   r   r   r   )rl   rh   r<   rq   resultr@   r@   rA   r     s"    


r   g#+Vcb?gVcb?gg?c             C   s0   | \}}|\}}t ||rdS t||r,dS dS )NFT)r   r   )rl   rm   rM   rN   rv   r   r@   r@   rA   mpi_overlap&  s    
 
 r   c       	      C   s  | \}}|d }|dkr,t t| t||dS t|tr|dkrXt||t}t||t}nB|dkrzt||t}t||t}n |dkrt	||t}t	||t}nt|t
rt|tr|dkrt||t}t||t}nD|dkrt||t}t||t}n"|dkrt	||t}t	||t}n|t| t|}|dkrJtt ||d d| |S |dkrltt ||d d| |S |dkrtt ||d dt| |d |S ||fS )Nre   r   rL   rf   ry   )	mpi_gammarO   r   r   gamma_min_br6   r   r   r7   r8   r   r   gamma_min_ar[   rY   rP   rb   )	r   r<   typerM   rN   rq   rv   r   znewr@   r@   rA   r   2  s@    


 
 
 "r   c             C   s  | \\}}\}}||  kr$t krJn n"|dks:t|t rJt| ||tfS |d }|dkr|d |d  }|d |d  }	|t krt||	}
n|	}
tt|}tt|}t||}td||
 }|t|7 }|dkrt||ft	|\}}||f||ff} d}t
|trt||fttfrt||ft	|||ff}|dkrXtt||d d| |S |dkrztt||d d| |S |dkrtt||d dt| |d |S t|t rt||f|t}t||f|t}t||f|t}t||f|t}nt|t rBt||f|t}t||f|t}t||f|t}t||f|t}nbt|t f|t}tt||rtt||f|t}nt||f|t}t||f|t}t||f|t}|d |d f|d |d ff}|dkrt|d |t|d |fS |dkrt|}t||S )Nry   re   rf   rL   r   )r   r   r   r   maxabsr   r   rO   r   r   r   r   gamma_mono_imag_agamma_mono_imag_br   
mpci_gammar   r   r   r   r9   r   r   r   r#   rT   r   r   )r   r<   r   Za1Za2Zb1Zb2rq   ZamagZbmagZmagZanZbnZabsnZ
gamma_sizer   ZminreZmaxreZminimZmaximwr@   r@   rA   r   W  sd    *
 
 
 
 " 

r   c             C   s   t | |ddS )Nry   )r   )r   )r   r<   r@   r@   rA   mpi_loggamma  s    r   c             C   s   t | |ddS )Nry   )r   )r   )r   r<   r@   r@   rA   mpci_loggamma  s    r   c             C   s   t | |ddS )Nrf   )r   )r   )r   r<   r@   r@   rA   
mpi_rgamma  s    r   c             C   s   t | |ddS )Nrf   )r   )r   )r   r<   r@   r@   rA   mpci_rgamma  s    r   c             C   s   t | |ddS )Nr   )r   )r   )r   r<   r@   r@   rA   mpi_factorial  s    r   c             C   s   t | |ddS )Nr   )r   )r   )r   r<   r@   r@   rA   mpci_factorial  s    r   N)rL   )rL   )rL   )rL   )rL   )rL   )Tr   r   rx   )rL   )rL   )rL   )__doc__Zbackendr   Zlibmpfr   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-   Z	libelefunr.   r/   r0   r1   r2   r3   r4   r5   Z	gammazetar6   r7   r8   r9   rB   r   r   rD   rE   rH   rI   rJ   rK   rO   rP   rQ   rS   rT   rU   rX   rZ   r\   rY   r_   r[   r`   ra   rb   rc   rd   rg   rk   rn   ro   rw   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   Z	gamma_minr   r   r   r   r   r   r   r   r   r   r   r@   r@   r@   rA   <module>   s   (	
	
	


D
;%4B
\
			&
%
I