Historical Notes

DEVELOPMENT REVIEW DEPLOYMENT - NOT READY FOR RELEASE

The authoritative reference for every historical claim in this module. Unit materials cite this page rather than restating history in their own words, so that a correction here propagates instead of leaving stale copies behind.

Each claim carries a verification status: established, contested, or unsourced. The labels are defined in course/references.md. Reference labels in square brackets — [P2], [S1] — resolve there.

A warning that is also the lesson: this is the part of the module where confident, fluent, wrong text is easiest to produce and hardest to notice. That applies to AI-generated drafts of this page, and it applied to the nineteenth-century printers too.


1. The people and the machine

Established. Charles Babbage designed the Analytical Engine, a general-purpose mechanical computing machine, from the 1830s onwards. It was never completed in his lifetime. Its architecture separated a "store" (memory) from a "mill" (processing), and it was to be programmed with punched cards adapted from the Jacquard loom. [S1], [S4]

Established. In 1840 Babbage lectured on the Engine in Turin. Luigi Federico Menabrea wrote up an account in French, published in 1842. [P1]

Established. Augusta Ada King, Countess of Lovelace, translated Menabrea's article into English and appended seven Notes, A to G, of her own. The translation with Notes appeared in 1843 in Taylor's Scientific Memoirs, volume 3. Her Notes run to roughly three times the length of the article she was translating (a commonly repeated characterisation of the 1843 text, not a figure the text itself states). [P2]

Established. Note G contains a table setting out, operation by operation, how the Engine would compute a Bernoulli number. [P2]


2. "The first program"

Contested — and the contest is the teaching point.

The claim "Note G contains the first computer program" is useful shorthand and a poor historical statement. What is actually disputed, and by whom:

How the module handles this. Unit 2 states only the checkable core: Note G was published in 1843 and contains an ordered operation table intended for the Analytical Engine. It reports “first program” as a common, contested retrospective description rather than claiming priority. It does not adjudicate the authorship question or pretend the question is settled in either direction.

A claim being contested does not make it unknowable or make all positions equal. It means the honest statement is "sources disagree, here is the disagreement", which is a different skill from repeating whichever version you met first.


3. The indexing convention in Note G

Established, and verified computationally.

Lovelace numbers only the Bernoulli numbers that are not zero. The odd-index Bernoulli numbers above the first are all zero, and in her scheme they simply do not receive labels. Her label numbers are therefore one smaller than the modern indices — her Bk is the modern Bk+1:

Lovelace's label modern index value
B₁ B₂ 1/6
B₃ B₄ -1/30
B₅ B₆ 1/42
B₇ B₈ -1/30

Note G's worked example computes her B₇, which is the modern B₈ = -1/30.

This mapping is implemented and tested in course/lab/reference_bernoulli.py (ada_to_modern_index, ADA_NOTE_G_INDEX_MAP) and covered by tests/test_reference_bernoulli.py.

Why the module makes so much of this. It is a specification hazard of exactly the kind that still causes defects: two systems, the same symbol, different meanings, and no error message when they meet. A learner who asks an AI to "reproduce Ada's Bernoulli calculation" and compares the result against a modern table will see a mismatch that is nobody's arithmetic error. The checker reports it as ada-indexing.


4. The error in the published table

Established: the table printed in Note G contains an error, and it is in operation 4.

Established (facsimile [P2a], accessed 2026-07-23): operation 4 acts on the variables ²V₅ and ²V₄, in that order, and its stated result is (2n−1)/(2n+1). Since V₄ holds 2n−1 and V₅ holds 2n+1, producing that result requires dividing V₄ by V₅. The table prints the operands the other way round. See the facsimile recorded at [P2a]; the diagram is headed "Diagram for the computation by the Engine of the Numbers of Bernoulli. See Note G (page 722 et seq.)", which is also the source for the page number now given in [P2].

Established (facsimile plus correction of record): the correct ordering is V₄ ÷ V₅; the published V₅ ÷ V₄ inverts the division. The location and the inversion are established by the facsimile [P2a] and the archival correction of record [S8], and corroborated by [S7], a detailed independent reconstruction, self-published. The corrected table computes −1/30 — Ada's B₇, the modern B₈.

Established (facsimile plus [S7] §5.2): operation 4 is not the only printed fault. Glaschick's errata list for the same table also records operation 24: "In line 24 the negative value of V₁₃ must be transferred to V₂₄, i.e. V₂₄ − V₁₃ must be calculated. Also, in the 6th column it must read = − B₇." As printed, operation 24 transfers the value without that sign inversion. Operation 21 carries further printed defects of the same kind. So "the table as printed" is not one faulty object with one result.

Established (recomputed in this module): the result depends on which question is asked, and there are at least four. course/lab/noteg.py reconstructs the 25 operations and runs them with exact arithmetic. The run that repairs both faults reproduces the documented −1/30, which is what earns trust in the reconstruction. The others then answer different questions:

What is executed Operation 4 Operation 24 Earlier B values Result
The intended computation repaired repaired supplied −1/30
One printed fault, in operation 4 as printed repaired supplied 139/630
The literal single table as printed as printed supplied −139/630
One printed fault, in operation 24 repaired as printed supplied 1/30
The faulty routine run from the start as printed repaired generated by itself −25621/630

Withdrawn: an earlier version of this module stated that "the as-printed table computes 139/630" and that the widely repeated −25621/630 "does not survive recomputation". Both statements were wrong, in the same way and for the same reason: they did not say which object was being executed. The 139/630 run repairs operation 24 without saying so, and −25621/630 reproduces exactly under the reading where the faulty routine generates the earlier Bernoulli numbers it then consumes — a reading Note G's operation 25 invites, since it increments n so the Engine can go round again. Those accounts do not state their interpretation; neither did this module. The error is retained here rather than quietly repaired, because it is the module's own instance of the failure it teaches.

Still contested: how it got there. The common description is a typesetting error rather than a mistake in the procedure Lovelace devised — Babbage's 1864 memoir records that she caught an error for him, and this one is often read as introduced in printing. But that attribution is an inference, not something the table itself can settle, and whether Babbage prepared or checked the table bears on the unsettled authorship question in section 2. Do not state the printer, or any individual, as the cause.

A caveat that is itself the lesson. The facsimile consulted is a single compressed web image [P2a]. From it, the operand order (V₅ before V₄) and the location (operation 4) are legible and match the secondary account; the division operator is small enough at that resolution to be easy to misread — on a first pass it can look like a plus sign. The value chain has now been recomputed from the operation sequence (course/lab/noteg.py), so each result rests on the module's own tested code rather than on repetition; a higher-resolution facsimile or the physical page in Scientific Memoirs vol. 3 would still settle the fine typography beyond doubt, and is needed before the operation-24 reading is treated as anything more than Glaschick's. What is settled now is the location of the operation-4 inversion, the operand order, and — by computation, under stated interpretations — what each reading of the table produces.

Why this restraint is the lesson, not a limitation. Unit 16's teaching point is not "here is an amusing bug in a famous document". It is that a published, respected, widely-cited table carried an error for a long time because readers trusted it instead of checking it, and that the specific story now attached to that error has itself propagated by repetition. A fluent AI system will produce a confident, detailed account of the Note G error on request. So will many websites. Being able to say "that is the common claim, here is what is actually established, here is what would settle it" is the transferable skill — and it is one this module has to model rather than only describe, which section 4 records it failing to do and then repairing.


5. The "originate anything" passage

Established that the passage appears in Note G [P2]. Lovelace writes that the Analytical Engine "has no pretensions whatever to originate anything", and that it can do "whatever we know how to order it to perform".

Contested what it implies for modern systems. Unit 17 asks learners to compare the claim with what a language model does, and is written to leave the question open rather than resolve it. Both of the easy readings are available and neither is obviously right:

The honest position is that Lovelace was writing about a specific machine she understood in detail, that the passage is being applied well outside its original context, and that the argument turns on what "originate" means — which is a philosophical question the module does not settle. Present it as a live question. Quote briefly; the source is public domain, so the limit is pedagogical rather than legal.


6. Claim register

Every historical claim the module makes should appear here, with its status split into the three things "established" used to run together: how well it is supported, whether anyone disagrees, and whether this module has actually read the source. Those are independent — a claim can be well supported and disputed, or uncontested and known only through somebody else's citation — and collapsing them is how "established" came to mean both "we checked it" and "nobody argues with it".

scripts/check_claims.py validates this table: ids unique, every status drawn from the closed vocabulary below, and every source key resolving to course/references.md.

There is no "cited but not read" status, and that is deliberate. A source is either checked or the claim does not go in. Naming a source you have not opened tells a reader that the claim rests on something, while leaving unexamined the only question that matters about it — and it is the same move as a generated citation that points at a real work saying something else. The vocabulary therefore records which kind of source was checked, primary or secondary, and none for a claim with no source at all. none is honest; it means unknown.

dimension values
support verified (checked against the source, or recomputed here) · supported (a source states it) · inferred (follows from the sources without being stated by them) · unverified (no check yet) · refuted
disagreement uncontested · disputed (sources disagree) · unresolved (the record cannot settle it)
source primary-checked (the original examined) · secondary-checked (a later work reporting it, read and located) · none (no source; the claim is unknown)
id claim support disagreement source sources
H1 Babbage designed the Analytical Engine; never completed in his lifetime supported uncontested secondary-checked [S1], [S4]
H2 Store and mill architecture, punched-card input supported uncontested secondary-checked [S1]
H3 Menabrea published a French account in 1842 supported uncontested primary-checked [P1]
H4 Lovelace translated it and added Notes A to G, published 1843 supported uncontested primary-checked [P2]
H5 The Notes are about three times the length of the article inferred uncontested primary-checked [P2]
H6 Note G contains an operation-by-operation Bernoulli computation verified uncontested primary-checked [P2]
H7 Note G's example computes Ada's B7 = modern B8 = -1/30 verified uncontested primary-checked [P2]
H8 Ada's B1, B3, B5, B7 are the modern B2, B4, B6, B8 verified uncontested primary-checked [P2]
H9 "The first program ever written" inferred disputed secondary-checked [S2], [S3], [S5]
H10 Extent of Lovelace's own contribution to the Notes unverified disputed secondary-checked [S2], [S3], [S5]
H11 The published table contains an error, in operation 4 verified uncontested primary-checked [P2a]
H12 The error is an inverted division, V5 divided by V4 where V4 divided by V5 is correct verified uncontested primary-checked [P2a], [S7]
H13 Operation 24 is also printed in a form the intended computation does not use supported uncontested secondary-checked [S7]
H14 With operation 4 as printed, operation 24 repaired and earlier values supplied, the table computes 139/630 verified uncontested primary-checked [S7]
H15 Taking both printed faults literally gives -139/630; repairing only operation 4 gives 1/30 verified uncontested primary-checked [S7]
H16 The repeated -25621/630 reproduces when the faulty routine generates its own earlier values verified uncontested primary-checked [S6], [S7]
H17 Which of those readings a given published account means unverified unresolved none
H18 The error was a typesetting slip rather than authorial inferred disputed secondary-checked [S8]
H19 "No pretensions whatever to originate anything" appears in Note G verified uncontested primary-checked [P2]
H20 What that passage implies about language models unverified disputed none

H14, H15 and H16 are recomputed by course/lab/noteg.py, whose tests assert each value; [S7] is cited for the operation sequence they run, and the arithmetic is this module's own. H13 rests on [S7] alone, which is why TODO.md Stage 6 carries a task for confirming operation 24 against a high-resolution facsimile.