
    "`                        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eT      ZU	 d ZVedk(  rd ZVefdZWd ZXefdZYd ZZd Z[d Z\d Z]edfdZ^edfdZ_efdZ`efdZaedfdZbd/dZcd/dZdedfd Zeefd!Zfefd"Zgefd#Zhefd$Ziefd%Zjefd&Zkefd'Zlefd(Zmefd)Znefd*Zoefd+Zpefd,Zqefd-Zrefd.Zsy)0z
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                       e Zd Zy)NoConvergenceN)__name__
__module____qualname__     7/usr/lib/python3/dist-packages/mpmath/libmp/libhyper.pyrP   rP   +   s    rU   rP   c                    | \  }}}}dj                  |      }d|||d| ||d |fz  }d|v }|dk(  }|xs |}	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       |r( |d        |d        |d        |d        |d       t        |      D ]  \  }}ddg||k\     }|dk(  r(||g||k\     j                  |        |d|||fz         >|dk(  r*||g||k\     j                  |        |d|||||fz         m|dk(  r_||g||k\     j                  |        |d|z          |d        |d        |d        |d||fz          |d        |d ||fz         |dk(  r||g||k\     j                  |        |d!|z          |d"        |d        |d#        |d        |d        |d        |d$||fz          |d        |d%||fz          |d        |d        |d&||fz          |d        |d'||fz         t         t	        |      }t	        |      }t        ||      }||d }||d } |d(        |d)        |d*       |	r |d+        |d,       d-j                  |D cg c]  }d.j                  d/t        |             c}|D cg c]  }d0j                  d/t        |             c}z   |D cg c]  }d1j                  d/t        |             c}z         }d-j                  |D cg c]  }d2j                  d/t        |             c}|D cg c]  }d3j                  d/t        |             c}z   |D cg c]  }d4j                  d/t        |             c}z   d5gz         }|r |d6|z           |d7|z           |d8       |r |d9        |d:        |d;       |	r$t        |      D ]  } |d<||   ||   fz          |D ]#  } |d=j                  d/t        |                   % |D ]#  } |d>j                  d/t        |                   % t        |      D ]  } |d?||   ||   fz          |D ]#  } |d@j                  d/t        |                   % |D ]#  } |dAj                  d/t        |                   % |r,|r |dB        |dC        |dD       n< |dE        |dF       n+|r |dG        |dC        |dD       n |dH        |dI       |D ]3  } |dJj                  d/t        |                    |dC        |dD       5 |D ]  } |dKj                  d/t        |                    |dLj                  d/t        |                    |dMj                  d/t        |                    |dNj                  d/t        |                    |dOj                  d/t        |                    nt        |      D ]  } |d<||   ||   fz          |D ]#  } |d=j                  d/t        |                   % |D ]#  } |d>j                  d/t        |                   % |r	 |dP       n |dH       |	r! |dQ        |dR        |dS        |dT       n |dQ        |dU        |dT        |dV        |dW       |D ]#  } |dXj                  d/t        |                   % |D ]#  } |dYj                  d/t        |                   % |D ]#  } |dZj                  d/t        |                   % |D ]#  } |d[j                  d/t        |                   % |D ]#  } |d\j                  d/t        |                   % |D ]#  } |d]j                  d/t        |                   % |D ]#  } |d^j                  d/t        |                   % |D ]#  } |d_j                  d/t        |                   % |	ra |d`        |da        |db        |dc        |dd        |de        |df        |dg        |dh        |d        |di        |dj       n0 |d`        |db        |dk        |d        |di        |dl       dmj                  dn |
D              }
do|z  |
z   }
i }t        |
t               |       |
||   fS c c}w c c}w c c}w c c}w c c}w c c}w )pz
    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 * zAINT_##zAP_#zBQ_#zBINT_#zBP_#zAQ_#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_#) >> wpz     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              3   &   K   | ]	  }d |z     yw)z    NrT   ).0lines     rV   	<genexpr>z$make_hyp_summator.<locals>.<genexpr>+  s     :4:s   zBdef %s(coeffs, z, prec, wp, epsshift, magnitude_check, **kwargs):
)joinappend	enumerate
ValueErrorlenminreplacestrranger   globals) keypqparam_typesztypepstringfnamehave_complex_paramhave_complex_arghave_complexsourceaddaintaratbintbratarealbrealacomplexbcomplexiflagWl_areall_brealcancellable_realnoncancellable_real_numnoncancellable_real_den
multiplierdivisork	namespaces                                    rV   make_hyp_summatorr   @   s=
     #Aq+uggk"G#q!WRa['!"+u&MME +|%9)9LF
--CDDDDEEHH ./"# +,"#'( !'( !$% ! !L#$$%G'([) $4#JqAv3;4[a ((+'1a)34S[4[a ((+3q!Q1oEFS[E]16"**1-7!;<$%"#!".!Q78L1QF:;S[x a(003/!34+,$%+,$%"#!"-A67L0Aq69:"#!"-A67L0Aq69:I$L %jG%jG7G,#$4$56#$4$56 #$&',-<=/0 DIqX--c3q6:IBFGQV^^CQ8GHBFGQV^^CQ8GH IJ DIqX--c3q6:IBFGQV^^CQ8GHBFGQV^^CQ8GHKN%P QG L:%&w !" )* 
 '(lA#.TX]^_X`bghibjWk.k*ll(eA#.O.W.WX[]`ab]c.d*ee(fA#.P.X.XY\^abc^d.e*ff'(lA#.TX]^_X`bghibjWk.k*ll(eA#.O.W.WX[]`ab]c.d*ee(fA#.P.X.XY\^abc^d.e*ff_`$%$%@A@AST$%$%:;:; 	"AMUUVY[^_`[abc ! !	"
  	DA7??SVLM2::3AGH2::3AGH-55c3q6BC-55c3q6BC	D '(lA#.TX]^_X`bghibjWk.k*ll(eA#.O.W.WX[]`ab]c.d*ee(fA#.P.X.XY\^abc^d.e*ff<=67 ?@O&'O
 mn Bs,44S#a&ABBBs,44S#a&ABBCs-55c3q6BCCCs-55c3q6BCCEs/77SVDEEEs/77SVDEEDs.66sCFCDDDs.66sCFCDD3434IM67K&'K"#G'(34I"#G#$YY:6::FSV[[_eeFI	&')Y' 9U###E JGGIGGs$   <"e$"e
"e
"e0"e 
"e%
sagec                 @    ddl m | \  f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 NrT   )coeffszprecwpepsshiftmagnitude_checkkwargsr   rq   rs   rr   rt   s          rV   _hypsumz"make_hyp_summator.<locals>._hypsum?  s'    "1aeVQb(OV= =rU   z(none))sage.libs.mpmath.ext_mainr   )rp   r   r   rq   rs   rr   rt   s     @@@@@rV   r   r   8  s-    
 	>#& 1k5	= 	=   rU   c                    | \  }}}}|s3| t         k(  rt         S | t        k(  rt        S | t        k(  rt        S t
        S ||z   }t        j                  }|dkD  r;d|dz
  z  dz    ||d      kD  r&|rt        t        d||      S t        t        d||      S || k  r5t        | d      } t        t        |dz         |dz         }	t        | |	||      S |t        |      z   dz   }
t        t        | |
            }||z  |
z	  }|dd}}}|r.||z  |
z	  |z  }|d|z  dz   z  }|dz  r||z  }n||z  }|dz  }|r.||
dz   z  t        t!        |
      |
      z  }|r| }t#        ||
 ||      S )	N      r   gW?r         i90  )r   r   r   r   r   r   mathlogr$   r&   r+   r/   r)   absr   r*   r2   r   )xr   rndsignmanexpbcsizelgcr   tt2stermr   s                   rV   mpf_erfr   O  s   D#sB:e|9Tku9Ul8D	BaxAtAvJ)BtAJ6uas33tQc22te|aNVDG_d2g.q!T3''	D		B	BHQOA
A#"BE1QtA
"f^!QqSU|q5IAIA	Q  
r!tHRL"55ABB3c**rU   c                 2    t        |       }|dz  dz  |kD  ryy)Nr   
ףp=
?TF)r   )r   r   r`   s      rV   erfc_check_seriesr   |  s!    q	A!td{TrU   c                 0   | \  }}}}|s3| t         k(  rt        S | t        k(  rt         S | t        k(  rt        S t
        S |dz   }||z   }|t        dd|z        z  }|xs |dk  }	|	st        | |      sh|	r't        t        t        | |dz   t        |         ||      S t        |       dz   }
t        t        t        | |t        |
dz  dz        z   dz         ||      S t        |z  x}}d}dt        | |      dz  z  |z	  }d}	 |d|z  dz
  z  |z  |z  }|dkD  r||kD  s|sn|dz  r||z  }n||z  }|}|dz  }6||z  t        t!        |      |      z  }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*   r2   r   r0   r%   r(   r)   )r   r   r   r   r   r   r   r   magregular_erfr`   r   r   	term_prevr   r   r   ys                     rV   mpf_erfcr     s   D#sB:d{9Ul:d{	B
S&C#a3-B/#'K+Ar24DG\#5F!GsSS1IaKtWQs1a49~(=(BCT3OO"}AI	
Xa_!	!b(A	A
1q!b(Q.q5TI%Tq5IAIA		Q  
bZb11AQR A!B+B/A1b!1dC0AHrU   c                 L    | x}}d}|r|| z  |z	  |z  }|||z  z  }|dz  }|r|S Nr   r   rT   )r   r   r   r   r   s        rV   	ei_taylorr     sG    IA	A
cd]q 	Q!V	Q  HrU   c                     t         }| x}}|x}}d} ||       ||      z   dkD  rL|| z  ||z  z
  |z  |z	  ||z  || z  z   |z  |z	  }}|||z  z  }|||z  z  }|dz  } ||       ||      z   dkD  rL||fS )Nr      r   )r   )	zrezimr   _abssretresimtimr   s	            rV   complex_ei_taylorr     s    DOC#OC#	A
s)d3i
!
#WSW_q(4/3s73s7?Q2F1MSsaxsax	Q	 s)d3i
!
#
 8OrU   c                 n    t         |z  }||z  | z  x} }|| z   }d}|r||z  | z  |z	  }||z  }|dz  }|r|S r   )r   )r   r   oner   r   r   s         rV   ei_asymptoticr     s^    
T/CTka AaA	A
qSUtO	Q	Q  HrU   c                 J   t         }t        |z  }||z  | | z  z   |z	  }| |z  |z  x}}| |z  |z  x}}	||z   }
|}d} ||       ||	      z   dkD  rQ||z  |	|z  z
  |z  |z	  ||z  |	|z  z   |z  |z	  }	}|
|z  }
||	z  }|dz  }||kD  rt         ||       ||	      z   dkD  rQ|
|fS )Nr   i  r   )r   r   rP   )r   r   r   r   r   Mxrer   ximr   r   r   r   s                rV   complex_ei_asymptoticr     s    D
T/C	S3s7	t#A""C#$4A%%C#
)C
C	A
s)d3i
$
&WSW_a'$.#c'#c'/11Dt0KSs
s
	Qt8 s)d3i
$
& 8OrU   Fc                    |rt        |       } | \  }}}}|r|s| t        k(  rt        S t        d      |rd|||f}||z   }	|dz   }
|	|
kD  }|s%|dk\  r||z  }n|| z	  }|t	        |
dz        dz   kD  }|rS|	|
kD  rt
        }n!t        t        t        | |
      |
      |
       }t        |t        | |
      |
      }t        || ||      }n|
dt	        t        |            z  z  }
t        | |
      }t        ||
      t        |
      z   }t        ||
       }t        ||
      }t!        ||||      }n6| t        k(  rt"        }n&| t        k(  rt        }n| t"        k(  rt        }nt$        }|rt        |      }|S )NzE1(x) for x < 0r   r   V-?r   r   )r%   r   r   r
   r   r   r   r   r   r(   r0   r)   r   r   rN   r1   r   r   r   )r   r   r   e1r   r   r   r   xabsxmagr   can_use_asympxabsintvut1r   s                    rV   mpf_eir     s   	AJD#sB	$:K-..
#sB2vBYr	ax*3$-#c"U(mb&88Mby x2!CbSI71b>2.A1dC(A!Ct%%%BBA!R ;r?2Aa$Bb!BBc*A:5q$YD%ZUa	AJHrU   c           
      ,   |rt        |       } | \  }}|\  }}}}	|\  }
}}}|t        k(  rP|r;t        t        |||            }|st        t	        ||            }||fS t        }||fS t        |||      t        fS |t        k7  r|r|st
        t
        fS |dz   }||	z   }||z   }t        ||      }||kD  }|s=t        t        |            t        t        |            z   }|t        |dz        dz   kD  }	 |r||kD  rt        t        f}nBt        ||      }t        ||      }t        |||      \  }}t        ||       t        ||       f}t        |t        | |      |      }t!        || |      }|rt        |||      }|S |\  }}|
r&t#        |||      t%        |t	        |      ||      f}|S t#        |||      t'        |t	        |      ||      f}|S 	 |dt        t        t+        | d                  z  z  }t        ||      }t        ||      }t-        |||      \  }}|t/        |      z  }t        ||       t        ||       f}|rt1        t        |       |      }nt1        | |      }t3        ||||      }|rt        |      }|S # t(        $ r Y w xY w)N(   r   r   r   r   )r;   r   r%   r   r/   r   r   r   r   r   r   r   r   r   r:   rJ   r=   r   r'   r   rP   rG   r   rN   r@   rA   )r   r   r   r   abasignamanaexpabcbsignbmanbexpbbcr   r   r   amagbmagzmagr   zabsintr   r   r   vrevimr   s                               rV   mpc_eir     s   	AJDAqE4sE4sEzq$,-AF4-. a4K a4K!T3'..Ez4$<	B8D8DtT?D2IMfQi.3vay>1#bh-""44by%Kq"oq"o0c2>S rc*Lrc,BB71b>2.A1b!AAtS) H 14-wq&*dC/PPA H  4-wq&*dC/PPAH% , !Cwq!}%&
&&B
1b/C
1b/C c2.HC;r?CS"|C44A	GAJr"AbM1dC A	AJH!  s   3B
J >,J +%J 	JJc                     t        | ||d      S NT)r   r   r   r   s      rV   mpf_e1r   O      !T3%%rU   c                     t        | ||d      S r   )r   r   s      rV   mpc_e1r   R  r   rU   c           
      j   |\  }}}}|s|rB|t         k(  r| dk  rt        dfS t        | ||      dfS |t        k(  rt         dfS t        t        fS |t         k(  r | dkD  rt	        d| dz
  ||      dfS t        dfS |t        k(  rt         dfS t        t        fS | }	|rd| z
  } |dz   }
||z   }|dk  rt
        t        t        |             }| dkD  xr |}t        |      }| dk(  sd|z  |z
  |
 k  rH|r*t        ||
      }t        |t        ||	dz
  |
      ||      }nt        ||
      }t        ||||      }nd|
z  | cxk  xr dk  nc }|snt        t        |            }t        t        d|| z
        d|
z        }|  |z  || z   t        t        || z               z  z   ||z  z
  d|z  d	z  z
  }|
 d
z
  }||k  }|rt          |
|
z   z  t#        ||
      z  }| }||z  }t         |
z  }|r|r||z  }|dz  }||z  |z  |
z	  }|r|rt        ||
      }|rt        |t        ||	dz
  |
      |
      }nt        |||
      }t        |t%        ||
       ||      }nd| dk(  rt        t'        |||            }nG| dkD  r;| d|
z  k  r2t        t'        ||
            }|r|	dz  r't        |      }nt        |t        || dz
  |
      |
      }t#        ||
      x}}dg| dz
  z  }t)        d| dz
        D ]  }||dz
     |z  ||<    |ddd   }|d   |
z  }t)        d| dz
        D ]&  }|dz  r|||   |z  z  }n|||   |z  z  }||z  |
z	  }( t%        ||
 |
      }t        |t        ||
            }|rt        |t        ||	|
      |
      }t+        ||      }t        |t-        t/        | dz
              ||      }nt
        |ryt-        t/        | dz
               }|r+t        t1        |
      |||      }|	dz  rt        |      }||fS t        t        t1        |
      t        ||	dz
  |
      |
      |||      }||fS |df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   rL   r   r   NotImplementedErrorr   r   r%   r0   r(   r-   r)   r   rk   r   r   r   r   r   rn   r   r   rK   r/   ) r`   r   r   r   gammar   r   r   r   n_origr   r   nmag	have_imagnegxr   recan_use_asymptotic_seriesximsiztolrr   r   T1facsr   T2r^   r   ims                                    rV   
mpf_expintr  U  s    D#sBEz6:%$Qc2D88Dyd{":Ezq5(AaCs;TAA:%Dyd{":FaC	B8Dcz!!CFDA$I1:DAv4$"$b!AK6!8R8$DBb!AAtS)B %'rEANN!(VAYBC2a4L!B$'A"T'QqS(3qs8"444qv=QLC#b&C(+c	%$(2&8Ar?:AA!A2AQQqSUrM  b!AA{1fQh;R@ Aq"%LRC0$<B!VdC01BUq1R4xb)*BA: BRT1Q3!;R@QO#A3!A#;D1QqS\ (qs)a-Q(":DQ2A1ac]  q5a1$Aa1$AqSRK  a"b)BWT2./BRQ!;R@BAHT!A#Y/s;B%%d1Q3iZ Qc2BzR[ 2v [vax-LbQSTVZ\_`B2v4xrU   c                     t        | |      } | | z   |z	  }|dk(  rdt        |z  d}}}n| | d}}}|r!||z  ||dz
  z  z  |z	  }|||z  z  }|dz  }|r!t        ||       S )z2
    0 - Ci(x) - (euler+log(x))
    1 - Si(x)
    r   r   r   r   )r   r   r   )r   r   whichx2r   r   r   s          rV   mpf_ci_si_taylorr    s    
 	BAQ32BzgrkAa1Qa1
rTAqsG_r!	QT		Q  B3rU   c                    | d   r| d   | d   z   }n|d   r|d   |d   z   }|d   rt        |d   |d   z         }dkD  s|| k  rt        |d|z
  z  }t        | |      }t        ||      }||z  ||z  z
  |z	  }d|z  |z  |z	  }|}	|}
t        |z  }|dk(  rddt        |z  ddf\  }}}	}
}n||||df\  }}}	}
}t        t	        |	      t	        |
            dkD  ra||dz
  z  }|	|z  |
|z  z
  |z  |z	  |	|z  |
|z  z   |z  |z	  }
}	||	|z  z  }||
|z  z  }|dz  }t        t	        |	      t	        |
            dkD  rat        ||       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   fs                   rV   mpc_ci_si_taylorr    s    
!ueBqEk	AeBqEk	!u#r!uRU{#
Qw#)!!1S5MB
2r
C
2r
CGCGOb DsF3JD
C
C
2+Cz !1w{Q 9S#sA #S#sA 5S#sA
c#hC
!A
%qsGXc$h&*R/3t8CH3Dq2H21MSsAvsAv	Q c#hC
!A
% bS!<bS#999rU   r   c           	      0   |dz   }| \  }}}}d\  }	}
|s| t         k(  rt        t         fS | t        k(  r| | fS t         }	|dk7  rN| t        k(  rt	        t        ||      d      }
| t        k(  r&t        t	        t        |t        |         d            }
|	|
fS ||z   }|| k  rM|dk7  rt        | d|z
  ||      }
|dk7  r.t        |      }t        |       }t        |t        ||      ||      }	|	|
fS ||kD  r]|dk7  r7|rt        t        |t        |               }
nt        ||      }
t	        |
d      }
|dk7  rt        t        | |      | ||      }	|	|
fS |t        |      z  }|dz
  t!        j"                  |d      kD  }|sj|dk7  rt%        t'        | |d      ||      }
|dk7  rDt'        | |d      }	t        |	t        |      |      }	t        |	t        t        |       |      ||      }	|	|
fS t        |       } t)        | |      }t*        d|z  z  |z  }t*        |z  }|}|}d}|r0| }||z  |z  |z	  }|dz  }||z  }||z  |z  |z	  }|dz  }||z  }|r0t-        ||       }t-        ||       }t        || |      }t        || |      }t/        | |      \  }}|dk7  r[t        t1        ||      t1        ||      |      }
t3        t	        t        |      d      |
|      }
|rt        |
      }
t%        |
||      }
|dk7  r"t3        t1        ||      t1        ||      ||      }	|	|
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$   rM   r   r   r1   r)   r5   r   r   r   r   r  r   r   r   r3   r(   r'   )r   r   r   r  r   r   r   r   r   cisir   r   r   
asymptoticxfxrs1s2r   r   cossins                          rV   	mpf_ci_sir'    s]    
BD#sBFB:5>!9q6MA:DyvdC0"5EzYvdL4E'FKLBx
b&C
bSyA:Q$c2BA:"A1:DGD"-tS9B2v	rA:VD,s*;<=D#&2r"BA:BD#6B2v
c#h Q"a(JA:)!R3T3?BA:!!R+BYr]B/BWWQZ4dC@B2v
A	!RB
AbD/b	 B
R-B	B
A	A
BrT!VbL	Q
arT!VbL	Q
a  
b2#	B	b2#	B	Q	B	Q	B1b!HC zWS"%wsB'7<Yvbz2.B7BRs#zWS"%wsB'7sCr6MrU   c                 L    t        |       dk  rt        t        | ||d      d   S )Nr   )r   r
   r'  r   s      rV   mpf_cir)  X  s)    {QQc1%a((rU   c                 $    t        | ||d      d   S )Nr   )r'  r   s      rV   mpf_sir+  ]  s    Qc1%a((rU   c                    | \  }}|t         k(  r5t        |||d      d   }t        |      dk  r|t        ||      fS |t         fS |dz   }t	        |||d      \  }}t        |t        |      |      }t        ||ft        | |      ||      }|S )Nr   r   )	r   r'  r   r/   r  r   rM   rA   r@   )	r   r   r   r  r  r  r   crecims	            rV   mpc_cir/  `  s    FB	U{r4a(+B<!tS)**E{	BBA.HC
#y}b
)C	#sWQ^T3	7BIrU   c                     | \  }}|t         k(  rt        |||d      d   t         fS |dz   }t        |||d      } t        | ||      S )Nr   r   )r   r'  r  rB   )r   r   r   r  r  r   s         rV   mpc_sir1  m  sU    FB	U{"dC+A.66	BRQ'A1dC  rU   c                    |dz  }| dk  xr | dz  }|d   |d   z   }t        |       } |dz   | t        |       z  z   }|dk  r|| |z  z  }t        ||      }|dz  |z	  }| st        |z  x}}	n|| z  t	        |       z  | dz
  |z  | z   z	  x}}	d}
|	r!|	|z  d|
z  |
| z   z  z  |z	  }	||	z  }|
dz  }
|	r!|r| }t        || ||      S )N2   r   r   r   r   r   )r   r   r   r   rK   r   )r`   r   r   roundingnegater   r   r  r   r   r   s              rV   mpf_besseljnr7    s   BJDU_q1uF
A$qt)CAA	Qx{]	"B
Qw
a#gBA
Q$2B2AAaqsBhl33A	A
"f"Q$!*%",	Q	Q  BB3h//rU   c                 4   | dk  xr | dz  }t        |       } |}|\  }}t        |d   |d   z   |d   |d   z         }|d| t        |       z  z   t        |      z   z  }|dk  r|| |z  z  }t        ||      }t        ||      }|dz  |dz  z
  |z	  }	||z  |dz
  z	  }
| st        |z  x}}t
        x}}nHt        |||       \  }}|t        |       z  | dz
  |z  | z   z	  x}}|t        |       z  | dz
  |z  | z   z	  x}}d}t        |      t        |      z   dkD  r[d|z  || z   z  }||	z  ||
z  z
  ||	z  ||
z  z   }}||z  |z	  }||z  |z	  }||z  }||z  }|dz  }t        |      t        |      z   dkD  r[|r| }| }t        || ||      }t        || ||      }||fS )Nr   r   r   r   r   r4  )	r   r   r   r   r   r   r<   rK   r   )r`   r   r   r5  r6  origprecr   r   r   r  r  r   r   r   r   r  r  r   rq   s                      rV   mpc_besseljnr:    s   U_q1uFAAHHC
c!fSVmSVCF]
+CB8A;S))D
QwC
3
C
3
CFS!VO$DGa DtO#cc c1-B47]1d
Q77c47]1d
Q77c	A
c(SX

!qD!A#Jt8c$h&D3t8(;SaxD axD s
s
	Q c(SX

! dd	cD5(H	5B	cD5(H	5B8OrU   c                    | \  }}}}|\  }}	}
}|s|rt        d      |r|	sZ| t        k(  s	|t        k(  rt        S | t        k(  r|t        k(  rt        S t        S |t        k(  r| t        k(  rt        S t        S t        S |dz   }||z   }|
|z   }||z
  }t	        |      }|dkD  r[|dkD  r9t        t        | ||      d      t        t        | ||      |      }} |dz  }|dkD  r9| \  }}}}|\  }}	}
}||z   }|
|z   }||z
  }t        ||      }t        ||      }d}|dk  r| }n|dkD  r| }|rt        | |      } t        ||      }t        | |      }t        ||      }t        |||      }t        || |z
  ||      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(   rk   r   r   r6   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	mag_deltaabs_mag_deltamin_magmax_magr`   afbfgs                          rV   mpf_agmrC    s   
 E4sE4s677T9T	K9EzK9EzK	B8D8DtI	NMrb WQq_R01R, AaM b  "#tT3!"tT3CxCx4K	 $tnG$tnG	A|H	2HaOaO	!RB	!RB"b"AB3q5$,,rU   c                 &    t        t        | ||      S )z\
    Computes the arithmetic-geometric mean agm(1,a) for a nonnegative
    mpf value a.
    )rC  r   r   r   r   s      rV   mpf_agm1rF    s    
 4D#&&rU   c                    t        |       st        |      rt        t        fS t        | |fv rt        t        fS t	        |       |k(  rt        t        fS |dz   }t        t        | dz         }	 t        t        | ||      d      }t        t        | ||      |      }||}} t        t        | d      t        |d      g      d   }t        t        | |d      d      }	|t        k(  st        |	t        ||            r| S )z
    Complex AGM.

    TODO:
    * check that convergence works as intended
    * optimize
    * select a nonarbitrary branch
    r   r   r   r   )rD   r   rE   r   r;   r&   r   rC   rA   rF   r:   r#   rG   r8   r    r(   )
r   r   r   r   r   epsa1b1r   errs
             rV   mpc_agmrL    s     Q=+TzAq6e|qzQe|	bB
D2#b&
!C
wq!R("-gaB',21GAbM71R=9:1=gaB',5=F3T(:;H rU   c                 &    t        t        | ||      S r   )rL  r7   rE  s      rV   mpc_agm1rN  ,  s    7AtS))rU   c                 :   | d   s9| t         k(  rt        t        ||      d      S | t        k(  rt         S | t        k(  r| S | t
        k(  rt        S |dz   }t        t        t
        | |      |      }t        ||      }t        t        |      |||      }t        |d      S )Nr   r      )r   r&   r/   r   r   r   r   r+   r'   rF  r)   )r   r   r   r   r   r   r  s          rV   
mpf_ellipkrQ  /  s    Q4:VD#.33:L9HDy 
B 	q"%r*ABAr
AtS)AQrU   c                     | \  }}|t         k(  r2|t        k(  rt        S t        |t              rt        |||      t         fS |dz   }t        t        t        | |      |      }t        ||      }t        t        |      |||      }t        |d      S )NrP  r   )r   r   rE   r!   r   rQ  rF   r8   r7   rN  rH   r/   rC   )	r   r   r   r  r  r   r   r   r  s	            rV   
mpc_ellipkrS  C  s    FB	U{:O"db$,e33	B!R("-ABAF2J4-AQrU   c                 H   | \  }}}}|sH| t         k(  rt        t        ||      d      S | t        k(  rt        S | t
        k(  r| S | t        k(  rt        | t        k(  rt        S |dz   }||z   }|| k  rt        t        ||      d      S t        |d      |z
  }	t        t        |	      }
t        | d|z        }t        t        | |
      d|z        }t        t        ||      |	       }t        t        |       }t        |t        | d      |      }t        |t        ||      ||      S )Nr   r   r   r   r   )r   r&   r/   r   r   r   r
   r   r   rQ  r'   r(   r   )r   r   r   r   r   r   r   r   r   rq   hKKhKdiffr   r   s                   rV   
mpf_elliperY  P  s    D#sB:VD#.33:K9H9Dy	bB
b&C
bSyc*B//CbA$A1adA	GAqM1R4	(Bganqb)EaAy1~r*A1gamT3//rU   c                 
   | \  }}|t         k(  r8|t        k(  rt         t        fS t        |t              rt	        |||      t         fS |dz   }t        | d      }t        |d   |d   z   d      |z
  }t        t        |      }t        | d|z        }	t        t        | |d|z        d|z        }
t        t        |
|	|      |       }t        t        | |      }t        |t        | d      |      }t        |t        |	||      ||      S )NrP  r   r   r   r   )r   r   r!   r   rY  rG   r   r&   rS  r>   rC   r8   r7   r:   rA   )r   r   r   r  r  r   r   rq   rU  rV  rW  rX  r   r   s                 rV   
mpc_elliper[  n  s    FB	U{:4= "db$,e33	B
!Q-CCF3q6M1"A$A1adA	K1ad+QrT	2Bgb!R(1"-EBAy1~r*A1gaB's33rU   )r   )t__doc__operatorr   backendr   r   r   r   r   
libintmathr	   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.   	libelefunr/   r0   r1   r2   r3   r4   r5   r6   libmpcr7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   	gammazetarL   rM   rN   	ExceptionrP   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r'  r)  r+  r/  r1  r7  r:  rC  rF  rL  rN  rQ  rS  rY  r[  rT   rU   rV   <module>re     s     > > 
 
 
 
 
 
 
 
 
 
  
       < <	I 		s$l f!. $ &+Z % %\
	( #u (T #u ?B # & # &  * tl ":> &Q [z # )
 # ) #  # !P '1 0. '1 "H ' 9-v % ' ' 4 % * ' ( '  ' 0< ' 4rU   