a
    <b"                    @   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 sJ 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\}}}|r|d|d  d| d  9 }|dd|  d|d   d  }|d|d   d	|d  d
|  d  |d d| d   }||7 }|d7 }q|d? S )N   )r   r   r             r      (         r   )precaonestn rz   f/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/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}	ttd|	 |}
t|
||}
t	|
||}
t
|
|}
|
| | |	 |? }|dk rq||7 }||d|	 d  |d|	   7 }|	d7 }	t|d|	 d|	 d  |}t|||}qN||> t| }tt|| |}t
|| }|S )N      ?      rm   r   d   )intr   r   r   r<   r2   r(   r%   mpf_bernoullir*   r    r)   r>   rA   r!   )rt   wprw   facrx   ONEpiZpipowZtwopi2ry   Zzeta2ntermKrz   rz   r{   khinchin_fixedm   s.    
 
r   c                 C   s  | d }t d|  d }t|> }t}td|D ]}|t|||d  7 }q.t||}||| | 7 }|||d d  7 }|d }d}d}	d}
td}d}||> |	|  | }t|| }td| |}t|||}t	|||}t
||}t|dk rqz||8 }|	||
  |
 |	 || |
d f\}}	}}
|	||
  |
 |	 || |
d f\}}	}}
|d7 }t|d| d| d  |}qt|}|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   )rt   r   Nr   rw   kZlogNZpNru   bjr   DBr   r   Arz   rz   r{   glaisher_fixed   sH    

** r   c                 C   s   | d7 } t | > }td| > }d}t}|r||7 }||d 9 }|d| d d d| d   }d| d|d  d	|  d  | }|d7 }q$|d
? S )Nrj   M   r   
   rm   r   ro         rr   )r   r   r   )rt   dr   ry   rw   rz   rz   r{   apery_fixed   s     $
r   c           	      C   s   d}| |7 } t t| d td dd }d| }| t|   }}t| >  }}d}||d  |d  }||d  | | | }||7 }||7 }tt|t|dk rq|d7 }qX|| | > | S )Nr   r   rm   r   r   )r   mathlogr>   r   maxr   )	rt   extrapry   r   Ur   Vr   rz   rz   r{   r     s    "
r   c                 C   sp   | d }d}t |}t||}|tkr(qft||}t|t||}t|t||}t||}|d7 }qt	|| S )Nrj   rm   r   )
	mpf_eulermpf_zeta_intr   rB   r)   r   r*   r   r&   r    )rt   r   mrw   rx   rz   rz   r{   mertens_fixed+  s    



r   c                    s   dd }d|  d  t } fdddD } fdd|D }d}t| }td	D ]2}t|tt ||  }t|| ||  ||< qRt|||  }t|| d
 dt krqt|| }|d7 }q@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   ry   rz   r{   	<genexpr>>      z-twinprime_fixed.<locals>.I.<locals>.<genexpr>r   )sumr   r   rz   r   r{   I=  s    ztwinprime_fixed.<locals>.Irm   r   c                    s   g | ]}t d | qS )r   )r"   r   r   r   rz   r{   
<listcomp>A  r   z#twinprime_fixed.<locals>.<listcomp>)rm   rl   r      c                    s   g | ]}t || qS rz   )r(   r   r   rz   r{   r   B  r   r   r   ry   r   i'  i 	  )
r   r   r   r(   r'   r,   r#   r   r*   r    )rt   r   resprimesZppowersry   ru   irz   r   r{   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㥛@r}   gK7A`@)r   r   r   )ry   Zlgnrz   rz   r{   bernoulli_size  s    r   c                 C   sV  | 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|\}}| |v 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|< |	| krN|	d }t|	}d}td|| }|	dk rt}n|}td|	d d D ]}||	d|    \}}}}}|r| }|t|| || 7 }d| }||	d | |	d |  |	d |  |	d |  |	d |  |	|  9 }|d| d|  d|  d|  d|  d|   }q|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r8|d|	 d|	   |	d |	d   }|	|
|g|dd< qJ||  S )z.Computation of Bernoulli numbers (numerically)rm   r   z)Bernoulli numbers only defined for n >= 0r   g?  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   )ry   rt   rndr   qr   cachedZnumbersstater   binZbin1ZcaseZszbmrw   Zsexpru   r   ZusignZumanZuexpZubcuZj6r   rz   rz   r{   r     sv    




H8 
$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   )ry   rt   r   r   Zpiprecvrz   rz   r{   r     s    r   c                 C   s   t | } | dk rg d|  S | d@ r(dS d}t| d D ]}| |d  s8||9 }q8t| 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   )ry   r   r   rt   r   r   Zpintrz   rz   r{   r     s    G


r   c                 C   s@   | t ttfv r| S ttt| |d |}t|t|d |||S )Nr   )r   r   r   mpf_psi0r&   r   r   )xrt   r   ru   rz   rz   r{   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   )zrt   r   ru   rz   rz   r{   mpc_harmonic  s    r   c                 C   sx  | \}}}}|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 rnt||D ]}|
||> |  8 }
| |7 } qN| |8 } |
ttt| | |||7 }
|
||> d|   7 }
| |  |? }|}d}d}|| |? }td| |\}}}}|d|  }|dkr||> |d|   }n|| ? |d|   }|d@ r8|
|8 }
n|
|7 }
|dkrX||krXqh|}|d7 }qt|
| ||S )	z_
    Computation of the digamma function (psi function of order 0)
    of a real argument.
    r   r   zpolygamma polerl   )\(?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   rt   r   signmanexpbcr   r   crw   r   r   r   ry   rv   r   x2rx   prevbsignbmanbexpbbcoffsetr   rz   rz   r{   r     sZ    

 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t||D ]"}t|t| ||}t| t|} qt| t	|} t|t
| ||}t|tt| ||}t| |}t	}t}d}tt| d }t|||}td| |}t|t|d| ||}t|||}t|d}|dkrt||rq|}|d7 }q`|S )zb
    Computation of the digamma function (psi function of order 0)
    of a complex argument.
    rj   rl   r   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   rt   r   reimr   r   r   r   r   r   rw   r   r   wry   r   z2rx   r   epsbernr   sztermrz   rz   r{   r     sL    




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   rt   r   rz   rz   r{   mpf_psi   s    r   c                 C   sf  | dkrt |||S |\}}|d }|\}}}	}
|d sN|tttfv 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 rt||D ].}t	||  d |}t
|||}t|t|}qt	||  |}t	|d|}t|t| |}t
|||}t
|tt|||t||}| d }d}d}t|d}|d |d	  }tt|| d }t|||}td| |}t|||}t|t||}t|||}t
|||}t|d}|dkrt||rܐq$|| d|  | d|  d  9 }|d| d d| d  9 }|d7 }qjt|tt| d |||}| d@ sbt|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   rt   r   r   r   r   r   r   r   r   r   ry   rw   r   rx   Zzmr   Zintegral_termru   r   Zmagnr   r   Zscalr   r   r   rz   rz   r{   r   	  s`    

 
r   c                 C   s   | t v rt |  S tg| d  }t}t }|d< td| d D ]L}|d | | d  | | d  }|d| d| d   }||7 }|||< q<|t | < |S )Nr   r   r   rm   )borwein_cacher   r   r   )ry   Zdsr   rw   r   rz   rz   r{   borwein_coefficientsz  s     
r   r   c                 C   s  |d }t | } | tv 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
}t|D ]T}t || t|d  }	|	dk r| qtt
tt||  |	|}
t||
|}qPtt
||S t |d	 d
 }t|}t}t| } t|D ]2}|d| || ||   |> |d |   7 }q||> ||   }||> d|> d|d |  >   }| tv r`t|  d |k sj| tv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       @R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   )rw   rt   r   r   rx   rv   r   Zneeded_termsr   Zpowprecru   ry   r   rz   rz   r{   r     sR    "

0 &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|}t |D ]\}| t!|d || |? }t"|||}|| ||  | }|d@ r||8 }n||7 }qJ|||   }t#|| |}|rt$|||S tttttt| |||}
t||
||S d S )
Nrj   rm   r   r   ro   r   r   r   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#   ) rw   rt   r   altr   r   r   r   r   r   r   yru   r   r   wp2r   r   rasignamanaexpabc	pole_distrx   ry   Zsfln2r   r   Zemanr   rz   rz   r{   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 } || }t(|"D ]}+t)|+d ||*},|)r|(t*|+d |>  }-nt+|# |, |? |}-|+d@ r |-|!|" |!|+  9 }-n|-|!|+ |!|"  9 }-t,|$ |, |? || \}.}/|%|-|. |? 7 }%|&|-|/ |? 7 }&q|%|!|"   }%|&|!|"   }&t-|%| |}%t-|&| |}&|rt|%|&f||S tttt|||}t|%|&f|||S d S )Nr   rj   r   ro   r   r   r   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!   )0rw   rt   r   r   forcer   r   r   r   r   r   r   r   r   r   r   gr   ru   r   r   ZrsignZrmanZrexpZrbcZisignZimanZiexpZibcmagr   r   pi2r   ry   refZimftretimrv   one_2wpcritical_liner   r   r   r   wrewimrz   rz   r{   r     s    






r   c                 C   s   t | ||dS Nr   )r   rw   rt   r   rz   rz   r{   mpf_altzetaq  s    r  c                 C   s   t | ||dS r  )r   r  rz   rz   r{   mpc_altzetat  s    r  c                 C   sN   |dkr| S t |> }|rJ|d@ r4||  |? }|d8 }| |  |? } |d }q|S )Nr   rm   rs   )r   ry   r   r   rz   rz   r{   	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| }|D ]"}t|| d |D ]}|||< qtq`t|D ]>\}}|dkrd}|| } | | s| | } |d7 }q|||< q|a|a|a|||fS )Nr   r   rm   )	lensieve_cacheprimes_cacheindexr   
mult_cacher	   r   	enumerate)ry   siever   multr   r   r   r   rz   rz   r{   
primesieve  s.    


r  c                 C   s  |dk rt dt|| \}}}i }	t|> }
td| > }|| }t|}t|d }|D ] }|d || krv q^t|||}t| | |? ||\}}| r|t||>  }nt| | |? |}|| |? }|| |? }||fg|	|< || }}t	dt
t|| |d d D ]B}|| ||  |? || ||  |?  }}|	| ||f qqZt}t}|dkrx||
7 }t|d}t||| d D ]}|| }||	v r6|| }|	| |d  \}}|||  }|dkrq|| }|| }|	| |d  \}}|| ||  |? || ||  |?  }}qnjt|||}t| | |? ||\}}| rt|t||>  }nt| | |? |}|| |? }|| |? }||7 }||7 }q||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simru   ry   r   r  r   r  Zbasic_powersrv   r  r   r   r  r   r   cossinr   preZpimr  r  r   xreximZaar   rz   rz   r{   zetasum_sieved  sf    

&*



0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 } }t||| d D ]}t||}t|	 | ? |\}}|
r|t||>  }nt| | ? }|| ? }|| ? }|r|||  }|| ? }|| ? }|r|rpt||}d  || ? 7  < d  || ? 7  < |rd  || ? 7  < d  || ? 7  < nt> }|D ]x}|  || ? 7  < |  || ? 7  < |r|  || ? 7  < |  || ? 7  < || ? }q|nFd  |7  < d  |7  < |rVd  |7  < d  |7  < qV|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        ry   c                 S   s   g | ]}t qS rz   r   r   rz   rz   r{   r     r   zmpc_zetasum.<locals>.<listcomp>c                 S   s   g | ]}t qS rz   r#  r   rz   rz   r{   r     r   c                 S   s   g | ]}t qS rz   r#  r   rz   rz   r{   r     r   c                 S   s   g | ]}t qS rz   r#  r   rz   rz   r{   r     r   rm   c                    s   g | ]}d |  |  qS ro   rz   r   )r   rz   r{   r   ;  r   c                    s   g | ]}d |  |  qS r$  rz   r   )r!  rz   r{   r   <  r   c                    s   g | ]}d |  |  qS r$  rz   r   )yrerz   r{   r   >  r   c                    s   g | ]}d |  |  qS r$  rz   r   )yimrz   r{   r   ?  r   c                    s0   g | ](\}}t |  d t |  d fqS r   r!   )r   Zxaxbrt   r   rz   r{   r   @  s   c                    s0   g | ](\}}t |  d t |  d fqS r   r'  )r   ZyaZybr)  rz   r{   r   B  s   )listr  r   r    ZETASUM_SIEVE_CUTOFFsysmaxsizer"  r!   r   r   r   r>   r=   r   r?   rN   r   rO   r  zip)!rw   ru   ry   ZderivativesZreflectrt   Zhave_derivativesZhave_one_derivativer  r  r	  r   r   xsZmaxdrv   r  r   r  r   r   r   r  r  r   Zxterm_reZxterm_imZ
reciprocalZyterm_reZyterm_imrx   r   Zysrz   )rt   r   r!  r   r&  r%  r{   mpc_zetasum  s    


"
r0  i  i:  g?   c                 C   s   g | ]}t t|qS rz   )r   r
   )r   ry   rz   rz   r{   r   [  s   r   c                    s  d |  t g| d  }t}t> }| d |d< ttd}t| }}g }d}	d|	  }
|
dk rrqttt|t|
|
}t	|t	|||
|
}t
|}t
|}|	| | ? }|||f t	||}|	d7 }	q\td| d dD ]}t }d}	|D ]b\}}|d dkr&||	|  }n |d d }|||  |	|  }|sR qf||7 }|	d7 }	qd| ||< qfd	d
t| d D }tttdd }}t|td}td| d dD ]L}t	|| |}t
|||< t	||}t|t|d |d  }q|> | }td| d dD ]}|d d }|d| d  d| d  d }td|d D ]2}	||d|	  |d| d d|	    ? 8 }qp||  d| | ? 7  < q2td| d dD ]}|d d }|d| d  d| d  }tdd| d D ]B}	|d|	 d |	 |d|	   |d| d d|	    ? 7 }q||  || ? d|  7  < qԇ 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 rz   )r%   r   )r   r   r   rz   r{   r     r   zzeta_array.<locals>.<listcomp>r   r   ro   c                    s   g | ]}| ? qS rz   rz   r   r   )r   rz   r{   r     r   )r   r=   r   r2   r<   rA   r*   r   r'   r(   r    r  r   r,   r   )r   rt   zeta_valuesr   rv   Zf_2piZ	exp_2pi_kZexp_2piZexps3r   tpZq1Zq2ry   rw   e1e2rx   r   r   Zpi_powZfpir   Zreciprocal_pirz   )r   r   r{   
zeta_array^  sp    


  0 @$r7  c           	         s  | dk r| d| d   n| dk r4| d| d   n| t v rLt  fS dk rftd d }ntd d }t D ]J  krz fdd	t   | d
 D }| dk r|t < |f  S qzdkrtd d }dg| }t|d< t|> |d< t||d< t||}td|D ]j}|d  ||d   |? }td|D ]*}|d| ||  |||   |? 7 }qH|d|  }|||< q 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   r   r   gRQ?rm   gv/?c                    s   g | ]}|  ? qS rz   rz   r2  Zcprecrt   rz   r{   r     r   z-gamma_taylor_coefficients.<locals>.<listcomp>Ng333333?rj   r   r   rl   ro   c                 S   s   g | ]}|d ? qS )rj   rz   )r   ru   rz   rz   r{   r     r   )gamma_taylor_cacher   r   r   r   r7  r   gamma_taylor_coefficients)	Zinprecr   coeffsr   r   r3  r   ru   r   rz   r8  r{   r:    sF    "

(r:  c                 C   sL  ||d ? t  d? }t |> }t|\}}	|dkr|}
t|d D ]}||8 }|
| |? }
q@||8 }t}|D ]}||| |?  }qj||	| L }|dkrt|
|> | | ||S |dkrtt||
|> |||S |dkrttt|
|> | | ||S nP|}
t| D ]}|
| |? }
||7 }qt}|D ]}||| |?  }q*||	| L }|t	t
| dkrt| t| }t||
 | | }
t|
||}
|dkrtt|
||S |dkrt|
||S |dkrHtttt|
|||S nbt|| |
 d| }
|dkrtt|
||S |dkr*t|
||S |dkrHt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   rt   r   typeZnearest_intrv   r;  Zcwpr   r   r   r   r  rz   rz   r{   gamma_fixed_taylor  sR    $


r>  c                 C   sT   | t v rt |  S t| \}}|t| | d  9 }||tt|t|ft | < t |  S r  )gamma_stirling_cacher   r   r5   r   )ry   r   r   rz   rz   r{   stirling_coefficient  s    r@  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}t|\}	}
}}|| | }| }|| }|dkr||k r|	|L }	||8 }|| }|dkr||k r||? }||8 }n|}||	 |
 |? }|sq(||7 }|| |? }||| 8 }|d7 }qb|S )zr
    Sums the rational part of Stirling's expansion,

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

    r   h              !    [  ܹ      r   rm   )r   rJ   r5   r   r@  )r   rt   rx   r   rw   r   usizetsizetexpr   r   pbqbterm_magshiftr   r   r   rz   rz   r{   real_stirling_series!  sP    

rV  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}t|
\}}}}|| | }| }|| }|dkr||k r||L }||8 }|| }|dkr*||k r*||? }||? }||8 }n|}|}|| | |? }|| | |? }t|t| dk rlq||7 }|	|7 }	|| ||  |? || ||  |?  }}||| 8 }|
d7 }
q||	fS )Nr   r   rA  rB  rC  r   rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  r   rm   )rJ   r   r5   r   r@  )r   r   rt   _mr  r  ZureZuimr  r  r   rO  rP  rQ  r   r   rR  rS  rT  rU  r   r
  r  ZtermreZtermimrz   rz   r{   complex_stirling_seriesV  sx    ***** ** * * *
rX  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|>  }}||
 }t#|D ]}|| |? }||7 }qt||  } }|r*t| } nt| }t$||}t%t|||} |t|d >  |  |? } || 7 }t|| }|rVt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   rV  r    rI   r<   rA   )#r   rt   r   r=  r   r   r   r   r   
is_integerry   r  
gamma_sizer   fr   Zabsxmanrv   Zone_distZtwo_distZcancellationZxsub1Zxsub2Zxsub1magZxsub2magn_for_stirlingZxorigr   r   r   Zxabsr   r   r   r   rz   rz   r{   r     s8   





"








 














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%}5t&|2D ]8}6|.|3 |/|5  |? |.|5 |/|3  |?  }3}5|.|47 }.q 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|rZ|dkrLt|A||}Ant|A||}Ant|At1|"||}A|0r~t|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rt|0t1|"|||S t1t|"||S |dk	r"t|"||S d S )Nrl   r   rj   ir   r   rm   ir   r   )r=  r}   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   r\  r    complexr   r   r   r!   rX  r6   r   hypotatan2r   floorr   rf   rc   r7   r8   r\   rB   )Fr   rt   r   r=  ru   r   r   r   r   r   r   r   r   r   r   ry   r   r   ZamagZbmagr  r   ZanZbnZabsnr_  Zneed_reflectionZzorigZyfinalZbalance_precZzsub1Zcancel1r   r   r   Zzsub2Zcancel2rx   ppZaabsr   x1r   Zxprimera  Zneed_reductionZafixZbfixr   Zzpreredr   Zrrerv   Zrimr   r%  r&  ZlreZlimZzfaZzfbZzfabsZyfbr   Zgir   r   s1ZrezfloorZimzsignrz   rz   r{   r   l  sT   
 

$





 


 






 *

  
$ (







r   c                 C   s   t | ||dS r  r   r   rt   r   rz   rz   r{   mpf_factorialV  s    rk  c                 C   s   t | ||dS r  r   rj  rz   rz   r{   mpc_factorialY  s    rm  c                 C   s   t | ||dS Nrm   ri  rj  rz   rz   r{   
mpf_rgamma\  s    ro  c                 C   s   t | ||dS rn  rl  rj  rz   rz   r{   
mpc_rgamma_  s    rp  c                 C   s"   | \}}}}|rt t| ||dS )Nrl   )r9   r   )r   rt   r   r   r   r   r   rz   rz   r{   mpf_loggammab  s    rq  c                 C   sr   | \}}|\}}}}|\}	}
}}|t krd|rdt|||d}| | ? }tt|d |||}||fS t| ||dS )Nrl   r   )r   r   r)   r<   r   )r   rt   r   ru   r   r   r   r   r   r   r   r   r   r   ry   r   rz   rz   r{   mpc_loggammah  s    rr  c                 C   s,   | t k rtt| d  ||S tt| ||S r  )rY  r#   rZ  r   r   )ry   rt   r   rz   rz   r{   r   s  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+  r0  r]  r\  rY  r9  r?  r   rZ  r7  r:  r>  r@  rV  rX  r   r   rk  rm  ro  rp  rq  rr  r   rz   rz   rz   r{   <module>   s   `
p
$
A
=
$


	#
K
 ;4	o5WZ:k
Q915H
 O
 k





