B
    'k[N4                @   s  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}ZdddZddd Zd!d" Zi Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zefd-d.Zefd/d0Zefd1d2Zedfd3d4Zedfd5d6Zd7d8 Zd9d: Zefd;d<Zefd=d>Zefd?d@ZefdAdBZi ZdCdD ZdEZi ZefdFdGZedfdHdIZeddJfdKdLZefdMdNZefdOdPZdZdQdR Zg ag ag adSdT ZdUdV ZdWZdXdY ZdZZed[k std\Zd]Zi Zi Zd^d_ eed D Zd`da Zdbdc Zddde Zdfdg Zdhdi Zdjdk ZddmdnZddodpZddqdrZddsdtZddudvZddwdxZddydzZdd{d|Zefd}d~ZdS )ao  
-----------------------------------------------------------------------
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   5lib/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>A  s    z#twinprime_fixed.<locals>.<listcomp>)rm   rl   r      c                s   g | ]}t || qS ry   )r(   )r   r   )r   ry   rz   r   B  s    r}   r   rx   r   i'  i 	  )
r   r   r   r(   r'   r,   r#   r   r*   r    )rs   r   Z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   cachedZnumbersstater   binZbin1Z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 | d  }dg|  }tt| d |}tt|}ttt|d|}t|||d< xrtd| D ]d}t	|d|d  | | |  |}t
|tt| | ||}t||||< t
|t|t|||}qdW |S )Ngffffff?r   r   ro   )r   rA   r   r   r+   r2   r<   r    r   r)   r*   r(   )	rt   rs   r   cr   eZsq2pir   r   ry   ry   rz   calc_spouge_coefficientsd  s    

 r   c             C   sx   | t krt |  S x4t D ],}d| t|   kr6dk rn qt | S qW tdtd|  }t|| }| ||ft | < t |  S )Ng?r   rl   gRQ?)spouge_cachefloatr   r   r   )rs   r   rt   Zcoefsry   ry   rz   get_spouge_coefficientsx  s    
 
r   c             C   sR   t | |} |d }x.td|D ] }||| |> | ||>   7 }qW t|| |tS )Nr   r   )r    r   r!   r   )xrs   rt   r   rv   r   ry   ry   rz   spouge_sum_real  s
    
 r   c             C   sH   |d }x.t d|D ] }||| | | ||   7 }qW t|| |tS )Nr   r   )r   r!   r   )r   r   rs   rt   r   rv   r   ry   ry   rz   spouge_sum_rational  s     r   c       
      C   s   t | |} t ||}|d d }}| d |? |d |?  }x^td|D ]P}|| d|   |d |>  }	||| | ||>   |	 7 }||| | |	 8 }qFW t|| |t} t|| |t}| |fS )Nr   rm   r   )r    r   r!   r   )
reimrs   rt   r   sresimmagr   Mry   ry   rz   spouge_sum_complex  s    

r   c             C   s`   | dk rt t| d ||S t| t| d }||d krPt t| d ||S tt | ||S )Ni  r   rm   g      4@)r   r
   r   r   r   	mpf_gamma)rx   rs   roundingsizery   ry   rz   mpf_gamma_int_old  s    r   c             C   s   t | ||ddS )Nr   )p1)mpf_gamma_old)r   rs   r   ry   ry   rz   mpf_factorial_old  s    r   c             C   s   t | ||ddS )Nr   )r   )mpc_gamma_old)r   rs   r   ry   ry   rz   mpc_factorial_old  s    r   c             C   s  | \}}}}|s0| t krt S | tks,| tkr0tS || }|dkrTt|t|d }|td| d }	|dkr|sz|r|std|| dkrtt	||> | ||S |p|| dk }
|rt
| t} |
r|	d7 }	t| t|	|	}t| |	}tt
t| |	}t|t|||	||S t|	\}}}t| |||}t| t||	}t||	}t| t|	}t
t|||	||	}tt||	|||}|S )zu
    Computes the gamma function of a real floating-point argument.
    With p1=0, computes a factorial instead.
    r   rm   r   r|   zgamma function poler   ro   )r   r   r   r   r   r   r   r   r   r
   r'   r   r(   r<   rI   r   r*   r   r   r&   rB   r   rA   )r   rs   r   r   signmanexpbcr   r   reflectpixrw   gsprecrt   r   rv   ZxpalogxpaZxphry   ry   rz   r     s@    


r   c       !      C   s>  | \}}|t kr"t||||t fS |\}}}}	|\}
}}}|t krL|| }nt||	 || }|dkrzt|t|d }|p||	 dk }|td| d }|r|| d k rttt| d| d t	t
d| d ||S |dk r|d| 7 }|r|}t|t|	t| d }||f} |rx|d	7 }t|t f}t| ||}t| |}tt| |}t||}t|||}t|||S || | k rt||}t||}t|||}t|||t||||fS t|\}}}t|||||}t|t||}t||f|}t|t|} tt|| |f|||f|}tt|||||}|S )
Nr   rm   ro   r      r   r   r|   )r   r   r   r   r   r   r\   r[   rQ   r$   r   r'   r   r   r<   rZ   rf   rY   r   mpf_psi0r*   r#   r(   r   r   r&   r   rb   r   rc   )!r   rs   r   r   r   r   r   r   r   r   isignimaniexpibcr   r   r   Zre_origr   r   rw   r   r   wrt   r   Z
gamma_diffr   r   rv   Zrepar   Zrephry   ry   rz   r     sX    




r   c             C   s@   | t ttfkr| S ttt| |d |}t|t|d |||S )Nr   )r   r   r   r   r&   r   r   )r   rs   r   rt   ry   ry   rz   mpf_harmonicc  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_harmonici  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 poler   rl   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   r   r   r   r   r   r   r   rv   r   r   r   rx   ru   r   x2rw   prevbsignbmanbexpbbcoffsetr   ry   ry   rz   r   o  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}d}tt| d }xrt|||}td| |}t|t|d| ||}t|||}t|d}|dkrt||rP |}|d7 }qfW |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   r   r   r   r   r   r   r   r   rv   r   r   r   rx   r   z2rw   r   epsbernr   sztermry   ry   rz   r     sN    




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/   r   r$   )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_coefficientsX  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!   r   r	   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   i  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  Zforcer   r   r   r	  r
  r  r  r  r  r   r  r   r   rt   r   r   ZrsignZrmanZrexpZrbcr   r   r   r   r   r  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_altzetaO  s    r  c             C   s   t | ||dS )Nr   )r  )rv   rs   r   ry   ry   rz   mpc_altzetaR  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_fixedY  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   
primesievej  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  r   r   rt   rx   r   r$  r   r%  Zbasic_powersru   r  r  r  r  r   r   cossinr   Z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xaZxb)rs   r   ry   rz   r     s   c                s0   g | ](\}}t |  d t |  d fqS )rx   )r!   )r   ZyaZyb)rs   r   ry   rz   r      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derivativesr   rs   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    


"

r4  i  i:  g?   c             C   s   g | ]}t t|qS ry   )r   r
   )r   rx   ry   ry   rz   r   9  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   u  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   tpZq1Zq2rx   rv   Ze1Ze2rw   r   r   Zpi_powZfpir   Zreciprocal_piry   )r   r   rz   
zeta_array<  sr    

" 2"B&r8  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   r8  r   gamma_taylor_coefficients)	Zinprecr   coeffsr   r   r6  r   rt   r   ry   )r9  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    

$




 
 
 r?  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    rA  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   rA  )r   rs   rw   r   rv   r   usizetsizetexpr   r   pbqbterm_magshiftr   r   r   ry   ry   rz   real_stirling_series  sl                 
rK  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 rB  i!  i  i[  iܹ i i rC  r   rm   )rJ   r   r5   r   rA  )r   r  rs   Z_mr  r  ZureZuimr   r   r   rD  rE  rF  r   r   rG  rH  rI  rJ  r   r  r  ZtermreZtermimry   ry   rz   complex_stirling_series4  s     * * * *  * * *  * * * 
rL  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_PRECr?  r   rK  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   rP  r    complexr   r   r   r!   rL  r6   r   ZhypotZatan2r   Z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   ZanZbnZabsnrS  Zneed_reflectionZzorigZyfinalZbalance_precZzsub1Zcancel1r   r   r  Zzsub2Zcancel2rw   ZppZaabsr   Zx1r   ZxprimerU  Zneed_reductionZafixZbfixr	  Zzpreredr   Zrreru   Zrimr   r-  r.  ZlreZlimZzfaZzfbZzfabsZyfbr   Zgir   r   s1ZrezfloorZimzsignry   ry   rz   r  J  s`   
 
 
 
 
 

$





 


 






 *

  
$ (

 
 






r  c             C   s   t | ||dS )Nr   )r   )r   rs   r   ry   ry   rz   mpf_factorial4	  s    rX  c             C   s   t | ||dS )Nr   )r  )r   rs   r   ry   ry   rz   mpc_factorial7	  s    rY  c             C   s   t | ||dS )Nrm   )r   )r   rs   r   ry   ry   rz   
mpf_rgamma:	  s    rZ  c             C   s   t | ||dS )Nrm   )r  )r   rs   r   ry   ry   rz   
mpc_rgamma=	  s    r[  c             C   s"   | \}}}}|rt t| ||dS )Nrl   )r9   r   )r   rs   r   r   r   r   r   ry   ry   rz   mpf_loggamma@	  s    r\  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_loggammaF	  s    r]  c             C   s,   | t k rtt| d  ||S tt| ||S )Nr   )rM  r#   rN  r   r   )rx   rs   r   ry   ry   rz   r   Q	  s    r   )N)N)r   r   )r   r   )r   )r   )r   )r   )r   )r   )__doc__r   r1  Z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   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,  r0  r4  rQ  AssertionErrorrP  rM  r:  r@  r   rN  r8  r;  r?  rA  rK  rL  r   r  rX  rY  rZ  r[  r\  r]  r   ry   ry   ry   rz   <module>   s   `
p%B>%	#
K
z	-};4	o5WZ:kQ915H
 O
 k





