U
    ZÊ¹j�  ã                   @   sö  d Z ddlZddlZddlmZmZmZ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/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m-Z-m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN dd	l	mOZO dd
lPmQZQmRZRmSZS G dd„ deTƒZUdd„ ZVedk�r¦dd„ ZVefdd„ZWdd„ ZXefdd„ZYdd„ ZZdd„ Z[dd„ Z\dd„ Z]edfd d!„Z^edfd"d#„Z_efd$d%„Z`efd&d'„Zaedfd(d)„ZbdMd*d+„ZcdNd,d-„Zded.fd/d0„Zeefd1d2„Zfefd3d4„Zgefd5d6„Zhefd7d8„Ziefd9d:„Zjefd;d<„Zkefd=d>„Zlefd?d@„ZmefdAdB„ZnefdCdD„ZoefdEdF„ZpefdGdH„ZqefdIdJ„ZrefdKdL„ZsdS )OzÝ
This module implements computation of hypergeometric and related
functions. In particular, it provides code for generic summation
of hypergeometric series. Optimized versions for various special
cases are also provided.
é    Né   )ÚMPZ_ZEROÚMPZ_ONEÚBACKENDÚxrangeÚexec_)Úgcd)%ÚComplexResultÚ
round_fastÚround_nearestÚnegative_rndÚbitcountÚto_fixedÚfrom_man_expÚfrom_intÚto_intÚfrom_rationalÚfzeroÚfoneÚfnoneÚftwoÚfinfÚfninfÚfnanÚmpf_signÚmpf_addÚmpf_absÚmpf_posÚmpf_cmpÚmpf_ltÚmpf_leÚmpf_gtÚmpf_min_maxÚmpf_perturbÚmpf_negÚ	mpf_shiftÚmpf_subÚmpf_mulÚmpf_divÚ
sqrt_fixedÚmpf_sqrtÚmpf_rdiv_intÚmpf_pow_intÚto_rational)	Úmpf_piÚmpf_expÚmpf_logÚpi_fixedÚmpf_cos_sinÚmpf_cosÚmpf_sinr*   Ú	agm_fixed)Úmpc_oneÚmpc_subÚmpc_mul_mpfÚmpc_mulÚmpc_negÚcomplex_int_powÚmpc_divÚmpc_add_mpfÚmpc_sub_mpfÚmpc_logÚmpc_addÚmpc_posÚ	mpc_shiftÚmpc_is_infnanÚmpc_zeroÚmpc_sqrtÚmpc_absÚmpc_mpf_divÚ
mpc_squareÚmpc_exp)Úifac)Úmpf_gamma_intÚ	mpf_eulerÚeuler_fixedc                   @   s   e Zd ZdS )ÚNoConvergenceN)Ú__name__Ú
__module__Ú__qualname__© rR   rR   úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mpmath/libmp/libhyper.pyrN   +   s   rN   c                  C   sˆ  | \}}}}d  |¡}d|||d|… ||d… |f }d|k}|dk}|pN|}	g }
|
j}g }g }g }g }g }g }g }g }|dƒ |dƒ |dƒ |dƒ |	r¦|d	ƒ |rÌ|d
ƒ |dƒ |dƒ |dƒ n|dƒ |dƒ |dƒ |dƒ |dƒ |dƒ |dƒ |�r2|dƒ |dƒ |dƒ |dƒ |dƒ t|ƒD �]º\}}ddg||k }|dk�rŠ||g||k  |¡ |d|||f ƒ �q:|dk�rÄ||g||k  |¡ |d|||||f ƒ �q:|dk�r2||g||k  |¡ |d| ƒ |dƒ |dƒ |dƒ |d||f ƒ |dƒ |d ||f ƒ nÂ|dk�rð||g||k  |¡ |d!| ƒ |d"ƒ |dƒ |d#ƒ |dƒ |dƒ |dƒ |d$||f ƒ |dƒ |d%||f ƒ |dƒ |dƒ |d&||f ƒ |dƒ |d'||f ƒ nt‚�q:t|ƒ}t|ƒ}t||ƒ}||d… }||d… }|d(ƒ |d)ƒ |d*ƒ |	�rP|d+ƒ |d,ƒ d-  d.d/„ |D ƒd0d/„ |D ƒ d1d/„ |D ƒ ¡}d-  d2d/„ |D ƒd3d/„ |D ƒ d4d/„ |D ƒ d5g ¡}|�rÐ|d6| ƒ |d7| ƒ |d8ƒ |�rú|d9ƒ |d:ƒ |d;ƒ |	�rât|ƒD ]}|d<|| || f ƒ �q|D ]}|d= d>t|ƒ¡ƒ �q4|D ]}|d? d>t|ƒ¡ƒ �qTt|ƒD ]}|d@|| || f ƒ �qx|D ]}|dA d>t|ƒ¡ƒ �qœ|D ]}|dB d>t|ƒ¡ƒ �q¼|�r|�rþ|dCƒ |dDƒ |dEƒ n|dFƒ |dGƒ n0|�r0|dHƒ |dDƒ |dEƒ n|dIƒ |dJƒ |D ]*}|dK d>t|ƒ¡ƒ |dDƒ |dEƒ �qD|D ]j}|dL d>t|ƒ¡ƒ |dM d>t|ƒ¡ƒ |dN d>t|ƒ¡ƒ |dO d>t|ƒ¡ƒ |dP d>t|ƒ¡ƒ �qtn€t|ƒD ]}|d<|| || f ƒ �qê|D ]}|d= d>t|ƒ¡ƒ �q|D ]}|d? d>t|ƒ¡ƒ �q.|�rZ|dQƒ n|dIƒ |	�rŠ|dRƒ |dSƒ |dTƒ |dUƒ n|dRƒ |dVƒ |dUƒ |dWƒ |dXƒ |D ]}|dY d>t|ƒ¡ƒ �q¶|D ]}|dZ d>t|ƒ¡ƒ �qÖ|D ]}|d[ d>t|ƒ¡ƒ �qö|D ]}|d\ d>t|ƒ¡ƒ �q|D ]}|d] d>t|ƒ¡ƒ �q6|D ]}|d^ d>t|ƒ¡ƒ �qV|D ]}|d_ d>t|ƒ¡ƒ �qv|D ]}|d` d>t|ƒ¡ƒ �q–|	�r|daƒ |dbƒ |dcƒ |ddƒ |deƒ |dfƒ |dgƒ |dhƒ |diƒ |dƒ |djƒ |dkƒ n0|daƒ |dcƒ |dlƒ |dƒ |djƒ |dmƒ dn  dodp„ |
D ƒ¡}
dq| |
 }
i }t	|
t
ƒ |ƒ |
|| fS )rzŽ
    Returns a function that sums a generalized hypergeometric series,
    for given parameter types (integer, rational, real, complex).

    Ú zhypsum_%i_%i_%s_%s_%sNÚCz$MAX = kwargs.get('maxterms', wp*100)zHIGH = MPZ_ONE<<epsshiftzLOW = -HIGHz!SRE = PRE = one = (MPZ_ONE << wp)zSIM = PIM = MPZ_ZEROzxsign, xm, xe, xbc = z[0]zif xsign: xm = -xmzysign, ym, ye, ybc = z[1]zif ysign: ym = -ymzxsign, xm, xe, xbc = zzoffset = xe + wpzif offset >= 0:z    ZRE = xm << offsetzelse:z    ZRE = xm >> (-offset)zoffset = ye + wpz    ZIM = ym << offsetz    ZIM = ym >> (-offset)ÚAÚBÚZz%sINT_%i = coeffs[%i]ÚQz!%sP_%i, %sQ_%i = coeffs[%i]._mpq_ÚRz%xsign, xm, xe, xbc = coeffs[%i]._mpf_z    %sREAL_%i = xm << offsetz    %sREAL_%i = xm >> (-offset)z__re, __im = coeffs[%i]._mpc_zxsign, xm, xe, xbc = __rezysign, ym, ye, ybc = __imz    %sCRE_%i = xm << offsetz    %sCRE_%i = xm >> (-offset)z    %sCIM_%i = ym << offsetz    %sCIM_%i = ym >> (-offset)zfor n in xrange(1,10**8):z    if n in magnitude_check:z"        p_mag = bitcount(abs(PRE))z.        p_mag = max(p_mag, bitcount(abs(PIM)))z%        magnitude_check[n] = wp-p_magz * c                 S   s   g | ]}d   dt|ƒ¡‘qS )zAINT_#ú#©ÚreplaceÚstr©Ú.0ÚirR   rR   rS   Ú
<listcomp>±   s     z%make_hyp_summator.<locals>.<listcomp>c                 S   s   g | ]}d   dt|ƒ¡‘qS )zAP_#r[   r\   r_   rR   rR   rS   rb   ²   s     c                 S   s   g | ]}d   dt|ƒ¡‘qS )zBQ_#r[   r\   r_   rR   rR   rS   rb   ³   s     c                 S   s   g | ]}d   dt|ƒ¡‘qS )zBINT_#r[   r\   r_   rR   rR   rS   rb   µ   s     c                 S   s   g | ]}d   dt|ƒ¡‘qS )zBP_#r[   r\   r_   rR   rR   rS   rb   ¶   s     c                 S   s   g | ]}d   dt|ƒ¡‘qS )zAQ_#r[   r\   r_   rR   rR   rS   rb   ·   s     Únz
    mul = z
    div = z    if not div:z        if not mul:z            breakz        raise ZeroDivisionErrorz$    PRE = PRE * AREAL_%i // BREAL_%iz    PRE = (PRE * AREAL_#) >> wpr[   z     PRE = (PRE << wp) // BREAL_#z$    PIM = PIM * AREAL_%i // BREAL_%iz    PIM = (PIM * AREAL_#) >> wpz     PIM = (PIM << wp) // BREAL_#zI    PRE, PIM = (mul*(PRE*ZRE-PIM*ZIM))//div, (mul*(PIM*ZRE+PRE*ZIM))//divz    PRE >>= wpz    PIM >>= wpz*    PRE = ((mul * PRE * ZRE) >> wp) // divz*    PIM = ((mul * PIM * ZRE) >> wp) // divz=    PRE, PIM = (PRE*ZRE-PIM*ZIM)//div, (PIM*ZRE+PRE*ZIM)//divz$    PRE = ((PRE * ZRE) >> wp) // divz$    PIM = ((PIM * ZRE) >> wp) // divz;    PRE, PIM = PRE*ACRE_#-PIM*ACIM_#, PIM*ACRE_#+PRE*ACIM_#z%    mag = BCRE_#*BCRE_#+BCIM_#*BCIM_#z     re = PRE*BCRE_# + PIM*BCIM_#z     im = PIM*BCRE_# - PRE*BCIM_#z    PRE = (re << wp) // magz    PIM = (im << wp) // magz*    PRE = ((PRE * mul * ZRE) >> wp) // divz    SRE += PREz    SIM += PIMz1    if (HIGH > PRE > LOW) and (HIGH > PIM > LOW):z        breakz    if HIGH > PRE > LOW:z    if n > MAX:zc        raise NoConvergence('Hypergeometric series converges too slowly. Try increasing maxterms.')z    AINT_# += 1z    BINT_# += 1z    AP_# += AQ_#z    BP_# += BQ_#z    AREAL_# += onez    BREAL_# += onez    ACRE_# += onez    BCRE_# += onez%a = from_man_exp(SRE, -wp, prec, 'n')z%b = from_man_exp(SIM, -wp, prec, 'n')zif SRE:z    if SIM:z(        magn = max(a[2]+a[3], b[2]+b[3])z	    else:z        magn = a[2]+a[3]z	elif SIM:z    magn = b[2]+b[3]z    magn = -wp+1zreturn (a, b), True, magnz    magn = a[2]+a[3]zreturn a, False, magnÚ
c                 s   s   | ]}d | V  qdS )z    NrR   )r`   ÚlinerR   rR   rS   Ú	<genexpr>+  s     z$make_hyp_summator.<locals>.<genexpr>zBdef %s(coeffs, z, prec, wp, epsshift, magnitude_check, **kwargs):
)ÚjoinÚappendÚ	enumerateÚ
ValueErrorÚlenÚminÚranger]   r^   r   Úglobals) ÚkeyÚpÚqÚparam_typesÚztypeZpstringÚfnameZhave_complex_paramZhave_complex_argZhave_complexÚsourceÚaddZaintZaratZbintZbratZarealZbrealZacomplexZbcomplexra   ÚflagÚWZl_arealZl_brealZcancellable_realZnoncancellable_real_numZnoncancellable_real_denZ
multiplierZdivisorÚkÚ	namespacerR   rR   rS   Úmake_hyp_summator@   s’   
"





ÿþÿþþ      


   

        
r{   Úsagec                    s4   ddl m‰  | \‰‰‰‰‡ ‡‡‡‡fdd„}d|fS )z™
        Returns a function that sums a generalized hypergeometric series,
        for given parameter types (integer, rational, real, complex).
        r   )Úhypsum_internalc                    s   ˆ ˆˆˆˆ| ||||||ƒS ©NrR   )ZcoeffsÚzÚprecÚwpZepsshiftZmagnitude_checkÚkwargs©r}   rp   rr   rq   rs   rR   rS   Ú_hypsum?  s        ÿz"make_hyp_summator.<locals>._hypsumz(none))Zsage.libs.mpmath.ext_mainr}   )ro   r„   rR   rƒ   rS   r{   8  s    c                 C   s|  | \}}}}|s8| t krt S | tkr(tS | tkr4tS tS || }tj}|dkrˆd|d  d ||dƒkrˆ|rzttd||ƒS ttd||ƒS || k rÀt	| dƒ} t
t|d ƒ|d ƒ}	t| |	||ƒS |t|ƒ d }
tt| |
ƒƒ}|| |
? }|dd  }}}|�rF|| |
? | }|d| d  }|d@ �r4||8 }n||7 }|d7 }qú||
d > tt|
ƒ|
ƒ }|�rl| }t||
 ||ƒS )	Né   é   r   gW“§¬¦ëà?r   é   é   i90  )r   r   r   r   r   r   ÚmathÚlogr#   r%   r*   r.   r(   Úabsr   r)   r1   r   )Úxr€   ÚrndÚsignÚmanÚexpÚbcÚsizeZlgÚcr�   ÚtÚt2ÚsÚtermry   rR   rR   rS   Úmpf_erfO  sD       "




r˜   c                 C   s    t | ƒ}|d d |krdS dS )Nr†   ç
×£p=
÷?TF)r   )rŒ   r€   rc   rR   rR   rS   Úerfc_check_series|  s    rš   c                 C   sª  | \}}}}|s8| t krtS | tkr(t S | tkr4tS tS |d }|| }|tdd| ƒ7 }|pd|dk }	|	stt| |ƒsÊ|	r–ttt	| |d t
| ƒ||ƒS t| ƒd }
ttt	| |t|
d d ƒ d ƒ||ƒS t|>  }}d}dt| |ƒd  |? }d}|d| d  |> | }|dk�r ||k�sT|�s*�qT|d@ �r>||8 }n||7 }|}|d7 }qô||> tt|ƒ|ƒ }t|| |ƒ}ttt| | |ƒ|ƒ|ƒ}tt|||ƒ| ||ƒ}|S )Nr‡   r   r†   é
   r   r™   é   )r   r   r   r   r   r   Úmaxrš   r&   r˜   r   r   Úintr   r   r)   r1   r   r/   r$   r'   r(   )rŒ   r€   r�   rŽ   r�   r�   r‘   r�   ÚmagZregular_erfrc   r–   r—   Z	term_prevr”   ry   r   ÚyrR   rR   rS   Úmpf_erfc‚  sF       (


r¡   c                 C   s:   |  }}d}|r6||  |? | }||| 7 }|d7 }q|S ©Nr†   r   rR   )rŒ   r€   r–   r”   ry   rR   rR   rS   Ú	ei_taylor°  s    
r£   c           	      C   sˆ   t }|  }}| }}d}||ƒ||ƒ dkr€||  ||  | |? || ||   | |?  }}||| 7 }||| 7 }|d7 }q||fS )Nr†   é   r   )r‹   )	ÚzreÚzimr€   Ú_absÚsreÚtreÚsimÚtimry   rR   rR   rS   Úcomplex_ei_taylor¹  s    2
r¬   c                 C   sN   t |> }||> |   } }||  }d}|rJ|| |  |? }||7 }|d7 }q$|S r¢   )r   )rŒ   r€   Úoner”   r–   ry   rR   rR   rS   Úei_asymptoticÅ  s    
r®   c                 C   sÆ   t }t|> }|| | |   |? }| |> |  }}| |> |  }}	|| }
|}d}||ƒ||	ƒ dkr¾|| |	|  | |? || |	|  | |?  }}	|
|7 }
||	7 }|d7 }||krRt‚qR|
|fS )Nr†   iè  r   )r‹   r   rN   )r¥   r¦   r€   r§   r­   ÚMZxrer©   Zximr«   r¨   rª   ry   rR   rR   rS   Úcomplex_ei_asymptoticÐ  s     2r°   Fc                 C   sz  |rt | ƒ} | \}}}}|r4|s4| tkr,tS tdƒ‚|�r4d|||f}|| }	|d }
|	|
k}|s’|dkrt||> }n
|| ? }|t|
d ƒd k}|rÞ|	|
kr¤t}nttt| |
ƒ|
ƒ|
 ƒ}t	|t
| |
ƒ|
ƒ}t|| ||ƒ}nT|
dtt|ƒƒ 7 }
t| |
ƒ}t||
ƒt|
ƒ }t||
 ƒ}t||
ƒ}t||||ƒ}n4| tk�rDt}n$| tk�rTt}n| tk�rdt}nt}|�rvt |ƒ}|S )NzE1(x) for x < 0r   r‡   ç“V-æ?r›   r†   )r$   r   r   r	   rž   r   r   r®   r   r'   r/   r(   r   r£   rM   r0   r   r   r   )rŒ   r€   r�   Úe1rŽ   r�   r�   r‘   ÚxabsÚxmagr�   Úcan_use_asympZxabsintÚvÚuÚt1r•   rR   rR   rS   Úmpf_eiä  sN    




 
 
 r¹   c                 C   s‚  |rt | ƒ} | \}}|\}}}}	|\}
}}}|tkrx|rhtt|||ƒƒ}|s\tt||ƒƒ}nt}||fS t|||ƒtfS |tkr�|rˆ|s�ttfS |d }||	 }|| }t||ƒ}||k}|sêtt|ƒƒtt|ƒƒ }|t	|d ƒd k}zÞ|�rÆ||k�rt
tf}n<t||ƒ}t||ƒ}t|||ƒ\}}t|| ƒt|| ƒf}t|t| |ƒ|ƒ}t|| |ƒ}|�rtt |||ƒ}nL|\}}|
�r¢t|||ƒt|t|ƒ||ƒf}nt|||ƒt|t|ƒ||ƒf}|W S W n tk
�rÞ   Y nX |dt	tt| dƒƒƒ 7 }t||ƒ}t||ƒ}t|||ƒ\}}|t|ƒ7 }t|| ƒt|| ƒf}|�rXtt | ƒ|ƒ}n
t| |ƒ}t||||ƒ}|�r~t |ƒ}|S )Né(   r±   r‡   r†   r¤   )r:   r   r$   r¹   r.   r   r�   r‹   r   rž   r   r   r°   r   r9   rI   r<   r   r&   r   rN   rF   r¬   rM   r?   r@   )r   r€   r�   r²   ÚaÚbÚasignÚamanÚaexpÚabcÚbsignÚbmanÚbexpÚbbcrŒ   r    r�   ÚamagÚbmagZzmagrµ   Zzabsintr¶   r¥   r¦   ZvreÚvimr·   rR   rR   rS   Úmpc_ei  sp    




 



rÈ   c                 C   s   t | ||dƒS ©NT)r¹   ©rŒ   r€   r�   rR   rR   rS   Úmpf_e1O  s    rË   c                 C   s   t | ||dƒS rÉ   )rÈ   rÊ   rR   rR   rS   Úmpc_e1R  s    rÌ   c                  C   s’  |\}}}}|sš|rT|t kr<| dkr,tdfS t| ||ƒdfS |tkrLt dfS ttfS |t kr‚| dkrztd| d ||ƒdfS tdfS |tkr’t dfS ttfS | }	|rªd|  } |d }
|| }|dk rÆt‚tt| ƒƒ}| dkoÜ|}t|ƒ}| dk�sd| | |
 k �rL|�r0t	||
ƒ}t
|t||	d |
ƒ||ƒ}nt	||
ƒ}t||||ƒ}�nÈd|
 |   k �oddkn  }|�sÜtt|ƒƒ}ttd||  ƒd|
 ƒ}|  | ||  tt||  ƒƒ  ||  d| d	  }|
 d
 }||k }|�rŽt |
|
 > t||
ƒ }| }|| }t|
> }|�r>|�r>||7 }|d7 }|| | |
? }�qt	||
ƒ}|�rht
|t||	d |
ƒ|
ƒ}nt|||
ƒ}t
|t||
 ƒ||ƒ}�n†| dk�r¬tt|||ƒƒ}�nh| dk�r| d|
 k �rtt||
ƒƒ}|�rì|	d@ �rt|ƒ}nt
|t|| d |
ƒ|
ƒ}t||
ƒ }}dg| d  }td| d ƒD ]}||d  | ||< �q.|ddd… }|d |
> }td| d ƒD ]>}|d@ �r’||| | 8 }n||| | 7 }|| |
? }�qrt||
 |
ƒ}t
|t	||
ƒƒ}|�rêt
|t||	|
ƒ|
ƒ}t||ƒ}t|tt| d ƒƒ||ƒ}nt‚|�r†tt| d ƒ ƒ}|�rXtt|
ƒ|||ƒ}|	d@ �r~t|ƒ}n&tt
t|
ƒt||	d |
ƒ|
ƒ|||ƒ}||fS |dfS dS )zå
    E_n(x), n an integer, x real

    With gamma=True, computes Gamma(n,x)   (upper incomplete gamma function)

    Returns (real, None) if real, otherwise (real, imag)
    The imaginary part is an optional branch cut term

    r   Nr   r‡   iöÿÿÿr†   éýÿÿÿé�   éd   r›   r…   éÿÿÿÿ)r   r   rK   r   r   ÚNotImplementedErrorr   r‹   r$   r/   r'   r,   r(   r   rl   r�   r   r   r   r¹   rm   r   r   rJ   r.   ) rc   rŒ   r€   r�   ÚgammarŽ   r�   r�   r‘   Zn_origr�   r´   ZnmagZ	have_imagZnegxr¶   ÚreZcan_use_asymptotic_seriesÚxiÚmZsizZtolÚrr”   r–   ZT1Zfacsry   ZT2rZ   r¯   ÚimrR   rR   rS   Ú
mpf_expintU  s²    


6








&rØ   c                 C   s„   t | |ƒ} | |   |? }|dkr6dt|> d  }}}n| | d  }}}|rx|| ||d   |? }||| 7 }|d7 }qFt|| ƒS )z2
    0 - Ci(x) - (euler+log(x))
    1 - Si(x)
    r   r†   r…   r   )r   r   r   )rŒ   r�   ÚwhichÚx2r–   r”   ry   rR   rR   rS   Úmpf_ci_si_taylorË  s    

rÛ   c                 C   sˆ  | d r| d | d  }n|d r2|d |d  }|d rPt ||d |d  ƒ}|dksb|| k rft‚|d| 7 }t| |ƒ}t||ƒ}|| ||  |? }d| | |? }|}	|}
t|> }|dkràddt|> ddf\}}}	}
}n||||df\}}}	}
}t t|	ƒt|
ƒƒdk�rp||d  }|	| |
|  | |? |	| |
|  | |?  }	}
||	| 7 }||
| 7 }|d7 }qøt|| ƒt|| ƒfS )Nr   r†   r…   éþÿÿÿr   )r�   rÑ   r   r   r‹   r   )rÓ   r×   r�   rÙ   rŸ   r¥   r¦   Úz2reÚz2imr©   r«   r­   r¨   rª   ry   ÚfrR   rR   rS   Úmpc_ci_si_taylorÜ  s4    

2
rà   r†   c                 C   s   |d }| \}}}}d\}	}
|sŒ| t kr0tt fS | tkr@| | fS t }	|dkr„| tkrdtt||ƒdƒ}
| tkr„ttt|t| ƒdƒƒ}
|	|
fS || }|| k rì|dkr¸t| d| ||ƒ}
|dkrät	|ƒ}t
| ƒ}t|t||ƒ||ƒ}	|	|
fS ||k�rT|dk�r.|�rtt|t| ƒƒ}
n
t||ƒ}
t|
dƒ}
|dk�rLtt| |ƒ| ||ƒ}	|	|
fS |t|ƒ7 }|d t |d¡k}|�sÞ|dk�r˜tt| |dƒ||ƒ}
|dk�rÖt| |dƒ}	t|	t	|ƒ|ƒ}	t|	tt
| ƒ|ƒ||ƒ}	|	|
fS t
| ƒ} t| |ƒ}td| > | }t|> }|}|}d}|�rd| }|| | |? }|d7 }||7 }|| | |? }|d7 }||7 }�qt|| ƒ}t|| ƒ}t|| |ƒ}t|| |ƒ}t| |ƒ\}}|dk�rôtt||ƒt||ƒ|ƒ}
ttt|ƒdƒ|
|ƒ}
|�rèt|
ƒ}
t|
||ƒ}
|dk�rtt||ƒt||ƒ||ƒ}	|	|
fS )zç
    Calculation of Ci(x), Si(x) for real x.

    which = 0 -- returns (Ci(x), -)
    which = 1 -- returns (Si(x), -)
    which = 2 -- returns (Ci(x), Si(x))

    Note: if x < 0, Ci(x) needs an additional imaginary term, pi*i.
    r‡   )NNr   rÐ   r   r†   )r   r   r   r   r%   r.   r$   r   r#   rL   r   r   r0   r(   r4   r‹   r‰   rŠ   r   rÛ   r   r   r   r2   r'   r&   )rŒ   r€   r�   rÙ   r�   rŽ   r�   r�   r‘   ÚciÚsirŸ   r    r³   Z
asymptoticZxfZxrÚs1Ús2r”   ry   ÚcosÚsinrR   rR   rS   Ú	mpf_ci_siû  s�    











rç   c                 C   s"   t | ƒdk rt‚t| ||dƒd S )Nr   )r   r	   rç   rÊ   rR   rR   rS   Úmpf_ciX  s    rè   c                 C   s   t | ||dƒd S )Nr   )rç   rÊ   rR   rR   rS   Úmpf_si]  s    ré   c           	      C   sŠ   | \}}|t krDt|||dƒd }t|ƒdk r<|t||ƒfS |t fS |d }t|||dƒ\}}t|t|ƒ|ƒ}t||ft| |ƒ||ƒ}|S )Nr   r‡   )	r   rç   r   r.   rà   r   rL   r@   r?   )	r   r€   r�   rÓ   r×   rá   r�   ZcreZcimrR   rR   rS   Úmpc_ci`  s    rê   c                 C   sH   | \}}|t kr&t|||dƒd t fS |d }t|||dƒ} t| ||ƒS )Nr   r‡   )r   rç   rà   rA   )r   r€   r�   rÓ   r×   r�   rR   rR   rS   Úmpc_sim  s    rë   c                 C   sô   |d7 }| dk o| d@ }|d |d  }t | ƒ} |d | t| ƒ  }|dk rX|| | 8 }t||ƒ}|d |? }| s€t|>  }}	n$||  t| ƒ | d | |  ?  }}	d}
|	rÚ|	| d|
 |
|    |? }	||	7 }|
d7 }
q¨|rä| }t|| ||ƒS )Né2   r   r   r†   r…   r‡   éüÿÿÿ)r‹   r   r   r   rJ   r   )rc   rŒ   r€   ÚroundingÚnegaterŸ   r�   rÚ   r–   r”   ry   rR   rR   rS   Úmpf_besseljn•  s(    
$
rð   c                 C   sÒ  | dk o| d@ }t | ƒ} |}|\}}t|d |d  |d |d  ƒ}|d| t| ƒ  t |ƒ 7 }|dk rv|| | 8 }t||ƒ}t||ƒ}|d |d  |? }	|| |d ? }
| sÈt|>  }}t }}nPt||| ƒ\}}|t| ƒ | d | |  ?  }}|t| ƒ | d | |  ?  }}d}t |ƒt |ƒ dk�r˜d| ||   }||	 ||
  ||	 ||
   }}|| |? }|| |? }||7 }||7 }|d7 }�q|�rª| }| }t|| ||ƒ}t|| ||ƒ}||fS )Nr   r   r†   r…   r‡   rí   )	r‹   r�   r   r   r   r   r;   rJ   r   )rc   r   r€   rî   rï   Zorigprecr¥   r¦   rŸ   rÝ   rÞ   r¨   r©   rª   r«   rÓ   r×   ry   rp   rR   rR   rS   Úmpc_besseljn¬  sB    "


  "rñ   c                 C   sš  | \}}}}|\}}	}
}|s |r(t dƒ‚|r0|	sx| tks@|tkrDtS | tkr\|tkrXtS tS |tkrt| tkrptS tS tS |d }|| }|
| }|| }t|ƒ}|dk�r|dkrâtt| ||ƒdƒtt| ||ƒ|ƒ } }|d }qª| \}}}}|\}}	}
}|| }|
| }|| }t	||ƒ}t
||ƒ}d}|dk �r<| }n|dk�rL| }|�rft| |ƒ} t||ƒ}t| |ƒ}t||ƒ}t|||ƒ}t|| | ||ƒS )z^
    Computes the arithmetic-geometric mean agm(a,b) for
    nonnegative mpf values a, b.
    zagm of a negative numberr‡   r›   rÐ   r†   r   iøÿÿÿ)r	   r   r   r   r‹   r%   r   r*   r'   rl   r�   r   r5   r   )r»   r¼   r€   r�   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   r�   rÅ   rÆ   Z	mag_deltaZabs_mag_deltaÚmin_magÚmax_magrc   ÚafÚbfÚgrR   rR   rS   Úmpf_agmÐ  s\    
ÿ








r÷   c                 C   s   t t| ||ƒS )z\
    Computes the arithmetic-geometric mean agm(1,a) for a nonnegative
    mpf value a.
    )r÷   r   ©r»   r€   r�   rR   rR   rS   Úmpf_agm1  s    rù   c           
      C   sÖ   t | ƒst |ƒrttfS t| |fkr,ttfS t| ƒ|kr@ttfS |d }tt| d ƒ}tt| ||ƒdƒ}t	t
| ||ƒ|ƒ}|| } }tt| dƒt|dƒgƒd }tt| |dƒdƒ}	|tksÌt|	t||ƒƒrX| S qXdS )z‚
    Complex AGM.

    TODO:
    * check that convergence works as intended
    * optimize
    * select a nonarbitrary branch
    r‡   r›   rÐ   r   N)rC   r   rD   r   r:   r%   r   rB   r@   rE   r9   r"   rF   r7   r   r'   )
r»   r¼   r€   r�   r�   ÚepsZa1Úb1r’   ÚerrrR   rR   rS   Úmpc_agm  s    	
rý   c                 C   s   t t| ||ƒS r~   )rý   r6   rø   rR   rR   rS   Úmpc_agm1,  s    rþ   c                 C   s„   | d s8| t kr tt||ƒdƒS | tkr,t S | tkr8| S | tkrDtS |d }ttt| |ƒ|ƒ}t	||ƒ}t
t|ƒ|||ƒ}t|dƒS )Nr   rÐ   é   )r   r%   r.   r   r   r   r   r*   r&   rù   r(   )rŒ   r€   r�   r�   r»   r¶   rÖ   rR   rR   rS   Ú
mpf_ellipk/  s    
r   c           	      C   sv   | \}}|t kr6|tkrtS t|tƒr6t|||ƒt fS |d }ttt| |ƒ|ƒ}t	||ƒ}t
t|ƒ|||ƒ}t|dƒS )Nrÿ   rÐ   )r   r   rD   r    r   r   rE   r7   r6   rþ   rG   r.   rB   )	r   r€   r�   rÓ   r×   r�   r»   r¶   rÖ   rR   rR   rS   Ú
mpc_ellipkC  s    

r  c                 C   sþ   | \}}}}|sL| t kr(tt||ƒdƒS | tkr4tS | tkr@| S | tkrLt‚| tkrXtS |d }|| }|| k r‚tt||ƒdƒS t|dƒ| }	tt|	ƒ}
t	| d| ƒ}t	t
| |
ƒd| ƒ}tt
||ƒ|	 ƒ}t
t| ƒ}t|t| dƒ|ƒ}t|t||ƒ||ƒS )NrÐ   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Ÿ   rp   ÚhÚKÚKhÚKdiffr”   r¼   rR   rR   rS   Ú
mpf_ellipeP  s0    


r  c                 C   sà   | \}}|t kr:|tkr t tfS t|tƒr:t|||ƒt fS |d }t| dƒ}t|d |d  dƒ| }tt|ƒ}t| d| ƒ}	tt	| |d| ƒd| ƒ}
t
t|
|	|ƒ| ƒ}tt| |ƒ}t|t
| dƒ|ƒ}t|t|	||ƒ||ƒS )Nrÿ   r   r†   r…   r   )r   r   r    r   r  rF   r�   r%   r  r=   rB   r7   r6   r9   r@   )r   r€   r�   rÓ   r×   r�   rŸ   rp   r  r  r  r  r”   r¼   rR   rR   rS   Ú
mpc_ellipen  s     


r  )r   )r   )tÚ__doc__Úoperatorr‰   Úbackendr   r   r   r   r   Z
libintmathr   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-   Z	libelefunr.   r/   r0   r1   r2   r3   r4   r5   Zlibmpcr6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   Z	gammazetarK   rL   rM   Ú	ExceptionrN   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  rR   rR   rR   rS   Ú<module>   sV   œ,X w
-.	*Av

]($;