Import:
= Napier's Constant =

I had always been bothered by the origin story of the constant \(e\).
Even a child can understand the constant \(\pi\), ratio of a circle's
circumference to its radius. In contrast, I imagine I'd have a tough time
explaining the base of the natural logarithm to less mathematically inclined
adults, let alone children.

We can express \(e\) as the sum of the reciprocal of the factorials:

\[
e = 1 + \frac{1}{1}
+ \frac{1}{1\cdot 2}
+ \frac{1}{1\cdot 2\cdot 3}
+ ...
\]

And \(\pi\) has a similar expansion:

\[
\frac{\pi}{2} = 1 + \frac{1}{3}
+ \frac{1\cdot 2}{3\cdot 5}
+ \frac{1\cdot 2\cdot 3}{3\cdot 5\cdot 7}
+ ...
\]

Both series converge quickly enough for cute party tricks:

[ ]:
sum $ take 20 $ snd <$> iterate (\(n,x) -> (n+1, x/n)) (1.0, 1.0)
(2*) $ sum $ take 20 $ snd <$> iterate (\(n,x) -> (n+1, x*n/(2*n+1))) (1.0, 1.0)
You would think a constant with a simple elegant formula would have an easy
explanation. This is indeed true for \(\pi\). Might this also be true for
\(e\)? Did I somehow miss an easy explanation all these years?

To answer this question, I read _e: The Story of a Number_ by Eli Maor, which
comprises of seemingly unrelated episodes, each culminating in a big reveal
where we learn \(e\) was behind it all along. For example:

  1. John Napier, the 8th Laird of Merchiston, "doubled the life of the
  astronomer" by publishing a table of numbers capable of miracles such
  as transforming multiplication into addition, division into subtraction, and
  taking square roots into halving.
  2. For the same rate, interest compounded daily grows faster than interest compounded monthly. What do we get when it is compounded more frequently? What if it were compounded continuously?
  3. Even before calculus, mathematicians managed to measure the area under curves of the form \(y = x^n\) where \(n\) is an integer. The toughest case is \(n = -1\), the hyperbola. Why? And what's the answer?
  4. Calculus gave mathematicians a brand new toy to play with, who promptly
  tried it on curves like \(y = 2^x\). They found its derivative was
  \(y' = m 2^x\) where \(m\) is the slope of the curve at \(x = 0\).
  Does this mean for some \(r\), the slope of \(y = r^x\) at \(x = 0\) is
  exactly 1, yielding a function that is its own derivative?

The fourth puzzle was how I first learned about \(e\), from a calculus textbook
whose title I forget. I learned of the other 3 puzzles soon after, so I hadn't
missed out after all.

In other words, the bad news is \(e\) is not as easy as \(\pi\). But the good
news is we get to watch a gripping drama. When young, we enjoy simple stories,
but as we age, we are drawn to mysterious and intricate plots with interwoven
threads, often presented nonlinearly.

Maor tells a good tale, and his book is full of tasty historical tidbits, but
he botches the opening scene. He distorts Napier's contributions. Maor's
statement in footnote 13 of the first chapter, "The often-made statement that
Napier discovered [\(1/e\)] (or even \(e\) itself) is erroneous", is itself
erroneous.

Instead of a documentary, we're left with a yarn based on a true story. We set
the record straight, with the help of
https://inria.hal.science/inria-00543934/document[Denis Roegel, _Napier's ideal
construction of the logarithms_].

== An unjust twenty-year sentence ==

Maor claims Napier built his wonderful canon of logarithms by choosing
the following base, or common ratio:

\[
1 - 10^7 = 0.9999999
\]

Maor suggests Napier then computed successive powers until he reached 0.5. This
cannot be! It already takes over a million iterations to reach 0.9:

[ ]:
length $ takeWhile (> 0.9) $ iterate (0.9999999*) 1
Indeed, Maor corrects himself when he lists the geometric progressions that
Napier actually computed. They come in 4 flavours:

  1. Napier did in fact compute successive powers of \(0.9999999\), but only one hundred of them: \(1, 0.9999999, ..., 0.9999999^{100}\).

  2. He computed successive powers of a five 9s version of the ratio: \(1, 0.99999, ..., 0.99999^{20}\).

  3. He computed successive powers of a two 9s version of the ratio: \(1, 0.99, ..., 0.99^{68}\).

  4. For every \(c\) in the previous step, he computed \(c, 0.9995 c, ..., 0.9995^{20} c\).

Maor states: "...he set himself to the task of finding, by tedious repeated
subtraction, the successive terms of his progression...Napier carried it
through, spending twenty years of his life (1594-1614) to complete the job."

Really? We'll examine the details later, but briefly, the first three sequences
only require shifts and subtractions, while the sequences of the last step
require only a little more work in the form of one extra halving operation.

The total bill comes to 1568 shifts and subtractions, and 1380 halvings.

[ ]:
100 + 20 + 68 + 69*20
69*20
Throughout my school years, my teachers frequently assigned around 10 homework
exercises that were due the next day: exercises comparable in technical
difficulty to subtraction and halving. (Some exercises may have revolved
around more advanced concepts like integration, but the calculation itself
followed simple rules.) In other words, schoolchildren could complete these
tables within half a year! There is no way Napier needed twenty. Maor's
sentence must be false.

And what could Napier possibly have done with these sequences? All numbers of
the first two sequences are close to 1, and there are only about 120 different
numbers anyway. The numbers of the third sequence are the seeds for the last
set of sequences, which are numerous and range from 0.5 to 1. The latter must
be where Napier looked up numbers to find their logarithms. This should raise
alarm bells. Two different sets of alarm bells, for we have exposed two gaping
plot holes.

Firstly, if Maor's explanation is to be believed, it appears the ratio Napier
used was not 0.9999999 but rather 0.9995.

Secondly, and more worryingly, what is the point of the first three sequences?
If Napier had chosen the ratio 0.9995, then all he had to do was compute:

\[
1, 0.9995, ..., 0.9995^{1386} = 0.49998...
\]

namely, one sequence of 1387 numbers instead of 69 sequences with 21 numbers
each. There must be more to the story.

== Waiting for Zeno ==

To truly understand Napier, we should walk a mile in his shoes. We do so almost
literally, because Napier explained logarithms by imagining a point traveling a
certain distance in a straight line that periodically marked off distances
following a geometric progression.

It seems Zeno was his cobbler because allowing artistic license, the trek
Napier envisioned began at noon at one mile per hour, but slowed down
exponentially as the destination neared. Every hour on the hour, the remaining
distance is \(r\) times the remaining distance one hour ago, for some constant
\(r < 1\). We'll never arrive, despite getting arbitrarily close.

Let's take advantage of modern mathematical notation to analyze this
journey. For a natural \(n\), let \(f(n)\) be the remaining distance in miles
after \(n\) hours. Thus:

\[
f(0) = 1 ,
f(n + 1) = r f(n)
\]

By induction:

\[ f(n) = r^n \]

Let's extend this equation to all reals \(t\):

\[ f(t) = r^t \]

Initially, we head towards our destination at one mile per hour:

\[ f'(0) = -1 \]

Haven't we met somewhere before? This is the fourth puzzle listed above,
namely, how I first learned \(e\) decades ago from my calculus textbook, except
with a sign flipped. We must have \(r = 1/e\).

Napier defined the logarithm to be the inverse of \(f\): given a remaining
distance in miles, how many hours have elapsed? In other words, Napier
invented logarithms to the base \(1/e\).

Maor alleges: "Napier unknowingly came within a hair's breadth of discovering"
\(e\).

Let's take stock. Napier defined the same function (up to sign) that my
calculus textbook defined to introduce \(e\), a function that Maor himself
discusses in Chapter 10. For memory, my textbook only argued \(e\) was between
2 and 3, and stated several digits without proof. In contrast, Napier figured
out quite a few digits of quite a few numbers, and explained how he did it. In
his 1614 table, the entry for 21 degrees and 35 minutes includes:

3678541 1000685

This means Napier is claiming \(\ln 0.3678541 = -1.000685\), which is
startlingly accurate: only the last digit is wrong. We can interpret this as:

\[
1/e \approx 0.3678541
\]

which is correct to 4 decimal places (\(1/e = 0.3678944...\)).

Napier even saw that the remaining distance (in miles) is also the current
speed (in miles per hour), a fact his work hinged on. This is obvious today
because we all know the derivative of \(e^t\) is itself, but Napier had no
access to calculus. In fact, in his day, non-integer exponents were poorly
understood.

Is it fair, then, to say Napier only came close to discovering \(e\)?

Confusingly, in Appendix 1, Maor mentions Napier's moving point, and adds:
"Napier's logarithms are actually logarithms to the base \(1/e\)",
contradicting his Chapter 1 claim that after rescaling, the base is
+\( (1 - 1/10^7)^{10^7} \)+.

The retconning of Appendix 1 somewhat redeems Chapter 1, but still fails to
explain why Napier bothered computing the first three sequences. It also
introduces another gun that Chekhov would condemn. If Napier's goal was to
compute successive powers of 0.9999999, why did he define this moving point?

We'll soon reveal the terrifying reasons, but first we atone for some
storytelling transgressions.

== A Pointless Exercise ==

We've swept a couple of details under the rug. My guess is Napier wanted a
function that takes a length and returns a length, so he wrote of a second
point that always moved at 1 mile per hour, and defined the logarithm using the
distance traveled by this second point. We view this as an unnecessary layer of
indirection.

More troublesome for us was that Napier lived through a sort of numerical
hyperinflation. A cutting-edge researcher, Napier was at ease with the latest
inventions such as the decimal point: indeed, Napier helped popularize this
handy bit of notation. But in 1614, for the sake of his intended audience, he
chose a https://en.wikipedia.org/wiki/Sinus_totus[_sinus totus_] of \(10^7\),
pumping up his numbers by 7 zeroes (markedly fewer than the number of zeroes
tacked onto certain unfortunate currencies throughout history).

Instead of "0.1234567", readers would see "1234567", with no trace of those
newfangled decimal points. They'd have to rescale now and then, but this was a
prevailing custom anyway.

In detail, the _Naperian logarithm_ is given by:

\[
\newcommand{\NapLog}{\mathop{\rm NapLog}\nolimits}
\NapLog x = - 10^7 \ln (x / 10^7)
\]

We do our best to dodge this security-blanket scaling factor, though if we
replace "mile" with "sinus totus" then some of our statements are equivalent to
Napier's. But on occasion we really are talking about numbers ten million times
smaller than Napier's.

One particularly tiresome mismatch is that \(\NapLog 10^7 = 0\). Everybody
loves that:

\[
\log a b = \log a + \log b
\]

but with Naperian logarithms, we get:

\[
\NapLog a b = \NapLog a + \NapLog b - \NapLog 1
\]

Naturally, Napier's fans soon clamoured for an upgraded logarithm that returns
0 when given 1.

== Shift Work ==

Let's look closer at the calculations Maor describes, which supposedly took 20
years. We call them auxiliary tables, but fear not: we'll soon divulge their
true purpose.

When multiplying a number \(x\) by a number of the form \(1 - 10^{-n}\),
Napier shifted \(x\) right by \(n\) places, simply truncating digits to fit
into the desired precision.

Napier computed his first sequence with 14 decimal places of precision.
The common ratio is \(1 - 10^{-7}\).

[ ]:
aux1 = take 101 $ iterate (\n -> n  - n `div` 10^7) (10^14)
take 5 aux1
last aux1
We stick to integer arithmetic to make it clear where the truncation occurs.
(So now we're the ones avoiding decimal points with hyperinflation!)

Our digits agree with Napier's:

image::https://upload.wikimedia.org/wikipedia/commons/7/7f/Napier%27s_first_table.agr.png[auxiliary table 1, 150]

Napier used 13 decimal places for the second sequence, whose common ratio is
\(1 - 10^{-5}\).

[ ]:
aux2 = take 51 $ iterate (\n -> n  - n `div` 10^5) (10^13)
take 5 aux2
last aux2
This time we disagree with Napier:

image::https://upload.wikimedia.org/wikipedia/commons/4/49/Napier%27s_second_table.agr.png[auxiliary table 2, 150]

The first 5 numbers are identical, but the last digits of the last number
should be 4826, not 2927. Napier must have slipped up at least once along the
way. We'll soon witness this tiny bug spread and grow as Napier computed more
of his logarithms.

For the heads of the 69 sequences, Napier used 11 decimal places. The common
ratio is 0.99:

[ ]:
aux3heads = take 69 $ iterate (\n -> n - n `div` 100) (10^11)
The rest of each of these sequences have the common ratio of 0.9995, which some
sources say were computed by shifting, then halving, then subtraction.
I assume Napier also truncated digits for these shifts, but what about the
halving? Did he truncate? Or did he round? Did he actually use higher precision
then truncate later? Could he have halved before shifting?

Whatever he did, I was unable to reproduce it exactly. We choose to shift,
truncate, halve, round, then subtract:

[ ]:
aux3 = map (take 21 . iterate (\n -> n - (n `div` 1000 + 1) `div` 2)) aux3heads
aux3sample = (take 3 aux3 ++ [last aux3])
(\ns -> (take 5 ns, last ns)) <$> aux3sample
This gets us pretty close:

image::https://upload.wikimedia.org/wikipedia/commons/4/4f/Napier%27s_third_table.agr.png[auxiliary table 3, 500]

Luckily, the discrepancies only seem to affect the last digit, and at any rate
they have far less impact than Napier's mistake in the second auxiliary table.

== The War on Error ==

Napier must have realized the accumulated truncation error bound grows linearly
with each step. This may be why he chose 69 sequences with 21 items each rather
than a giant sequence with over 1000 truncations. Within each of the 69
sequences, an entry has at most 20 accumulated truncation errors.

The start of the 69th sequence, 50488588900, is off by at most 63; less than 68
because it comes from a sequence with a ratio of 0.99 computed with 11 decimal
places, so the first 5 shifts and subtractions are exact. With arbitrary
precision arithmetic at our fingertips, we find the last 3 digits should be
878, not 900:

[ ]:
take 11 $ show $ 99^68
Maor suggests that Napier took the index of an entry to be its logarithm.
Not so. Napier only computed the 69 sequences to establish geometric
progressions with reasonable coverage of the interval [0.5..1]. Then the real
fun begins: Napier proceeds to compute the logarithms of each member of each
progression.

Why not just use an entry's index? Because Napier cared deeply about accuracy
(aside from the last few digits lost to truncation errors). He knew no power of
0.9995 is exactly 0.99, so integer indices won't cut it.

There's more. For the sake of argument, let's say Napier somehow possessed
accurate approximations to some logarithms, for example:

\[ 0.9995^{1349} = 0.5093251... \]

\[ 0.9995^{1350} = 0.5090704... \]

Then how do we solve the following?

\[ 0.9995^x = 0.5092 \]

The answer lies between 1349 and 1350, but where exactly? Should we linearly
interpolate and hope for the best?

I speculate Napier may have toyed with ideas like this. But in the end, Napier
did the right thing: define a sort of continuous ideal geometric progression,
namely the exponential curve, and exploit its properties to produce incredibly
accurate approximations.

By the way, Napier of course computed Naperian logarithms, but we speak of
natural logarithms instead. One might object that we need \(\ln 10\) to convert
one kind to the other, but this constant is unneeded when computing Naperian
logarithms alone, and once done, we can figure out \(\ln 10\) from the tables.

== I got 0.99 problems ==

The properties of logarithms imply a shortcut. If Napier could look up the
values of \(\ln 0.99\) and \(\ln 0.9995\) then he could just add and subtract
to find the logarithms of all \(69 \times 21\) numbers in his coverage table,
the third auxiliary table. Unfortunately, his goal was to create from scratch a
lookup table that would provide such answers in the first place! We have a
chicken-and-egg problem.

It is only at this point we learn why Napier bothered with the first two
sequences. They were for bootstrapping:

  1. Napier found a good approximation for \(\ln 0.9999999\).

  2. Since \(0.9999999^{100} \approx 0.99999\), their logarithms are also close.
  Napier bounded the difference between their logarithms to approximate
  \(\ln 0.99999\).

  3. Since \(0.99999^{20} \approx 0.9995\), their logarithms are also close,
  but this time, instead of bounding their difference to derive an
  approximation, he went above and beyond. He approximated the logarithm of
  their ratio using the highly accurate approximation from step 1, which
  in turn led to an approximation for \(\ln 0.9995\).

  4. Since \(0.9995^{20} \approx 0.99\), their logarithms are also close.
  Napier found an approximation for \(\ln 0.99\) in a similar manner as the
  previous step.

  5. Profit! Napier approximated the logarithms of every number in his
  lookup table via repeated additions of the approximations for \(\ln 0.99\)
  and \(\ln 0.9995\).

Napier's moving point makes short work of step 1. When there are 0.9999999
miles left to go, our current speed is also 0.9999999 miles per hour. Our pace
was only faster in the past, which means we took less than \( (1 - 0.9999999) /
0.9999999 \) hours to reach our current position.

Dually, since we set off at 1 mile per hour, and since our pace has only
slowed, more than \( 1 - 0.9999999 \) hours have elapsed. In other words:

\[ 1 - 0.9999999 < -\ln 0.9999999 < \frac{1 - 0.9999999}{0.9999999} \]

Napier approximated the denominator of the right-hand side with the first few
terms of the geometric series:

\[ \frac{1}{1 - 10^{-7}} = 1 + 10^{-7} + 10^{-14} + ... \]

and averaged the resulting bounds to get:

\[ \ln 0.9999999 \approx -1.00000005 \times 10^{-7} \]

This https://www.google.com/search?q=ln+0.9999999[agrees with Google], and any
program limited to IEEE 754 double-precision floats. We need more precision to
detect the error:

\[ \ln 0.9999999 = -1.00000005000000333333358... \times 10^{-7} \]

Napier took the first 100 multiples of -1.00000005 to be the logarithms of the
(approximiate) powers of 0.9999999. In particular, his first sequence ended
with:

\[ 0.9999999^{100} \approx 0.9999900000495 \]

thus:

\[ \ln 0.9999900000495 \approx -1.00000005 \times 10^{-5} \]

In general we have:

\[ x < -\ln (1 - x) < \frac{x}{1 - x} \]

which may look banal to modern eyes, because of the Taylor expansion:

\[ -\ln (1 - x) = x + \frac{x^2}{2} + \frac{x^3}{3} + ... \]

So we stress Napier derived these bounds without calculus, for a brand new
function he invented. Napier provided no explanation for choosing the average,
but we can see it's essentially the second-order Taylor approximation.

== What's the difference? ==

If we replace \(1 - x\) with \(a/b\) and rearrange, we obtain:

\[ \frac{a - b}{b} < \ln b - \ln a < \frac{a - b}{a} \]

Napier used this formula to approximate a logarithm if he already knew a
nearby logarithm. For step 2, set:

\[ a = 0.9999900000495, b = 0.99999 \]

The bounds on either side are approximately:

\[ a - b = -4.95 \times 10^{11} \]

so he took the lower and upper bound to be the same. Thus:

\[ \ln 0.99999 \approx \ln 0.9999900000495 - 4.95 \times 10^{11}
\approx -1.000005 \times 10{^-5}  \]

Again, this agrees with double-precision float arithmetic, and we need higher
precision to spot the error.

While not obvious in this particular case where the upper and lower bounds are
identical, Napier performed
https://en.wikipedia.org/wiki/Interval_arithmetic[interval arithmetic], that
is, he postponed the averaging of bounds as late as possible. He added lower
bounds together and upper bounds together, and only when he wanted to record a
single number would he compute their mean.

Then we have the beginnings of a tragedy. Napier's erroneous last few digits in
the last entry of the second auxiliary table, 2927 instead of 4826, means the
following approximation is worse than it should have been:

\[
\ln 0.99999^{50} \approx 50 \times \ln 0.9995001222927 \approx -5.000025 \times 10^{-4}
\]

The bug propagates in step 3, where Napier computed:

\[
\frac{0.9995}{0.9995001222927} \approx 0.9999987764614
\]

Setting:

\[ a = 0.9999987764614, b = 0.9999999 \]

in the above leads to:

\[ \ln 0.9999987764614 \approx -1.2235387 \times 10^{-7} \]

then interval arithmetic and averaging yields:

\[ \ln 0.9995 \approx \ln 0.9999987764614
- \ln 0.9995001222927 \approx 5.0012485387 \times 10^{-4}
\]

This approximation is smaller than it should have been because of Napier's bug.

Step 4 followed a similar procedure to arrive at:

\[ \ln 0.99 \approx 0.1005033210291 \]

which again is lower than it should have been, because of other approximations
that were infected by the bug.

Step 5 completes the tragedy. The error virulently spread and magnified
throughout the third \(69 \times 21\) table, accumulating with every addition.

While the errors were tolerably small in practice, it is a shame that Napier
worked so hard to boost accuracy but was sabotaged by a trivial mistake in
elementary arithmetic.

To recap, Napier computed the first two sequences to determine approximate
logarithms for the third table, and he invented the exponential function
because the indices alone are far too inaccurate for approximating logarithms
from known nearby logarithms.

However, we have not quite fired all the guns of Chekhov. How long would the
above taken? Almost all of the logarithms are derived from others via addition
or multiplication by a small constant. Only 4 of the logarithms require
interval arithmetic. The divisions in the bounds can be approximated by
multiplications with a truncated geometric series because the denominators are
close to 1.

Overall, while it is certainly a mountain of work, it's not an order of
magnitude more than the initial shifts, subtractions, and halvings.
It still would not have taken Napier twenty years.

What could have eaten so much time? Surely Napier spent hours on failed
experiments and inferior approaches, and on finding miraculous coincidences
such as \(0.9999999^{100} \approx 0.99999\), inventing the exponential function
and interval arithmetic, and so on. But this kind of work is not soul-crushing
drudgery.

The bulk of the two decades must have been spent elsewhere.

== Take care of the minutes... ==

Where did the time go? Where was the soul-crushing drudgery?

We dropped a hint when we mentioned 21 degrees and 35 minutes. There are 60
minutes in a degree, and Napier's tables handled every degree between 0 and 90.
For each of these 5400 degrees and minutes, Napier looked up its sine value
from a reference, then computed the logarithm. For values close to 1 he could
use the first-order Taylor approximation which is almost no work, but for most
sine values he had to find the closest value in the third auxiliary table, then
approximate the logarithm via the above formula for the bounds.

image::napier-21-recto.jpg[page showing 21 degrees 35 minutes]

These involved divisions where geometric series approximations are of no help
because the divisor is too far from 1. Some sine values required even more
work, as Napier had to first apply trigonometric identities or logarithm laws
to bring numbers in range of the third auxiliary table.

Napier also had to perform 2700 subtractions to compute the logarithms of
tangent values. Though trivial compared to divisions, this alone is about
double the number of subtractions Napier needed for the auxiliary tables.

Ben Lynn blynn@cs.stanford.edu 💡