Skip to content

Commit 2f6c75a

Browse files
Convert 3F2's num/den to rat+rat
check if doctests are happy
1 parent 57f9add commit 2f6c75a

File tree

2 files changed

+32
-41
lines changed

2 files changed

+32
-41
lines changed

src/generalized.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ julia> pFq((1, 2+im), (3.5, ), exp(im*big(π)/3)) # More digits, you say?
3838
0.6786952632946589823300834090168381068073515492901393549193461972311801512528996 + 0.4523504929285013648194489713901658143893464679689810112119412310631860619947939im
3939
4040
julia> pFq((1, 2+im, 2.5), (3.5, 4), exp(im*π/3)) # ₃F₂ because why not
41-
0.8434434031615686 + 0.3417550761546318im
41+
0.8434434031615687 + 0.3417550761546318im
4242
4343
julia> pFq((1, 2+im, 2.5), (3.5, 4), exp(im*big(π)/3)) # Also in extended precision
44-
0.8434434031615690763389963048175253868863156451003855955719081209861492349267312 + 0.3417550761546319732614495656712509723030350666571102474299311122586948108416013im
44+
0.8434434031615690763389963048175253868863156451003855955719081209861492349268002 + 0.3417550761546319732614495656712509723030350666571102474299311122586948108413206im
4545
4646
julia> pFq((1, 1), (), -1) # A divergent series
4747
0.5963473623231942

src/weniger.jl

+30-39
Original file line numberDiff line numberDiff line change
@@ -331,74 +331,65 @@ function pFqweniger(α::Tuple{T1, T1, T1}, β::Tuple{T2, T2}, z::T3; kmax::Int =
331331
if norm(z) < eps(real(T)) || norm*β*γ) < eps(absα*absβ*absγ)
332332
return one(T)
333333
end
334-
ζ = inv(z)
335-
Nlo = δ*λ*ζ/*β*γ)
336-
Dlo = δ*λ*ζ/*β*γ)
337-
Tlo = Nlo/Dlo
334+
μlo = T*β*γ)/T*λ)
335+
Rlo = one(T)
338336
a0 = T+1)*T+1)*T+1)
339337
b0 = 2*T+1)*T+1)
340-
Nmid2 = (b0*ζ-a0)*Nlo + b0*ζ
341-
Dmid2 = (b0*ζ-a0)*Dlo
342-
Tmid2 = Nmid2/Dmid2
338+
μmid2 = inv(b0-a0*z)
339+
Rmid2 = Rlo + b0*z*μmid2*μlo
343340
if norm(a0) < eps((absα+1)*(absβ+1)*(absγ+1))
344-
return Tmid2
341+
return Rmid2
345342
end
346-
Nmid2 /= a0
347-
Dmid2 /= a0
343+
μmid2 *= a0
348344
k = 1
349345
a0 = T+2)*T+2)*T+2)
350346
a1 = (T(1-β)*γ+β+5)*α+T(5+β)*γ+5*T(β)+13
351347
b0 = 6*T+2)*T+2)
352348
b1 = 6*T+λ+3)
353-
t0 = b0*ζ-3*(T+γ+3)*α+T+3)*γ+3*T(β)+7)
354-
t1 = b1*ζ-a1
355-
Nmid1 = t0*Nmid2 + t1*Nlo + b1*ζ
356-
Dmid1 = t0*Dmid2 + t1*Dlo
357-
Tmid1 = Nmid1/Dmid1
349+
t0 = b0-3*(T+γ+3)*α+T+3)*γ+3*T(β)+7)*z
350+
t1 = b1-a1*z
351+
μmid1 = inv(t0 + t1*z*μmid2)
352+
Rmid1 = (t0*Rmid2 + (t1*Rlo + b1*z*μlo)*z*μmid2)*μmid1
358353
if norm(a0) < eps((absα+2)*(absβ+2)*(absγ+2))
359-
return Tmid1
354+
return Rmid1
360355
end
361-
Nmid1 /= a0
362-
Dmid1 /= a0
356+
μmid1 *= a0
363357
k = 2
364358
a0 = T+3)*T+3)*T+3)
365359
a2 = 5*(T-1)*T-1)*α+T(1-β)*γ+T(β)+23)/3
366360
b0 = 10*T+3)*T+3)
367361
b1 = -10*(T-1)*λ-T+11))
368362
b2 = T(40)
369-
t0 = b0*ζ+5*((T-1)*γ-T+11))*α-T+11)*γ-11*T(β)-49)/3
370-
t1 = b1*ζ+(T(3+β)*γ+T(3*β-11))*α+T(3*β-11)*γ-11*T(β)-93
371-
t2 = b2*ζ-a2
372-
Nhi = t0*Nmid1 + t1*Nmid2 + t2*Nlo + b2*ζ
373-
Dhi = t0*Dmid1 + t1*Dmid2 + t2*Dlo
374-
Thi = Nhi/Dhi
363+
t0 = b0+5*((T-1)*γ-T+11))*α-T+11)*γ-11*T(β)-49)/3*z
364+
t1 = b1+((T(3+β)*γ+T(3*β-11))*α+T(3*β-11)*γ-11*T(β)-93)*z
365+
t2 = b2-a2*z
366+
μhi = inv(t0 + (t1 + t2*z*μmid2)*z*μmid1)
367+
Rhi = (t0*Rmid1 + (t1*Rmid2 + (t2*Rlo + b2*z*μlo)*z*μmid2)*z*μmid1)*μhi
375368
if norm(a0) < eps((absα+3)*(absβ+3)*(absγ+3))
376-
return Thi
369+
return Rhi
377370
end
378-
Nhi /= a0
379-
Dhi /= a0
371+
μhi *= a0
380372
k = 3
381-
while k < 6 || (k < kmax && errcheck(Tmid1, Thi, 8eps(real(T))))
373+
z2 = z*z
374+
while k < 6 || (k < kmax && errcheck(Rmid1, Rhi, 8eps(real(T))))
382375
a0 = T+k+1)*T+k+1)*T+k+1)
383-
a3 = T(k-α-2)*T(k-β-2)*T(k-γ-2)*k*T(2k+1)/T((k-1)*(2k-3))
376+
a3 = T(k-α-2)*T(k-β-2)*T(k-γ-2)*k*T(2k+1)/T((k-1)*(2k-3))*z2
384377
b0 = T(4k+2)*T+k+1)*T+k+1)
385378
b1 = (T(k*(k-1))-T+1)*T+1))*T(2k-1)*T(4k+2)/T(k-1)
386379
b2 = T(k-δ-2)*T(k-λ-2)*T(4k+2)*k/T(k-1)
387-
t0 = b0*ζ-((T(2k+α+β+γ)*k-T+β+γ+2))*k-T+1)*T+1)*T+1))*T(2k+1)/T(k-1)
388-
t1 = b1*ζ-(((T(6k-12)*k+(T(-2β-2γ-3)*α+T(-2β-3)*γ-3β-2))*k+(T(2β+2γ+3)*α+T(2β+3)*γ+3β+8))*k+3*T+1)*T+1)*T+1))*T(2k-1)/T((k-1)*(2k-3))
389-
t2 = b2*ζ-((T(2k-α-β-γ-6)*k+T+β+γ+4))*k+T+1)*T+1)*T+1))*T(2k+1)/T(k-1)
390-
Nhi, Nmid1, Nmid2, Nlo = t0*Nhi + t1*Nmid1 + t2*Nmid2 - a3*Nlo, Nhi, Nmid1, Nmid2
391-
Dhi, Dmid1, Dmid2, Dlo = t0*Dhi + t1*Dmid1 + t2*Dmid2 - a3*Dlo, Dhi, Dmid1, Dmid2
392-
Thi, Tmid1, Tmid2, Tlo = Nhi/Dhi, Thi, Tmid1, Tmid2
380+
t0 = b0-((T(2k+α+β+γ)*k-T+β+γ+2))*k-T+1)*T+1)*T+1))*T(2k+1)/T(k-1)*z
381+
t1 = b1-(((T(6k-12)*k+(T(-2β-2γ-3)*α+T(-2β-3)*γ-3β-2))*k+(T(2β+2γ+3)*α+T(2β+3)*γ+3β+8))*k+3*T+1)*T+1)*T+1))*T(2k-1)/T((k-1)*(2k-3))*z
382+
t2 = b2-((T(2k-α-β-γ-6)*k+T+β+γ+4))*k+T+1)*T+1)*T+1))*T(2k+1)/T(k-1)*z
383+
μhi, μmid1, μmid2, μlo = inv(t0 + (t1 + (t2 - a3*μmid2)*z*μmid1)*z*μhi), μhi, μmid1, μmid2
384+
Rhi, Rmid1, Rmid2, Rlo = (t0*Rhi + (t1*Rmid1 + (t2*Rmid2 - a3*Rlo*μlo)*z*μmid2)*z*μmid1)*μhi, Rhi, Rmid1, Rmid2
393385
if norm(a0) < eps((absα+k+1)*(absβ+k+1)*(absγ+k+1))
394-
return Thi
386+
return Rhi
395387
end
396-
Nhi /= a0
397-
Dhi /= a0
388+
μhi *= a0
398389
k += 1
399390
end
400391
k < kmax || @warn "Rational approximation to "*pFq2string(Val{3}(), Val{2}())*" reached the maximum type of ("*string(kmax, ", ", kmax)*")."
401-
return isfinite(Thi) ? Thi : isfinite(Tmid1) ? Tmid1 : isfinite(Tmid2) ? Tmid2 : Tlo
392+
return isfinite(Rhi) ? Rhi : isfinite(Rmid1) ? Rmid1 : isfinite(Rmid2) ? Rmid2 : Rlo
402393
end
403394

404395
# ₘFₙ(α;β;z)

0 commit comments

Comments
 (0)