
    (phD2                         S r SSKJrJr  SSKrSSKJr  SSKJ	r	J
r
  SSKJr   SSKrSSKJrJrJrJrJrJrJrJrJrJrJr  SSKJr  S	 rS
 rS rS rS rS r S r!\"S:X  a  \!" 5         gg! \ a     N,f = f)zPrecompute coefficients of several series expansions
of Wright's generalized Bessel function Phi(a, b, x).

See https://dlmf.nist.gov/10.46.E1 with rho=a, beta=b, z=x.
    )ArgumentParserRawTextHelpFormatterN)quad)minimize_scalar	curve_fit)time)
EulerGammaRationalSSum	factorialgamma	gammasimppi	polygammasymbolszeta)hornerc                  |   Sn [        S5      u  pp4/ n/ n/ n[        X4-  [        U5      -  [        X-  U-   5      -  US[        R
                  45      n[        U5      [        R                  " U5      -  U-  n[        SU S-   5       H  n	UR                  X5      R                  US5      R                  5       R                  5       n
U
R                  [        SU5      S5      R                  [        S 5      nUSU	-  -  nUR                  X-  [        U	5      -  5        UR                  [!        U5      5        UR                  [!        X-  R                  5       5      5        M     SnUS-  n[#        / S	QXVU/5       H:  u  p[        [%        U5      5       H  nUS
U SU S3['        X   5      -   -  nM     M<     U$ )zATylor series expansion of Phi(a, b, x) in a=0 up to order 5.
       a b x kr      c                      gNr    argss    Z/var/www/html/venv/lib/python3.13/site-packages/scipy/special/_precompute/wright_bessel.py<lambda> series_small_a.<locals>.<lambda>&       A    z=Tylor series expansion of Phi(a, b, x) in a=0 up to order 5.
zAPhi(a, b, x) = exp(x)/gamma(b) * sum(A[i] * X[i] * B[i], i=0..5)
)AXB
[] = )r   r   r   r   r   Infinitysympyexprangediffsubssimplifydoitr   replaceappendr   ziplenstr)orderabxkr$   r%   r&   
expressionntermx_partsnamecis                   r   series_small_arD      s    E#JA!
A
A
AQT)A,&uQSU|3aAJJ5GHJq%))A,&3J 1eAgq$))!Q/88:??A))IaOQ/79o6 	 	2'	il"#	 	..012  	IA	MMAq	2s1vA2dV1QCt$s14y00A  3 Hr"   c                     [        S5      nSU -  [        -
  [        R                  " SU-  [	        U5      -  XS-
  -  -  USUS-   45      -   $ )z|Symbolic expansion of digamma(z) in z=0 to order n.

See https://dlmf.nist.gov/5.7.E4 and with https://dlmf.nist.gov/5.5.E2
r;   r#   r      )r   r	   r+   	summationr   )zr=   r;   s      r   	dg_seriesrI   7   sU    
 	Aa4*a$q')A!H4q!QqSkBC Cr"   c                 H    [         R                  " [        XU -   5      X5      $ )z8Symbolic expansion of polygamma(k, z) in z=0 to order n.)r+   r.   rI   )r;   rH   r=   s      r   	pg_seriesrK   A   s    ::iQ3'..r"   c                  	  ^^ Sm[        S5      u  pp#[        S5      u  pEn[        U[        U[        S5      U0n/ n/ n	/ n
/ n[	        U5      [
        R                  " U5      -  [        X#-  [        U5      -  [	        X-  U-   5      -  US[        R                  45      -  n[        STS-   5       GHP  mUR                  U T5      R                  U S5      R                  5       R                  5       nUR                  [!        SU5      S5      R#                  [         S 5      nUST-  -  nX-  [	        U5      -  nTS:  at  UR#                  [         UU4S	 j5      nUR%                  USTS-   T-
  S
9R'                  5       R                  [!        SS5      S[        S5      -  5      R                  5       nUR)                  U T-  [        T5      -  5        U	R)                  [+        U5      5        U
R)                  U5        GMS     [
        R,                  " U
S   R                  U5      U5      R/                  5       nUR1                  5         [        [3        U5      5       H%  nUU   [        U5      -  R                  5       UU'   M'     SnUS-  nUS-  nUS-  nUS-  nUS-  nUS-  n[5        SS/X/5       H>  u  nn[        [3        U5      5       H   nUSU SU S3-  nU[7        UU   5      -  nM"     M@     [        [3        U5      5       Hl  nUSU S3-  nU[7        UU   5      -  nUSU S3-  nU[7        UU   R                  U[        U[        U[        S5      05      R9                  S5      5      -  nMn     US-  nUS-  nUS-  n[;        [        TS-
  5       Vs/ s H  o1U-  [        U5      -  XS-      -  PM     sn5      nUU
S   R                  U5      -
  R                  5       nUSU[        S5      :H   3-  nUS -  n[;        [        TS-
  5       Vs/ s H  o1U-  [        U5      -  XS-      -  PM     sn5      nUU
S   R                  U5      -
  R                  5       nUSU[        S5      :H   3-  nU$ s  snf s  snf )!an  Tylor series expansion of Phi(a, b, x) in a=0 and b=0 up to order 5.

Be aware of cancellation of poles in b=0 of digamma(b)/Gamma(b) and
polygamma functions.

digamma(b)/Gamma(b) = -1 - 2*M_EG*b + O(b^2)
digamma(b)^2/Gamma(b) = 1/b + 3*M_EG + b*(-5/12*PI^2+7/2*M_EG^2) + O(b^2)
polygamma(1, b)/Gamma(b) = 1/b + M_EG + b*(1/12*PI^2 + 1/2*M_EG^2) + O(b^2)
and so on.
r   r   zM_PI M_EG M_Z3   r   r   c                      gr   r   r   s    r   r   (series_small_a_small_b.<locals>.<lambda>e   r!   r"   r#   c                 (   > [        XTS-   T-   5      $ )Nr   )rK   )r;   r:   r=   r7   s     r   r   rO   m   s    9Q57193Mr"   )r=   rF   zDTylor series expansion of Phi(a, b, x) in a=0 and b=0 up to order 5.z9
Phi(a, b, x) = exp(x) * sum(A[i] * X[i] * B[i], i=0..5)
z	B[0] = 1
z&B[i] = sum(C[k+i-1] * b**k/k!, k=0..)
z

M_PI = piz
M_EG = EulerGammaz
M_Z3 = zeta(3)r$   r%   r'   r(   r)   z
# C[z
C[   z/

Test if B[i] does have the assumed structure.z"
C[i] are derived from B[1] alone.z:
Test B[2] == C[1] + b*C[2] + b^2/2*C[3] + b^3/6*C[4] + ..z
test successful = z-
Test B[3] == C[2] + b*C[3] + b^2/2*C[4] + ..)r   r   r	   r   r   r+   r,   r   r   r   r*   r-   r.   r/   r0   r1   r   r2   seriesremoveOr3   r   Polycoeffsreverser5   r4   r6   evalfsum)r8   r9   r:   r;   M_PIM_EGM_Z3c_subsr$   r%   r&   Cr<   r>   r?   pg_partrC   r@   rA   rB   testr=   r7   s                        @@r   series_small_a_small_bra   F   si    E#JA!/0D$
D$q'48F
A
A
A
A
 q%))A,&AD1eACEl*Q1::,>?@J 1eAgq!$))!Q/88:??A))IaOQ/79o6 	 	2'+eAh&6ooi&MOG~~aeAgai~8	Yq!_baj9 
  	
Ail"#	 	+ 0 	

1Q499V$a(//1AIIK3q6]!y|#--/!  	OA	FFAA	22AA	A	ASzA6*as1vA2dV1QCt$$AQqTNA  +
 3q6]	vaS	S1Y	tA3d^	S1D*dBd1gFG%) 		  	<<A	..A	FFAE%'NCNq1Yq\!AcF*NCDD1Q499V$$..0Dad
|	,,A	99AE%'NCNq1Yq\!AcF*NCDD1Q499V$$..0Dad
|	,,AH D Ds   ""R"Rc            	        ^ Sn  " U4S jS[         R                  5      m " U4S jS[         R                  5      n[        S5      u  p#nU" SX#5      nSnUS	-  nUS
-  nUS-  nUS-  nUS-  nUS-  nUS-  n[        SU S-   5       H  nU" XrU5      USU-   U-  -  -  R	                  5       n[         R
                  " U5      R                  5        V	s/ s H  oR                  5       PM     n
n	[         R                  " U
5      n
X-  R	                  5       R                  U[         R                  5      nUR                  US-   U05      nUSU SU
 SU S3-  nUSU S[        U5       S3-  nM     SSKnUR                  S5      nUR                  SU5      nUR                  S5      nUR                  SU5      nUR!                  SS5      nUR!                  SS5      nUR                  S 5      nUR                  S!U5      nU$ s  sn	f )"a}  Asymptotic expansion for large x.

Phi(a, b, x) ~ Z^(1/2-b) * exp((1+a)/a * Z) * sum_k (-1)^k * C_k / Z^k
Z = (a*x)^(1/(1+a))

Wright (1935) lists the coefficients C_0 and C_1 (he calls them a_0 and
a_1). With slightly different notation, Paris (2017) lists coefficients
c_k up to order k=3.
Paris (2017) uses ZP = (1+a)/a * Z  (ZP = Z of Paris) and
C_k = C_0 * (-a/(1+a))^k * c_k
   c                   4   > \ rS rSrSrSr\U 4S j5       rSrg)asymptotic_series.<locals>.g   zHelper function g according to Wright (1935)

g(n, rho, v) = (1 + (rho+2)/3 * v + (rho+2)*(rho+3)/(2*3) * v^2 + ...)

Note: Wright (1935) uses square root of above definition.
rM   c                    > US:  d  [        S5      eUS:X  a  gT" US-
  X#5      [        [        US-   U-   5      [        US-   5      -  5      [        [        SU-   5      [        S5      -  5      -  X1-  -  -   $ )Nr   zmust have n >= 0r   rF   rM   )
ValueErrorr   r   )clsr=   rhovgs       r   eval!asymptotic_series.<locals>.g.eval   s    6 !344a1c~c!eAguSU| ;<ac
58 34556T:: :r"   r   N	__name__
__module____qualname____firstlineno____doc__nargsclassmethodrm   __static_attributes__rl   s   r   rl   re      s!    	 		: 
	:r"   rl   c                   4   > \ rS rSrSrSr\U 4S j5       rSrg)!asymptotic_series.<locals>.coef_C   zCalculate coefficients C_m for integer m.

C_m is the coefficient of v^(2*m) in the Taylor expansion in v=0 of
Gamma(m+1/2)/(2*pi) * (2/(rho+1))^(m+1/2) * (1-v)^(-b)
    * g(rho, v)^(-m-1/2)
rM   c                 r  > US:  d  [        S5      e[        S5      nSU-
  U* -  T" SU-  X$5      U* [        SS5      -
  -  -  nUR                  USU-  5      R	                  US5      [        SU-  5      -  nU[        U[        SS5      -   5      S[        -  -  SUS-   -  U[        SS5      -   -  -  -  nU$ )Nr   zmust have m >= 0rk   r   rF   )rh   r   r
   r.   r/   r   r   r   )ri   mrj   betark   r<   resrl   s          r   rm   &asymptotic_series.<locals>.coef_C.eval   s    6 !344AA#$!AaC.A2hq!n;L*MMJ//!QqS)..q!4y1~ECq8Aq>12ad;s1uIXa^);<= >CJr"   r   Nro   rx   s   r   coef_Crz      s!    	 			 
		r"   r   z	xa b xap1r   z!Asymptotic expansion for large x
z.Phi(a, b, x) = Z**(1/2-b) * exp((1+a)/a * Z) 
z3               * sum((-1)**k * C[k]/Z**k, k=0..6)

zZ      = pow(a * x, 1/(1+a))
zA[k]   = pow(a, k)
zB[k]   = pow(b, k)
zAp1[k] = pow(1+a, k)

z#C[0] = 1./sqrt(2. * M_PI * Ap1[1])
r   zC[z] = C[0] / (z * Ap1[z])
z] *= z

Nzxa\*\*(\d+)zA[\1]z
b\*\*(\d+)zB[\1]xap1zAp1[1]xar8   z	(\d{10,})z\1.)r+   Functionr   r-   r0   rU   rV   denominatorlcmcollectfactorxreplacer6   recompilesubr2   )r7   r   r   r9   r   C0r@   rC   exprr:   r   r   re_are_b	re_digitsrl   s                  @r   asymptotic_seriesr      s    E:ENN :( , +&KB4	2	B,A	::A	@@A	))A	A	A	##A	//A1eAgqa B"qyL1;;=+0::d+;+B+B+DE+Da--/+DE6"'')11!U\\B}}bdD\*	r!Ls$77	r!E#d)D))  ::n%D1A::m$D1A			&(#A			$A 

<(Ifa AH# Fs   Hc            
      j  ^^^^	^
^ S m
SU
4S jjm/ SQm/ SQm/ SQm	[         R                  " TTT	5      u  mmm	TR                  5       TR                  5       T	R                  5       smmm	/ n [        T	R                  5       H2  mU R                  [        UUUU	U4S jSSS	S
0S9R                  5        M4     [         R                  " U 5      n TTT	U S.nS n[        [        X!US   SS9S   5      nSnUS-  nUS-  nUS-  nUS-  nUSR                  U Vs/ s H  oUS PM     sn5      -  nU$ s  snf )a  Fit optimal choice of epsilon for integral representation.

The integrand of
    int_0^pi P(eps, a, b, x, phi) * dphi
can exhibit oscillatory behaviour. It stems from the cosine of P and can be
minimized by minimizing the arc length of the argument
    f(phi) = eps * sin(phi) - x * eps^(-a) * sin(a * phi) + (1 - b) * phi
of cos(f(phi)).
We minimize the arc length in eps for a grid of values (a, b, x) and fit a
parametric function to it.
c                     [         R                  " SU -  U* 5      nU [         R                  " U5      -  X-  U-  [         R                  " X-  5      -  -
  S-   U-
  $ )zDerivative of f w.r.t. phi.g      ?r   )nppowercos)epsr8   r9   r:   phieps_as         r   fp$optimal_epsilon_integral.<locals>.fp  sO    cA2&RVVC[ 155=266!'?#BBQFJJr"   c                 X   >^ ^^^ [        UUU UU4S jS[        R                  USS9S   $ )zCompute Arc length of f.

Note that the arc length of a function f from t0 to t1 is given by
    int_t0^t1 sqrt(1 + f'(t)^2) dt
c           
      P   > [         R                  " ST" TTTTU 5      S-  -   5      $ )Nr   rF   )r   sqrt)r   r8   r9   r   r   r:   s    r   r   =optimal_epsilon_integral.<locals>.arclength.<locals>.<lambda>  s%    BsAq!S,A1,D(D Er"   r   d   )epsrellimit)r   r   r   )r   r8   r9   r:   r   r   r   s   ````  r   	arclength+optimal_epsilon_integral.<locals>.arclength	  s.     EEruu!../1 	1r"   )
MbP?g?g      ?g?r   rF      r      rc   )r   r   r      
   )r   g      ?rF   r   r      2   r      i  g     @@g     @g     @c                 ,   > T" U TT   TT   TT   5      $ Nr   )r   r   data_adata_bdata_xrC   s    r   r   *optimal_epsilon_integral.<locals>.<lambda>  s    	#vay&)28))=r"   )r   i  Boundedxatolr   )boundsmethodoptions)r8   r9   r:   r   c           
      D   U S   nU S   nU S   n	X-  [         R                  " SU-  5      -  [         R                  " USSU-   -  [         R                  " U	5      -  -   U[         R                  " U* U-  5      -  -
  US[         R                  " Xg-  5      -   -  -   5      -   $ )z#Compute parametric function to fit.r8   r9   r:   g      r   )r   r,   log)
dataA0A1A2A3A4A5r8   r9   r:   s
             r   func&optimal_epsilon_integral.<locals>.func*  s    IIIq))&&a1q5kBFF1I55RVVRC!G_8LLRVVBF^!345 66 	7r"   r   trf)r   r   z7Fit optimal eps for integrand P via minimal arc length
zwith parametric function:
zBoptimal_eps = (A0 * b * exp(-a/2) + exp(A1 + 1 / (1 + a) * log(x)
z=              - A2 * exp(-A3 * a) + A4 / (1 + exp(A5 * a)))

z Fitted parameters A0 to A5 are:
z, z.5g)g{Gz?r   )r   meshgridflattenr-   sizer3   r   r:   arraylistr   join)best_epsdfr   func_paramsr@   r:   r   r   r   r   r   rC   s         @@@@@@r   optimal_epsilon_integralr      sS   K
1 5FFEF[[@FFF$nn.0@$nn. FFFH6;; = =#/#,woG HIq		
   xx!H
B7 y2e9UCAFGKBA	&&A	NNA	JJA	,,A41gJ4	55AH 5s   D0
c                  "   [        5       n [        [        [        S9nUR	                  S[
        / SQSS9  UR                  5       nS S S S	 S.nUR                  UR                  S
 5      " 5         [        S[        5       U -
  S-  S S35        g )N)descriptionformatter_classaction)r   rF   rM   r   zchose what expansion to precompute
1 : Series for small a
2 : Series for small a and small b
3 : Asymptotic series for large x
    This may take some time (>4h).
4 : Fit optimal eps for integral representation.)typechoiceshelpc                  (    [        [        5       5      $ r   )printrD   r   r"   r   r   main.<locals>.<lambda>L  s    ~/0r"   c                  (    [        [        5       5      $ r   )r   ra   r   r"   r   r   r   M  s    578r"   c                  (    [        [        5       5      $ r   )r   r   r   r"   r   r   r   N  s    023r"   c                  (    [        [        5       5      $ r   )r   r   r   r"   r   r   r   O  s    79:r"   c                      [        S5      $ )NzInvalid input.)r   r   r"   r   r   r   Q  s
    E*:$;r"   r'   <   z.1fz minutes elapsed.
)
r   r   rt   r   add_argumentint
parse_argsgetr   r   )t0parserr   switchs       r   mainr   >  s    	B,@BF
sLP   D083:F
 JJt{{;<>	BR$$7
89r"   __main__)#rt   argparser   r   numpyr   scipy.integrater   scipy.optimizer   r   r   r+   r	   r
   r   r   r   r   r   r   r   r   r   sympy.polys.polyfuncsr   ImportErrorrD   rI   rK   ra   r   r   r   rp   r   r"   r   <module>r      s   
 :    5 	B B B B,
DC/
VrVrCL:. zF I
  		s   $A, ,A54A5