Computing expressions from a number theory paper in MATLAB
4 views (last 30 days)
Show older comments
I’m reading the paper Explicit estimates for the Riemann zeta function close to the 1-line (arXiv:2312.09412), and on page 6, the authors define the following expressions:



I would like to compute these quantities in MATLAB for given values of
and k. For example, if
and k = 1.5, the approximate expected outputs (based on the paper) are:
,
,
,
.
% Inputs
t0 = 3;
k = 1.5;
w1=vpa(8/exp(1));
% Compute w2
if w1 < 1
w2 = (1 - 1/exp(1) + log(sym(w1)) / log(log(t0))) / (sym(w1) * log(2));
else
w2 = (1 - 1/exp(1)) / (sym(w1 )* log(2));
end
% Compute zeta(s)
s = 1 +k;
zeta_val = zeta(s);
% Compute B
B = 1 + 8 / (3 *sym( w1));
% Compute A_k
Ak = 1.546 * zeta_val * (1 + (2 + k)/t0)^(1/6) ...
* (1 + (2 + k) / (t0 * log(t0))) ...
* (1 + 2 * sqrt(1 + k) / t0);
% Display results
fprintf('For t0 = %.2f and k = %d:\n', t0, k);
fprintf('w1 = %.8f\n', w1);
fprintf('w2 = %.8f\n', w2);
fprintf('zeta(s) = %.8f at s = %.8f\n', zeta_val, s);
fprintf('B = %.8f\n', B);
fprintf('A_k = %.8f\n', Ak);
My questions :
Is this implementation correct and numerically stable?
2 Comments
Walter Roberson
on 6 Apr 2025
Theoretically more robust is the following implementation.
... It doesn't make any difference to the number of decimal places you display.
% Inputs
t0 = sym(3);
k = sym(1.5);
e = exp(sym(1));
w1 = (8/e);
log2 = log(sym(2));
% Compute w2
if w1 < 1
w2 = (1 - 1/e + log(w1) / log(log(t0))) / (w1 * log2);
else
w2 = (1 - 1/e) / (w1 * log2);
end
% Compute zeta(s)
s = 1 + k;
zeta_val = zeta(s);
% Compute B
B = 1 + 8 / (3 * w1);
% Compute A_k
Ak = sym(1546)/sym(10)^3 * zeta_val * (1 + (2 + k)/t0)^(1/sym(6)) ...
* (1 + (2 + k) / (t0 * log(t0))) ...
* (1 + 2 * sqrt(1 + k) / t0);
% Display results
fprintf('For t0 = %.2f and k = %d:\n', t0, k);
fprintf('w1 = %.8f\n', w1);
fprintf('w2 = %.8f\n', w2);
fprintf('zeta(s) = %.8f at s = %.8f\n', zeta_val, s);
fprintf('B = %.8f\n', B);
fprintf('A_k = %.8f\n', Ak);
John D'Errico
on 6 Apr 2025
Edited: John D'Errico
on 7 Apr 2025
Note that doing things like this:
w1=vpa(8/exp(1))
is BAD. Why? Because MATLAB computes exp(1) as a DOUBLE. VPA cannot be expected to know that 8/exp(1) ia what you think it is. The issue then is exp(1) LOOKS like the number e. But it is only an approximation, and when you need those extra digits, the extra digits you end up getting are complete garbage.
If instead you do this:
w1 = 8/exp(sym(1))
now w1 is a parameter where you know the true value, not a 16 decimal digit approximation to w1. Do you see the difference?
vpa(w1)
Similarly, you did this:
w2 = (1 - 1/exp(1) + log(sym(w1)) / log(log(t0))) / (sym(w1) * log(2));
do you see that 1/exp(1) is a DOUBLE precision number? Again, you should not assume that MATLAB will see into your mind, and know to make that 1/exp(sym(1))
Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!