Skip to content

Commit 18710e9

Browse files
new Gaunt method for 32-bit word sizes
1 parent 09b613a commit 18710e9

File tree

2 files changed

+34
-34
lines changed

2 files changed

+34
-34
lines changed

src/gaunt.jl

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ This is a Julia implementation of the stable recurrence described in:
1414
1515
Y.-l. Xu, Fast evaluation of Gaunt coefficients: recursive approach, *J. Comp. Appl. Math.*, **85**:53–65, 1997.
1616
"""
17-
function gaunt{T}(::Type{T},m::Int,n::Int::Int::Int;normalized::Bool=false)
17+
function gaunt{T}(::Type{T},m::Integer,n::Integer::Integer::Integer;normalized::Bool=false)
1818
if normalized
1919
normalizedgaunt(T,m,n,μ,ν)
2020
else
@@ -24,15 +24,17 @@ end
2424
doc"""
2525
Calculates the Gaunt coefficients in 64-bit floating-point arithmetic.
2626
"""
27-
gaunt(m::Int,n::Int::Int::Int;kwds...) = gaunt(Float64,m,n,μ,ν;kwds...)
27+
gaunt(m::Integer,n::Integer::Integer::Integer;kwds...) = gaunt(Float64,m,n,μ,ν;kwds...)
2828

29-
function normalization{T}(::Type{T},m::Int,n::Int::Int::Int)
29+
gaunt{T}(::Type{T},m::Int32,n::Int32::Int32::Int32;normalized::Bool=false) = gaunt(T,Int64(m),Int64(n),Int64(μ),Int64(ν);normalized=normalized)
30+
31+
function normalization{T}(::Type{T},m::Integer,n::Integer::Integer::Integer)
3032
pochhammer(n+one(T),n)*pochhammer+one(T),ν)/pochhammer(n+ν+one(T),n+ν)*gamma(n+ν-m-μ+one(T))/gamma(n-m+one(T))/gamma-μ+one(T))
3133
end
3234

33-
normalization(::Type{Float64},m::Int,n::Int::Int::Int) = normalization1(Float64,n,ν)*normalization2(Float64,n-m,ν-μ)
35+
normalization(::Type{Float64},m::Integer,n::Integer::Integer::Integer) = normalization1(Float64,n,ν)*normalization2(Float64,n-m,ν-μ)
3436

35-
function normalization1(::Type{Float64},n::Int::Int)
37+
function normalization1(::Type{Float64},n::Integer::Integer)
3638
if n 8
3739
if ν 8
3840
return exp((n+0.5)*log1p(n/(n+1))++0.5)*log1p/+1))+(n+ν+0.5)*log1p(-(n+ν)/(2n+2ν+1))+n*log1p(-2ν/(2n+2ν+1))+ν*log1p(-2n/(2n+2ν+1)))*stirlingseries(2n+1.0)*stirlingseries(2ν+1.0)*stirlingseries(n+ν+1.0)/stirlingseries(n+1.0)/stirlingseries+1.0)/stirlingseries(2n+2ν+1.0)
@@ -46,7 +48,7 @@ function normalization1(::Type{Float64},n::Int,ν::Int)
4648
end
4749
end
4850

49-
function normalization2(::Type{Float64},nm::Int,νμ::Int)
51+
function normalization2(::Type{Float64},nm::Integer,νμ::Integer)
5052
if nm 8
5153
if νμ 8
5254
return edivsqrt2pi*exp((nm+0.5)*log1p(νμ/(nm+1))+(νμ+0.5)*log1p(nm/(νμ+1)))/sqrt(nm+νμ+1.0)*stirlingseries(nm+νμ+1.0)/stirlingseries(nm+1.0)/stirlingseries(νμ+1.0)
@@ -60,7 +62,7 @@ function normalization2(::Type{Float64},nm::Int,νμ::Int)
6062
end
6163
end
6264

63-
function normalizedgaunt{T}(::Type{T},m::Int,n::Int::Int::Int)
65+
function normalizedgaunt{T}(::Type{T},m::Integer,n::Integer::Integer::Integer)
6466
qmax = min(n,ν,(n+ν-abs(m+μ))÷2)
6567
a = Vector{T}(qmax+1)
6668
a[1] = one(T)
@@ -106,15 +108,15 @@ function normalizedgaunt{T}(::Type{T},m::Int,n::Int,μ::Int,ν::Int)
106108
a
107109
end
108110

109-
function secondinitialcondition{T}(::Type{T},m::Int,n::Int::Int::Int)
111+
function secondinitialcondition{T}(::Type{T},m::Integer,n::Integer::Integer::Integer)
110112
n₄ = n+ν-m-μ
111113
mn = m-n
112114
μν = μ-ν
113115
temp = 2n+2ν-one(T)
114116
return (temp-2)/2*(1-temp/n₄/(n₄-1)*(mn*(mn+one(T))/(2n-1)+μν*(μν+one(T))/(2ν-1)))
115117
end
116118

117-
function thirdinitialcondition{T}(::Type{T},m::Int,n::Int::Int::Int)
119+
function thirdinitialcondition{T}(::Type{T},m::Integer,n::Integer::Integer::Integer)
118120
n₄ = n+ν-m-μ
119121
mn = m-n
120122
μν = μ-ν
@@ -124,14 +126,14 @@ function thirdinitialcondition{T}(::Type{T},m::Int,n::Int,μ::Int,ν::Int)
124126
return temp*(temp-6)/4*( (temp-2)/n₄/(n₄-1)*temp2 + one(T)/2 )
125127
end
126128

127-
α{T}(::Type{T},n::Int::Int,p::Int) = (p^2-(n+ν+1)^2)*(p^2-(n-ν)^2)/(4p^2-one(T))
128-
A{T}(::Type{T},m::Int,n::Int::Int::Int,p::Int) = p*(p-one(T))*(m-μ)-(m+μ)*(n-ν)*(n+ν+one(T))
129+
α{T}(::Type{T},n::Integer::Integer,p::Integer) = (p^2-(n+ν+1)^2)*(p^2-(n-ν)^2)/(4p^2-one(T))
130+
A{T}(::Type{T},m::Integer,n::Integer::Integer::Integer,p::Integer) = p*(p-one(T))*(m-μ)-(m+μ)*(n-ν)*(n+ν+one(T))
129131

130-
c₀{T}(::Type{T},m::Int,n::Int::Int::Int,p::Int,p₁::Int) = (p+2)*(p+3)*(p₁+1)*(p₁+2)*A(T,m,n,μ,ν,p+4)*α(T,n,ν,p+1)
131-
c₁{T}(::Type{T},m::Int,n::Int::Int::Int,p::Int,p₁::Int,p₂::Int) = A(T,m,n,μ,ν,p+2)*A(T,m,n,μ,ν,p+3)*A(T,m,n,μ,ν,p+4) + (p+1)*(p+3)*(p₁+2)*(p₂+2)*A(T,m,n,μ,ν,p+4)*α(T,n,ν,p+2) + (p+2)*(p+4)*(p₁+3)*(p₂+3)*A(T,m,n,μ,ν,p+2)*α(T,n,ν,p+3)
132-
c₂{T}(::Type{T},m::Int,n::Int::Int::Int,p::Int,p₂::Int) = -(p+2)*(p+3)*(p₂+3)*(p₂+4)*A(T,m,n,μ,ν,p+2)*α(T,n,ν,p+4)
132+
c₀{T}(::Type{T},m::Integer,n::Integer::Integer::Integer,p::Integer,p₁::Integer) = (p+2)*(p+3)*(p₁+1)*(p₁+2)*A(T,m,n,μ,ν,p+4)*α(T,n,ν,p+1)
133+
c₁{T}(::Type{T},m::Integer,n::Integer::Integer::Integer,p::Integer,p₁::Integer,p₂::Integer) = A(T,m,n,μ,ν,p+2)*A(T,m,n,μ,ν,p+3)*A(T,m,n,μ,ν,p+4) + (p+1)*(p+3)*(p₁+2)*(p₂+2)*A(T,m,n,μ,ν,p+4)*α(T,n,ν,p+2) + (p+2)*(p+4)*(p₁+3)*(p₂+3)*A(T,m,n,μ,ν,p+2)*α(T,n,ν,p+3)
134+
c₂{T}(::Type{T},m::Integer,n::Integer::Integer::Integer,p::Integer,p₂::Integer) = -(p+2)*(p+3)*(p₂+3)*(p₂+4)*A(T,m,n,μ,ν,p+2)*α(T,n,ν,p+4)
133135

134-
d₀{T}(::Type{T},m::Int,n::Int::Int::Int,p::Int,p₁::Int) = (p+2)*(p+3)*(p+5)*(p₁+2)*(p₁+4)*A(T,m,n,μ,ν,p+6)*α(T,n,ν,p+1)
135-
d₁{T}(::Type{T},m::Int,n::Int::Int::Int,p::Int,p₁::Int,p₂::Int) = (p+5)*(p₁+4)*A(T,m,n,μ,ν,p+6)*( A(T,m,n,μ,ν,p+2)*A(T,m,n,μ,ν,p+3) + (p+1)*(p+3)*(p₁+2)*(p₂+2)*α(T,n,ν,p+2) )
136-
d₂{T}(::Type{T},m::Int,n::Int::Int::Int,p::Int,p₁::Int,p₂::Int) = (p+2)*(p₂+3)*A(T,m,n,μ,ν,p+2)*( A(T,m,n,μ,ν,p+5)*A(T,m,n,μ,ν,p+6) + (p+4)*(p+6)*(p₁+5)*(p₂+5)*α(T,n,ν,p+5) )
137-
d₃{T}(::Type{T},m::Int,n::Int::Int::Int,p::Int,p₂::Int) = -(p+2)*(p+4)*(p+5)*(p₂+3)*(p₂+5)*(p₂+6)*A(T,m,n,μ,ν,p+2)*α(T,n,ν,p+6)
136+
d₀{T}(::Type{T},m::Integer,n::Integer::Integer::Integer,p::Integer,p₁::Integer) = (p+2)*(p+3)*(p+5)*(p₁+2)*(p₁+4)*A(T,m,n,μ,ν,p+6)*α(T,n,ν,p+1)
137+
d₁{T}(::Type{T},m::Integer,n::Integer::Integer::Integer,p::Integer,p₁::Integer,p₂::Integer) = (p+5)*(p₁+4)*A(T,m,n,μ,ν,p+6)*( A(T,m,n,μ,ν,p+2)*A(T,m,n,μ,ν,p+3) + (p+1)*(p+3)*(p₁+2)*(p₂+2)*α(T,n,ν,p+2) )
138+
d₂{T}(::Type{T},m::Integer,n::Integer::Integer::Integer,p::Integer,p₁::Integer,p₂::Integer) = (p+2)*(p₂+3)*A(T,m,n,μ,ν,p+2)*( A(T,m,n,μ,ν,p+5)*A(T,m,n,μ,ν,p+6) + (p+4)*(p+6)*(p₁+5)*(p₂+5)*α(T,n,ν,p+5) )
139+
d₃{T}(::Type{T},m::Integer,n::Integer::Integer::Integer,p::Integer,p₂::Integer) = -(p+2)*(p+4)*(p+5)*(p₂+3)*(p₂+5)*(p₂+6)*A(T,m,n,μ,ν,p+2)*α(T,n,ν,p+6)

test/gaunttests.jl

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,19 @@ using FastTransforms, Base.Test
33
import FastTransforms: δ
44

55
@testset "Gaunt coefficients" begin
6-
if Sys.WORD_SIZE == 64
7-
println("Testing Table 2 of Y.-l. Xu, JCAM 85:53–65, 1997.")
8-
for (m,n) in ((0,2),(1,2),(1,8),(6,8),(3,18),
9-
(10,18),(5,25),(-23,25),(2,40),(-35,40),
10-
(28,62),(-42,62),(1,99),(90,99),(10,120),
11-
(80,120),(23,150),(88,150))
12-
@test norm(gaunt(m,n,-m,n)[end]./(big(-1.0)^m/(2n+1))-1, Inf) < 400eps()
13-
end
14-
println("Testing Table 3 of Y.-l. Xu, JCAM 85:53–65, 1997.")
15-
for (m,n,μ,ν) in ((0,1,0,5),(0,5,0,10),(0,9,0,10),(0,10,0,12),
16-
(0,11,0,15),(0,12,0,20),(0,20,0,45),(0,40,0,80),
17-
(0,45,0,100),(3,5,-3,6),(4,9,-4,15),(-8,18,8,23),
18-
(-10,20,10,30),(5,25,-5,45),(15,50,-15,60),(-28,68,28,75),
19-
(32,78,-32,88),(45,82,-45,100))
20-
@test norm(sum(gaunt(m,n,μ,ν))-δ(m,0), Inf) < 15000eps()
21-
end
6+
println("Testing Table 2 of Y.-l. Xu, JCAM 85:53–65, 1997.")
7+
for (m,n) in ((0,2),(1,2),(1,8),(6,8),(3,18),
8+
(10,18),(5,25),(-23,25),(2,40),(-35,40),
9+
(28,62),(-42,62),(1,99),(90,99),(10,120),
10+
(80,120),(23,150),(88,150))
11+
@test norm(gaunt(m,n,-m,n)[end]./(big(-1.0)^m/(2n+1))-1, Inf) < 400eps()
12+
end
13+
println("Testing Table 3 of Y.-l. Xu, JCAM 85:53–65, 1997.")
14+
for (m,n,μ,ν) in ((0,1,0,5),(0,5,0,10),(0,9,0,10),(0,10,0,12),
15+
(0,11,0,15),(0,12,0,20),(0,20,0,45),(0,40,0,80),
16+
(0,45,0,100),(3,5,-3,6),(4,9,-4,15),(-8,18,8,23),
17+
(-10,20,10,30),(5,25,-5,45),(15,50,-15,60),(-28,68,28,75),
18+
(32,78,-32,88),(45,82,-45,100))
19+
@test norm(sum(gaunt(m,n,μ,ν))-δ(m,0), Inf) < 15000eps()
2220
end
2321
end

0 commit comments

Comments
 (0)