
    iT                     b    d dl mZmZmZmZmZmZmZmZ d	dZ	e
dk(  rde_         e	dd      Zyy)
    )mpcossinexplogpiefindrootc                    ! dt         _        t        j                  |       }t        dd        t        d       t        d        t        d|        d !d9!fd	t        d| d	       t        j                  d
      d|z  z     |      }t        d|        t	        |      dk  r	  !       }t        d|        nt        d       t        d       t        dd      D cg c]  }t        j                  |      dz   }}g }|D ]  }	 fd}
t        j                  |
d|	g      }|j                  t        t        j                  |                   t        |      dk\  s\|d   }t        t        j                  |            dkD  s|dk  st        dt        |	t        j                  d
      z
        ddt        |	      d        t        d       t        dd      D cg c]  }|t        j                  |      dz  z    }}g }t        d        t        d!d"z          |D ][  } |      }|j                  t        |             t        |      d#z  dk(  s7t        d!t        |      dd!t        |      d       ] g }t        dt        |            D ]M  }||   ||dz
     z  dk  s||dz
     ||   ||dz
     z
  dz  z   }|j                  |       t        d$|        O t        d%       fd&}|dd' D ]  }	 |}t        d(      D ]i  } ||      }t        j                  d)      } |||z          |||z
        z
  d|z  z  }t	        |      d*k  r n|||z  z
  }t	        ||z
        d+k  r n|}k t        d,t        |      d-       t        d. ||               t        d0       d:d1}|dd' D ]F  } ||d23      } ||      }t        d4t        |      dd5t        |      d6d7t        |      d6       H |||d8S # t
        $ r}t        d|        Y d}~cd}~ww xY wc c}w c c}w # t
        $ r}t        d/|        Y d}~Zd}~ww xY w);u5  
    Using an exact integral form for zeta, then converting to Hardy Z(t).
    
    ζ(s) = [1 / ((1 - 2^(1-s)) Γ(s))] ∫_0^∞ x^(s-1) / (e^x + 1) dx

    On the critical line s = 1/2 + it, the Hardy function is
    Z(t) = Re(e^{iθ(t)} ζ(1/2 + it))
    and its zeros match the zeros of ζ(1/2 + it).
    2   
zP================================================================================zINTEGRAL FORM ZERO FINDERzSearching near t = c                      t        j                   d      rt        d       fd}t        j                  |ddt         j                  g      }|ddd z
  z  z
  t        j
                         z  z  S )u   
        Exact integral representation of ζ(s) through the Dirichlet eta function.
        Valid for Re(s) > 0, s != 1.
           u   ζ(s) has a pole at s = 1c                 B    | dz
  z  t         j                  | z  dz   z  S Nr   r   r	   xss    integral_finder.py	integrandzDZ_integral_zero_finder.<locals>.zeta_via_integral.<locals>.integrand   "    q1u:q1--    r      )r   almosteq
ValueErrorquadinfgamma)r   r   eta_integrals   `  r   zeta_via_integralz1Z_integral_zero_finder.<locals>.zeta_via_integral   sd    
 ;;q!899	. wwy1a.9AAJ"((1+=>>r   c                 *   t        j                  |       } |dk(  rdt        j                  d      d| z  z   } |      }t        j                  |       }t        j                  t         j                  d|z  z  |z        S t        j
                  |       S )z
        Hardy Z(t).

        `method="siegelz"` uses mpmath's stable implementation.
        `method="integral"` uses the eta-integral representation for validation,
        but it is much less stable for larger t.
        integral0.5              ?)r   mpfsiegelthetarer	   siegelz)t_valmethodr   zeta_sthetar!   s        r   hardy_Zz'Z_integral_zero_finder.<locals>.hardy_Z$   sx     uZuU
*A&q)FNN5)E55U
+f455zz%  r   z
[1] Integral form at t = :r$   r%   z    Z(t) =    u        ζ(1/2 + it) via integral = u'       ζ(1/2 + it) via integral skipped: NuI       ζ(1/2 + it) via integral skipped for large t; using stable Z(t) pathz)
[2] Finding zero-crossing of Hardy Z(t):r      g      ?c                 B    | dz
  z  t         j                  | z  dz   z  S r   r   r   s    r   partial_integrandz1Z_integral_zero_finder.<locals>.partial_integrandK   r   r   r   r   z0    Partial eta-integral changes sign between X=z.6fz and X=z$
[3] Searching for t where Z(t) = 0:igMbP?z    t           Z_integralz    z(----------------------------------------   u       ✓ Zero near t = z(
[4] Newton refinement on integral form:c                      |       S )z(Stable Hardy Z(t) used for root finding. )r*   r.   s    r   Z_funcz&Z_integral_zero_finder.<locals>.Z_funco   s    u~r      
   z1e-10g0.++g#B;z    Zero refined: t = z.10fz    Z_integral = z    Failed to refine: z$
[5] Verification with discrete sum:c           
          t        j                  d      }t        d|dz         D ]?  }|dt        t        dz  | t        |      z  z
        z  t        j                  |      z  z  }A |S )Nr   r   r      )r   r&   ranger   r   r   sqrt)r*   n_maxtotalns       r   
Z_discretez*Z_integral_zero_finder.<locals>.Z_discrete   sb    q	q%!)$ 	AAQRTECFN233bggaj@@E	Ar   i  )r?   z    t = z: Z_discrete = z.6ez	, Z(t) = )sign_changesintegral_valuesupper_limits)r)   i  )r   dpsr&   printabs	Exceptionr=   r   appendfloatr(   len)"
t_estimaten_endtZ_value
zeta_valueexcirE   rD   Xr3   Iprev_It_gridZ_valuestiZirC   t_idxr8   tc	t_current_Z_valdtZ_primet_nextr	   rB   Z_discZ_intr.   r   r!   s"                                  @@@r   Z_integral_zero_finderrf      s    BF
zA	Bvh-	%'	VH	s
#$?!" 
's!
,-
uQAajG	Ky
!"
1v|	C*1-J4ZLAB 	YZ 
68-21b\:BFF1IO:L:O 	~	.GG%1v.uRUU1X/1$$R(FRUU1X"vzHqSUSYSYZ_S`O`IabeHffmnstunvwzm{|}	~ 
13 .33^<a"&&)e##<F<H	&(	DH
 =R[b	"x=2"Dr3tE"Ic?;<	= L1c(m$ 4A;!A#&*1Q3K6!9vac{#:a"??E&*5'23	4 
57 2A 0	0I2Y #y)VVG_!)b.1F9r>4JJqSUvVw<&("UW_4v	)*U2"	# *5+;D*ABC%fY&7%89:'00 
13 2A gBc*r
r3uV}S6ISXY^S_`cRdefg %*$ u  	C;C5ABB	C ;$ =^  	0*1#.//	0s=   /P *P<."QB%Q	P9 P44P9	Q(Q##Q(__main__r   gOH@d   )rN   rO   NrF   )mpmathr   r   r   r   r   r   r	   r
   rf   __name__rG   resultr7   r   r   <module>rl      s9    : : :Yv zBF $}CHF r   