U
    ZÊ¹jûh  ã                	   @   s°  d Z ddlZddlmZmZmZmZ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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZR e efZSeefZTe!efZUe"efZVe#e$fZWe#e$e%fZXdd„ ZYd	d
„ ZZdd„ Z[defdd„Z\dd„ Z]efdd„Z^dd„ Z_efdd„Z`efdd„Zadefdd„Zbdefdd„Zcefdd„Zddefd d!„Zed"d#„ Zfefd$d%„Zgefd&d'„Zhefd(d)„Ziefd*d+„Zjefd,d-„Zkefd.d/„Zlefd0d1„Zmefd2d3„Znefd4d5„Zoefd6d7„Zpefd8d9„Zqefd:d;„Zrefd<d=„Zsefd>d?„Ztefd@dA„ZudBdC„ ZvefdDdE„ZwefdFdG„ZxefdHdI„ZyefdJdK„ZzdLdM„ Z{efdNdO„Z|efdPdQ„Z}efdRdS„Z~efdTdU„ZefdVdW„Z€efdXdY„Z�efdZd[„Z‚efd\d]„Zƒefd^d_„Z„efd`da„Z…efdbdc„Z†efddde„Z‡efdfdg„Zˆefdhdi„Z‰efdjdk„ZŠedlƒZ‹edmƒZŒdndo„ Z�efdpdq„ZŽefdrds„Z�efdtdu„Z�efdvdw„Z‘efdxdy„Z’efdzd{„Z“d‡d}d~„Z”dˆdd€„Z•d‰d�d‚„Z–dŠdƒd„„Z—ed…k�r¬z(ddl˜m™  mš  m›Zœ eœj~Z~eœjzZzW n" e�ežfk
�rª   eŸd†ƒ Y nX dS )‹z-
Low-level functions for complex arithmetic.
é    Né   )ÚMPZÚMPZ_ZEROÚMPZ_ONEÚMPZ_TWOÚBACKEND)1Úround_floorÚround_ceilingÚ
round_downÚround_upÚround_nearestÚ
round_fastÚbitcountÚbctableÚ	normalizeÚ
normalize1Úreciprocal_rndÚrshiftÚlshiftÚgiant_stepsÚnegative_rndÚto_strÚto_fixedÚfrom_man_expÚ
from_floatÚto_floatÚfrom_intÚto_intÚfzeroÚfoneÚftwoÚfhalfÚfinfÚfninfÚfnanÚfnoneÚmpf_absÚmpf_posÚmpf_negÚmpf_addÚmpf_subÚmpf_mulÚmpf_divÚmpf_mul_intÚ	mpf_shiftÚmpf_sqrtÚ	mpf_hypotÚmpf_rdiv_intÚ	mpf_floorÚmpf_ceilÚmpf_nintÚmpf_fracÚmpf_signÚmpf_hashÚComplexResult)Úmpf_piÚmpf_expÚmpf_logÚmpf_cos_sinÚmpf_cosh_sinhÚmpf_tanÚmpf_pow_intÚmpf_log_hypotÚmpf_cos_sin_piÚmpf_phiÚmpf_cosÚmpf_sinÚ
mpf_cos_piÚ
mpf_sin_piÚmpf_atanÚ	mpf_atan2Úmpf_coshÚmpf_sinhÚmpf_tanhÚmpf_asinÚmpf_acosÚ	mpf_acoshÚmpf_nthrootÚmpf_fibonaccic                 C   s$   | \}}|t krdS |t kr dS dS )z2Check if either real or imaginary part is infiniteTF)Ú_infs©ÚzÚreÚim© rV   úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mpmath/libmp/libmpc.pyÚ
mpc_is_inf)   s      rX   c                 C   s$   | \}}|t krdS |t kr dS dS )z9Check if either real or imaginary part is infinite or nanTF)Ú	_infs_nanrR   rV   rV   rW   Úmpc_is_infnan0   s      rZ   c                 K   sV   | \}}t ||ƒ}|d r8|d t t|ƒ|f|Ž d S |d t ||f|Ž d S d S )Nr   z - Újz + )r   r(   )rS   ZdpsÚkwargsrT   rU   ÚrsrV   rV   rW   Ú
mpc_to_str7   s
    
r^   Fc                 C   s"   | \}}t t|||ƒt|||ƒƒS ©N)Úcomplexr   )rS   ÚstrictÚrndrT   rU   rV   rV   rW   Úmpc_to_complex?   s    rc   c                 C   sv   t jdkrB| \}}t|ƒt jjt|ƒ  }|dt jj  }t|ƒS ztt| dd�ƒW S  t	k
rp   t| ƒ Y S X d S )N)é   é   re   T)ra   )
ÚsysÚversion_infor7   Ú	hash_infoÚimagÚwidthÚintÚhashrc   ÚOverflowError)rS   rT   rU   ÚhrV   rV   rW   Úmpc_hashC   s    
ro   c                 C   s   | \}}|t |||ƒfS r_   ©r(   ©rS   Úprecrb   rT   rU   rV   rV   rW   Úmpc_conjugateP   s    rs   c                 C   s   | t kS r_   )Úmpc_zero)rS   rV   rV   rW   Úmpc_is_nonzeroT   s    ru   c                 C   s,   | \}}|\}}t ||||ƒt ||||ƒfS r_   ©r)   ©rS   Úwrr   rb   ÚaÚbÚcÚdrV   rV   rW   Úmpc_addW   s    r}   c                 C   s   | \}}t ||||ƒ|fS r_   rv   )rS   Úxrr   rb   ry   rz   rV   rV   rW   Úmpc_add_mpf\   s    r   c                 C   s,   | \}}|\}}t ||||ƒt ||||ƒfS r_   ©r*   rw   rV   rV   rW   Úmpc_sub`   s    r�   c                 C   s   | \}}t ||||ƒ|fS r_   r€   )rS   Úprr   rb   ry   rz   rV   rV   rW   Úmpc_sub_mpfe   s    rƒ   c                 C   s    | \}}t |||ƒt |||ƒfS r_   )r'   ©rS   rr   rb   ry   rz   rV   rV   rW   Úmpc_posi   s    r…   c                 C   s    | \}}t |||ƒt |||ƒfS r_   rp   r„   rV   rV   rW   Úmpc_negm   s    r†   c                 C   s   | \}}t ||ƒt ||ƒfS r_   )r.   )rS   Únry   rz   rV   rV   rW   Ú	mpc_shiftq   s    rˆ   c                 C   s   | \}}t ||||ƒS )zEAbsolute value of a complex number, |a+bi|.
    Returns an mpf value.)r0   r„   rV   rV   rW   Úmpc_absu   s    r‰   c                 C   s   | \}}t ||||ƒS )z3Argument of a complex number. Returns an mpf value.)rH   r„   rV   rV   rW   Úmpc_arg{   s    rŠ   c                 C   s    | \}}t |||ƒt |||ƒfS r_   )r2   r„   rV   rV   rW   Ú	mpc_floor€   s    r‹   c                 C   s    | \}}t |||ƒt |||ƒfS r_   )r3   r„   rV   rV   rW   Úmpc_ceil„   s    rŒ   c                 C   s    | \}}t |||ƒt |||ƒfS r_   )r4   r„   rV   rV   rW   Úmpc_nintˆ   s    r�   c                 C   s    | \}}t |||ƒt |||ƒfS r_   )r5   r„   rV   rV   rW   Úmpc_fracŒ   s    rŽ   c                 C   s\   | \}}|\}}t ||ƒ}t ||ƒ}	t ||ƒ}
t ||ƒ}t||	||ƒ}t|
|||ƒ}||fS )zÎ
    Complex multiplication.

    Returns the real and imaginary part of (a+bi)*(c+di), rounded to
    the specified precision. The rounding mode applies to the real and
    imaginary parts separately.
    )r+   r*   r)   )rS   rx   rr   rb   ry   rz   r{   r|   r‚   ÚqÚrÚsrT   rU   rV   rV   rW   Úmpc_mul‘   s    



r’   c           
      C   sJ   | \}}t ||ƒ}t ||ƒ}t ||||ƒ}t||||ƒ}t|dƒ}	||	fS ©Nr   )r+   r*   r.   )
rS   rr   rb   ry   rz   r‚   r�   r�   rT   rU   rV   rV   rW   Ú
mpc_square£   s    


r”   c                 C   s,   | \}}t ||||ƒ}t ||||ƒ}||fS r_   )r+   ©rS   r‚   rr   rb   ry   rz   rT   rU   rV   rV   rW   Úmpc_mul_mpf­   s    r–   c                 C   s0   | \}}t t||||ƒƒ}t||||ƒ}||fS )zB
    Multiply the mpc value z by I*x where x is an mpf value.
    )r(   r+   )rS   r~   rr   rb   ry   rz   rT   rU   rV   rV   rW   Úmpc_mul_imag_mpf³   s    r—   c                 C   s,   | \}}t ||||ƒ}t ||||ƒ}||fS r_   )r-   )rS   r‡   rr   rb   ry   rz   rT   rU   rV   rV   rW   Úmpc_mul_int¼   s    r˜   c                 C   s|   | \}}|\}}|d }t t||ƒt||ƒ|ƒ}	t t||ƒt||ƒ|ƒ}
tt||ƒt||ƒ|ƒ}t|
|	||ƒt||	||ƒfS ©Né
   )r)   r+   r*   r,   )rS   rx   rr   rb   ry   rz   r{   r|   ÚwpÚmagÚtÚurV   rV   rW   Úmpc_divÂ   s    rŸ   c                 C   s,   | \}}t ||||ƒ}t ||||ƒ}||fS )zCalculate z/p where p is real)r,   r•   rV   rV   rW   Úmpc_div_mpfÍ   s    r    c                 C   sL   | \}}t t||ƒt||ƒ|d ƒ}t||||ƒ}tt||||ƒƒ}||fS )zCalculate 1/z efficientlyrš   ©r)   r+   r,   r(   )rS   rr   rb   ry   rz   ÚmrT   rU   rV   rV   rW   Úmpc_reciprocalÔ   s
    r£   c           	      C   sX   |\}}t t||ƒt||ƒ|d ƒ}tt|| ƒ|||ƒ}ttt|| ƒƒ|||ƒ}||fS )z)Calculate p/z where p is real efficientlyrš   r¡   )	r‚   rS   rr   rb   ry   rz   r¢   rT   rU   rV   rV   rW   Úmpc_mpf_divÜ   s
    r¤   c                 C   sn   d}d}|rf|d@ r>||  ||  ||  ||   }}|d8 }| |  ||  d|  |  } }|d }q||fS )zgComplex integer power: computes (a+b*I)**n exactly for
    nonnegative n (a and b must be Python ints).r   r   re   rV   )ry   rz   r‡   ZwreZwimrV   rV   rW   Úcomplex_int_powä   s    "
r¥   c                 C   s@   |d t krt| |d ||ƒS ttt| |d ƒ||d ƒ||ƒS )Nr   r   rš   )r   Úmpc_pow_mpfÚmpc_expr’   Úmpc_log)rS   rx   rr   rb   rV   rV   rW   Úmpc_powñ   s    r©   c           	      C   s|   |\}}}}|dkr.t | d| ||>  ||ƒS |dkrZt| |d ƒ}t |d| | ||ƒS ttt| |d ƒ||d ƒ||ƒS )Nr   éÿÿÿÿrš   )Úmpc_pow_intÚmpc_sqrtr§   r–   r¨   )	rS   r‚   rr   rb   ZpsignZpmanZpexpZpbcZsqrtzrV   rV   rW   r¦   ö   s    r¦   c                 C   sÚ  | \}}|t kr"t||||ƒt fS |t krˆt||||ƒ}|d; }|dkrP|t fS |dkr`t |fS |dkrtt|ƒt fS |dkrˆt t|ƒfS |dkr”tS |dkr¨t| ||ƒS |dkr¼t| ||ƒS |dkrÐt| ||ƒS |dk ròtt| | |d ƒ||ƒS |\}}}	}
|\}}}}|�r| }|�r"| }|	| }t|ƒ}||t	|
|ƒ  }|dk �r¸|dk�rf||K }|}	n|| K }|	}t
|||ƒ\}}t|t||	 ƒ||ƒ}t|t|| ƒ||ƒ}||fS ttt| |d ƒ||d ƒ||ƒS )	Né   r   r   re   rd   rª   i'  rš   )r   r?   r(   Úmpc_oner…   r”   r£   r«   ÚabsÚmaxr¥   r   rk   r§   r˜   r¨   )rS   r‡   rr   rb   ry   rz   ÚvÚasignÚamanÚaexpÚabcÚbsignÚbmanÚbexpÚbbcÚdeZabs_deZ
exact_sizerT   rU   rV   rV   rW   r«   ÿ   sX           


r«   c                 C   s$  | \}}|t krT|t kr ||fS |d r@tt|ƒ||ƒ}t |fS t|||ƒ}|t fS |d }|d s´tt||f|ƒ||ƒ}t|dƒ}	t|	||ƒ}t|dƒ}
t|
|ƒ}t||||ƒ}nhtt||f|ƒ||ƒ}t|dƒ}	t|	||ƒ}t|dƒ}
t|
|ƒ}t||||ƒ}|d �rt|ƒ}t|ƒ}||fS )z¥Complex square root (principal branch).

    We have sqrt(a+bi) = sqrt((r+a)/2) + b/sqrt(2*(r+a))*i where
    r = abs(a+bi), when a+bi is not a negative real number.r   é   rª   r   )r   r/   r(   r)   r‰   r.   r,   r*   )rS   rr   rb   ry   rz   rU   rT   r›   r�   rž   r±   rx   rV   rV   rW   r¬   '  s6    






r¬   c                 C   sú  d}t t| |||  ƒƒ}t t||||  ƒƒ}z<|d|  d|  }|j}|j}	tt |ƒƒ}tt |	ƒƒ}	W nd tk
rÐ   t||ƒ}t||ƒ}t|ƒ}
td|
|ƒ}t||f|t	f|ƒ\}}	t
|ƒ}t
|	ƒ}	Y nX d}|}|}t||| ƒD �]}t||	|d ƒ\}}t||d | | | ƒ}t||d | | | ƒ}|| ||  || ? }t| || ƒ}t||| ƒ}|| ||  |? }| | ||  |? }||> | }||> | }||d t||| ƒ  | }||d t|	|| ƒ  | }	|}qì||	fS )Né2   y              ð?g      ð?r   rš   )rk   r   Úrealri   r   rm   r   r1   r©   r   r   r   r¥   r   )ry   rz   r‡   rr   ÚstartZa1Úb1r�   rT   rU   ÚfnÚnthÚextraZprevpZextra1r‚   Zre2Zim2Zr4ÚapÚbpZrecZimcZrebZimbrV   rV   rW   Úmpc_nthroot_fixedK  sF    

rÅ   c                 C   sî  | \}}|d dkr2|t kr2t||||ƒ}|t fS |dk r¢|dkrFtS |dkr^t||f||ƒS |dkrxtt||f||ƒS t||f| |d t| ƒ}tt|||ƒS |dk�rhtd|d  ƒ}|\}	}
}}|\}}}}t||f|ƒ}|d	 |d  d
k�rh|d	 |d  |k �rht	||ƒ}t	||ƒ}t
||||ƒ\}}d}t|| | ||ƒ}t|| | ||ƒ}||fS t|ƒ}|d d }td||ƒ}t||f|t f||ƒ\}}t|d |d |d |d ||ƒ}t|d |d |d |d ||ƒ}||fS )zu
    Complex n-th root.

    Use Newton method as in the real case when it is faster,
    otherwise use z**(1/n)
    r   re   r   rª   é   r»   g333333ó?rš   éþÿÿÿiöÿÿÿrd   )r   rO   r®   r…   rŸ   Úmpc_nthrootr   rk   r‰   r   rÅ   r   r   r1   r©   r   )rS   r‡   rr   rb   ry   rz   rT   ZinverseZprec2r²   r³   r´   rµ   r¶   r·   r¸   r¹   ÚpfÚafÚbfrU   rÂ   rÀ   rÁ   rV   rV   rW   rÈ   r  sB    
,

""rÈ   c                 C   s   t | d||ƒS )z
    Complex cubic root.
    rd   )rÈ   ©rS   rr   rb   rV   rV   rW   Úmpc_cbrt›  s    rÍ   c           
      C   s|   | \}}|t krt|||ƒS |t kr4t|||ƒt fS t||d |ƒ}t||d |ƒ\}}t||||ƒ}t||||ƒ}	||	fS )av  
    Complex exponential function.

    We use the direct formula exp(a+bi) = exp(a) * (cos(b) + sin(b)*i)
    for the computation. This formula is very nice because it is
    pefectly stable; since we just do real multiplications, the only
    numerical errors that can creep in are single-ulp rounding errors.

    The formula is efficient since mpmath's real exp is quite fast and
    since we can compute cos and sin simultaneously.

    It is no problem if a and b are large; if the implementations of
    exp/cos/sin are accurate and efficient for all real numbers, then
    so is this function for all complex numbers.
    r­   )r   r<   r:   r+   )
rS   rr   rb   ry   rz   rœ   r{   r‘   rT   rU   rV   rV   rW   r§   ¡  s    r§   c                 C   s*   t | d | d ||ƒ}t| ||ƒ}||fS )Nr   r   )r@   rŠ   rq   rV   rV   rW   r¨   ¼  s    r¨   c                 C   s„   | \}}|t kr t|||ƒt fS |t kr8t|||ƒt fS |d }t||ƒ\}}t||ƒ\}}	t||||ƒ}
t||	||ƒ}|
t|ƒfS )aS  Complex cosine. The formula used is cos(a+bi) = cos(a)*cosh(b) -
    sin(a)*sinh(b)*i.

    The same comments apply as for the complex exp: only real
    multiplications are pewrormed, so no cancellation errors are
    possible. The formula is also efficient since we can compute both
    pairs (cos, sin) and (cosh, sinh) in single stwps.é   )r   rC   rI   r<   r=   r+   r(   ©rS   rr   rb   ry   rz   r›   r{   r‘   ÚchÚshrT   rU   rV   rV   rW   Úmpc_cosÁ  s    rÒ   c                 C   s€   | \}}|t kr t|||ƒt fS |t kr8t t|||ƒfS |d }t||ƒ\}}t||ƒ\}}	t||||ƒ}
t||	||ƒ}|
|fS )zƒComplex sine. We have sin(a+bi) = sin(a)*cosh(b) +
    cos(a)*sinh(b)*i. See the docstring for mpc_cos for additional
    comments.rÎ   )r   rD   rJ   r<   r=   r+   rÏ   rV   rV   rW   Úmpc_sinÕ  s    rÓ   c                 C   s¸   | \}}|\}}}}|\}	}
}}|t kr8t|||ƒt fS |t krPt t|||ƒfS |d }t|dƒ}t|dƒ}t||ƒ\}}t||ƒ\}}t|||ƒ}t||||ƒ}t||||ƒ}||fS )zcComplex tangent. Computed as tan(a+bi) = sin(2a)/M + sinh(2b)/M*i
    where M = cos(2a) + cosh(2b).é   r   )r   r>   rK   r.   r<   r=   r)   r,   )rS   rr   rb   ry   rz   r²   r³   r´   rµ   r¶   r·   r¸   r¹   r›   r{   r‘   rÐ   rÑ   rœ   rT   rU   rV   rV   rW   Úmpc_tanå  s       

rÕ   c                 C   sœ   | \}}|t kr t|||ƒt fS t|t|d ƒ|d ƒ}|t krPt|||ƒt fS |d }t||ƒ\}}t||ƒ\}}	t||||ƒ}
t||	||ƒ}|
t|ƒfS ©NrÆ   rÎ   )r   rE   r+   r9   rI   rA   r=   r(   rÏ   rV   rV   rW   Ú
mpc_cos_piø  s    r×   c                 C   s˜   | \}}|t kr t|||ƒt fS t|t|d ƒ|d ƒ}|t krPt t|||ƒfS |d }t||ƒ\}}t||ƒ\}}	t||||ƒ}
t||	||ƒ}|
|fS rÖ   )r   rF   r+   r9   rJ   rA   r=   rÏ   rV   rV   rW   Ú
mpc_sin_pi  s    rØ   c                 C   sÈ   | \}}|t kr0t|||ƒ\}}|t ft |ffS |t krXt|||ƒ\}}|t f|t ffS |d }	t||	ƒ\}}t||	ƒ\}}t||||ƒ}
t||||ƒ}t||||ƒ}t||||ƒ}|
t|ƒf||ffS )NrÎ   )r   r=   r<   r+   r(   )rS   rr   rb   ry   rz   rÐ   rÑ   r{   r‘   r›   ÚcreÚcimÚsreÚsimrV   rV   rW   Úmpc_cos_sin  s    rÝ   c                 C   sà   | \}}|t kr0t|||ƒ\}}|t f|t ffS t|t|d ƒ|d ƒ}|t krpt|||ƒ\}}|t ft |ffS |d }	t||	ƒ\}}t||	ƒ\}}t||||ƒ}
t||||ƒ}t||||ƒ}t||||ƒ}|
t|ƒf||ffS rÖ   )r   rA   r+   r9   r=   r(   )rS   rr   rb   ry   rz   r{   r‘   rÐ   rÑ   r›   rÙ   rÚ   rÛ   rÜ   rV   rV   rW   Úmpc_cos_sin_pi%  s     rÞ   c                 C   s   | \}}t |t|ƒf||ƒS )z:Complex hyperbolic cosine. Computed as cosh(z) = cos(z*i).)rÒ   r(   r„   rV   rV   rW   Úmpc_cosh7  s    rß   c                 C   s$   | \}}t ||f||ƒ\}}||fS )z;Complex hyperbolic sine. Computed as sinh(z) = -i*sin(z*i).)rÓ   r„   rV   rV   rW   Úmpc_sinh<  s    rà   c                 C   s$   | \}}t ||f||ƒ\}}||fS )z>Complex hyperbolic tangent. Computed as tanh(z) = -i*tan(z*i).)rÕ   r„   rV   rV   rW   Úmpc_tanhB  s    rá   c                 C   s–   | \}}|d }t t||ƒt|ƒf}tt||ƒ|f}t||ƒ}t||ƒ}	t||	||ƒ\}}tt|dƒƒt|dƒf}
|
d tkr’t| ƒr’|
d t	f}
|
S )NrÔ   rª   r   r   )
r)   r   r(   r*   r¨   r�   r.   r$   rX   r   )rS   rr   rb   ry   rz   r›   r~   ÚyÚl1Úl2r±   rV   rV   rW   Úmpc_atanI  s    

rå   gû:pÎˆä?g      ø?c                 C   s.  | \}}|d }|t krÜttt|ƒ|ƒ}|d sZ|dkrHt|||ƒt fS t|||ƒt fS n‚|d r¤t||ƒ}tt|ƒ||ƒ}	|dkr�|t|	ƒfS tt	|dƒƒ|	fS n8t|||ƒ}	|dkrÀt |	fS t||ƒ}t	|dƒt|	ƒfS d }
}|d røt|ƒ}d}
|d �rt|ƒ}d}tt||ƒ}t
t||ƒ}t|||ƒ}t|||ƒ}t	t
|||ƒdƒ}t|||ƒ}t|||ƒ}tt||ƒd �sž|dk�r�t||ƒ}n
t||ƒ}�n
t
|||ƒ}|d �s,t|t
|||ƒ|ƒ}	t
|||ƒ}t	t|t
|	||ƒ|ƒdƒ}|dk�rttt||ƒ||ƒ|ƒ}ntt|t||ƒ|ƒ|ƒ}n|t|t
|||ƒ|ƒ}	t|t|||ƒ|ƒ}t	t
|	||ƒdƒ}t|t||ƒ|ƒ}|dk�r–tt|||ƒ|ƒ}ntt|||ƒ|ƒ}tt||ƒd �s\t|t
|||ƒ|ƒ}t|ƒd �rt
|||ƒ}t|||ƒ}t	t
|||ƒdƒ}nt|||ƒ}t	t
|||ƒdƒ}t|t
|t|ƒ|ƒ}tt
tt
|t||ƒ|ƒ|ƒ|ƒ}n,ttt|||ƒt|ƒ|ƒ}tt
|||ƒ|ƒ}|
�r²|dk�rªtt|ƒ||ƒ}nt|ƒ}|�sÊ|dk�rÊt|ƒ}|�râ|dk�rât|ƒ}t|d |d |d |d ||ƒ}t|d |d |d |d ||ƒ}||fS )a&   complex acos for n = 0, asin for n = 1
    The algorithm is described in
    T.E. Hull, T.F. Fairgrieve and P.T.P. Tang
    'Implementing the Complex Arcsine and Arcosine Functions
    using Exception Handling',
    ACM Trans. on Math. Software Vol. 23 (1997), p299
    The complex acos and asin can be defined as
    acos(z) = acos(beta) - I*sign(a)* log(alpha + sqrt(alpha**2 -1))
    asin(z) = asin(beta) + I*sign(a)* log(alpha + sqrt(alpha**2 -1))
    where z = a + I*b
    alpha = (1/2)*(r + s); beta = (1/2)*(r - s) = a/alpha
    r = sqrt((a+1)**2 + y**2); s = sqrt((a-1)**2 + y**2)
    These expressions are rewritten in different ways in different
    regions, delimited by two crossovers alpha_crossover and beta_crossover,
    and by abs(a) <= 1, in order to improve the numerical accuracy.
    rš   r   rª   r   re   rd   )r   r*   r   r&   rM   rL   r9   rN   r(   r.   r)   r0   r,   r+   Úbeta_crossoverrG   r/   Úalpha_crossoverr;   r   )rS   rr   rb   r‡   ry   rz   r›   ÚamÚpir{   r²   r¶   rÃ   r�   r‘   ÚalphaÚbetaÚb2rT   ZAxr|   Úc1Úc2ZAm1rU   rV   rV   rW   Ú	acos_asin_  s–    






"
""rï   c                 C   s   t | ||dƒS ©Nr   ©rï   rÌ   rV   rV   rW   Úmpc_acosç  s    rò   c                 C   s   t | ||dƒS r“   rñ   rÌ   rV   rV   rW   Úmpc_asinê  s    ró   c                 C   s,   | \}}t |t|ƒf||ƒ\}}t|ƒ|fS r_   )ró   r(   r„   rV   rV   rW   Ú	mpc_asinhí  s    rô   c                 C   s<   t | ||ƒ\}}|d s |tkr,t|ƒ|fS |t|ƒfS d S rð   )rò   r   r(   r„   rV   rV   rW   Ú	mpc_acoshó  s    rõ   c                 C   sj   |d }t | t|ƒ}tt| |ƒ}t||ƒ}t||ƒ}tt|||ƒdƒ}|d tkrft| ƒrft|d f}|S )NrÔ   rª   r   r   )r}   r®   r�   r¨   rˆ   r$   rX   r   )rS   rr   rb   r›   ry   rz   r±   rV   rV   rW   Ú	mpc_atanhü  s    

rö   c                 C   s´   | \}}|t kr t|||ƒt fS tt|d |d  ƒt|d |d  ƒƒ}|| d }t|ƒ}tt|dƒt|ƒ}t|t f| |ƒ}	t	| |ƒ}
t
|
|	|ƒ}
t|	|
|ƒ}	t|	|||ƒ}	|	S )Nre   rd   r»   r   )r   rP   r°   r¯   rB   r)   r.   r%   r©   r×   rŸ   r�   r    )rS   rr   rb   rT   rU   Úsizer›   ry   rz   rž   r±   rV   rV   rW   Úmpc_fibonacci
  s    *
rø   Úfc                 C   s   t ‚d S r_   ©r8   ©r~   rr   rb   rV   rV   rW   Úmpf_expj  s    rü   c                 C   s€   | \}}|t krt|||ƒS |t kr8tt|ƒ||ƒt fS tt|ƒ|d ƒ}t||d ƒ\}}t||||ƒ}t||||ƒ}||fS r™   )r   r<   r:   r(   r+   )rS   rr   rb   rT   rU   Úeyr{   r‘   rV   rV   rW   Úmpc_expj  s    rþ   c                 C   s   t ‚d S r_   rú   rû   rV   rV   rW   Ú
mpf_expjpi(  s    rÿ   c                 C   s¶   | \}}|t krt|||ƒS |\}}}}|d }	|rF|	td|| ƒ7 }	ttt|	ƒ||	ƒƒ}|t krrt|||ƒt fS t||d ƒ}
t||d ƒ\}}t|
|||ƒ}t|
|||ƒ}||fS )Nrš   r   )r   rA   r°   r(   r+   r9   r:   )rS   rr   rb   rT   rU   ÚsignÚmanÚexpÚbcr›   rý   r{   r‘   rV   rV   rW   Ú
mpc_expjpi+  s    r  Úsagez&Warning: Sage imports in libmpc failed)rù   )rù   )rù   )rù   ) Ú__doc__rf   Úbackendr   r   r   r   r   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/   r0   r1   r2   r3   r4   r5   r6   r7   r8   Z	libelefunr9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r®   rt   Zmpc_twoZmpc_halfrQ   rY   rX   rZ   r^   rc   ro   rs   ru   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æ   rç   rï   rò   ró   rô   rõ   rö   rø   rü   rþ   rÿ   r  Zsage.libs.mpmath.ext_libmpZlibsZmpmathZ	ext_libmpZ_lbmpÚImportErrorÚAttributeErrorÚprintrV   rV   rV   rW   Ú<module>   s¢   Ìh


		($') 		





