B
    bd-                @   sB  d Z ddlZddlZddlm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 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZS dd	lTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZn e>d
d Zoe>dd Zpe>dd Zqe>dd Zre>dd Zse>dd Zte>dd Zue?esZve?erZwe?epZxe?eqZye?eoZze?etZ{e?euZ|dZ}i Z~e!dZe!dZdd Zee}ZdkddZdldd Zd!d" Zd#d$ Zd%d& Zefd'd(Zefd)d*Zefd+d,Zefd-d.Zi Zd/d0 Zd1Zi Zefd2d3Zedfd4d5Zedd6fd7d8Zefd9d:Zefd;d<ZdZd=d> Zg ag ag ad?d@ ZdAdB ZdCZdDdE ZdFZedGk stdHZdIZi Zi ZdJdK eed D ZdLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdmdYdZZdnd[d\Zdod]d^Zdpd_d`ZdqdadbZdrdcddZdsdedfZdtdgdhZefdidjZdS )uao  
-----------------------------------------------------------------------
This module implements gamma- and zeta-related functions:

* Bernoulli numbers
* Factorials
* The gamma function
* Polygamma functions
* Harmonic numbers
* The Riemann zeta function
* Constants related to these functions

-----------------------------------------------------------------------
    N   )xrange)MPZMPZ_ZEROMPZ_ONE	MPZ_THREEgmpy)list_primesifacifac2moebius)-round_floorround_ceiling
round_downround_upround_nearest
round_fastlshift
sqrt_fixed
isqrt_fastfzerofonefnonefhalfftwofinffninffnanfrom_intto_intto_fixedfrom_man_expfrom_rationalmpf_posmpf_negmpf_absmpf_addmpf_submpf_mulmpf_mul_intmpf_divmpf_sqrtmpf_pow_intmpf_rdiv_intmpf_perturbmpf_lempf_ltmpf_gt	mpf_shiftnegative_rndreciprocal_rndbitcountto_float	mpf_floormpf_signComplexResult)constant_memodef_mpf_constantmpf_pipi_fixed	ln2_fixedlog_int_fixedmpf_ln2mpf_expmpf_logmpf_powmpf_coshmpf_cos_sinmpf_cosh_sinhmpf_cos_sin_pi
mpf_cos_pi
mpf_sin_piln_sqrt2pi_fixedmpf_ln_sqrt2pisqrtpi_fixed
mpf_sqrtpicos_sin_fixed	exp_fixed)mpc_zerompc_onempc_halfmpc_twompc_abs	mpc_shiftmpc_posmpc_negmpc_addmpc_submpc_mulmpc_divmpc_add_mpfmpc_mul_mpfmpc_div_mpfmpc_mpf_divmpc_mul_intmpc_pow_intmpc_logmpc_expmpc_pow
mpc_cos_pi
mpc_sin_pimpc_reciprocal
mpc_squarempc_sub_mpfc             C   s   | d } t | >  }}d\}}}x|r|d|d  d| d  9 }|dd|  d|d   d  }|d|d   d	|d  d
|  d  |d d| d   }||7 }|d7 }q W |d? S )N   )r   r   r             r      (         )r   )precaonestn ry   c/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/mpmath/libmp/gammazeta.pycatalan_fixedH   s    
 <r{   c             C   s.  t | | d  d }t}td}t|>  }}t|}tt|||d }}d}	xttd|	 |}
t|
||}
t	|
||}
t
|
|}
|
| | |	 |? }|dk rP ||7 }||d|	 d  |d|	   7 }|	d7 }	t|d|	 d|	 d  |}t|||}qPW ||> t| }tt|| |}t
|| }|S )Ng      ?      rm   r   d   )intr   r   r   r<   r2   r(   r%   mpf_bernoullir*   r    r)   r>   rA   r!   )rs   wprv   facrw   ONEpiZpipowZtwopi2rx   Zzeta2ntermKry   ry   rz   khinchin_fixedm   s0    
 
r   c             C   s  | d }t d|  d }t|> }t}x(td|D ]}|t|||d  7 }q0W t||}||| | 7 }|||d d  7 }|d }d}d}	d}
td}d}x||> |	|  | }t|| }td| |}t|||}t	|||}t
||}t|dk rP ||8 }|	||
  |
 |	 || |
d f\}}	}}
|	||
  |
 |	 || |
d f\}}	}}
|d7 }t|d| d| d  |}qW t|}|d	9 }||> |d |?  }|t|7 }|t
ttd| | ||7 }|d
 }tt|| |}t
|| S )N   gQ?   rm   rl   r   r~         )r   r   r   ranger?   r   r!   r   r(   r*   r    absr)   r=   euler_fixedrB   rA   )rs   r   Nr   rv   kZlogNZpNrt   bjr   DBr   r   Ary   ry   rz   glaisher_fixed   sJ    

**  r   c             C   s   | d7 } t | > }td| > }d}t}xh|r||7 }||d 9 }|d| d d d| d   }d| d|d  d	|  d  | }|d7 }q&W |d
? S )Nrj   M   r   
   rm   r   ro         rr   )r   r   r   )rs   dr   rx   rv   ry   ry   rz   apery_fixed   s     $r   c       	      C   s   d}| |7 } t t| d td dd }d| }| t|   }}t| >  }}d}x`||d  |d  }||d  | | | }||7 }||7 }tt|t|dk rP |d7 }qZW || | > | S )Nr   r}   rm   r   r~   )r   mathlogr>   r   maxr   )	rs   extraprx   r   Ur   Vr   ry   ry   rz   r     s     "r   c             C   st   | d }d}t |}xTt||}|tkr*P t||}t|t||}t|t||}t||}|d7 }qW t	|| S )Nrj   rm   r   )
	mpf_eulermpf_zeta_intr   rB   r)   r   r*   r   r&   r    )rs   r   mrv   rw   ry   ry   rz   mertens_fixed*  s    


r   c                s   dd }d|  d  t } fdddD } fdd|D }d}xt| }x>td	D ]2}t|tt ||  }t|| ||  ||< qVW t|||  }t|| d
 dt krP t|| }|d7 }qBW t|td }t|td }t	|| S )Nc                s$   t  fddtd d D   S )Nc             3   s&   | ]} | st | | > V  qd S )N)r   ).0r   )rx   ry   rz   	<genexpr>=  s    z-twinprime_fixed.<locals>.I.<locals>.<genexpr>r   )sumr   )rx   ry   )rx   rz   I<  s    ztwinprime_fixed.<locals>.Irm   r   c                s   g | ]}t d | qS )r   )r"   )r   r   )r   ry   rz   
<listcomp>@  s    z#twinprime_fixed.<locals>.<listcomp>)rm   rl   r      c                s   g | ]}t || qS ry   )r(   )r   r   )r   ry   rz   r   A  s    r}   r   rx   r   i'  i 	  )
r   r   r   r(   r'   r,   r#   r   r*   r    )rs   r   resprimesZppowersrx   rt   iry   )r   rz   twinprime_fixed:  s&    
r   i  rl   r   c             C   s(   t | d}tdd|  | |d   S )z5Accurately estimate the size of B_n (even n > 2 only)rm   gS㥛@g      ?gK7A`@)r   r   r   )rx   Zlgnry   ry   rz   bernoulli_size  s    r   c             C   s`  | dk r4| dk rt d| dkr$tS | dkr4ttS | d@ r@tS |tkrz|t| d d krzt| \}}t||||pvt	S | t
krt| ||S |d }|d|d	@  7 }t|}|r|\}}| |kr|s||  S t||  ||S |\}	}
}| |	 d
krJt| ||S nB| d
krt| ||S dti}dtd
tg \}	}
}}||ft|< x
|	| krV|	d }t|	}d}td|| }|	dk rt}n|}xtd|	d d D ]}||	d|    \}}}}}|r| }|t|| || 7 }d| }||	d | |	d |  |	d |  |	d |  |	d |  |	|  9 }|d| d|  d|  d|  d|  d|   }qW |dkrt|	d t|}|dkrt|	d t|}|dkrt|	 d t|}t|||}tt|||t|
|}|||	< |	d7 }	|
|	d |	d   |	|	d   }
|	dkr@|d|	 d|	   |	d |	d   }|	|
|g|dd< qNW ||  S )z.Computation of Bernoulli numbers (numerically)rm   r   z)Bernoulli numbers only defined for n >= 0r   g?i  r   rk      r   r   r   r}   rl   r      	   N)
ValueErrorr   r$   r   r   BERNOULLI_PREC_CUTOFFr   bernfracr"   r   MAX_BERNOULLI_CACHEmpf_bernoulli_hugebernoulli_cachegetr#   r   r   r   r   r   r   r-   f3f6r!   r*   r'   r   )rx   rs   rndr   qr   cachednumbersstater   binZbin1caseZszbmrv   Zsexprt   r   ZusignZumanZuexpZubcuZj6r   ry   ry   rz   r     s|    



H:
 
 
  
$r   c             C   s   |d }|t t| d }t| d |}t|t| ||}t|tt||  |}t|d|  }| d@ srt	|}t
|||p~tS )Nr   rm   r   rl   )r   r   r   mpf_gamma_intr(   r   r,   r<   r2   r$   r#   r   )rx   rs   r   r   Zpiprecvry   ry   rz   r     s    r   c             C   s   t | } | dk rdddg|  S | d@ r*dS d}x(t| d D ]}| |d  s<||9 }q<W t| t t|d d }t| |}t|t|}t|t	}||fS )	a  
    Returns a tuple of integers `(p, q)` such that `p/q = B_n` exactly,
    where `B_n` denotes the `n`-th Bernoulli number. The fraction is
    always reduced to lowest terms. Note that for `n > 1` and `n` odd,
    `B_n = 0`, and `(0, 1)` is returned.

    **Examples**

    The first few Bernoulli numbers are exactly::

        >>> from mpmath import *
        >>> for n in range(15):
        ...     p, q = bernfrac(n)
        ...     print("%s %s/%s" % (n, p, q))
        ...
        0 1/1
        1 -1/2
        2 1/6
        3 0/1
        4 -1/30
        5 0/1
        6 1/42
        7 0/1
        8 -1/30
        9 0/1
        10 5/66
        11 0/1
        12 -691/2730
        13 0/1
        14 7/6

    This function works for arbitrarily large `n`::

        >>> p, q = bernfrac(10**4)
        >>> print(q)
        2338224387510
        >>> print(len(str(p)))
        27692
        >>> mp.dps = 15
        >>> print(mpf(p) / q)
        -9.04942396360948e+27677
        >>> print(bernoulli(10**4))
        -9.04942396360948e+27677

    .. note ::

        :func:`~mpmath.bernoulli` computes a floating-point approximation
        directly, without computing the exact fraction first.
        This is much faster for large `n`.

    **Algorithm**

    :func:`~mpmath.bernfrac` works by computing the value of `B_n` numerically
    and then using the von Staudt-Clausen theorem [1] to reconstruct
    the exact fraction. For large `n`, this is significantly faster than
    computing `B_1, B_2, \ldots, B_2` recursively with exact arithmetic.
    The implementation has been tested for `n = 10^m` up to `m = 6`.

    In practice, :func:`~mpmath.bernfrac` appears to be about three times
    slower than the specialized program calcbn.exe [2]

    **References**

    1. MathWorld, von Staudt-Clausen Theorem:
       http://mathworld.wolfram.com/vonStaudt-ClausenTheorem.html

    2. The Bernoulli Number Page:
       http://www.bernoulli.org/

    rl   )r   r   )ro   rm   )r   r   r   )r   r   rm   rj   )
r   r	   r   r   r   r   r(   r   r   r   )rx   r   r   rs   r   r   Zpintry   ry   rz   r     s    G

r   c             C   s@   | t ttfkr| S ttt| |d |}t|t|d |||S )Nr   )r   r   r   mpf_psi0r&   r   r   )xrs   r   rt   ry   ry   rz   mpf_harmonic  s    r   c             C   sN   | d t kr t| d ||t fS tt| t|d |}t|t|d |||S )Nr   r   r   )r   r   mpc_psi0r\   r   r   )zrs   r   rt   ry   ry   rz   mpc_harmonic  s    r   c             C   s~  | \}}}}|d }|s8| t kr$| S | tks4| tkr8tS | tksL|dkrT|rTtd|| dk rtt| t||||}t|t	t| ||||S |r|| dkrt
| |\}	}
tt	|	|
|t||}ttt| ||}t||||S |s|| |krtt| t|||S t| }td| d }t}
t| |} t|> }||k rrx,t||D ]}|
||> |  8 }
| |7 } qPW | |8 } |
ttt| | |||7 }
|
||> d|   7 }
| |  |? }|}d}d}x|| |? }td| |\}}}}|d|  }|dkr||> |d|   }n|| ? |d|   }|d@ r>|
|8 }
n|
|7 }
|dkr\||kr\P |}|d7 }qW t|
| ||S )	z_
    Computation of the digamma function (psi function of order 0)
    of a real argument.
    r   r   zpolygamma polerl   g)\(?rm   r   )r   r   r   r   r   r   r&   r   r'   r*   rG   r(   r<   rB   r   r   r   r    r   r   r!   r   )r   rs   r   signmanexpbcr   r   crv   r   r   r   rx   ru   r   x2rw   prevbsignbmanbexpbbcoffsetr   ry   ry   rz   r     sd      


 
 
r   c             C   s  | \}}|t kr t|||t fS |d }|\}}}}	|r||	 dkrt| |}
t| |}tt|
||t||}ttt	| ||}t||||S |s|	| |krt
t| t	|||S t|}td| d }t}||k rx0t||D ]"}t|t| ||}t| t|} qW t| t	|} t|t
| ||}t|tt| ||}t| |}t	}t}t }d}tt| d }xt|||}td| |}t|t|d| ||}t|||}t|d}|dkrt||st||rP |}|}|d7 }qjW |S )zb
    Computation of the digamma function (psi function of order 0)
    of a complex argument.
    rj   rl   g)\(?rm   r   r   )r   r   re   rf   r]   r[   r<   r   rY   rQ   rb   r   r   rP   r   rg   r\   r   rX   rR   rh   r2   rZ   r   r_   r`   rT   r/   )r   rs   r   reimr   r   r   r   r   r   rv   r   r   wrx   r   z2rw   r   Zszprevepsbernr   sztermry   ry   rz   r     sR    




"r   c             C   s,   | dkrt ||tdS t| |tf||d S )zm
    Computation of the polygamma function of arbitrary integer order
    m >= 0, for a real argument x.
    r   )r   )r   r   mpc_psir   )r   r   rs   r   ry   ry   rz   mpf_psi  s    r   c             C   sl  | dkrt |||S |\}}|d }|\}}}	}
|d sN|tttfkrNttfS |sz|tkrj|tkrjttfS |tkrzttfS t|}td| d|   }t}||k rx<t||D ].}t	||  d |}t
|||}t|t|}qW t	||  |}t	|d|}t|t| |}t
|||}t
|tt|||t||}| d }d}d}t|d}|d |d	  }tt|| d }xt|||}td| |}t|||}t|t||}t|||}t
|||}t|d}|dkrt||rP || d|  | d|  d  9 }|d| d d| d  9 }|d7 }qpW t|tt| d |||}| d@ sht|d t|d f}|S )
zp
    Computation of the polygamma function of arbitrary integer order
    m >= 0, for a complex argument z.
    r   rj   r   g?r}   r   rm   r   rl   )r   r   r   r   r   r   r   rP   r   ra   rX   r\   r   r^   r   r]   r[   r   rT   r2   rZ   r   r)   r*   r/   	mpf_gammar$   )r   r   rs   r   r   r   r   r   r   r   r   r   rx   rv   r   rw   Zzmr   Zintegral_termrt   r   Zmagnr   r   Zscalr   r   r   ry   ry   rz   r   
  sb    

 
r   c             C   s   | t krt |  S tg| d  }t}t }|d< x^td| d D ]L}|d | | d  | | d  }|d| d| d   }||7 }|||< q>W |t | < |S )Nr   r   r}   rm   )borwein_cacher   r   r   )rx   Zdsr   rv   r   ry   ry   rz   borwein_coefficients{  s     r   i  c             C   s  |d }t | } | tkr<t|  d |kr<tt|  d ||S | dk r| dkrTtd| s`ttS tt|  d |t| d ||S | |krt	t
d||S | |d k rd|>  }}|d||  > 7 }||t|   7 }|dtd|| d  > 7 }t|| ||S t|| d  d }|dk rt d| d }|t |d	 d
 d k rt
}x\t|D ]P}t || t|d  }	|	dk rzP tt
tt||  |	|}
t||
|}qRW tt
||S t |d	 d
 }t|}t}t| } x>t|D ]2}|d| || ||   |> |d |   7 }qW ||> ||   }||> d|> d|d |  >   }| tkrdt|  d |k sn| tkr|t|| | ft| < t|| | ||S )z<
    Optimized computation of zeta(s) for an integer s.
    rj   r   r   rm   zzeta(1) poleg/$?r   g       @gRQ@r   r   ro   )r   zeta_int_cacher#   r   r$   r   r*   r   r   r.   r   r   r   r!   floatr	   r   r   r'   r,   r(   r   r   r   r   )rv   rs   r   r   rw   ru   r   Zneeded_termsr   Zpowprecrt   rx   r   ry   ry   rz   r     sR    "

2 &r   c              C   s  | \}}}}|s8| t kr(|r tS ttS | tkr4tS tS |d }|sj|| t|dd krjtt|||S |dkr|r| tkrt	||S t
t| |t| }	tttttt| |||}
t|	|
||S t
t| ||S |r|rtttttt| |||}
tt| ||
||S tt| d| }t||}t||}tt| d|}|td||  }t|| }ttt|d| |||}t|t|t||||||S tt| |}t|\}}}}d||  }||kr|rt	||S ttt||}
t|
t|||S n|td|7 }t}t|d d	 }t|}t}t| |}t|}xht |D ]\}| t!|d || |? }t"|||}|| ||  | }|d@ r||8 }n||7 }qLW |||   }t#|| |}|rt$|||S tttttt| |||}
t||
||S d S )
Nrj   rm   r   r   ro   r   r   gRQ@r   )%r   r   r$   r   r   r   r   r   r.   r@   r   r   r3   r'   rC   r   r(   mpf_zetar   rI   r2   r   r<   r*   r%   r&   r   r   r   r   r    r>   r   r?   rO   r!   r#   ) rv   rs   r   altr   r   r   r   r   r   r   yrt   r   r   wp2r   r   rasignamanaexpabc	pole_distrw   rx   Zsfln2r   r   Zemanr   ry   ry   rz   r     sx    







r   Fc       0      C   s  | \}}|t kr"t||||t fS |s>tt| dt|r>t|d }tt| |}t|d\}	}
}}d||  }||kr|rt|}t	|t
||}tt	|||d}t||}t|t||}t|||}t|||S ttt||}t|t
||}t|||S n|td|7 }t|t r|rXtttttt| |||}tt| ||||S tt| d| }t||}t||}tt| d|}|\}}}}|\}}}}t|| || }|td| }t|| }t|dt f} tt| | |||}!t|t|t||!||||S t|d d }"|"td	tt | 7 }"t!|"}!t"||}#t"||}$t#}%t#}&t$|> }'t$d
| > }(|t%k})t&|}*t'|d } || }xt(|"D ]}+t)|+d ||*},|)r|(t*|+d |>  }-nt+|# |, |? |}-|+d@ r|-|!|" |!|+  9 }-n|-|!|+ |!|"  9 }-t,|$ |, |? || \}.}/|%|-|. |? 7 }%|&|-|/ |? 7 }&qW |%|!|"   }%|&|!|"   }&t-|%| |}%t-|&| |}&|rt|%|&f||S tttt|||}t|%|&f|||S d S )Nr   rj   r   ro   r   r   gRQ@r   g?rm   ).r   r   r1   rT   r   NotImplementedErrorrY   rQ   r@   r(   r   r2   r'   r]   r$   r\   rV   rW   r[   r   r0   rd   rS   rZ   mpc_zeta	mpc_gammarf   rU   r<   r^   r   r   r   r   r    r   r   r   r>   r=   r   r?   r   rO   rN   r!   )0rv   rs   r   r   forcer   r   r   r   r   r   r   r   r   r   r   gr   rt   r   r   ZrsignZrmanZrexpZrbcZisignZimanZiexpZibcmagr   r   pi2r   rx   refZimftretimru   one_2wpcritical_liner   r   r   r   wrewimry   ry   rz   r     s    







r   c             C   s   t | ||dS )Nr   )r   )rv   rs   r   ry   ry   rz   mpf_altzetar  s    r  c             C   s   t | ||dS )Nr   )r   )rv   rs   r   ry   ry   rz   mpc_altzetau  s    r  c             C   sR   |dkr| S t |> }x8|rL|d@ r6||  |? }|d8 }| |  |? } |d }qW |S )Nr   rm   )r   )r   rx   r   r   ry   ry   rz   	pow_fixed|  s    r  c             C   s   | t tk r8t}td tt|d  }t}|||fS dg| d  }dg| d  }t| }x.|D ]&}x t|| d |D ]}|||< qxW qbW xNt|D ]B\}}|dkrd}|| } x| | s| | } |d7 }qW |||< qW |a|a|a|||fS )Nr   r   rm   )	lensieve_cacheprimes_cacheindexr   
mult_cacher	   r   	enumerate)rx   siever   multr   r   r   r   ry   ry   rz   
primesieve  s.    


r  c             C   s  |dk rt dt|| \}}}i }	t|> }
td| > }|| }t|}t|d }x
|D ] }|d || krvP t|||}t| | |? ||\}}| r|t||>  }nt| | |? |}|| |? }|| |? }||fg|	|< || }}xht	dt
t|| |d d D ]B}|| ||  |? || ||  |?  }}|	| ||f qW q^W t}t}|dkr~||
7 }t|d}x6t||| d D ]}|| }||	krB|| }|	| |d  \}}x|||  }|dkrP || }|| }|	| |d  \}}|| ||  |? || ||  |?  }}qW njt|||}t| | |? ||\}}| r|t||>  }nt| | |? |}|| |? }|| |? }||7 }||7 }qW ||fS )Nr   za cannot be less than 1rm   g{Gz?)r   r  r   r>   r=   r?   rN   r   rO   r   r   r   r   appendr   r   r   )r  sresimrt   rx   r   r  r   r  Zbasic_powersru   r   r   r   r   r   r   cossinr   preZpimr   r   r   xreximZaar   ry   ry   rz   zetasum_sieved  sh    
(*



2r  r   c       !         s,   d t |}|dgk}t|dk}| \}}	|tk}
t|}t|	}	|dkr|tkr|s|s|dk sttjdkrt|
||	||\}}t|  dt|  dfg}|g fS t	|}|st
|d }dd |D d	d |D |rd
d |D dd |D ng  t> }td > }t}td } }xt||| d D ]}t||}t|	 | ? |\}}|
r|t||>  }nt| | ? }|| ? }|| ? }|r|||  }|| ? }|| ? }|r |rtt||}d  || ? 7  < d  || ? 7  < |rd  || ? 7  < d  || ? 7  < nt> }x|D ]x}|  || ? 7  < |  || ? 7  < |r|  || ? 7  < |  || ? 7  < || ? }qW nFd  |7  < d  |7  < |rZd  |7  < d  |7  < qZW |r|r|d rd  d< d  d< |rd  d< d  d< nNfdd|D fdd|D |rfdd|D fdd|D  fddtD } fddtD } || fS )zI
    Fast version of mp._zetasum, assuming s = complex, a = integer.
    r   r   r   g    Al        rx   c             S   s   g | ]}t qS ry   )r   )r   r   ry   ry   rz   r     s    zmpc_zetasum.<locals>.<listcomp>c             S   s   g | ]}t qS ry   )r   )r   r   ry   ry   rz   r      s    c             S   s   g | ]}t qS ry   )r   )r   r   ry   ry   rz   r     s    c             S   s   g | ]}t qS ry   )r   )r   r   ry   ry   rz   r     s    rm   c                s   g | ]}d |  |  qS )ro   ry   )r   r   )r  ry   rz   r   <  s    c                s   g | ]}d |  |  qS )ro   ry   )r   r   )r  ry   rz   r   =  s    c                s   g | ]}d |  |  qS )ro   ry   )r   r   )yrery   rz   r   ?  s    c                s   g | ]}d |  |  qS )ro   ry   )r   r   )yimry   rz   r   @  s    c                s0   g | ](\}}t |  d t |  d fqS )rx   )r!   )r   Zxaxb)rs   r   ry   rz   r   A  s   c                s0   g | ](\}}t |  d t |  d fqS )rx   )r!   )r   ZyaZyb)rs   r   ry   rz   r   C  s   )listr  r   r    ZETASUM_SIEVE_CUTOFFsysmaxsizer  r!   r   r   r   r>   r=   r   r?   rN   r   rO   r  zip)!rv   rt   rx   ZderivativesZreflectrs   Zhave_derivativesZhave_one_derivativer  r  r  r   r   ZxsZmaxdru   r   r   r   r   r   r   r  r  r   Zxterm_reZxterm_imZ
reciprocalZyterm_reZyterm_imrw   r   Zysry   )rs   r   r  r  r  r  rz   mpc_zetasum  s    


"

r!  i  i:  g?   c             C   s   g | ]}t t|qS ry   )r   r
   )r   rx   ry   ry   rz   r   \  s   r   c                s  d |  t g| d  }t}t> }| d |d< ttd}t| }}g }d}	xd|	  }
|
dk rtP ttt|t|
|
}t	|t	|||
|
}t
|}t
|}|	| | ? }|||f t	||}|	d7 }	q^W xtd| d dD ]}t }d}	xf|D ]^\}}|d dkr.||	|  }n |d d }|||  |	|  }|sVP ||7 }|	d7 }	q
W d| ||< qW fd	d
t| d D }tttdd }}t|td}x`td| d dD ]L}t	|| |}t
|||< t	||}t|t|d |d  }qW |> | }xtd| d dD ]}|d d }|d| d  d| d  d }xDtd|d D ]2}	||d|	  |d| d d|	    ? 8 }qW ||  d| | ? 7  < q@W xtd| d dD ]}|d d }|d| d  d| d  }xXtdd| d D ]B}	|d|	 d |	 |d|	   |d| d d|	    ? 7 }q*W ||  || ? d|  7  < qW  fdd
|D S )a  
    zeta(n) = A * pi**n / n! + B

    where A is a rational number (A = Bernoulli number
    for n even) and B is an infinite sum over powers of exp(2*pi).
    (B = 0 for n even).

    TODO: this is currently only used for gamma, but could
    be very useful elsewhere.
    r   rm   r   r   r   rl   r}   r   c                s   g | ]}t t| qS ry   )r%   r   )r   r   )r   ry   rz   r     s    zzeta_array.<locals>.<listcomp>r   r   ro   c                s   g | ]}| ? qS ry   ry   )r   r   )r   ry   rz   r     s    )r   r=   r   r2   r<   rA   r*   r   r'   r(   r    r  r   r,   r   )r   rs   zeta_valuesr   ru   Zf_2piZ	exp_2pi_kZexp_2piZexps3r   tpq1q2rx   rv   e1e2rw   r   r   Zpi_powZfpir   Zreciprocal_piry   )r   r   rz   
zeta_array_  sr    

" 2"B&r)  c       	         s  | dk r| d| d   n| dk r4| d| d   n| t krLt  fS dk rftd d }ntd d }xNt D ]F  kr| fdd	t   | d
 D }| dk r|t < |fS q|W dkrtd d }dg| }t|d< t|> |d< t||d< t||}x|td|D ]n}|d  ||d   |? }x8td|D ]*}|d| ||  |||   |? 7 }qLW |d|  }|||< q"W dd	 |D }|d
d
d }|d
d }|t < t| S )z
    Gives the Taylor coefficients of 1/gamma(1+x) as
    a list of fixed-point numbers. Enough coefficients are returned
    to ensure that the series converges to the given precision
    when x is in [0.5, 1.5].
    i  r   i  r   gRQ?rm   gv/?c                s   g | ]}|  ? qS ry   ry   )r   r   )cprecrs   ry   rz   r     s    z-gamma_taylor_coefficients.<locals>.<listcomp>Ng333333?rj   r   r   rl   ro   c             S   s   g | ]}|d ? qS )rj   ry   )r   rt   ry   ry   rz   r     s    )gamma_taylor_cacher   r   r   r   r)  r   gamma_taylor_coefficients)	Zinprecr   coeffsr   r   r#  r   rt   r   ry   )r*  rs   rz   r,    sF    
"

*r,  c             C   s^  ||d ? t  d? }t |> }t|\}}	|dkr|}
x(t|d D ]}||8 }|
| |? }
qDW ||8 }t}x|D ]}||| |?  }qrW ||	| L }|dkrt|
|> | | ||S |dkrtt||
|> |||S |dkrttt|
|> | | ||S nX|}
x(t| D ]}|
| |? }
||7 }qW t}x|D ]}||| |?  }q:W ||	| L }|t	t
| dkrt| t| }t||
 | | }
t|
||}
|dkrtt|
||S |dkrt|
||S |dkrZtttt|
|||S nbt|| |
 d| }
|dkr&tt|
||S |dkr<t|
||S |dkrZttt|
||S d S )Nr   r   rm   rl   r   )r   r,  r   r   r!   r2   r"   rB   r%   r5   r   r&   r   r(   r*   r   r#   r$   )Zxmpfr   r   rs   r   typeZnearest_intru   r-  Zcwpr   r   r   r   r   ry   ry   rz   gamma_fixed_taylor  sX    

$




 
 
 r0  c             C   sT   | t krt |  S t| \}}|t| | d  9 }||tt|t|ft | < t |  S )Nr   )gamma_stirling_cacher   r   r5   r   )rx   r   r   ry   ry   rz   stirling_coefficient  s    r2  c             C   s.  t || > |  }|| |? }t||  }||d 7 }|| |? }||d 8 }|| |? }||d 7 }|| |? }||d 8 }|| |? }|s|S ||d 7 }|| |? }|d| d 8 }|| |? }||d 7 }|| |? }|s|S |d	| d
 8 }|| |? }|d| d 7 }|| |? }|d| d 8 }|| |? }|sB|S d}tt|}tt|}d}xt|\}	}
}}|| | }| }|| }|dkr||k r|	|L }	||8 }|| }|dkr||k r||? }||8 }n|}||	 |
 |? }|sP ||7 }|| |? }||| 8 }|d7 }qdW |S )zr
    Sums the rational part of Stirling's expansion,

    log(sqrt(2*pi)) - z + 1/(12*z) - 1/(360*z^3) + ...

    r   ih  i  i  i  i  i    i!  i  i[  iܹ i i    r   rm   )r   rJ   r5   r   r2  )r   rs   rw   r   rv   r   usizetsizetexpr   r   pbqbterm_magshiftr   r   r   ry   ry   rz   real_stirling_series"  sl                 
r<  c             C   s  | |  ||  |? }| |> | }| |> | }|| ||  |? }|| |d ? }t ||  }| }	||d 7 }|	|d 7 }	|| ||  |? || ||  |?  }}||d 8 }|	|d 8 }	|| ||  |? || ||  |?  }}||d 7 }|	|d 7 }	|| ||  |? || ||  |?  }}||d 8 }|	|d 8 }	|| ||  |? || ||  |?  }}t|t| dk r||	fS ||d 7 }|	|d 7 }	|| ||  |? || ||  |?  }}|d| d	 8 }|	d| d	 8 }	|| ||  |? || ||  |?  }}||d
 7 }|	|d
 7 }	|| ||  |? || ||  |?  }}t|t| dk rv||	fS |d| d 8 }|	d| d 8 }	|| ||  |? || ||  |?  }}|d| d 7 }|	d| d 7 }	|| ||  |? || ||  |?  }}|d| d 8 }|	d| d 8 }	|| ||  |? || ||  |?  }}t|t| dk rr||	fS d}
ttt|t|}ttt|t|}d}xt|
\}}}}|| | }| }|| }|dkr||k r||L }||8 }|| }|dkr.||k r.||? }||? }||8 }n|}|}|| | |? }|| | |? }t|t| dk rnP ||7 }|	|7 }	|| ||  |? || ||  |?  }}||| 8 }|
d7 }
qW ||	fS )Nr   r   ih  i  i  r   i  i  i r3  i!  i  i[  iܹ i i r4  r   rm   )rJ   r   r5   r   r2  )r   r   rs   _mr   r   ZureZuimr  r  r   r5  r6  r7  r   r   r8  r9  r:  r;  r   r  r  ZtermreZtermimry   ry   rz   complex_stirling_seriesW  s     * * * *  * * *  * * * 
r>  r   c       #      C   s
  | \}}}}|sT| t kr8|dkr$tS |dkr0t S td| tkrP|dkrLt S tS tS |dkr|d }|| |kr|stt| t| ||| ||S |dk}	|	r<|r|dkrt S td||> }
|
tk rJ|dkrt	t
|
d  ||S |dkrt	t
|
 ||S |dkrttt
|
d  ||S |dkrJtt
|
d  ||S nt|| ? }
|| }|
| }|dkrn|d }n|t| d }|| k r
|dkrttt| |tt| ||S |dkrtt| ||S |dkrt| tt|| ||S |dkr
ttt| ||S |dkr(tt| t||dS |dkrD|	r|d| k r|dkrdtt|
d ||S |dkrttt|
d ||S |dkrttt|
d ||S |
d	k s|d| k rD|r~t|}|
d rtd|
 d }ntd|
 d  }|dkr"tt||||| |
 d S |dkrHtt||||||
 d S |dkrDttt|t|||| |
 d ||S n|
dkr|dkrt||S |dkrttt|||S |dkrDtt|||S npt|}t|td|
 d  | |
 }|dkrt	|||S |dkr*tt|||S |dkrDtt|||S || }|dkr`||> }n
|| ? }|dkrt|stt|> }t|| }t|d|  }|tt|| }|dkrttt| }tt| }|d |d  }|d |d  }|| k rtt|tt| ||S || k r<tttt|t| t||S |t| | 7 }|| }|dkrj||> }n
|| ? }tt | }|
td	|k r|t!k r|r| }t"| |||||S | }d}|
|k r&t|>  }}||
 }x&t#|D ]}|| |? }||7 }qW t||  } }|r.t| } nt| }t$||}t%t|||} |t|d >  |  |? } || 7 }t|| }|rZtt&||||}!tt'|}"|dks|dkrt|!t(||}!|rt|"t|| |}"|dkrt|"|!||S |dkrt|!|"||S |dkr|r*t|"t|| |}"ttt|!|||}!ttt|"||!||S n|dkr|rtt(||t|| ||S t(|||S |dkr|rtt|| t(||||S t(t|||S |dkr|rt|tt|| |||S t	|||S d
S )a  
    This function implements multipurpose evaluation of the gamma
    function, G(x), as well as the following versions of the same:

    type = 0 -- G(x)                    [standard gamma function]
    type = 1 -- G(x+1) = x*G(x+1) = x!  [factorial]
    type = 2 -- 1/G(x)                  [reciprocal gamma function]
    type = 3 -- log(|G(x)|)             [log-gamma function, real part]
    r   rm   zgamma function polerl   rj   r   ro   r   r~   N))r   r   r   r   r   r'   r(   rB   SMALL_FACTORIAL_CACHE_SIZEr#   small_factorial_cacher*   r   r5   r2   r&   r$   r%   r   r   r
   r"   r   rL   r   r   rM   r!   minr   r   r   GAMMA_STIRLING_BETAMAX_GAMMA_TAYLOR_PRECr0  r   r<  r    rI   r<   rA   )#r   rs   r   r/  r   r   r   r   r   
is_integerrx   r   
gamma_sizer   fr   Zabsxmanru   Zone_distZtwo_distZcancellationZxsub1Zxsub2Zxsub1magZxsub2magn_for_stirlingZxorigr   r   r   Zxabsr   r   r   r   ry   ry   rz   r     sF      






 
 
 





 




 

 
  
 
 
 
 





 











r   c       F      C   s*	  | \}}|\}}}}	|\}
}}}|t kr~|dkrl|rlt|||d}| | ? }tt|d |||}||fS t||||t fS |s|s|s|rttfS |d }||	 }|| }|rt||}n|}|dk rn|| k rZt| tt| | |t	|||}|dkrt
|||S |dkr&t| |||S |dkr<t|||S |dkrntt
||||S n|dkrn|| 7 }|dkr||kr|r||krtt| t| ||| ||S |dkrtt|t|f||dS tt|}tt|}t||}|| }|dkrn|t|7 }|}| }|rPt| } | d  \}}}}	}| d  \}
}}}}d}d}|dk r|dkrt| t}|d t kr| }n t|d d |d d  | }||krt|} t|| |}!t|!|!|}!t|!td	|}!t|tt	||}"t|!|"|}|s,t|||S n|dkr,||7 }t| t}#|#d t krL| }$n t|#d d |#d d  | }$|$|krt|} tt| | td
}%tt|#|#||%|}!t|!td	|}!t|#ttt	||}"t|!|"|}|st|||S n|$dkr||$7 }|| k rd|d  }&t|}'tt|| }(t|'|&|d})tt|'|(|&|d}*tt|*|)|&|(|&}+t||+||}"|)|"f}|st|||S n
|| 7 }||7 }t t!| },||,k }-t"||}.t"||}/d}0|s| }1||,k rt#||}t d|,d  |d  d | }2t$|>  }3}4t%}5xDt&|2D ]8}6|.|3 |/|5  |? |.|5 |/|3  |?  }3}5|.|47 }.q"W t'|3| t'|5| f}0t'|.| }||f} t(|.|/|\}7}8t| |\}9}:t"|9|}9t"|:|}:|9|. |:|/  |? |9d?  |7 }7|9|/ |:|.  |? |:d?  |8 }8t'|7| t'|8| f}"|0r|dkrt|"t|0||}"t)|1d };t)|1d }<t*+|;|<}=t)|"d }>t*,|<|;}?|=dkrd|< |? }@n$|< d|?  |;|?  |<t*-|=  }@t t*.|@|> dt*j/  d }|"d t|"d tt|d| ||f}"|r|dks|dkrtt0||||}Att|t f}B|r^|dkrPt|A||}Ant|A||}Ant|At1|"||}A|0rt|B|0|}B|dkrt|B|A||S |dkrt|A|B||S |dk	r&|rt|}Cnt|"}Ct|Ctt|||}Ct2|d }Dt3|d }Et|} t| |D}%t|%|E|}%|Cd t|Cd |%|f}Ct4|Ct5| ||}Ct0t||D|}%t|%|}%t|C|%|}C|Est| t2|D|}%|Cd t|Cd |%|f}Ct|C||S nz|dkr|0rtt1|"||0||S t1|"||S |dk	r|0	r t|0t1|"|||S t1t|"||S |dk	r&t|"||S d S )Nrl   r   rj   ir   r   rm   ir   r   )r/  g      ?g@KWx?)6r   r   r)   r<   r   r   rX   r]   rZ   r   rg   r[   rV   rb   rY   r   r&   r   r   r   r5   rW   ri   r^   r   r$   r   r'   r(   r%   r2   r*   r   rB  r    complexr   r   r   r!   r>  r6   r   hypotatan2r   floorr   rf   rc   r7   r8   r\   rB   )Fr   rs   r   r/  rt   r   r   r   r   r   r   r   r   r   r   rx   r   r   ZamagZbmagr   r   anZbnZabsnrE  Zneed_reflectionZzorigZyfinalZbalance_precZzsub1Zcancel1r   r   r   Zzsub2Zcancel2rw   ppZaabsr   x1r   ZxprimerG  Zneed_reductionZafixZbfixr   Zzpreredr   Zrreru   Zrimr   r  r  ZlreZlimZzfaZzfbZzfabsZyfbr   gir   r   s1ZrezfloorZimzsignry   ry   rz   r   m  s`   
 
 
 
 
 

$





 


 






 *

  
$ (

 
 






r   c             C   s   t | ||dS )Nr   )r   )r   rs   r   ry   ry   rz   mpf_factorialW  s    rQ  c             C   s   t | ||dS )Nr   )r   )r   rs   r   ry   ry   rz   mpc_factorialZ  s    rR  c             C   s   t | ||dS )Nrm   )r   )r   rs   r   ry   ry   rz   
mpf_rgamma]  s    rS  c             C   s   t | ||dS )Nrm   )r   )r   rs   r   ry   ry   rz   
mpc_rgamma`  s    rT  c             C   s"   | \}}}}|rt t| ||dS )Nrl   )r9   r   )r   rs   r   r   r   r   r   ry   ry   rz   mpf_loggammac  s    rU  c             C   sr   | \}}|\}}}}|\}	}
}}|t krd|rdt|||d}| | ? }tt|d |||}||fS t| ||dS )Nrl   r   )r   r   r)   r<   r   )r   rs   r   rt   r   r   r   r   r   r   r   r   r   r   rx   r   ry   ry   rz   mpc_loggammai  s    rV  c             C   s,   | t k rtt| d  ||S tt| ||S )Nr   )r?  r#   r@  r   r   )rx   rs   r   ry   ry   rz   r   t  s    r   )N)N)r   r   )r   r   )r   )r   )r   )r   )r   )r   )__doc__r   r  backendr   r   r   r   r   r   Z
libintmathr	   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/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   Z	libelefunr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   ZlibmpcrP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   r{   r   r   r   r   r   r   r   Z	mpf_aperyZmpf_khinchinZmpf_glaisherZmpf_catalanZmpf_mertensZmpf_twinprimer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ZZETA_INT_CACHE_MAX_PRECr   r   r   r   r  r  Zmpf_zetasumr  r  r	  r  r  r  r  r!  rC  AssertionErrorrB  r?  r+  r1  r   r@  r)  r,  r0  r2  r<  r>  r   r   rQ  rR  rS  rT  rU  rV  r   ry   ry   ry   rz   <module>   s   `
p%B>$	#
K
 ;6	o5WZ:kQ915H
 O
 k





