a
    <b                     @   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rd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   e/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/mpmath/libmp/libhyper.pyrN   +   s   rN   c                  C   s  | \}}}}d |}d|||d| ||d |f }d|v }|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; |	rt|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| qtnt|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>       z%make_hyp_summator.<locals>.<listcomp>c                 S   s   g | ]}d  dt|qS )zAP_#r[   r\   r_   rR   rR   rS   rb      rc   c                 S   s   g | ]}d  dt|qS )zBQ_#r[   r\   r_   rR   rR   rS   rb      rc   c                 S   s   g | ]}d  dt|qS )zBINT_#r[   r\   r_   rR   rR   rS   rb      rc   c                 S   s   g | ]}d  dt|qS )zBP_#r[   r\   r_   rR   rR   rS   rb      rc   c                 S   s   g | ]}d  dt|qS )zAQ_#r[   r\   r_   rR   rR   rS   rb      rc   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>+  rc   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_den
multiplierZdivisork	namespacerR   rR   rS   make_hyp_summator@   sp   
"





(  (  


(  

        
r}   Z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~   rq   rs   rr   rt   rR   rS   _hypsum?  s    
z"make_hyp_summator.<locals>._hypsumz(none))Zsage.libs.mpmath.ext_mainr~   )rp   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rd|d  d ||dkr|rzttd||S ttd||S || k rt	| 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termr{   rR   rR   rS   mpf_erfO  s>    "




r   c                 C   s    t | }|d d |krdS dS )Nr   
ףp=
?TF)r   )r   r   rd   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|	rt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_erfrd   r   r   Z	term_prevr   r{   r   yrR   rR   rS   mpf_erfc  s@    (


r   c                 C   s:   |  }}d}|r6||  |? | }||| 7 }|d7 }q|S Nr   r   rR   )r   r   r   r   r{   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timr{   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   r{   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   r{   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rt}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  sH    



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|sttfS |d }||	 }|| }t||}||k}|st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|\}}|
rt|||t|t|||f}nt|||t|t|||f}|W S W n ty   Y n0 |dt	tt| d 7 }t||}t||}t|||\}}|t|7 }t|| t|| f}|rVt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vreZ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rt dfS ttfS | }	|rd|  } |d }
|| }|dk rttt| }| dko|}t|}| dksd| | |
 k rL|r0t	||
}t
|t||	d |
||}nt	||
}t||||}nd|
 |   k oddkn  }|stt|}ttd||  d|
 }|  | ||  tt||    ||  d| d	  }|
 d
 }||k }|rt |
|
 > t||
 }| }|| }t|
> }|r>|r>||7 }|d7 }|| | |
? }qt	||
}|rht
|t||	d |
|
}nt|||
}t
|t||
 ||}n| dkrt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	||
}|rt
|t||	|
|
}t||}t|tt| d ||}nt|rt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   ir      d   r   r   )r   r   rK   r   r   NotImplementedErrorr   r   r$   r/   r'   r,   r(   r   rm   r   r   r   r   r   rn   r   r   rJ   r.   ) rd   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facsr{   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   r{   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rddt|> ddf\}}}	}
}n||||df\}}}	}
}t t|	t|
dkrp||d  }|	| |
|  | |? |	| |
|  | |?  }	}
||	| 7 }||
| 7 }|d7 }qt|| 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   r{   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rttt|t| d}
|	|
fS || }|| k r|dkrt| d| ||}
|dkrt	|}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rtt| |d||}
|dkrt| |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rtt||t|||}
ttt|d|
|}
|rt|
}
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   r{   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 |? }| st|>  }}	n$||  t|  | d | |  ?  }}	d}
|	r|	| d|
 |
|    |? }	||	7 }|
d7 }
q|r| }t|| ||S )N2   r   r   r   r   r   )r   r   r   r   rJ   r   )rd   r   r   roundingnegater   r   r   r   r   r{   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 ? }
| st|>  }}t }}nPt||| \}}|t|  | d | |  ?  }}|t|  | d | |  ?  }}d}t |t | dkrd| ||   }||	 ||
  ||	 ||
   }}|| |? }|| |? }||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   )rd   r   r   r   r   Zorigprecr   r   r   r   r   r   r   r   r   r   r   r{   rq   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rt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'   rm   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_magrd   afZ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v 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st|	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   Z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 rt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   rq   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   rq   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

]($;