a
    <bh                     @   s   d Z ddlZG dd deZddlmZ dd Zd	d
 Zdd Zdd Z	dddZ
dgfddZd ddZd!ddZd"ddZd#ddZed$ddZed%ddZdS )&aI  
---------------------------------------------------------------------
.. sectionauthor:: Juan Arias de Reyna <arias@us.es>

This module implements zeta-related functions using the Riemann-Siegel
expansion: zeta_offline(s,k=0)

* coef(J, eps): Need in the computation of Rzeta(s,k)

* Rzeta_simul(s, der=0) computes Rzeta^(k)(s) and Rzeta^(k)(1-s) simultaneously
  for  0 <= k <= der. Used by zeta_offline and z_offline

* Rzeta_set(s, derivatives) computes Rzeta^(k)(s) for given derivatives, used by
  z_half(t,k) and zeta_half

* z_offline(w,k): Z(w) and its derivatives of order k <= 4
* z_half(t,k): Z(t) (Riemann Siegel function) and its derivatives of order k <= 4
* zeta_offline(s): zeta(s) and its derivatives of order k<= 4
* zeta_half(1/2+it,k):  zeta(s)  and its derivatives of order k<= 4

* rs_zeta(s,k=0) Computes zeta^(k)(s)   Unifies zeta_half and zeta_offline
* rs_z(w,k=0)    Computes Z^(k)(w)      Unifies z_offline and z_half
----------------------------------------------------------------------

This program uses Riemann-Siegel expansion even to compute
zeta(s) on points s = sigma + i t  with sigma arbitrary not
necessarily equal to 1/2.

It is founded on a new deduction of the formula, with rigorous
and sharp bounds for the  terms and rest of this expansion.

More information on the papers:

 J. Arias de Reyna, High Precision Computation of Riemann's
 Zeta Function by the Riemann-Siegel Formula I, II

 We refer to them as I, II.

 In them we shall find detailed explanation of all the
 procedure.

The program uses Riemann-Siegel expansion.
This  is useful when t is big, ( say  t > 10000 ).
The precision is limited, roughly it can compute zeta(sigma+it)
with an error less than exp(-c t) for some constant c depending
on sigma.  The program gives an error when the Riemann-Siegel
formula can not compute to the wanted precision.

    Nc                   @   s   e Zd Zdd ZdS )RSCachec                 C   s   ddi i g| _ d S )Nr   
   )	_rs_cachectx r   g/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/mpmath/functions/rszeta.py__init__6   s    zRSCache.__init__N)__name__
__module____qualname__r	   r   r   r   r   r   5   s   r      )defunc                 C   sv  |d }|d }t | d|d  d| d | | }| d| }t | d| | |d | }|| _i }| j|d< | j|d	< tdd| d	 D ]}	||	d	  | j ||	< q|d | _i }
i }td|d	 D ]F}	d
|	 | d|	  }| || d|	  }||d|	   |
|	< qtdd| d	 D ]2}	| j| |	 }|d|	  }|||	  ||	< q0d| _d| | }i }td|d	 D ]}	d| _t | d|	d  d|	 | }|| _d}td|	d	 D ].}|d
| |
|  |d|	 d|    7 }qd
|	d	  | j	 | ||	< qi }td|d	 D ]z}	d| _t | d|	d  d|	 | }|| _d}td|	d	 D ],}|| j	|	|  |
|  ||	|   7 }qn|||	< q,d| _d| | }t dd| | }|| _| 
| dd }| dd }i }td|D ]D}	d| _t dd|	 | }|| _|||	  |||	   |d|	 < qtd	d| dD ]}	d||	< qZ||||gS )a  
    Computes the coefficients  `c_n`  for `0\le n\le 2J` with error less than eps

    **Definition**

    The coefficients c_n are defined by

    .. math ::

        \begin{equation}
        F(z)=\frac{e^{\pi i
        \bigl(\frac{z^2}{2}+\frac38\bigr)}-i\sqrt{2}\cos\frac{\pi}{2}z}{2\cos\pi
        z}=\sum_{n=0}^\infty c_{2n} z^{2n}
        \end{equation}

    they are computed applying the relation

    .. math ::

        \begin{multline}
        c_{2n}=-\frac{i}{\sqrt{2}}\Bigl(\frac{\pi}{2}\Bigr)^{2n}
        \sum_{k=0}^n\frac{(-1)^k}{(2k)!}
        2^{2n-2k}\frac{(-1)^{n-k}E_{2n-2k}}{(2n-2k)!}+\\
        +e^{3\pi i/8}\sum_{j=0}^n(-1)^j\frac{
        E_{2j}}{(2j)!}\frac{i^{n-j}\pi^{n+j}}{(n-j)!2^{n-j+1}}.
        \end{multline}
              @r            (   r   r      	      2g      ?)maxmagZ	_eulernumpreconepirangempffacjsqrtZexpjpi)r   JepsZnewJZneweps6ZwpvwEZwppiZpipowernvwvawaZwpp1aZP1Zwpp1ZsumpkZP2Zwpp2Zwpc0Zwpcmunucr   r   r   _coefN   sr    *"


 , *$r0   c                    s    j }||d kr.||d kr.|d |d fS  jj}zt j||}W | j_n
| j_0   jurt fdd|d  D |d< t fdd|d  D |d< | j d d <  j d  j d fS )Nr   r   r   r   c                 3   s    | ]\}}|  |fV  qd S Nconvert.0r,   r(   r   r   r   	<genexpr>       zcoef.<locals>.<genexpr>c                 3   s    | ]\}}|  |fV  qd S r1   r2   r4   r   r   r   r6      r7   )r   Z_mpr   r0   dictitems)r   r$   r%   _cacheorigdatar   r   r   coef   s    
""r=   c                 C   s   d| | }|  |}d|  | j |  | |  | d |  d| j d  }d| d }| |d | |d d  d | |d d  }	||| |	 k r|dkr|d }| |d | |d d  d | |d d  }	q|}
|
S )Ngbk5_@r   r   r         @r   )lnr   Zloggamma)r   xAxeps4axB1xLaux1aux2maux3xMr   r   r   aux_M_Fp   s    
<68rJ   c           	      C   sJ   |d|  }|| d }||  ||d  |d d  | }t||}|S )Nx  gJR_@r   r   r   )powermin)	r   r@   rA   rB   rC   rI   h1h2h3r   r   r   aux_J_needed   s
    $
rQ   c              
      s   j } |} |}d| }d _  |d j  }|| }|| }	 d |d }
 d |	d } d| }|d }||
 d }|| d }d _ |dkrd}td|d	 }td|}d}n(d
}td| d	 }td| }d}|dkr2d}td|d	 }td|}d}n(d
}td| d	 }td| }d}d _ d}d|  	|d   || |  |kr|d }qdt
d|}d}d|  	|d   || |  |kr|d }qt
d|}d| d| | d kstd| d | dk stt||d kstd| d| | d kstd| d | dk stt||d kr| _ tdt
||}|d|  }|d|  }|d|  }|d|  }t |||||}t |||||} t
|| }!t |||||}"t ||||| }#t|"|#}"d}$d j |$  	|$d  }%|%|"kr`|$d }$d j |% |$ }%q8i }&tjtj | | }'tjtj | | }(tddD ]})t|'|)d d|  }*t|(|)d d|  }+t|*|+}, 	|)d  	|)d d  }-t|-}-|,|- t|| |&|)< qtd| d dd }.d|$ }/ d|$ }0td|.D ],})t
|0 |/ 	|)d  |&|)  }0qN|0 | d  _  |d j  } |}1dd||1   }2 |2 d|0  }3|2 d|0  |3 }4|4dk r|3}3n|3d }3 |3 d|0   }2  d j |$ 	|$d d |$  }5i }6i }7t |$|5\}7}8|7 }6i }9t|!d| d D ]}:d|9|:< qi }9|0 _ td|!d D ]x})d};td|$ |) d ddD ]}<|;|2 |6|<  };q|;|9|)< tdd|$ |) d D ]}<|<d |6|<d   |6|<< q qi }=t
d d| | }>d dt| |   | d }? d j j | | | |  d }@td|D ]@}:   	|:d  |:|@  |? }At
|A|>|=|:< q|=d d  _ dd|  }Bi }Cd|Cd< d|Cd < d|Cd!< d|Cd"< d|Cd#< d|Cd$< d|Cd%< d|Cd&< td|D ]}:|=|: d  _ tdd|: d d D ]}<d|: d|<  })|)dkr j|) }D|Dd }E|B|D d }F|)d  }G|G|Cd|:d |<d f  |E|Cd|:d |<f   |F|Cd|:d |<d f   |Cd|:|<f< n~d|Cd|:|<f< td|<D ]d}H|Cd|:|Hf  d' d|< d|H    |<|H   }I|Cd|:|<f  d|<|H  |I 8  < q&qpd|Cd|:d(f< d|Cd|:df< d|Cd|:d|: d d f< qFtd(|d D ]z}Jtd(|D ]h}:td)t
dd|: d d D ]D}<|Jdk 	s:|:dk 	s:|<dk 	s:|<d|: d k	rd|C|J|:|<f< 	qqqtd|d D ]}Jtd|D ]}:|=|: d  _ tdd|: d d D ]~}<d|J d |C|Jd |:d |<d f  d||: d  |C|Jd |:d |<d f   }/|/|C|Jd |:d |<d f  |C|J|:|<f< 	q	qp	qbi }Kt
d d| | }>d dt| |   | d }L d j j | | | |  d }Mtd|D ]@}:   	|:d  |:|M  |L }Nt
|N|>|K|:< 
q|Kd d  _ dd|  }Oi }Pd|Pd< d|Pd < d|Pd!< d|Pd"< d|Pd#< d|Pd$< d|Pd%< d|Pd&< td|D ]}:|K|: d  _ tdd|: d d D ]}<d|: d|<  })|)dkr
 j|) }D|Dd }E|O|D d }F|)d  }G|G|Pd|:d |<d f  |E|Pd|:d |<f   |F|Pd|:d |<d f   |Pd|:|<f< n~d|Pd|:|<f< td|<D ]d}H|Pd|:|Hf  d' d|< d|H    |<|H   }I|Pd|:|<f  d|<|H  |I 8  < q"qld|Pd|:d(f< d|Pd|:df< d|Pd|:d|: d d f< qBtd(|d D ]z}Jtd(|D ]h}:td)t
dd|: d d D ]D}<|Jdk s6|:dk s6|<dk s6|<d|: d krd|P|J|:|<f< qqqtd|d D ]}Jtd|D ]}:|K|: d  _ tdd|: d d D ]~}<d|J d |P|Jd |:d |<d f  d||: d  |P|Jd |:d |<d f   }/|/|P|Jd |:d |<d f  |P|J|:|<f< qqlq^i }Qi }Rd _  d|d  }E d*|d  | }S || t j d }Ttd|D ]}<|S|<|T    |<d d  }Ut
|E|U | d d d d+ |Q|<< t
|E |d |U  | d d d |R|<< qzi }Vi }Wd _  d|d  }E d*|d  | }X || t j d }Ytd|D ]}<|X|<|Y    |<d d  }Zt
|E|Z | d d d+ |V|<< t
|E |d |Z  | d d d |W|<< q^i }[td|d D ]D}Jtd|D ]2}<td(d|< d d D ]}\d|[|J|<|\f< qq qtd|d D ]}Jtd|D ]}<|Q|<  _ tdd|< d d D ]h}\|C|J|<|\f |9d|< d|\    |8d|< |\   |[|J|<|\f< |[|J|<|\f d j |\  |[|J|<|\f< qxqTqF fd,d-}]i }^td|d D ]D}Jtd|D ]2}<td(d|< d d D ]}\d|^|J|<|\f< q0qqt
|Qd |Vd d  _ |]|}_ |_ }`td|d D ]}atd|D ]}<|Q|<  _ tdd|< d d D ]j}\d|^|a|<|\f< td|ad D ]F}J |a|J |`|J |[|a|J |<|\f  }b|^|a|<|\f  |b7  < qڐqqqi }ctd|d D ]D}Jtd|D ]2}<td(d|< d d D ]}\d|c|J|<|\f< qhqNq@td|d D ]}Jtd|D ]}<|V|<  _ tdd|< d d D ]h}\|P|J|<|\f |9d|< d|\    |8d|< |\   |c|J|<|\f< |c|J|<|\f d j |\  |c|J|<|\f< qƐqqi }dtd|d D ]D}atd|D ]2}<td(d|< d d D ]}\d|d|a|<|\f< qrqXqJtd|d D ]}atd|D ]}<|V|<  _ tdd|< d d D ]j}\d|d|a|<|\f< td|ad D ]F}J |a|J |`|J |c|a|J |<|\f  }b|d|a|<|\f  |b7  < qqАqqt
|Qd |Vd d  _ i }ed|ed< |ed | |ed< t
|Qd |Vd  _ td|D ]}<|e|<d  |ed  |e|<< qi }ftd|d D ]`}atd|D ]N}<|Q|<  _ tdd|< d d D ]&}\|^|a|<|\f |e|<  |f|a|<|\f< qq֐qi }gtd|d D ]`}atd|D ]N}<|V|<  _ tdd|< d d D ]&}\|d|a|<|\f |e|<  |g|a|<|\f< qnqJq<i }htd|d D ]b}atd|D ]P}:|R|:  _ d}itdd|: d d D ]}<|i|f|a|:|<f 7 }iq|i|h|a|:f< qqi }jtd|d D ]b}atd|D ]P}:|W|:  _ d}itdd|: d d D ]}<|i|g|a|:|<f 7 }iq\|i|j|a|:f< q4q&i }kd _ t j| ||  }ld _  d.|d d  |l | }mt
|m d|d  }m|m _ td|d D ]@}ad|k|a< td|d D ]"}<|k|a  |h|a||< f 7  < qqi }nd _ t j| ||  }od _  d.|d d  |o | }pt
|p d|d  }p|p _ td|d D ]@}ad|n|a< td|d D ]"}<|n|a  |j|a||< f 7  < qʐqd _ dt
 t|kd  t|nd  }q|d|q  }r| |d j   }sd/ dd|r  ||   |s  }td/ dd|r  ||   |s  }ut
|t|u _ |d j  }v|d  |v |d   jd  }w |w }x|]|} || } || }	d|1d  | |x }yd|1d  |	 |x }zd _ d |1 |1d|   |1 |  }{d |1 |1d|   |1 |  }|t
|{||}}|}d  _  |dt|1d td|d d0\}~}d _ t|~| }t|k| |y }t
d| dd| d1|    }| _ i }td|d D ]}a|~|a |k|a |y  ||a< q$d _ t|| }t|n| |z }t
d| dd| d1|    }| _ i }td|d D ]0}a||a |n|a |z  ||a<  ||a ||a< q| _ ||fS )2Nr   r   r         @r>   r   r   r   5U@`<@Y?r         ?      9@2Riemann-Siegel can not compute with such precisionr              s@     ,      r   r   r   r         r   r   r   r   r   r   r   r   r   r   r   r   r   r   rc   r   r   r   r   r   r   r   r   r   z1.0rc   D         ?c                    s.    j }|d  _  | d j  }| _ |S Nr   r   r#   r   tZwpaar   r   r   trunc_a0  s
    
zRzeta_simul.<locals>.trunc_a皙@r   T   )r   _im_rer#   r   rL   r   mathpowgammar   absNotImplementedErrorrJ   rQ   rM   r   floorr    r3   r=   copyr?   r   r!   r"   binomialexpj_zetasumintconj)r   sder	wpinitialrq   ZxsigmaZysigmarB   ZxasigmaZyasigmaZxA1ZyA1r%   eps1Zxeps2Zyeps2xbZxcr@   rC   ZybZycZyAZyB1rD   ZyLLZxeps3Zyeps3rA   Zyeps4rI   ZyMMrP   h4r$   jvalueeps5Zxforeps5Zyforeps5rG   Zxaux1Zyaux1rE   rF   twentyauxwpfpNpnum
differenceeps6cccontpipowersFpr'   sumPr,   Zxwpdd1Zxd2ZxconstZxd3ZxpsigmaZxdm1c1c2c3raddr-   ZywpdZyd2ZyconstZyd3ZypsigmaZydZxwptcoefZxwptermZxc2Zxc4Zxc3ZywptcoefZywptermZyc2Zyc4Zyc3Z	xfortcoefellrs   Zxtcoefrr   lachitcoefterZ	yfortcoefZytcoefavZxtvZytvZxtermteZytermZxrssumZxrsboundZxwprssumZyrssumZyrsboundZywprssumA2eps8TZxwps3Zywps3tpiargUZxS3ZyS3ZxwpsumZywpsumwpsumZxS1ZyS1ZxabsS1ZxabsS2ZxwpendxrzZyabsS1ZyabsS2Zywpendyrzr   r   r   Rzeta_simul   s   


.
.
B




 
*

. (*,  


V<*: 0P4(*,  


V<*: 0P4$(6$$6
<2
*&
<2
*&
,
,

$$*(($,,

($$r   c           \   
      sh  t |} j} |} |}d _ |d j  } ||} d |d }	 d| }
|
d }|
|	 d }d _|dkrd}t	d|d	 }t	d|}d}n(d
}t	d| d	 }t	d| }d}d _d}d|  
|d   || |  |kr|d }qt d|}d| d| | d ksjd| d | dk sjt||d krx| _td|d|  }|d|  }t |||||}i }t|d| d D ]}d||< q|d|  } j j | |  d tj tj }| ||d  |d d  | }t||}d}d j |  
|d  }||krt|d }d j | | }qLi }tjtj | | }tddD ]X}t	||d d|  } 
|d  
|d d  } t| } ||  | ||< qtd| d dd }!d| }" d| }#td|!D ],}t |# |" 
|d  ||  }#q&|# | d  _ |d j  } |}$dd||$   }% |% d|#  }&|% d|#  |& }'|'dk r|&}&n|&d }& |& d|#   }% d j | 
|d d |  }(i })i }*t ||(\}*}+|* })i }t|d| d D ]}d||< qT|# _td|d D ]x}d},td| | d ddD ]}-|,|% |)|-  },q|,||< tdd| | d D ]}-|-d |)|-d   |)|-< qΐqxi }.t d d| | }/d dt| |   | d }0 d j j | | | |  d }1td|D ]@}   
|d  ||1  |0 }2t |2|/|.|< qj|.d d  _dd|  }3i }4d|4d< d|4d < d|4d!< d|4d"< d|4d#< d|4d$< d|4d%< d|4d&< td|D ]|}|.| d  _tdd| d d D ]}-d| d|-  }|dkr܈ j| }5|5d }6|3|5 d }7|d  }8|8|4d|d |-d f  |6|4d|d |-f   |7|4d|d |-d f   |4d||-f< nzd|4d||-f< td|-D ]`}9|4d||9f  j d|- d|9    |-|9   }:|4d||-f  d|-|9  |: 8  < qq>d|4d|d'f< d|4d|df< d|4d|d| d d f< qtd'|d D ]z};td'|D ]h}td(t dd| d d D ]D}-|;dk s|dk s|-dk s|-d| d krd|4|;||-f< qАqqtd|d D ]};td|D ]}|.| d  _tdd| d d D ]~}-d|; d |4|;d |d |-d f  d|| d  |4|;d |d |-d f   }"|"|4|;d |d |-d f  |4|;||-f< qbq:q,i }<i }=d _ d|d  }6 d)|d  | }7 || t j d }>td|D ]}-|7|-|>    |-d d  }8t |6|8 | d d d |<|-< t |6 |d |8  | d d d |=|-< 	qHi }?|D ]D};td|D ]2}-td'd|- d d D ]}@d|?|;|-|@f< 	q	q	q|D ]};td|D ]}-|<|-  _tdd|- d d D ]h}@|4|;|-|@f |d|- d|@    |+d|- |@   |?|;|-|@f< |?|;|-|@f d j |@  |?|;|-|@f< 
qN
q*
q fd*d+}Ai }B|D ]D}Ctd|D ]2}-td'd|- d d D ]}@d|B|C|-|@f< 
q
q
q|<d d  _|A|}D |D }E|D ]}Ctd|D ]}-|<|-  _tdd|- d d D ]f}@d|B|C|-|@f< td|Cd D ]B}; |C|;|E|;  |?|C|; |-|@f  }F|B|C|-|@f  |F7  < qqrqNq@|<d d  _i }Gd|Gd< |Gd | |Gd< |<d  _td|D ]}-|G|-d  |Gd  |G|-< q i }H|D ]`}Ctd|D ]N}-|<|-  _tdd|- d d D ]&}@|B|C|-|@f |G|-  |H|C|-|@f< qzqVqHi }I|D ]b}Ctd|D ]P}|=|  _d}Jtdd| d d D ]}-|J|H|C||-f 7 }Jq|J|I|C|f< qqi }Kd _t j| ||  }Ld _ d,|d d  |L | }Mt |M d|d  }M|M _|D ]@}Cd|K|C< td|d D ]"}-|K|C  |I|C||- f 7  < qq~d _d |Kd  }N|
d|N  }O| |d j   }Pd- dd|O  ||   |P  }Q|Q _|d j  }R|d  |R |d   jd  }S |S }T|A|} || }d|$d  | |T }Ud _d |$ |$d|   |$ |  }V|Vd  _ |dt|$d |d }Wd _t|W| }Xt|K| |U }Yt d| dd|X d.|Y    }Z|Z _i }[|D ]}C|W|C |K|C |U  |[|C< q>| _|[S )/a  
    Computes several derivatives of the auxiliary function of Riemann `R(s)`.

    **Definition**

    The function is defined by

    .. math ::

        \begin{equation}
        {\mathop{\mathcal R }\nolimits}(s)=
        \int_{0\swarrow1}\frac{x^{-s} e^{\pi i x^2}}{e^{\pi i x}-
        e^{-\pi i x}}\,dx
        \end{equation}

    To this function we apply the Riemann-Siegel expansion.
    r   r   r   rR   r>   r   r   r   rS   rT   rU   r   rV   rW   rX   r   rK   rY   rZ   r[   r\   r]   r^   r_   r   r   r   r`   ra   r   rb   rd   re   rf   rg   rh   ri   rj   rc   rk   rl   c                    s.    j }|d  _  | d j  }| _ |S rn   ro   rp   r   r   r   rs     s
    
zRzeta_set.<locals>.trunc_art   r   ru   )r   r   rv   rw   r#   r   rL   r   rx   ry   rz   r{   r|   rJ   r   erM   r}   r    r3   r=   r~   r?   r   r!   r"   r   r   r   r   )\r   r   Zderivativesr   r   rq   sigmarB   ZasigmaA1r%   r   Zeps2br/   AZB1r   Zeps3Zeps4r   r   r'   rN   rO   rP   r$   r   r   Zforeps5rG   rE   rF   r   r   r   r   r   r   r   r   r   r   r   r   r,   Zwpdr   Zd2constZd3Zpsigmadr   r   r   r   r   r   r-   ZwptcoefZwptermZc4Zfortcoefr   rs   Ztcoefr   rr   r   r   r   ZtvZtermr   ZrssumZrsboundZwprssumr   r   r   Zwps3r   r   r   ZS3r   ZS1ZabsS1ZabsS2Zwpendrzr   r   r   	Rzeta_set  s   

.

B*$

 
*

( (*,  


V8*: 0P4$$6
<2
&

,
$($,
$r   c                 C   sv  |  d| j|  }| j}d| _|d| j  }|d | d|d  | |  }|d | d| | |  }|| _| |}|| _t| |t|d }	|dkr| 	| 
d|d d | | jd  }
|dkr| 	| j| 
d|d  d	 }|dkr| 	| 
d|d  d
 }|dkrH| 	| j | 
d|d  d }| |}|dkrld| |	d  }|dkrd| }||
|	d  |	d   }|dkrd| }| d|	d  |
 |	d |
d   |	d  | j|	d  |   }|dkrnd| }d|	d  |
d  |	d |
d   d|
 |	d   }||d|	d  |  d|	d  |
 |  |	d  |	d |   }|d	krfd| }d	|	d  |
d  |	d |
d	   d|
d  |	d   }|d|	d  |
 |  d|	d  |
d  |  d|	d  |  d|	d  | |  }|d	|
 |	d   d	|	d  |  d	|	d  |
 |  |	d	  | j|	d  |  }|| }|| _| 	|S )z-
    z_half(t,der=0) Computes Z^(der)(t)
    0.5r   r   r   r   rm   rY   r   r   ra                     @y                            @r                 (@              @)r    r"   r   r   r   r?   siegelthetar   r   rw   psir   )r   rq   r   r   r   ttwpthetaZwpzthetar   ps1ps2ps3ps4expthetazzfr   r   r   z_halfr  sF    $ 
2(&,



@
4@
8TRr   c                 C   s  | j }| |}| |}d| _ |dkr8| t|}n&d| j |d  td| d|   }|dkrd| |d| j   }nd| | }td| }d| t| }	tdd| 	| }
d| 	d	| d
| |  d| | |	   | d }t|
|}
tdd| 	d| |  | d }d| 	dd|   | d }|| _ | 
|| j|| d   }|dkr| | d|d d | | jd  }|dkr| | d|d  d }|dkr| | d|d  d }|dkr| | d|d d }|| _ t| |t|d }i }td|d D ]}| || ||< q4|
| _ | d| }|dkr|d ||d   }|dkr|d  d|d  |  }|d ||  }|dkr
d|d  | d|d  |d   |d  d|d  |  }|d ||  }|dkrd|d  |d  d|d  |d   d|d  |  d|d  |  }|d|d  | |  |d  d|d  |  }|d ||  }|dkrd|d  |d  d|d  |d   d|d  |d   }|d|d  | |  d|d  |d  |  }|d|d  |  d|d  |d   d|d  |  d|d  |  }|d|d  | |  |d  d|d  |  }|d ||  }|| _ |S )z?
    zeta_half(s,k=0) Computes zeta^(k)(s) when Re s = 0.5
    5   r   r   r   rV   r   r   r   (\ @3333335@?皙@皙?r   ra   r   rc   r   r   r                        H@rY   )r   rw   rv   r#   r{   r   rx   logr   r   r   r"   r    r   r?   r   r   r   r   )r   r   r,   r   r   rq   XM1abstr   wpbasicwpbasic2r   wpRr   r   r   r   r   r   r   r   r   zvzv1r   r   r   	zeta_half  sd    

&6
$4&&$


<
H0
<0H0r   c                 C   s*  | j }| |}| |}d| _ |dkr:| t|d}n.| d| j |d | td| d|  }|dkrd| |d| j   }nd| | }d| dkrd| |d| j   }n0d| | d| j |  | t||d  }td| }	d|	 t|	 }
t	dd| 
| }d| 
d	| d
| |  d| | |
   | d }t	||}t	dd| 
d| |  | d }d| 
dd|   | d }|| _ | || j|| d   }|}| d| }|| _ t| ||\}}|dkr.| d|d | dd| d  d | | jd  }|dkrf| j| d|d | dd| d   d }|dkr| d|d | dd| d   d }|dkr| j | d|d | dd| d   d }|| _ | d| }|dkr|d ||d   }|dkr:|d  d|d  |  }|d ||  }|dkrd|d  | d|d  |d   |d  d|d  |  }|d ||  }|dkr"d|d  |d  d|d  |d   d|d  |  d|d  |  }|d|d  | |  |d  d|d  |  }|d ||  }|dkr d|d  |d  d|d  |d   d|d  |d   }|d|d  | |  d|d  |d  |  }|d|d  |  d|d  |d   d|d  |  d|d  |  }|d|d  | |  |d  d|d  |  }|d ||  }|| _ |S )z+
    Computes zeta^(k)(s) off the line
    r   r   rV   r   r   r   r   r   r   r   r   r   r   r   ra   r   r   rc   r   r   r   r   r   r   rY   )r   rw   rv   rL   r{   r   r#   rx   r   r   r   r   r"   r    r   r   r   r?   r   )r   r   r,   r   r   rq   r   r   M2r   r   r   r   r   r   r   s1s2r   r   r   r   r   r   r   r   r   r   r   r   zeta_offline  sh    

.06
$B84:


<
H0
<0H0r   c              	   C   sz  |  d| j|  }|}| d| }| j}d| _| |dkrnd| | |d| j   }| t|}nDd| j | |d  td| d| |   }d| | | }| |dkrd| | |d| j   }	n@d| | d| j | |d   td| d| |   }	dt| 	| }
| |}|||	  }d| }t
d	d| |
 | |d
d|
   | }t
d| d| | }| d| | }|| _| 	|}|| _t| ||\}}dd|  }dd|  }|dkrd| d|| d|  | | jd  }|dkr@d| d|| d|  }|dkrfd| d|| d|  }|dkrd| d|| d|  }|| _| |}|dkr||d  |d |  }| j}|dkr|| |d |d |   ||d |d |   |  }|dkr|d|d  | |d |d   |d  ||d  |   }|d|d  | |d |d   |d  ||d  |  |  }|dkrd|d  |d  |d |d   d|d  |  |d |d  |  }|d|d  | |  |d  |d |  | | }d|d  |d  |d |d   d|d  |  |d |d  |  }||d|d  | |  |d  |d |   | }|| }|dkrpd|d  |d  |d |d   d	|d  |d   }|d|d  | |  d|d  |d  |  d|d  |  }|d|d  | |  d|d  |  d|d  |  d|d  | |  }||d  ||d  |  }d|d  |d  |d |d   d	|d  |d   }|d|d  | |  d|d  |d  |  d|d  |  }|d|d  | |  d|d  |  d|d  |  d|d  | |  }||d  ||d  |  }|| ||  }|| _|S )z8
    Computes Z(w) and its derivatives off the line
    r   r   #   r   r   rV   r   r   r      gRQ @g      ?y              ?y              ?g      y             rc   rk   r   r   r   )r    r"   r   r   rw   r#   rv   r   r{   r   r   r   r   r   r?   r   )r   r)   r,   r   r   r   r   r   r   r   r   rE   rF   rH   r   r   r   r   r   r   ZptaZptbr   r   r   r   r   r   r"   r   Zzv2r   r   r   	z_offline  st    2 @
,
6&&&


8
<@
H4H4
8@L8@Lr   c                 K   sv   |dkrt | |}| |}| |}|dk rN| | | ||}|S |dk}|rft| ||S t| ||S d S )Nr   r   rV   )r|   r3   rw   rv   r   rs_zetar   r   )r   r   
derivativekwargsreimr   critical_liner   r   r   r   b  s    
r   c                 C   s\   |  |}| |}| |}|dk r4t| | |S |dk}|rLt| ||S t| ||S d S )Nr   )r3   rw   rv   rs_zr   r   )r   r)   r   r   r   r   r   r   r   r   q  s    
r   )r   )r   )r   )r   )r   )r   )r   )__doc__rx   objectr   Z	functionsr   r0   r=   rJ   rQ   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s.   2v
    
  v
(
>
B
H