Skip to content

Commit cda397d

Browse files
committed
Fix Hurwitz zeta function when calculated using a Bernoulli polynomial and a is nonpositive integer, fixes #50
1 parent a0036a1 commit cda397d

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

apfloat/src/main/java/org/apfloat/HurwitzZetaHelper.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ public static Apcomplex zeta(Apcomplex s, Apcomplex a)
6060
precision = ApfloatHelper.extendPrecision(targetPrecision);
6161
s = ApfloatHelper.ensurePrecision(s, precision);
6262
a = ApfloatHelper.ensurePrecision(a, precision);
63+
if (isNonPositiveInteger(s))
64+
{
65+
// Handle cases where the result might be genuinely zero
66+
long n1 = ApfloatHelper.longValueExact(one.subtract(s.real().truncate()));
67+
return bernoulliB(n1, a).divide(new Apfloat(n1, targetPrecision, radix)).negate();
68+
}
6369
if (isNonPositiveInteger(a))
6470
{
6571
if (s.real().signum() < 0 || s.isZero())
@@ -86,12 +92,6 @@ public static Apcomplex zeta(Apcomplex s, Apcomplex a)
8692

8793
throw new ArithmeticException("Zeta of second argument nonpositive integer");
8894
}
89-
if (isNonPositiveInteger(s))
90-
{
91-
// Handle cases where the result might be genuinely zero
92-
long n1 = ApfloatHelper.longValueExact(one.subtract(s.real().truncate()));
93-
return bernoulliB(n1, a).divide(new Apint(n1, radix)).negate();
94-
}
9595
if (precision == Apfloat.INFINITE)
9696
{
9797
throw new InfiniteExpansionException("Cannot calculate zeta function to infinite precision");
@@ -273,8 +273,13 @@ private static Apfloat expPrecision(Apfloat x)
273273
// z assumed to be of extended precision already
274274
private static Apcomplex bernoulliB(long n, Apcomplex z)
275275
{
276+
assert (n > 0);
276277
long precision = z.precision();
277278
int radix = z.radix();
279+
if (z.isZero())
280+
{
281+
return AprationalMath.bernoulli(n, radix);
282+
}
278283
Apcomplex sum = Apcomplex.ZEROS[radix],
279284
numerator = new Apfloat(1, precision, radix),
280285
denominator = numerator;

apfloat/src/test/java/org/apfloat/ApcomplexMathTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3297,6 +3297,14 @@ public static void testZetaHurwitz()
32973297
assertEquals("-1+2i,-3 precision", 6, a.precision());
32983298
assertEquals("-1+2i,-3 value", new Apcomplex("(210.002,2354.18)"), a, new Apfloat("5e-2"));
32993299

3300+
a = ApcomplexMath.zeta(new Apcomplex("0"), new Apcomplex("-1.00000"));
3301+
assertEquals("0,-1 precision", 6, a.precision());
3302+
assertEquals("0,-1 value", new Apcomplex("(1.50000)"), a, new Apfloat("5e-5"));
3303+
3304+
a = ApcomplexMath.zeta(new Apcomplex("0"), new Apcomplex("-2.00000"));
3305+
assertEquals("0,-2 precision", 6, a.precision());
3306+
assertEquals("0,-2 value", new Apcomplex("(2.50000)"), a, new Apfloat("5e-5"));
3307+
33003308
a = ApcomplexMath.zeta(new Apcomplex("(2,3)"), new Apcomplex("(4,5)"));
33013309
assertEquals("2+3i,4+5i precision", 1, a.precision());
33023310
assertEquals("2+3i,4+5i value", new Apcomplex("(0.2,-0.9)"), a, new Apfloat("5e-1"));
@@ -5939,6 +5947,10 @@ public static void testBernoulliB()
59395947
assertEquals("4, -3 precision", 6, a.precision());
59405948
assertEquals("4, -3 value", new Apcomplex("143.967"), a, new Apfloat("5e-3"));
59415949

5950+
a = ApcomplexMath.bernoulliB(1, new Apcomplex("-2.00000"));
5951+
assertEquals("1, -2 precision", 6, a.precision());
5952+
assertEquals("1, -2 value", new Apcomplex("-2.50000"), a, new Apfloat("5e-5"));
5953+
59425954
a = ApcomplexMath.bernoulliB(3, new Apcomplex(new Apfloat("0.1", 18, 2), new Apfloat("0.11", 18, 2)));
59435955
assertEquals("3, 0.5 + 0.75i precision", 18, a.precision());
59445956
assertEquals("3, 0.5 + 0.75i radix", 2, a.radix());

apfloat/src/test/java/org/apfloat/ApfloatMathTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3125,7 +3125,7 @@ public static void testZetaHurwitz()
31253125
assertEquals("-3,-3 value", new Apfloat("-35.9917"), a, new Apfloat("5e-4"));
31263126

31273127
a = ApfloatMath.zeta(new Apfloat("-3.00000"), new Apfloat("-1.00000"));
3128-
assertEquals("-3,-1 precision", 5, a.precision());
3128+
assertEquals("-3,-1 precision", 6, a.precision());
31293129
assertEquals("-3,-1 value", new Apfloat("-0.991667"), a, new Apfloat("5e-6"));
31303130

31313131
a = ApfloatMath.zeta(new Apfloat("-3.00000"), new Apfloat("0"));

0 commit comments

Comments
 (0)