Skip to content

Commit 989ec59

Browse files
committed
add odd function
1 parent d7a20cd commit 989ec59

File tree

2 files changed

+99
-42
lines changed

2 files changed

+99
-42
lines changed

src/U_polynomials.jl

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
function Uk_poly_Jn(p, v, p2, x::T) where T <: Float64
22
if v > 5.0 + 1.00033*x + (1427.61*x)^(1/3)
3-
return Uk_poly11(p, v, p2)[1]
3+
return Uk_poly10(p, v, p2, even_odd_poly_minus)
44
else
5-
return Uk_poly21(p, v, p2)[1]
5+
return Uk_poly20(p, v, p2, even_odd_poly_minus)
66
end
77
end
88

9-
Uk_poly_In(p, v, p2, ::Type{Float32}) = Uk_poly3(p, v, p2)[1]
10-
Uk_poly_In(p, v, p2, ::Type{Float64}) = Uk_poly5(p, v, p2)[1]
11-
Uk_poly_Kn(p, v, p2, ::Type{Float32}) = Uk_poly3(p, v, p2)[2]
12-
Uk_poly_Kn(p, v, p2, ::Type{Float64}) = Uk_poly5(p, v, p2)[2]
9+
Uk_poly_In(p, v, p2, ::Type{Float32}) = Uk_poly3(p, v, p2, even_odd_poly_minus)
10+
Uk_poly_In(p, v, p2, ::Type{Float64}) = Uk_poly5(p, v, p2, even_odd_poly_minus)
11+
Uk_poly_Kn(p, v, p2, ::Type{Float32}) = Uk_poly3(p, v, p2, even_odd_poly_add)
12+
Uk_poly_Kn(p, v, p2, ::Type{Float64}) = Uk_poly5(p, v, p2, even_odd_poly_add)
1313

14-
@inline function split_evalpoly(x, P)
14+
@inline function even_odd_poly_add(x, P)
1515
# polynomial P must have an even number of terms
1616
N = length(P)
1717
xx = x*x
@@ -23,21 +23,44 @@ Uk_poly_Kn(p, v, p2, ::Type{Float64}) = Uk_poly5(p, v, p2)[2]
2323
out = muladd(xx, out, P[i])
2424
out2 = muladd(xx, out2, P[i-1])
2525
end
26+
if iszero(rem(N, 2))
27+
return muladd(out, x, out2)
28+
else
29+
out = muladd(xx, out, P[1])
30+
return muladd(x, out2, out)
31+
end
32+
end
33+
@inline function even_odd_poly_minus(x, P)
34+
# polynomial P must have an even number of terms
35+
N = length(P)
36+
xx = x*x
2637

27-
out = x*out
28-
return out2 - out, out2 + out
38+
out = P[end]
39+
out2 = P[end-1]
40+
41+
for i in N-2:-2:2
42+
out = muladd(xx, out, P[i])
43+
out2 = muladd(xx, out2, P[i-1])
44+
end
45+
if iszero(rem(N, 2))
46+
return muladd(-out, x, out2)
47+
else
48+
out = muladd(xx, out, P[1])
49+
return muladd(x, -out2, out)
50+
end
2951
end
30-
function Uk_poly3(p, v, p2)
52+
53+
function Uk_poly3(p, v, p2, even_odd_poly)
3154
u0 = 1.0
3255
u1 = evalpoly(p2, (0.125, -0.20833333333333334))
3356
u2 = evalpoly(p2, (0.0703125, -0.4010416666666667, 0.3342013888888889))
3457
u3 = evalpoly(p2, (0.0732421875, -0.8912109375, 1.8464626736111112, -1.0258125964506173))
3558

3659
Poly = (u0, u1, u2, u3)
3760

38-
return split_evalpoly(-p/v, Poly)
61+
return even_odd_poly(-p/v, Poly)
3962
end
40-
function Uk_poly5(p, v, p2)
63+
function Uk_poly5(p, v, p2, even_odd_poly)
4164
u0 = 1.0
4265
u1 = evalpoly(p2, (0.125, -0.20833333333333334))
4366
u2 = evalpoly(p2, (0.0703125, -0.4010416666666667, 0.3342013888888889))
@@ -46,10 +69,10 @@ function Uk_poly5(p, v, p2)
4669
u5 = evalpoly(p2, (0.22710800170898438, -7.368794359479632, 42.53499874538846, -91.81824154324002, 84.63621767460073, -28.212072558200244))
4770

4871
Poly = (u0, u1, u2, u3, u4, u5)
49-
return split_evalpoly(-p/v, Poly)
72+
return even_odd_poly(-p/v, Poly)
5073
end
5174

52-
function Uk_poly11(p, v, p2)
75+
function Uk_poly10(p, v, p2, even_odd_poly)
5376
u0 = 1.0
5477
u1 = evalpoly(p2, (0.125, -0.20833333333333334))
5578
u2 = evalpoly(p2, (0.0703125, -0.4010416666666667, 0.3342013888888889))
@@ -64,11 +87,10 @@ function Uk_poly11(p, v, p2)
6487
u11 = evalpoly(p2, (551.3358961220206, -84005.4336030241, 2.2437681779224495e6, -2.4474062725738727e7, 1.420629077975331e8, -4.9588978427503026e8, 1.1068428168230145e9, -1.6210805521083372e9, 1.5535968995705802e9, -9.394623596815784e8, 3.2557307418576574e8, -4.932925366450996e7))
6588

6689
Poly = (u0, u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11)
67-
68-
return split_evalpoly(-p/v, Poly)
90+
return even_odd_poly(-p/v, Poly)
6991
end
7092

71-
function Uk_poly21(p, v, p2)
93+
function Uk_poly20(p, v, p2, even_odd_poly)
7294
u0 = 1.0
7395
u1 = evalpoly(p2, (0.125, -0.20833333333333334))
7496
u2 = evalpoly(p2, (0.0703125, -0.4010416666666667, 0.3342013888888889))
@@ -91,10 +113,9 @@ function Uk_poly21(p, v, p2)
91113
u19 = evalpoly(p2, (3.8362551802304335e9, -1.7277040123529995e12, 1.3412416915180639e14, -4.2619355104268985e15, 7.351663610930971e16, -7.921651119323832e17, 5.789887667664653e18, -3.025566598990372e19, 1.1707490535797259e20, -3.434621399768417e20, 7.756704953461136e20, -1.360203777284994e21, 1.8571089321463453e21, -1.9677247077053125e21, 1.6016898573693598e21, -9.824438427689858e20, 4.392792200888712e20, -1.351217503435996e20, 2.5563802960529236e19, -2.242438856186775e18))
92114
u20 = evalpoly(p2, (3.646840080706556e10, -1.818726203851104e13, 1.5613123930484672e15, -5.48403360388329e16, 1.0461721131134344e18, -1.2483700995047234e19, 1.0126774169536592e20, -5.8917941350694964e20, 2.548961114664972e21, -8.405915817108351e21, 2.1487414815055883e22, -4.302534303482379e22, 6.783661642951883e22, -8.423222750084323e22, 8.19433100543513e22, -6.173206302884415e22, 3.528435843903409e22, -1.4787743528433614e22, 4.285296082829494e21, -7.671943936729004e20, 6.393286613940837e19))
93115
u21 = evalpoly(p2, (3.6490108188498334e11, -2.0052440123627112e14, 1.894406984252143e16, -7.319501491566134e17, 1.5365025218443373e19, -2.0197335419300872e20, 1.8081594057131945e21, -1.1640246461465369e22, 5.591591380366263e22, -2.0566149136271542e23, 5.8965434619782445e23, -1.3337178907798302e24, 2.3967237744351682e24, -3.430872898515746e24, 3.905264103536985e24, -3.511096528332644e24, 2.461506085403875e24, -1.3170969618092387e24, 5.194289094766812e23, -1.4228394823321413e23, 2.417461500896379e22, -1.91862023880665e21))
94-
95-
Poly = (u0, u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17, u18, u19, u20, u21)
96116

97-
return split_evalpoly(-p/v, Poly)
117+
Poly = (u0, u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17, u18, u19, u20, u21)
118+
return even_odd_poly(-p/v, Poly)
98119
end
99120

100121
function Uk_poly_Jn(p, v, p2, x::T) where T <: BigFloat

0 commit comments

Comments
 (0)