4

Anyone can help me please? I need to calculate the sum 1+1/2+1/3+...1/n (n given) by using only Latex commands. I have no idea how can I do this. Many thanks.

3
  • Are you willing and able to use LuaLaTeX? – Mico Oct 19 '20 at 13:44
  • 1
    Do you mean write the equation or calculate the value of the sum? – Herb Schulz Oct 19 '20 at 13:51
  • Calculate the value of sum. – Angelo Aliano Filho Oct 19 '20 at 14:33
4

For best precision, I suggest performing this computation using l3fp rather than pgfmath. I propose two functions, \mySetToSum and \mySetToSumAlt. Both accept the same arguments and compute the sum using l3fp. The difference is in how they write the rounded result to their first argument:

  • \mySetToSum rounds the computed sum according to the number of decimal places given in its third argument, then discards trailing zeros, if any;

  • \mySetToSumAlt does the same but keeps trailing zeros.

\documentclass{article}
\usepackage{amsmath}            % only for the sample text with \dotsb
\usepackage{xparse}             % not necessary with recent LaTeX (Oct. 2020)
\usepackage{xfp}                % only for \fpeval (demo code)
\usepackage{pgfmath}            % for printing the result with a fixed number
                                % of decimal places (used in \mySetToSumAlt)
\ExplSyntaxOn

\cs_new_protected:Npn \angelo_set_to_sum:Nn #1#2
  {
    \fp_zero_new:N #1
    \int_step_inline:nn {#2} { \fp_add:Nn #1 { 1/##1 } }
  }

\fp_new:N \l__angelo_result_fp

% Document-level interface
% #1: control sequence that will receive the result
% #2: value of n
% #3: round the result to this number of decimal places
\NewDocumentCommand \mySetToSum { m m m }
  {
    % Compute the sum with l3fp; put the result in \l__angelo_result_fp.
    \angelo_set_to_sum:Nn \l__angelo_result_fp {#2}
    % Set #1 to the result after rounding.
    \tl_set:Nx #1 { \fp_eval:n { round(\l__angelo_result_fp, #3) } }
  }

% Same macro, but uses \pgfmathprintnumberto in order to always write the
% specified number of decimal places, even if this means printing trailing
% zeros.
\NewDocumentCommand \mySetToSumAlt { m m m }
  {
    \angelo_set_to_sum:Nn \l__angelo_result_fp {#2}
    % Set #1 to the result after rounding.
    \pgfmathprintnumberto[fixed~zerofill, precision={#3}]
      { \fp_eval:n { \l__angelo_result_fp } } {#1}
  }
\ExplSyntaxOff

\begin{document}

% Use n = 60 and round to 6 decimal places.
\mySetToSum{\result}{60}{6}%
% Ditto, but keep trailing zeros, if any.
\mySetToSumAlt{\resultWithTrailingZeros}{60}{6}%
\[ 1 + \frac{1}{2} + \frac{1}{3} + \dotsb + \frac{1}{60}
   \approx \resultWithTrailingZeros \approx \result \]
Approximation of the Euler–Mascheroni constant:
\[ 1 + \frac{1}{2} + \frac{1}{3} + \dotsb + \frac{1}{60} - \ln(60) \approx
    \fpeval{round(\result - ln(60), 6)} \]
%
% Now use n = 100
\mySetToSum{\result}{100}{6}%
\[ 1 + \frac{1}{2} + \frac{1}{3} + \dotsb + \frac{1}{100} - \ln(100) \approx
    \fpeval{round(\result - ln(100), 6)} \]
%
% Now use n = 200
\mySetToSum{\result}{200}{6}%
\[ 1 + \frac{1}{2} + \frac{1}{3} + \dotsb + \frac{1}{200} - \ln(200) \approx
    \fpeval{round(\result - ln(200), 6)} \]
%
% Now use n = 1000
\mySetToSum{\result}{1000}{6}%
\[ 1 + \frac{1}{2} + \frac{1}{3} + \dotsb + \frac{1}{1000} - \ln(1000) \approx
    \fpeval{round(\result - ln(1000), 6)} \]
According to Wikipedia, the value of this constant is close to $0.57722$.

\end{document}

enter image description here

3
  • Wondefull! Perfect. Many thanks for the help! – Angelo Aliano Filho Oct 19 '20 at 15:12
  • Glad to help. :-) – frougon Oct 19 '20 at 15:16
  • I added macro \mySetToSumAlt that uses \pgfmathprintnumberto to print the result without discarding trailing zeros, in case you are interested. The sum is still computed in the same way, with l3fp. – frougon Oct 19 '20 at 16:45
4

Here's a LuaLaTeX-based solution.

enter image description here

% !TEX TS-program = lualatex
\documentclass{article}
\directlua{%
  function harmonic ( n )
     local h=0
     for i=1,n do h=h+1/i end
     return h
  end
} 
%% LaTeX macro to access the Lua function:
\newcommand\harmonic[1]{\directlua{tex.sprint(harmonic(#1))}}
\newcommand\difference[1]{\directlua{tex.sprint(harmonic(#1)-math.log(#1))}}

\begin{document}

The value of the tenth harmonic number is \harmonic{10}.

\medskip
\begin{tabular}{@{} rll @{}}
\hline
$n$ & harmonic($n$) & harmonic($n$)${}-\ln(n)$\\
\hline
1 & \harmonic{1}   & \difference{1}    \\
10 & \harmonic{10}  & \difference{10}   \\
100 & \harmonic{100} & \difference{100}  \\
1000 & \harmonic{1e3} & \difference{1e3}  \\
10000 & \harmonic{1e4} & \difference{1e4}  \\
100000 & \harmonic{1e5} & \difference{1e5}  \\
1000000 & \harmonic{1e6} & \difference{1e6}  \\
10000000 & \harmonic{1e7} & \difference{1e7}  \\
100000000 & \harmonic{1e8} & \difference{1e8}  \\
\hline
\end{tabular}

\medskip
Euler-Mascheroni constant${}\approx 0.5772156649$.
         
\end{document}
3

There's essentially no way to get fast computations with just TeX methods, because of very limited arithmetic capabilities.

The following solution stores the values of the harmonic sums up to 5000, so they're available in linear time. Beyond 5000, the computation time becomes too long.

\documentclass{article}
\usepackage{booktabs}
%\usepackage{xparse} % not necessary with LaTeX 2020-10-01 or later
\usepackage{xfp} % for \fpeval

\ExplSyntaxOn
% store the values of H_n in an array (up to 5000)
\fparray_new:Nn \g_aliano_harmonic_fparray { 5000 }
% initialize
\fparray_gset:Nnn \g_aliano_harmonic_fparray { 1 } { 1 }
% at each step add the reciprocal of the next number
\int_step_inline:nn { 5000-1 }
 {
  \fparray_gset:Nnn \g_aliano_harmonic_fparray { #1+1 }
   {
    \fparray_item:Nn \g_aliano_harmonic_fparray { #1 } + 1/(#1+1)
   }
 }
% this retrieves the value, rounding it to 5 decimal digits
\NewExpandableDocumentCommand{\harmonic}{m}
 {
  \fp_eval:n { round(\fparray_item:Nn \g_aliano_harmonic_fparray { #1 },5) }
 }
\ExplSyntaxOff

\begin{document}

\begin{tabular}{@{}rll@{}}
\toprule
\multicolumn{1}{@{}c}{$n$} &
\multicolumn{1}{c}{$H_n$} &
\multicolumn{1}{c@{}}{$H_n-\log n$} \\
\midrule
1    & \harmonic{1}    & \fpeval{round(\harmonic{1}-ln(1),5)} \\
10   & \harmonic{10}   & \fpeval{round(\harmonic{10}-ln(10),5)} \\
100  & \harmonic{100}  & \fpeval{round(\harmonic{100}-ln(100),5)}\\
1000 & \harmonic{1000} & \fpeval{round(\harmonic{1000}-ln(1000),5)}\\
5000 & \harmonic{5000} & \fpeval{round(\harmonic{5000}-ln(5000),5)}\\
\bottomrule
\end{tabular}

\end{document}

enter image description here

If you need more terms, using LuaTeX seems the only fast alternative. Maybe this can also be done with PythonTeX in sufficiently fast way.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.