Eight Greek inscriptions

I love ancient inscriptions. They provide a connection to people of the past, they provide an insight into how people thought, and they demonstrate how the experience of writing has changed over the past five thousand years or so. Here are eight Greek inscriptions and documents that interest me – some historical, some religious, and one mathematical.


Six of the eight inscriptions

1. The inscription that is no longer there, 480 BC

Our first inscription was inscribed at the site of the Battle of Thermopylae (480 BC), where Leonidas and his 300 Spartans (plus several thousand allies) died trying to hold off a vastly superior Persian army. The inscription no longer exists (though there is a modern copy at the site), but the wording has been preserved by Herodotus (Histories 7.228.2):

Ω ΞΕΙΝ ΑΓΓΕΛΛΕΙΝ
ΛΑΚΕΔΑΙΜΟΝΙΟΙΣ ΟΤΙ ΤΗΔΕ
ΚΕΙΜΕΘΑ ΤΟΙΣ ΚΕΙΝΩΝ
ΡΗΜΑΣΙ ΠΕΙΘΟΜΕΝΟΙ.

Phonetically, that reads:

Ō ksein’, angellein
Lakedaimoniois hoti tēide
keimetha, tois keinōn
rhēmasi peithomenoi.

I’ve always thought that there was a degree of sarcasm in this laconic epigram – after all, the Spartans had declared war on the Persians (rather informally, by throwing the Persian ambassadors down a well), but then stayed home, leaving Leonidas and his personal honour guard (plus the allies) to do the actual fighting. My (rather free) personal translation would therefore be:

Go tell the Spartans,
Stranger passing by,
We listened to their words,
And here we lie.


The battle of Thermopylae, 480 BC (illustration: John Steeple Davis)

2. The Rosetta Stone, 196 BC

The rich history of the Rosetta Stone has always fascinated me (and I made a point of seeing the Stone when I visited the British Museum). The Stone records a decree of 196 BC from Ptolemy V, inscribed using three forms of writing – Egyptian hieroglyphs, Egyptian demotic script, and a Greek translation. The Stone was therefore a valuable input to the eventual decoding of Egyptian hieroglyphs. Romance practically drips off the Stone.


The Rosetta Stone in the British Museum (photo: Hans Hillewaert)

3. The Theodotus inscription, before 70 AD

The Theodotus inscription in Jerusalem was located in a 1st century synagogue near the Temple (this dating is generally accepted). It reads as follows (with [square brackets] denoting missing letters):

ΘΕΟΔΟΤΟΣ ΟΥΕΤΤΕΝΟΥ ΙΕΡΕΥΣ ΚΑΙ
ΑΡΧΙΣΥΝΑΓΩΓΟΣ ΥΙΟΣ ΑΡΧΙΣΥΝ[ΑΓΩ]
Γ[Ο]Υ ΥΙΟΝΟΣ ΑΡΧΙΣΥΝ[Α]ΓΩΓΟΥ ΩΚΟ-
ΔΟΜΗΣΕ ΤΗΝ ΣΥΝΑΓΩΓ[Η]Ν ΕΙΣ ΑΝ[ΑΓ]ΝΩ-
Σ[Ι]Ν ΝΟΜΟΥ ΚΑΙ ΕΙΣ [Δ]ΙΔΑΧΗΝ ΕΝΤΟΛΩΝ ΚΑΙ
ΤΟΝ ΞΕΝΩΝΑ ΚΑ[Ι ΤΑ] ΔΩΜΑΤΑ ΚΑΙ ΤΑ ΧΡΗ-
Σ[Τ]ΗΡΙΑ ΤΩΝ ΥΔΑΤΩΝ ΕΙΣ ΚΑΤΑΛΥΜΑ ΤΟΙ-
Σ [Χ]ΡΗZΟΥΣΙΝ ΑΠΟ ΤΗΣ ΞΕ[Ν]ΗΣ ΗΝ ΕΘΕΜΕ-
Λ[ΙΩ]ΣΑΝ ΟΙ ΠΑΤΕΡΕΣ [Α]ΥΤΟΥ ΚΑΙ ΟΙ ΠΡΕ-
Σ[Β]ΥΤΕΡΟΙ ΚΑΙ ΣΙΜΩΝ[Ι]ΔΗΣ.

In translation:

Theodotus, son of Vettenus [or, of the gens Vettia], priest and
archisynagogue [leader of the synagogue], son of an archisynagogue,
grandson of an archisynagogue, built
the synagogue for the reading of
the Law and for teaching the commandments;
also the hostel, and the rooms, and the water
fittings, for lodging
needy strangers. Its foundation was laid
by his fathers, and the
elders, and Simonides.

The inscription is interesting in a number of ways. Along with other similar inscriptions, it demonstrates the existence of Greek-language synagogues in 1st Palestine. The title ἀρχισυνάγωγος (archisynagōgos) also occurs in the New Testament (nine times, starting at Mark 5:22), so is clearly a title of the time-period. Some scholars have suggested that Theodotos was a freed slave, who had made his fortune and returned from Italy to the land of his fathers (in which case there is a very slight possibility that the synagogue with the inscription might have been the “synagogue of the Freedmen” mentioned in Acts 6:9).


The Theodotus inscription in the Israel Museum, Jerusalem (photo: Oren Rozen)

4. The Delphi inscription, 52 AD


The Temple of Apollo at Delphi (photo: Luarvick)

The Delphi inscription is a letter of around 52 AD from the Roman emperor Claudius. It was inscribed on stone at the Temple of Apollo at Delphi (above), although it now exists only as nine fragments. Of particular interest is this line (see also the photograph below):

[IOU]ΝΙΟΣ ΓΑΛΛΙΩΝ Ο Φ[ΙΛΟΣ] ΜΟΥ ΚΑ[Ι ΑΝΘΥ]ΠΑΤΟΣ …

Phonetically, that reads:

[Jou]nios Galliōn ‘o ph[ilos] mou ka[i anthu]patos …

This is a reference to Lucius Junius Gallio Annaeanus, who was briefly proconsul (anthupatos) of the Roman senatorial province of Achaea (southern Greece) at the time:

Junius Gallio, my friend and proconsul …

This same anthupatos Gallio appears in the New Testament (Acts 18:12–17: “Γαλλίωνος δὲ ἀνθυπάτου ὄντος τῆς Ἀχαΐας …”), and therefore provides a way of dating the events described there.


One of the fragments of the Delphi inscription, highlighting the name ΓΑΛΛΙΩΝ = Gallio (photo: Gérard)

5. Papyrus Oxyrhynchus 29, c. 100 AD

I have written before about Papyrus Oxyrhynchus 29. It contains the statement of Proposition 5 of Book 2 of Euclid’s Elements, with an accompanying diagram (plus just a few letters of the last line of the preceding proposition). In modern Greek capitals, it reads:

ΕΑΝ ΕΥΘΕΙΑ ΓΡΑΜΜΗ
ΤΜΗΘΗ ΕΙΣ ΙΣΑ ΚΑΙ ΑΝ-
ΙΣΑ ΤΟ ΥΠΟ ΤΩΝ ΑΝΙ-
ΣΩΝ ΤΗΣ ΟΛΗΣ ΤΜΗΜ[ΑΤ]ΩΝ ΠΕΡΙΕΧΟΜΕΝΟΝ
ΟΡΘΟΓΩΝΙΟΝ ΜΕΤΑ Τ[Ο]Υ ΑΠΟ ΤΗΣ ΜΕΤΟΞΥ
ΤΩΝ ΤΟΜΩΝ ΤΕΤ[ΡΑ]ΓΩΝΟΥ ΙΣΟΝ ΕΣΤΙΝ
ΤΩ ΑΠΟ ΤΗΣ ΗΜΙΣΕΙ-
ΑΣ ΤΕΤΡΑΓΩΝΟΥ

However, the actual document (image below) uses “Ϲ” for the modern “Σ,” and “ω” for the modern “Ω”:

ΕΑΝ ΕΥΘΕΙΑ ΓΡΑΜΜΗ
ΤΜΗΘΗ ΕΙϹ ΙϹΑ ΚΑΙ ΑΝ-
ΙϹΑ ΤΟ ΥΠΟ ΤωΝ ΑΝΙ-
ϹωΝ ΤΗϹ ΟΛΗϹ ΤΜΗΜ[ΑΤ]ωΝ ΠΕΡΙΕΧΟΜΕΝΟΝ
ΟΡΘΟΓωΝΙΟΝ ΜΕΤΑ Τ[Ο]Υ ΑΠΟ ΤΗϹ ΜΕΤΟΞΥ
ΤωΝ ΤΟΜωΝ ΤΕΤ[ΡΑ]ΓωΝΟΥ ΙϹΟΝ ΕϹΤΙΝ
Τω ΑΠΟ ΤΗϹ ΗΜΙϹΕΙ-
ΑϹ ΤΕΤΡΑΓωΝΟΥ

This manuscript is important because, being from 75–125 AD, it dates to only four centuries after the original was written in 300 BC – most manuscripts of Euclid are twelve centuries or more after (in fact, it pre-dates the alterations made to the work by Theon of Alexandria in the 4th century AD). The manuscript also contains one of the oldest extant Greek mathematical diagrams. The text is identical to the accepted Greek text, except for two spelling variations and one one grammatical error (τετραγώνου for τετραγώνῳ on the last line, perhaps as the result of the mental influence of the preceding word in the genitive):

ἐὰν εὐθεῖα γραμμὴ
τμηθῇ εἰς ἴσα καὶ ἄνισα,
τὸ ὑπὸ τῶν ἀνίσων τῆς ὅλης τμημάτων περιεχόμενον ὀρθογώνιον
μετὰ τοῦ ἀπὸ τῆς μεταξὺ τῶν τομῶν τετραγώνου
ἴσον ἐστὶ τῷ ἀπὸ τῆς ἡμισείας τετραγώνῳ.

It is really just a geometric way of expressing the equality (x + y)2 = x2 + 2xy + y2, but in English it reads as follows:

If a straight line
be cut into equal and unequal [segments] (x + y + x and y),
the rectangle contained by the unequal segments of the whole (i.e. (x + y + x)y = 2xy + y2)
together with the square on the straight line between the points of section (+ x2)
is equal to the square on the half (= (x + y)2).

The proof of the proposition is missing, however, and there are no labels on the diagram. I suspect that the manuscript was a teaching tool of some kind (either an aide-mémoire or an exam question). Alternatively, it may have been part of an illustrated index to the Elements.


Papyrus Oxyrhynchus 29 (photo: Bill Casselman)

6. Rylands Library Papyrus P52, c. 140 AD

Papyrus P52 is a small fragment written in a similar style to Papyrus Oxyrhynchus 29, but is dated a few decades later (to around 140 AD). In modern Greek capitals, it reads:

ΟΙ ΙΟΥΔΑΙ[ΟΙ]· ΗΜΕ[ΙΝ ΟΥΚ ΕΞΕΣΤΙΝ ΑΠΟΚΤΕΙΝΑΙ]
ΟΥΔΕΝΑ. ΙΝΑ Ο Λ[ΟΓΟΣ ΤΟΥ ΙΗΣΟΥ ΠΛΗΡΩΘΗ ΟΝ ΕΙ]
ΠΕΝ ΣΗΜΑΙΝΩ[Ν ΠΟΙΩ ΘΑΝΑΤΩ ΗΜΕΛΛΕΝ ΑΠΟ]
ΘΝΗΣΚΕΙΝ. ΙΣ[ΗΛΘΕΝ ΟΥΝ ΠΑΛΙΝ ΕΙΣ ΤΟ ΠΡΑΙΤΩ]
ΡΙΟΝ Ο Π[ΙΛΑΤΟΣ ΚΑΙ ΕΦΩΝΗΣΕΝ ΤΟΝ ΙΗΣΟΥΝ]
ΚΑΙ ΕΙΠ[ΕΝ ΑΥΤΩ· ΣΥ ΕΙ O ΒΑΣΙΛΕΥΣ ΤΩΝ ΙΟΥ]
[Δ]ΑΙΩN;

The reverse side also has writing:

[ΒΑΣΙΛΕΥΣ ΕΙΜΙ. ΕΓΩ ΕΙΣ TO]ΥΤΟ Γ[Ε]ΓΕΝΝΗΜΑΙ
[ΚΑΙ (ΕΙΣ ΤΟΥΤΟ) ΕΛΗΛΥΘΑ ΕΙΣ ΤΟΝ ΚΟ]ΣΜΟΝ, ΙΝΑ ΜΑΡΤΥ-
[ΡΗΣΩ ΤΗ ΑΛΗΘΕΙΑ· ΠΑΣ Ο ΩΝ] ΕΚ ΤΗΣ ΑΛΗΘΕI-
[ΑΣ ΑΚΟΥΕΙ ΜΟΥ ΤΗΣ ΦΩΝΗΣ]. ΛΕΓΕΙ ΑΥΤΩ
[Ο ΠΙΛΑΤΟΣ· ΤΙ ΕΣΤΙΝ ΑΛΗΘΕΙΑ; Κ]ΑΙ ΤΟΥΤΟ
[ΕΙΠΩΝ ΠΑΛΙΝ ΕΞΗΛΘΕΝ ΠΡΟΣ] ΤΟΥΣ Ι[ΟΥ]
[ΔΑΙΟΥΣ ΚΑΙ ΛΕΓΕΙ ΑΥΤΟΙΣ· ΕΓΩ ΟΥΔ]ΕΜΙ[ΑΝ]
[ΕΥΡΙΣΚΩ ΕΝ ΑΥΤΩ ΑΙΤΙΑΝ].

Some clever detective work has identified the fragment as being from a manuscript of the New Testament gospel of John (John 18:31b–33 and 18:37b–38), permitting the reconstruction of the missing letters. The fragment is from the top inner corner of a book page (books with bound two-sided pages were a relatively new technology at the time, with many people still using scrolls). The fragment dates from less than a century after the gospel of John was written (and possibly just a few decades), thus helping in dating that work. There is no indication of any textual difference from later manuscripts – even the text on the missing parts of the front page seems of the right amount. The only exception is in the second line of the reverse side – there’s not quite enough room for the expected wording, and it seems likely that the duplicated words ΕΙΣ ΤΟΥΤΟ were not present.

In English, the passage reads:

… the Jews, “It is not lawful for us to put anyone to death.” This was to fulfil the word that Jesus had spoken to show by what kind of death he was going to die. So Pilate entered the Praetorium again and called Jesus and said to him, “Are you the King of the Jews?” …
… I am a king. For this purpose I was born and for this purpose I have come into the world – to bear witness to the truth. Everyone who is of the truth listens to my voice.” Pilate said to him, “What is truth?” After he had said this, he went back outside to the Jews and told them, “I find no guilt in him.”


Papyrus P52 (front and back) in the John Rylands Library

7. The Akeptous inscription in the Megiddo church, c. 250 AD

The Akeptous inscription is one of a number of inscriptions found in the mosaic floor of a 3rd century church which was discovered in 2005 while digging inside the Megiddo Prison in Israel (the date is just slightly later than the Dura-Europos church in Syria). The Akeptous inscription reads:

ΠΡΟϹΗΝΙΚΕΝ
ΑΚΕΠΤΟΥϹ,
Η ΦΙΛΟΘΕΟϹ,
ΤΗΝ ΤΡΑΠΕ-
ZΑΝ {Θω} {ΙΥ} {Χω}
ΜΝΗΜΟϹΥΝΟΝ

Phonetically:

Prosēniken Akeptous, ‘ē philotheos, tēn trapezan Th(e)ō Ι(ēso)u Ch(rist)ō mnēmosunon.

In English translation:

A gift of Akeptous, she who loves God, this table is for God Jesus Christ, a memorial.

Brief as it is, the inscription has several interesting features. First, Jesus Christ is being explicitly referred to as God, which tells us something about Christian beliefs of the time. Second, the inscription uses nomina sacra – divine names (“God,” “Jesus,” and “Christ”) are abbreviated with first and last letter, plus an overbar (this is denoted by curly brackets in the Greek text above). Third, the inscription records the gift of a prominent (presumably wealthy) female church member (the feminine definite article shows that Akeptous was female). And fourth, the reference to the construction of a table suggests that there were architectural features in the church to support the celebration of Communion, which tells us something about liturgy.


The Akeptous inscription in the Megiddo church

8. The Codex Sinaiticus, c. 340 AD

Our final inscription is a portion of the Codex Sinaiticus, a 4thcentury manuscript of the Christian Bible, containing the earliest complete copy of the New Testament. This Bible is a century later than the Megiddo church, and two centuries after Papyrus P52. Unlike Papyrus P52, it is written on vellum made from animal skins, and is written in beautiful calligraphic script. I have selected the passage John 1:1–3a:

ΕΝ ΑΡΧΗ ΗΝ Ο ΛΟΓΟϹ,
ΚΑΙ Ο ΛΟΓΟϹ ΗΝ
ΠΡΟϹ ΤΟΝ {ΘΝ}, ΚΑΙ
{ΘϹ} ΗΝ Ο ΛΟΓΟϹ. ΟΥ-
ΤΟϹ ΗΝ ΕΝ ΑΡΧΗ
ΠΡΟϹ ΤΟΝ {ΘΝ}. ΠΑ[Ν]-
ΤΑ ΔΙ ΑΥΤΟΥ ΕΓΕΝΕ-
ΤΟ, ΚΑΙ ΧΩΡΙϹ ΑΥΤΟΥ
ΕΓΕΝΕΤΟ ΟΥΔΕΝ

In English:

In the beginning was the Logos, and the Logos was with God, and the Logos was God. He was in the beginning with God. All things through him were made, and apart from him was not one thing made …

In the Greek, nomina sacra for “God” can be seen, together with a number of corrections (including, on the last line, an expansion of the contraction ΟΥΔΕΝ = “nothing” to ΟΥΔΕ ΕΝ = “not one thing”). Spaces between words had still not been invented, nor had punctuation or lowercase letters, which means that it is almost impossible to make sense of the text unless it is read aloud (or at least subvocalised). Fortunately, things have changed in the last seventeen centuries!


John 1:1–3a in the Codex Sinaiticus


The Sydney Observatory


Observatory exterior (photo by Greg O’Beirne, 2006)

An unusual free science museum in Sydney, Australia is the Sydney Observatory. This opened in 1858 as a working observatory. The time ball, which dropped each day to mark the exact time, is still operating at 1:00 PM each afternoon. The observatory now operates as a small museum, having been refurbished during 1997–2008. The telescopes can also be used on paid night tours.

The observatory is a stiff climb up Observatory Hill. The exhibits are limited in number, but include some excellent orreries. Unless you have some astronomical expertise, the paid guided tours will be helpful. My brief visit was an enjoyable one.


An orrery at Sydney Observatory (photo by Anthony Dekker)


Looking back: 1994

In 1994, I finished up a three-year lecturing contract at the National University of Singapore, and returned to Australia. That year saw the launch of the Netscape Navigator web browser (I wrote my first web page) and the opening of the Channel Tunnel between France and the UK (I was to take a train through that tunnel some years later). A plethora of movies was released – Stargate was one of the better ones:

In science, the Wollemi pine was discovered in Australia, stirring up a media frenzy. Martin Chalfie transferred the jellyfish gene for green fluorescent protein to the nematode Caenorhabditis elegans, eventually sharing in the 2008 Nobel Prize in Chemistry for this work. And Comet Shoemaker–Levy 9 crashed into Jupiter, leaving visible marks in the Jovian atmosphere:

In France, the Chauvet Cave was discovered. It contains cave art dated to around 30,000 years ago. And superb art it is – those ancient cavemen knew a thing or two:


Boyle’s law

Boyle’s law is the principle that, at constant temperature, the volume occupied by a gas is inversely proportional to pressure (at least until the pressure gets extremely high). In symbolic terms, PV = k, where k is a constant. The pioneering scientist and amateur theologian Robert Boyle published this law in 1662, in his New Experiments Physico-Mechanical, Touching the Air (2nd edition): Whereunto is added a defence of the authors explication of the experiments against the objections of Franciscus Linus and Thomas Hobbes. The chart above shows the data he collected, together with a diagram of his apparatus and a scan of his original data table (cleaned up from an image in the Wellcome Collection).

Boyle’s apparatus involved an uneven U-shaped tube, sealed at the short end, and with mercury in the “U.” Further mercury was added to the long end, in order to compress the air in the short end to a specified volume. The pressure in each case (in inches of mercury) was the measured amount in the long end of the tube, plus 29.125 inches for atmospheric pressure.

Boyle’s experimental work was excellent, with all errors less than 1% (on my calculation). This is shown visually by the close fit of his experimental datapoints to the line PV = 351.9. His arithmetic was not quite so good – column “E” in his original table showed his predicted pressure, calculated laboriously using fractions. Seven of the 25 entries are incorrect. For example, using his approach, the 7th entry should be 1398 / 36 = 38 5/6, but Boyle has 38 7/8.

Home replications of Boyle’s work generally involve weights, a large syringe, some precarious balancing, and the fact that the air column sitting on a square centimetre weighs about 1.03 kg. Like so:


The Invention of Clouds: a book review


The Invention of Clouds: How an Amateur Meteorologist Forged the Language of the Skies by Richard Hamblyn (2001)

I recently read The Invention of Clouds by Richard Hamblyn, who also wrote Terra (which I reviewed some years ago). The present volume focuses on the Quaker pharmacist Luke Howard, who produced a taxonomy of clouds in 1802. Essentially the same classification is still used today (but not, as Hamblyn points out, without considerable debate during the 1800s):

Although the focus is on Howard’s work and life, Hamblyn in fact provides a brief history of meteorology (or at least of the study of clouds), and there is a chapter on the Beaufort scale. Contemporary literature referred to includes:


Google Ngrams plot for three of the cloud types (with and without hyphens). The words “cirrostratus” and “cirrocumulus” first appear in reprintings of Howard’s pioneering essay, while the word “cumulonimbus” is introduced around 1887. There is a renewed spike of interest in cloud types beginning in the early 1940’s.

The Invention of Clouds also has some interesting comments on clouds in art and on how to get an education at a time when the two English universities banned non-Anglicans from attending. However, the book does have a few small errors. For example, cloud droplets are not “a mere millionth of a millimetre across,” but in the range 0.005 to 0.05 mm. However, that does not stop the book from being both enjoyable and informative (although I did wish for colour images). See also this review from the NY Times.


The Invention of Clouds by Richard Hamblyn: 3½ stars


Ada’s Program



Fragment of the Analytical Engine’s arithmetic/logic unit built by Babbage (photo: Science Museum London) and punched cards for operating it (photo: Karoly Lorentey)

Following on from my post about his Difference Engine, Charles Babbage’s Analytical Engine deserves some discussion. Only small pieces of the Analytical Engine were built. Indeed, Babbage’s ideas were so far ahead of his time that it could not be built with the technology available to him. Babbage was clearly either a true genius – or else he was a time-traveller from the future trying to recreate a modern computer.

It is not quite clear whether Babbage’s Analytical Engine was Turing complete. The kind of abstract computer developed independently by Alan Turing and Emil Post uses an arbitrarily long tape. Even more abstract models of computation use arbitrarily long integers to achieve the same effect. For example, the list (2, 3, 0, 1) can be encoded as the number 582 (1001000110 in binary). Modern computers use a sequence of numbered memory locations, accessed by indexing. The Analytical Engine could not do this. To quote the excellent analysis by Allan G. Bromley, “With hindsight we may note that in the Analytical Engine (at least until 1840) Babbage did not possess the variable-address concept; that is, there was no mechanism by which the machine could, as a result of a calculation, specify a particular variable in the store to be used as the operand for an instruction.


Ada King-Noel, the Countess of Lovelace (1836 portrait by Margaret Sarah Carpenter, cropped)

Babbage was not terribly good at explaining his ideas in writing, unfortunately. The best description is a 13-page summary of of a lecture by Babbage written in French by Luigi Federico Menabrea (later Prime Minister of Italy). This was translated into English in 1843 by Augusta Ada King-Noel (née Byron), the Countess of Lovelace.

Ada added 36 pages of detailed notes of her own. These include several insightful comments regarding the philosophy of computing, such as: “Again, it might act upon other things besides number, were objects found whose mutual fundamental relations could be expressed by those of the abstract science of operations, and which should be also susceptible of adaptations to the action of the operating notation and mechanism of the engine. Supposing, for instance, that the fundamental relations of pitched sounds in the science of harmony and of musical composition were susceptible of such expression and adaptations, the engine might compose elaborate and scientific pieces of music of any degree of complexity or extent. The Analytical Engine is an embodying of the science of operations, constructed with peculiar reference to abstract number as the subject of those operations.” (from Note A).

Also: “The Analytical Engine has no pretensions whatever to originate anything. It can do whatever we know how to order it to perform.” (from Note G).


The diagram from Note G, which shows what is essentially a computer program

Ada is sometimes described as the “first computer programmer,” based on the material in her Note G. This is clearly incorrect, since Charles Babbage had written several dozen programs for the Analytical Engine before 1840. Perhaps “first computer scientist” would be a better title. The program described in Ada’s Note G computes Bernoulli numbers. It does so using the fact that each Bernoulli number can be computed from its predecessors via the relationship:

0 = A0 + A1B1 + A3B3 + A5B5 + … + B2n−1

Here each Ai can be calculated as follows:

a <- function (n, i) {
	if (i == 0) -0.5 * (2*n - 1) / (2*n + 1)
	else if (i == 1) n
	else a(n, i-2) * (2*n + 2 - i) * (2*n + 1 - i) / (i * (i + 1))
}

Bromley notes that “the ‘user instruction set’ of the Analytical Engine seems nowhere to be clearly stated,” which makes it a little difficult to extract an actual program from Ada’s material. After fixing three small bugs, here is something that actually works (in the language R, and all done using numbered registers):

ada <- function (n.max) {
	b <- rep(0, n.max)  # result registers
	v <- c(1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)  # other registers
	
	while (v[3] <= n.max) {  # how is this loop done in the Analytical Engine?
		v[4] <- v[5] <- v[6] <- v[2] * v[3]
		v[4] <- v[4] - v[1]  # v[1] is always 1
		v[5] <- v[5] + v[1]
		v[11] <- v[4] / v[5]  # accidentally reversed in Ada’s diagram
		v[11] <- v[11] / v[2]  # v[2] is always 2
		v[13] <- v[13] - v[11]
		v[10] <- v[3] - v[1]
		
		if (v[10] > 0) {  # how is this conditional execution done in the Analytical Engine?
			v[7] <- v[2] + v[7]
			v[11] <- v[6] / v[7]
			v[12] <- b[1] * v[11]
			v[13] <- v[12] + v[13]
			v[10] <- v[10] - v[1]
		}

		while(v[10] > 0) {  # how is this loop done in the Analytical Engine?
			v[6] <- v[6] - v[1]
			v[7] <- v[1] + v[7]
			v[8] <- v[6] / v[7]
			v[11] <- v[8] * v[11]
			v[6] <- v[6] - v[1]
			v[7] <- v[1] + v[7]
			v[9] <- v[6] / v[7]
			v[11] <- v[9] * v[11]
			
			i <- v[3] - v[10]   # how is this indexing done in the Analytical Engine?
			v[12] <- b[i] * v[11]
			v[13] <- v[12] + v[13]
			v[10] <- v[10] - v[1]
		}

		n <- v[3]  # how is this indexing done in the Analytical Engine?
		b[n] <- b[n] - v[13]  # another apparent error in Ada's table at line 14 (negation is needed)

		v[3] <- v[1] + v[3]
		v[7] <- 0   # reset the register with a “variable card”
		v[13] <- 0  # a third apparent error in Ada's table (v[13] needs to be reset, not v[6])
	}
	b
}

There are a number of questions about this. First, I am assuming that all registers are read non-destructively (Ada’s notes indicate that read-and-clear is also possible). Second, the results stored in b require indexing, which the Analytical Engine could not do. Third, Ada writes that “Operation 7 must either bring out a result equal to zero (if n = 1); or a result greater than zero, as in the present case; and the engine follows the one or the other of the two courses just explained, contingently on the one or the other result of Operation 7.” This implies that some kind of conditional branching was possible. But how?

A simple response is simply to “unroll” the loops, breaking the program down into instructions of just three kinds:

  • Set 1 567: place the number 567 in register #1
  • Do 2 + 3: add the contents of register #2 to the content of register #3 (and similarly for −, ×, and ÷)
  • Store 4: store a previously computed result in register #4

The following, rather lengthy, version of the program correctly computes the first three Bernoulli numbers:

Set 1 1, Set 2 2, Set 3 1

# First Bernoulli number
Do 2 * 3, Store 4, Store 5, Store 6
Do 4 - 1, Store 4
Do 5 + 1, Store 5
Do 4 / 5, Store 11
Do 11 / 2, Store 11
Do 13 - 11, Store 13
Do 3 - 1, Store 10

Do 1 + 3, Store 3
Do 21 - 13, Store 21,  # 21 done
Set 7 0, Set 13 0

# Second Bernoulli number
Do 2 * 3, Store 4, Store 5, Store 6
Do 4 - 1, Store 4
Do 5 + 1, Store 5
Do 4 / 5, Store 11
Do 11 / 2, Store 11
Do 13 - 11, Store 13
Do 3 - 1, Store 10

Do 2 + 7, Store 7
Do 6 / 7, Store 11
Do 21 * 11, Store 12,  # use 21
Do 12 + 13, Store 13
Do 10 - 1, Store 10

Do 1 + 3, Store 3
Do 22 - 13, Store 22,  # 22 done
Set 7 0, Set 13 0

# Third Bernoulli number
Do 2 * 3, Store 4, Store 5, Store 6
Do 4 - 1, Store 4
Do 5 + 1, Store 5
Do 4 / 5, Store 11
Do 11 / 2, Store 11
Do 13 - 11, Store 13
Do 3 - 1, Store 10

Do 2 + 7, Store 7
Do 6 / 7, Store 11
Do 21 * 11, Store 12,  # use 21
Do 12 + 13, Store 13
Do 10 - 1, Store 10

# Inner loop
Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 8
Do 8 * 11, Store 11
Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 9
Do 9 * 11, Store 11
Do 22 * 11, Store 12,  # use 22
Do 12 + 13, Store 13
Do 10 - 1, Store 10

Do 1 + 3, Store 3
Do 23 - 13, Store 23,  # 23 done
Set 7 0, Set 13 0

Can we do better than that? Bromley notes that “the mechanism by which the sequencing of operations is obtained is obscure.” Furthermore, driven by what was probably a correct intuition about code/data separation, Babbage separated operation and variable cards, and this would have played havoc with control flow (Bromley again: “I am not convinced that Babbage had clearly resolved even the representational difficulties that his separation of operation and variable cards implies”).

I’m resolving those issues by straying into what Babbage might have done had he seen the need. In particular:

  • I assume a conditional jump mechanism, with Ifzero 1 goto A jumping (somehow) to Label A if register #1 is zero (if operation and variable cards are reunited, this can be easily done by moving forward or back the required number of cards)
  • I assume an additional category of card, with its own card queue, with each such card specifying an output register, and with the operations:
    • Q (in Do, Store, Set, or Ifzero): access the register specified by the next card in the card queue
    • ResetQ: wind back the card queue to the start
    • StopifemptyQ: stop if all the cards in the card queue have been read

Yes, that’s all very speculative – but something like that is needed to make Ada’s loops work. In addition, the card queue (plus the associated output registers) performs the role of the tape in Turing/Post machines, or the memory in modern computers. Something like it is therefore needed.

And here is Ada’s program in that modified form. It works, loops and all! I tested it for the first 12 Bernoulli numbers, which are 0.1666667, −0.03333333, 0.02380952
−0.03333333, 0.07575758, −0.2531136, 1.166667, −7.092157, 54.97118, −529.1242, 6192.123, and −86580.25 (numerical errors do accumulate as the sequence is continued).

Set 1 1, Set 2 2, Set 3 1

Label A

Do 2 * 3, Store 4, Store 5, Store 6
Do 4 - 1, Store 4
Do 5 + 1, Store 5
Do 4 / 5, Store 11
Do 11 / 2, Store 11
Do 13 - 11, Store 13
Do 3 - 1, Store 10

Ifzero 10 goto B
Do 2 + 7, Store 7
Do 6 / 7, Store 11
Do Q * 11, Store 12  # Using 21
Do 12 + 13, Store 13
Do 10 - 1, Store 10

Label B

# Inner loop
Ifzero 10 goto C
Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 8
Do 8 * 11, Store 11
Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 9
Do 9 * 11, Store 11
Do Q * 11, Store 12  # Using 22, etc.
Do 12 + 13, Store 13
Do 10 - 1, Store 10
Ifzero 14 goto B  # Unconditional jump

Label C

Do 1 + 3, Store 3
Do 14 - 13, Store Q  # Using register 14 as constant zero
StopifemptyQ

Set 7 0, Set 13 0, ResetQ
Ifzero 14 goto A  # Unconditional jump

And for those interested, here is an emulator (in R) which will read and execute that program. For a slightly different approach, see the online emulator here.

read.program <- function (f) {
	p <- readLines(f)
	p <- gsub(" *#.*$", "", p)  # remove comments
	p <- gsub(" *, *", ",", p)  # remove spaces after commas
	p <- p[p != ""]  # remove blank lines
	p <- paste0(p, collapse=",")  # join up lines
	p <- gsub(",+", ",", p)  # remove duplicate commas
	strsplit(p, ",")[[1]]  # split by commas
}

do.op <- function (x, op, y) {
	if (op == "+") x + y
	else if (op == "-") x - y
	else if (op == "*") x * y
	else if (op == "/") x / y
	else stop(paste0("Bad op: ", op))
}

emulate <- function(program, maxreg) {
	set.inst <- "^Set (Q|[0-9]*) (Q|[0-9]*)$"
	store.inst <- "^Store (Q|[0-9]*)$"
	do.inst <- "^Do (Q|[0-9]*) ([^ ]) (Q|[0-9]*)$"
	label.inst <- "^Label ([0-9A-Za-z]*)$"
	ifzero.inst <- "^Ifzero ([0-9]*) goto ([0-9A-Za-z]*)$"

	v <- rep(0, maxreg)
	op.result <- 0
	stopping <- FALSE
	pc <- 1
	queue <- 21:maxreg
	qptr <- 1
	
	while (pc <= length(program) && ! stopping) {
		p <- program[pc]
		if (grepl(set.inst, p)) {
			i <- gsub(set.inst, "\\1", p)
			j <- as.numeric(gsub(set.inst, "\\2", p))
			if (i == "Q") {
				i <- queue[qptr];
				qptr <- qptr + 1
			} else i <- as.numeric(i)
			v[i] <- j

		} else if (grepl(do.inst, p)) {
			i <- gsub(do.inst, "\\1", p)
			op <- gsub(do.inst, "\\2", p)
			j <- gsub(do.inst, "\\3", p)
			if (i == "Q") {
				i <- queue[qptr];
				qptr <- qptr + 1
			} else i <- as.numeric(i)
			if (j == "Q") {
				j <- queue[qptr];
				qptr <- qptr + 1
			} else j <- as.numeric(j)
			op.result <- do.op(v[i], op, v[j])

		} else if (grepl(store.inst, p)) {
			i <- gsub(store.inst, "\\1", p)
			if (i == "Q") {
				i <- queue[qptr];
				qptr <- qptr + 1
			} else i <- as.numeric(i)
			v[i] <- op.result

		} else if (grepl(ifzero.inst, p)) {
			i <- gsub(ifzero.inst, "\\1", p)
			if (i == "Q") {
				i <- queue[qptr];
				qptr <- qptr + 1
			} else i <- as.numeric(i)
			dest <- gsub(ifzero.inst, "\\2", p)
			j <- which(program == paste0("Label ", dest))
			if (v[i] == 0) pc <- j

		} else if (p == "StopifemptyQ") {
			if (qptr > length(queue)) stopping <- TRUE

		} else if (grepl(label.inst, p)) {
			# do nothing
			
		} else if (p == "ResetQ") {
			qptr <- 1
			
		} else stop(paste0("Bad instruction: ", p))
		pc <- pc + 1
	}
	v
}

emulate(program = read.program("ada.program.txt"), maxreg = 32)

Update: If we take Ada’s program as specifying implicit zeroing of unused registers, we get this slightly fancier version (which also works):

Set 1 1, Set 2 2, Set 3 1

Label A

Do 2 * 3, Store 4, Store 5, Store 6
Do 4 - 1, Store 4
Do 5 + 1, Store 5
Do 4 / 5 clearing 4 and 5
Store 11
Do 11 / 2, Store 11
Do 13 - 11 clearing 11
Store 13
Do 3 - 1, Store 10

Ifzero 10 goto B

Do 2 + 7, Store 7
Do 6 / 7, Store 11
Do Q * 11, Store 12  # Using 21
Do 12 + 13 clearing 12
Store 13
Do 10 - 1, Store 10

Label B

Ifzero 10 goto C  # Inner loop test

Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 8
Do 8 * 11 clearing 8
Store 11
Do 6 - 1, Store 6
Do 1 + 7, Store 7
Do 6 / 7, Store 9
Do 9 * 11 clearing 9
Store 11
Do Q * 11, Store 12  # Using 22, etc.
Do 12 + 13 clearing 12
Store 13
Do 10 - 1, Store 10
Goto B  # End of inner loop

Label C

Do 1 + 3, Store 3
Do 14 - 13 clearing 13
Store Q  # Using register 14 as constant zero
StopifemptyQ

Set 6 0, Set 7 0, Set 11 0, ResetQ
Goto A

Did the Difference Engine make a difference?

I have been reading a few steampunk novels lately – I have a great fondness for the genre. Charles Babbage’s planned “Difference Engine” and “Analytical Engine” always play a large part in the fictional universe of such books. However, as Francis Spufford has pointed out, this does rely on some counterfactual history.


Reconstructed “Difference Engine No. 2” in the Science Museum, London (photo: “Geni”)

Babbage never completed any of his major devices, although redesigned working difference engines were built by Per Georg Scheutz (1843), Martin Wiberg (1859), and George B. Grant (1876). With much fanfare, the Science Museum, London reconstructed Babbage’s “Difference Engine No. 2” between 1985 and 2002, making only essential fixes to the original design – and it works! However, the pinnacle of this kind of technology was probably the beautiful handheld Curta calculator, produced in Liechtenstein by Curt Herzstark from 1947.

The world’s first programmable digital computer was in fact built four years before the Curta, in 1943, by English electrical engineer Tommy Flowers. The wartime secrecy associated with his work has kept this monumental achievement largely in the dark.


Colossus in action at Bletchley Park in 1943 (photo: National Archives)

The significance of the Colossus has also been obscured by a kind of “personality cult” built up around Alan Turing, much like the one built up around Babbage. Turing was one of a number of people who contributed to the design of the cryptographic “Bombe” at Bletchley Park, and Turing also did important theoretical work – although the fundamental result in Turing’s 1936 paper, “On Computable Numbers, with an Application to the Entscheidungsproblem” was not actually new, as is revealed on the second page of Turing’s paper, where Turing admits “In a recent paper Alonzo Church has introduced an idea of ‘effective calculability,’ which is equivalent to my ‘computability,’ but is very differently defined. Church also reaches similar conclusions about the Entscheidungsproblem . The proof of equivalence between ‘computability’ and ‘effective calculability’ is outlined in an appendix to the present paper.

Turing’s life was more colourful than either Church’s or Flowers’s, however, and this may be why he is far more famous. In a similar way, Babage lived a more colourful life than many of his contemporaries, including his collaboration with the forward-thinking Countess of Lovelace.


1: Charles Babbage, 2: Augusta Ada King-Noel (née Byron, Countess of Lovelace), 3: Alonzo Church, 4: Alan Turing, 5: Tommy Flowers

The chart below (click to zoom) puts the work of Babbage and Flowers in a historical context. Various devices are ranked according to their computational power in decimal digits calculated per second (from 1 up to 1,000,000,000,000,000). Because this varies so dramatically, a logarithmic vertical scale is used. The Colossus marks the beginning of a chain of “supercomputers,” often built for government use, with power doubling every 1.84 years (pink line). Starting with the Intel 4004 in 1971, there is also a chain of silicon chips, with power doubling every 1.74 years (blue line). At any given point in time, supercomputers are between 1,000 and 3,000 times more powerful than the chips, but the chips always catch up around 20 years later. The revolutionary PDP-8 of 1965 sits between the two chains.

One of the things that stand out on this chart is the gap between Babbage’s Difference Engine and the later digital computers – even the Colossus was around 280 times more powerful than the Difference Engine (carrying out a simpler task much more quickly). Steampunk fiction often suggests that steam power would have made the Difference Engine faster. However, it turns out that the mechanism jams if it is cranked too quickly. Complex mechanical calculating devices simply cannot operate that fast.


Morse telegraph key (photo: Hp.Baumeler)

In fact, Charles Babbage may actually have distracted people from the way forward. Samuel Morse’s improved telegraph was officially operational in 1844. It used electromechanical principles that were also used in the Colossus a century later. Electricity also has the advantage of travelling at the speed of light, along wires that can be made extremely thin. What might the world have been like had electromechanical computing developed earlier? The chart also shows the 1964 fluidic computer FLODAC. This was a fascinating idea that was abandoned after a successful proof of concept (although a 1975 film portrayed it as the future). What if that idea had been launched in Victorian Britain?