Beinecke MS 408 · unknown script · early 15th century · working notes, September–October 2026

The Voynich manuscript: tests of the language, cipher and meaningless-text hypotheses

A genuine early-15th-century book. No text was obtained, and no published decipherment survives blind testing. Statistical tests on the transliteration exclude plaintext and simple substitution, transposition or abjad renderings of eleven European languages. Real ciphers used in 15th-century Italy, measured the same way, look nothing like it. What remains is an encoding of rigid glyph groups (a verbose cipher) or structured meaningless text; the evidence leans slightly to meaningless text.

Daniel Bourdeau · posted · updated

Method: not solved · Extent: text not obtained

At a glanceNot solved · text not obtained

The document
Beinecke MS 408: a genuine early-15th-century codex, vellum radiocarbon-dated 1404–1438, with provenance from Prague c.1600. Modern forgery is excluded.
How it was tried
Not a decipherment: five literature sweeps and six computational tests on the ZL transliteration against natural-language corpora and hoax generators, each re-run by a separate agent.
Ruled out
Plaintext, one-to-one substitution, transposition, abjad and null-padded renderings of eleven European languages. Character entropy sits at least 1.0 bit below the natural-language floor in raw EVA.
Still live
A verbose or slot-template encoding versus meaningless generation by copy-and-modify; every statistic that separates Voynichese from language is reproduced by a member of each class.
Judgement
Roughly even, about 45:50, the remainder on an unenciphered exotic language.

01 The question and the method

This is not a decipherment. The question was whether the text is meaningless, enciphered or a language, and how far public data can push that in one session. Five literature sweeps, one per hypothesis or evidence class, produced SOURCES.md. Six computational tests, a1 to a6, ran on the ZL transliteration against natural-language corpora and implemented hoax generators. A separate agent re-ran every test adversarially (v_a1 to v_a6) and corrected several; corrected figures are quoted. Two baseline scripts written before the agents ran reproduce the a1 and a2 headlines: h2 of 2.32 bits in raw EVA without spaces, Zipf slope −1.04, adjacent repeats 0.81%.

October 2026 update. Four follow-up analyses written in September but never folded into this page are now in it, each re-run and checked: v_b1 to v_b3 by separate agents, v_b4 by its September checking script, which had never been run: b1 re-segmentation (section 02), b2 long-range and page-level structure (section 08), b3 a fixed battery of 37 items run on every candidate generator (section 06), b4 higher-order entropies and intervals (section 03). Three new analyses answer points raised by RBA’s post “Not deciphering the Voynich manuscript” (22 September 2026) and a reader’s note on it: c1 adds constructed languages, the lowest-entropy natural languages and Markov chains (sections 03, 04, 06); c3 measures real 15th-century ciphertexts from this project’s own targets (section 07); c2 draws the charts. Every September number was reproduced from fresh downloads of the same corpora; the Italian control had to be re-anchored, since its source file had been rebuilt in a different order (section 13).

(S) marks a number computed this session by a named script; (L) one quoted from the literature, with source and year. Judgement carries an asterisk.

Data (S). ZL3b-n, the Zandbergen–Landini EVA transliteration (voynich.nu, 13 May 2025), paragraph text only: 34,116 tokens after dropping words with unread or extended-EVA glyphs, about 10,750 in Currier A and 22,900 in B, 7,236 word types. Cross-checked on RF1b-er, IT2a, GC2a (v101) and CD2a (Currier). The 2,463 uncertain spaces were treated as breaks; joining them changes nothing material (v_a2). Language controls are single Gutenberg books and an OCR’d 16th-century Italian corpus; since October also Bibles in low-entropy languages, Tatoeba sentences in constructed languages, and real 15th-century ciphertexts (sections 03 and 07). Entropies are plug-in; Miller–Madow moves h2 by at most 0.007.

02 Strongest counterargument first

Every character statistic assumes the transliteration, and that EVA spaces mark plaintext units. Latin re-segmented after every e, s and m moves 60% of the way to Voynichese slot rigidity, and Latin cut into vowel-final syllables is more rigid than Voynichese at equal length (S: v_a3). The exclusion therefore covers word-boundary-preserving encodings of eleven languages in modern orthography.

Tested since (S: b1, v_b1). Joining the 2,458 uncertain spaces lengthens words by 0.4 glyph and leaves h2 unchanged to the third decimal. Latin and Italian written one syllable per token do not reproduce Voynichese: ordinary syllables give h2 of 2.83 to 2.99 with the space counted, against 2.11, and at every token length from two to five glyphs they are 1.6 to 8 times less rigid than merged Voynichese. Syllables trimmed to consonant plus vowel do hit h2 2.05 to 2.12, but that is the shape of the token, not the language: a random generator of C, V and CV tokens gives 2.10 to 2.16, and such texts have about 100 word types and 1–6% hapax. What stays open is glyph groups spelling syllables inside word-sized tokens, which is hypothesis (a) in section 10, not a segmentation artefact.

Second, the verbose control that matches raw EVA on h1, h2 and their ratio at once produces words 2.3 times too long, 11.52 symbols against 5.07, while carrying Latin word entropy (S: v_a1). That refutes a letter-level verbose cipher of whole Latin words. Both points narrow the verdict. Neither overturns it.

03 Character level

The firmest result is conditional character entropy h2, the uncertainty of a glyph given the one before it. Bennett (1976) put Voynichese at 2.22 bits against 3.01 to 3.37 for European languages (L); Lindemann & Bowern (2021) found it below all 311 language samples in their Wikipedia corpus (L). The gap survives glyph merging and the Currier and v101 alphabets. All rows (S), no spaces, a1, v_a1 and v_a5.

texth1h2h1−h2h2/h1mean word length
ZL raw EVA, Currier A3.8322.3531.4790.6144.98
ZL raw EVA, Currier B3.8592.1821.6770.5655.12
ZL raw EVA, all3.8652.3111.5540.5985.07
ZL merged (benches, i/e groups, aiin, qo)4.0392.8701.1700.7103.7–3.9
GC v101 (68 symbols)4.1442.8931.250.6983.7–4.0
Currier CD2a (35 symbols)3.8572.6601.1970.690
Latin, Aeneid4.0253.5100.5150.8725.77
German (diacritics folded 3.335)4.1603.3910.7690.8154.88
Range of 11 languages (floor 3.32 folded)3.94–4.523.32–3.880.49–0.770.82–0.884.2–6.6
Latin, vowels removed3.6593.5150.1440.9613.11
Verbose cipher of Latin, every letter 2–3 symbols, 24 symbols3.9012.3251.5760.59611.52
Verbose cipher, 8 letters kept single4.1022.9161.1860.7117.64

Raw EVA gives 2.18 to 2.35 bits; ZL merged, v101 and Currier give 2.66 to 2.89; the eleven-language floor is 3.32 with diacritics folded. Any transposition of Latin gives at least 3.44. Vowel deletion leaves Latin at 3.52 with h2/h1 of 0.961, the wrong direction for an abjad.

Two conventions, and the lowest languages anywhere

The table leaves the space out. Lindemann & Bowern (2021) count it as a character, which lowers every h2. Measured their way, the ZL text gives 2.117 in raw EVA and 2.509 with merged glyphs, against their 2.114 for EVA (“Full Maximal”) and 2.475 for their Currier-style merge (“Minimal”) (S: c1; L). The two sets of figures agree once the convention is matched; they must not be mixed. Their appendix gives h2 and alphabet size for 311 Wikipedia samples, the lowest being Hawaiian at 2.765, then Venda, Tswana, Min Dong and Tahitian (L). To test the low end directly, c1 measured the same way six transliterations of the manuscript, the eleven European languages, public-domain Bibles in Hawaiian (1868), Tongan, Māori, Setswana and Swahili, the Latin Vulgate as a same-genre control, and four constructed languages: Esperanto, Volapük, Lojban and Toki Pona. Every text was cut to the Voynich token count (S: c1).

2.0 2.5 3.0 3.5 4.0 10 20 30 40 50 60 70 80 alphabet size, space included h2, bits per character (space counted) Abkhazian (Cyrillic script), Wikipedia: h2 3.571, 44 characters (Lindemann & Bowern 2021) Acehnese (Latin script), Wikipedia: h2 3.208, 33 characters (Lindemann & Bowern 2021) Adyghe (Cyrillic script), Wikipedia: h2 3.403, 36 characters (Lindemann & Bowern 2021) Afrikaans (Latin script), Wikipedia: h2 3.375, 31 characters (Lindemann & Bowern 2021) Akan (Latin script), Wikipedia: h2 3.321, 31 characters (Lindemann & Bowern 2021) Albanian (Latin script), Wikipedia: h2 3.387, 30 characters (Lindemann & Bowern 2021) Alemannic (Latin script), Wikipedia: h2 3.542, 38 characters (Lindemann & Bowern 2021) Anglo Saxon (Latin script), Wikipedia: h2 3.605, 41 characters (Lindemann & Bowern 2021) Arabic (Arabic script), Wikipedia: h2 3.702, 44 characters (Lindemann & Bowern 2021) Aragonese (Latin script), Wikipedia: h2 3.293, 34 characters (Lindemann & Bowern 2021) Aramaic (Syriac script), Wikipedia: h2 3.483, 40 characters (Lindemann & Bowern 2021) Armenian (Armenian script), Wikipedia: h2 3.376, 40 characters (Lindemann & Bowern 2021) Aromanian (Latin script), Wikipedia: h2 3.440, 42 characters (Lindemann & Bowern 2021) Assamese (Bengali script), Wikipedia: h2 3.760, 63 characters (Lindemann & Bowern 2021) Asturian (Latin script), Wikipedia: h2 3.308, 36 characters (Lindemann & Bowern 2021) Atikamekw (Latin script), Wikipedia: h2 2.953, 28 characters (Lindemann & Bowern 2021) Avar (Cyrillic script), Wikipedia: h2 3.355, 37 characters (Lindemann & Bowern 2021) Awadhi (Devanagari script), Wikipedia: h2 3.746, 69 characters (Lindemann & Bowern 2021) Aymara (Latin script), Wikipedia: h2 3.185, 39 characters (Lindemann & Bowern 2021) Azerbaijani (Latin script), Wikipedia: h2 3.644, 34 characters (Lindemann & Bowern 2021) Balinese (Latin script), Wikipedia: h2 3.180, 27 characters (Lindemann & Bowern 2021) Bambara (Latin script), Wikipedia: h2 3.191, 38 characters (Lindemann & Bowern 2021) Banjar (Latin script), Wikipedia: h2 3.175, 28 characters (Lindemann & Bowern 2021) Banyumasan (Latin script), Wikipedia: h2 3.257, 28 characters (Lindemann & Bowern 2021) Bashkir (Cyrillic script), Wikipedia: h2 3.691, 42 characters (Lindemann & Bowern 2021) Basque (Latin script), Wikipedia: h2 3.250, 27 characters (Lindemann & Bowern 2021) Bavarian (Latin script), Wikipedia: h2 3.550, 34 characters (Lindemann & Bowern 2021) Belarusian (Cyrillic script), Wikipedia: h2 3.566, 33 characters (Lindemann & Bowern 2021) Belarusian (Taraˇskievica) (Cyrillic script), Wikipedia: h2 3.567, 35 characters (Lindemann & Bowern 2021) Bengali (Bengali script), Wikipedia: h2 3.665, 62 characters (Lindemann & Bowern 2021) Bihari (Devanagari script), Wikipedia: h2 3.618, 68 characters (Lindemann & Bowern 2021) Bishnupriya Manipuri (Bengali script), Wikipedia: h2 3.545, 63 characters (Lindemann & Bowern 2021) Bislama (Latin script), Wikipedia: h2 3.126, 29 characters (Lindemann & Bowern 2021) Bosnian (Latin script), Wikipedia: h2 3.468, 33 characters (Lindemann & Bowern 2021) Breton (Latin script), Wikipedia: h2 3.322, 35 characters (Lindemann & Bowern 2021) Buginese (Buginese) (Buginese script), Wikipedia: h2 3.365, 29 characters (Lindemann & Bowern 2021) Buginese (Latin) (Latin script), Wikipedia: h2 3.278, 28 characters (Lindemann & Bowern 2021) Bulgarian (Cyrillic script), Wikipedia: h2 3.476, 31 characters (Lindemann & Bowern 2021) Burmese (Myanmar script), Wikipedia: h2 3.324, 62 characters (Lindemann & Bowern 2021) Buryat (Cyrillic script), Wikipedia: h2 3.503, 35 characters (Lindemann & Bowern 2021) Catalan (Latin script), Wikipedia: h2 3.370, 41 characters (Lindemann & Bowern 2021) Cebuano (Latin script), Wikipedia: h2 3.186, 32 characters (Lindemann & Bowern 2021) Central Bicolano (Latin script), Wikipedia: h2 3.212, 35 characters (Lindemann & Bowern 2021) Chamorro (Latin script), Wikipedia: h2 3.291, 34 characters (Lindemann & Bowern 2021) Chechen (Cyrillic script), Wikipedia: h2 3.672, 35 characters (Lindemann & Bowern 2021) Cheyenne (Latin script), Wikipedia: h2 3.194, 39 characters (Lindemann & Bowern 2021) Chichewa (Latin script), Wikipedia: h2 3.246, 28 characters (Lindemann & Bowern 2021) Chuvash (Cyrillic script), Wikipedia: h2 3.620, 38 characters (Lindemann & Bowern 2021) Cornish (Latin script), Wikipedia: h2 3.385, 30 characters (Lindemann & Bowern 2021) Corsican (Latin script), Wikipedia: h2 3.232, 33 characters (Lindemann & Bowern 2021) Cree (Latin script), Wikipedia: h2 2.992, 29 characters (Lindemann & Bowern 2021) Crimean Tatar (Latin script), Wikipedia: h2 3.589, 35 characters (Lindemann & Bowern 2021) Croatian (Latin script), Wikipedia: h2 3.464, 32 characters (Lindemann & Bowern 2021) Czech (Latin script), Wikipedia: h2 3.745, 41 characters (Lindemann & Bowern 2021) Danish (Latin script), Wikipedia: h2 3.476, 30 characters (Lindemann & Bowern 2021) Dinka (Latin script), Wikipedia: h2 3.469, 35 characters (Lindemann & Bowern 2021) Divehi (Thaana script), Wikipedia: h2 3.138, 51 characters (Lindemann & Bowern 2021) Doteli (Devanagari script), Wikipedia: h2 3.824, 71 characters (Lindemann & Bowern 2021) Dutch (Latin script), Wikipedia: h2 3.332, 30 characters (Lindemann & Bowern 2021) Dutch Low Saxon (Latin script), Wikipedia: h2 3.393, 35 characters (Lindemann & Bowern 2021) Dzongkha (Tibetan script), Wikipedia: h2 3.076, 63 characters (Lindemann & Bowern 2021) Egyptian Arabic (Arabic script), Wikipedia: h2 3.663, 47 characters (Lindemann & Bowern 2021) Emilian-Romagnol (Latin script), Wikipedia: h2 3.525, 53 characters (Lindemann & Bowern 2021) English (Latin script), Wikipedia: h2 3.403, 27 characters (Lindemann & Bowern 2021) Erzya (Cyrillic script), Wikipedia: h2 3.518, 34 characters (Lindemann & Bowern 2021) Esperanto (Latin script), Wikipedia: h2 3.305, 34 characters (Lindemann & Bowern 2021) Estonian (Latin script), Wikipedia: h2 3.536, 34 characters (Lindemann & Bowern 2021) Ewe (Latin script), Wikipedia: h2 3.188, 43 characters (Lindemann & Bowern 2021) Extremaduran (Latin script), Wikipedia: h2 3.354, 35 characters (Lindemann & Bowern 2021) Faroese (Latin script), Wikipedia: h2 3.523, 34 characters (Lindemann & Bowern 2021) Fiji Hindi (Latin script), Wikipedia: h2 3.411, 34 characters (Lindemann & Bowern 2021) Fijian (Latin script), Wikipedia: h2 2.888, 27 characters (Lindemann & Bowern 2021) Finnish (Latin script), Wikipedia: h2 3.475, 28 characters (Lindemann & Bowern 2021) Franco-Proven¸cal (Latin script), Wikipedia: h2 3.461, 41 characters (Lindemann & Bowern 2021) French (Latin script), Wikipedia: h2 3.354, 39 characters (Lindemann & Bowern 2021) Friulian (Latin script), Wikipedia: h2 3.284, 38 characters (Lindemann & Bowern 2021) Fula (Latin script), Wikipedia: h2 3.364, 37 characters (Lindemann & Bowern 2021) Gagauz (Latin script), Wikipedia: h2 3.570, 38 characters (Lindemann & Bowern 2021) Galician (Latin script), Wikipedia: h2 3.314, 34 characters (Lindemann & Bowern 2021) Georgian (Georgian script), Wikipedia: h2 3.566, 43 characters (Lindemann & Bowern 2021) German (Latin script), Wikipedia: h2 3.394, 31 characters (Lindemann & Bowern 2021) Gilaki (Arabic script), Wikipedia: h2 3.854, 49 characters (Lindemann & Bowern 2021) Goan Konkani (Devanagari script), Wikipedia: h2 3.659, 76 characters (Lindemann & Bowern 2021) Gorontalo (Latin script), Wikipedia: h2 3.258, 32 characters (Lindemann & Bowern 2021) Gothic (Gothic script), Wikipedia: h2 3.321, 28 characters (Lindemann & Bowern 2021) Greek (Greek script), Wikipedia: h2 3.519, 34 characters (Lindemann & Bowern 2021) Greenlandic (Latin script), Wikipedia: h2 3.055, 29 characters (Lindemann & Bowern 2021) Guarani (Latin script), Wikipedia: h2 3.435, 48 characters (Lindemann & Bowern 2021) Guianan Creole (Latin script), Wikipedia: h2 3.224, 31 characters (Lindemann & Bowern 2021) Gujarati (Gujarati script), Wikipedia: h2 3.732, 69 characters (Lindemann & Bowern 2021) Haitian (Latin script), Wikipedia: h2 3.385, 35 characters (Lindemann & Bowern 2021) Hakka (Latin script), Wikipedia: h2 2.857, 44 characters (Lindemann & Bowern 2021) Hausa (Latin script), Wikipedia: h2 3.105, 31 characters (Lindemann & Bowern 2021) Hawaiian (Latin script), Wikipedia: h2 2.765, 31 characters (Lindemann & Bowern 2021) Hebrew (Hebrew script), Wikipedia: h2 3.664, 28 characters (Lindemann & Bowern 2021) Hill Mari (Cyrillic script), Wikipedia: h2 3.701, 37 characters (Lindemann & Bowern 2021) Hindi (Devanagari script), Wikipedia: h2 3.623, 71 characters (Lindemann & Bowern 2021) Hungarian (Latin script), Wikipedia: h2 3.742, 35 characters (Lindemann & Bowern 2021) Icelandic (Latin script), Wikipedia: h2 3.596, 36 characters (Lindemann & Bowern 2021) Ido (Latin script), Wikipedia: h2 3.329, 33 characters (Lindemann & Bowern 2021) Igbo (Latin script), Wikipedia: h2 3.380, 44 characters (Lindemann & Bowern 2021) Ilokano (Latin script), Wikipedia: h2 3.163, 28 characters (Lindemann & Bowern 2021) Inari Sami (Latin script), Wikipedia: h2 3.769, 36 characters (Lindemann & Bowern 2021) Indonesian (Latin script), Wikipedia: h2 3.222, 26 characters (Lindemann & Bowern 2021) Ingush (Cyrillic script), Wikipedia: h2 3.649, 37 characters (Lindemann & Bowern 2021) Interlingua (Latin script), Wikipedia: h2 3.244, 28 characters (Lindemann & Bowern 2021) Interlingue (Latin script), Wikipedia: h2 3.380, 38 characters (Lindemann & Bowern 2021) Inuktitut (Latin) (Latin script), Wikipedia: h2 3.129, 25 characters (Lindemann & Bowern 2021) Inupiak (Latin script), Wikipedia: h2 3.350, 39 characters (Lindemann & Bowern 2021) Irish (Latin script), Wikipedia: h2 3.338, 31 characters (Lindemann & Bowern 2021) Italian (Latin script), Wikipedia: h2 3.272, 33 characters (Lindemann & Bowern 2021) Jamaican Patois (Latin script), Wikipedia: h2 3.387, 27 characters (Lindemann & Bowern 2021) Javanese (Latin script), Wikipedia: h2 3.238, 29 characters (Lindemann & Bowern 2021) Kabardian Circassian (Cyrillic script), Wikipedia: h2 3.367, 35 characters (Lindemann & Bowern 2021) Kabiye (Latin script), Wikipedia: h2 3.302, 40 characters (Lindemann & Bowern 2021) Kabyle (Latin script), Wikipedia: h2 3.458, 39 characters (Lindemann & Bowern 2021) Kalmyk (Cyrillic script), Wikipedia: h2 3.863, 41 characters (Lindemann & Bowern 2021) Kannada (Kannada script), Wikipedia: h2 3.773, 66 characters (Lindemann & Bowern 2021) Kapampangan (Latin script), Wikipedia: h2 3.063, 31 characters (Lindemann & Bowern 2021) Karachay-Balkar (Cyrillic script), Wikipedia: h2 3.476, 34 characters (Lindemann & Bowern 2021) Karakalpak (Latin script), Wikipedia: h2 3.509, 37 characters (Lindemann & Bowern 2021) Kashmiri (Arabic) (Arabic script), Wikipedia: h2 3.872, 79 characters (Lindemann & Bowern 2021) Kashmiri (Devanagari) (Devanagari script), Wikipedia: h2 3.864, 69 characters (Lindemann & Bowern 2021) Kashubian (Latin script), Wikipedia: h2 3.750, 40 characters (Lindemann & Bowern 2021) Kazakh (Cyrillic script), Wikipedia: h2 3.496, 40 characters (Lindemann & Bowern 2021) Khmer (Khmer script), Wikipedia: h2 4.138, 79 characters (Lindemann & Bowern 2021) Kikuyu (Latin script), Wikipedia: h2 3.152, 32 characters (Lindemann & Bowern 2021) Kinyarwanda (Latin script), Wikipedia: h2 3.136, 29 characters (Lindemann & Bowern 2021) Kirghiz (Cyrillic script), Wikipedia: h2 3.605, 37 characters (Lindemann & Bowern 2021) Kirundi (Latin script), Wikipedia: h2 3.074, 28 characters (Lindemann & Bowern 2021) Komi (Cyrillic script), Wikipedia: h2 3.706, 36 characters (Lindemann & Bowern 2021) Komi-Permyak (Cyrillic script), Wikipedia: h2 3.743, 36 characters (Lindemann & Bowern 2021) Kongo (Latin script), Wikipedia: h2 3.141, 38 characters (Lindemann & Bowern 2021) Kotava (Latin script), Wikipedia: h2 3.454, 30 characters (Lindemann & Bowern 2021) Kurdish (Latin script), Wikipedia: h2 3.386, 35 characters (Lindemann & Bowern 2021) Ladin (Latin script), Wikipedia: h2 3.394, 46 characters (Lindemann & Bowern 2021) Ladino (Latin script), Wikipedia: h2 3.305, 32 characters (Lindemann & Bowern 2021) Lak (Cyrillic script), Wikipedia: h2 3.454, 36 characters (Lindemann & Bowern 2021) Lao (Lao script), Wikipedia: h2 4.030, 55 characters (Lindemann & Bowern 2021) Latgalian (Latin script), Wikipedia: h2 3.606, 36 characters (Lindemann & Bowern 2021) Latin (Latin script), Wikipedia: h2 3.412, 28 characters (Lindemann & Bowern 2021) Latvian (Latin script), Wikipedia: h2 3.634, 36 characters (Lindemann & Bowern 2021) Lezgian (Cyrillic script), Wikipedia: h2 3.411, 33 characters (Lindemann & Bowern 2021) Ligurian (Latin script), Wikipedia: h2 3.475, 51 characters (Lindemann & Bowern 2021) Limburgish (Latin script), Wikipedia: h2 3.436, 34 characters (Lindemann & Bowern 2021) Lingala (Latin script), Wikipedia: h2 3.222, 46 characters (Lindemann & Bowern 2021) Lingua Franca Nova (Latin script), Wikipedia: h2 3.111, 28 characters (Lindemann & Bowern 2021) Lithuanian (Latin script), Wikipedia: h2 3.573, 36 characters (Lindemann & Bowern 2021) Livvi-Karelian (Latin script), Wikipedia: h2 3.571, 31 characters (Lindemann & Bowern 2021) Lojban (Latin script), Wikipedia: h2 3.140, 28 characters (Lindemann & Bowern 2021) Lombard (Latin script), Wikipedia: h2 3.444, 41 characters (Lindemann & Bowern 2021) Low Saxon (Latin script), Wikipedia: h2 3.390, 30 characters (Lindemann & Bowern 2021) Lower Sorbian (Latin script), Wikipedia: h2 3.626, 39 characters (Lindemann & Bowern 2021) Luganda (Latin script), Wikipedia: h2 3.158, 27 characters (Lindemann & Bowern 2021) Luxembourgisch (Latin script), Wikipedia: h2 3.423, 33 characters (Lindemann & Bowern 2021) Macedonian (Cyrillic script), Wikipedia: h2 3.407, 31 characters (Lindemann & Bowern 2021) Madurese (Latin script), Wikipedia: h2 3.394, 34 characters (Lindemann & Bowern 2021) Maithili (Devanagari script), Wikipedia: h2 3.831, 73 characters (Lindemann & Bowern 2021) Malagasy (Latin script), Wikipedia: h2 2.944, 34 characters (Lindemann & Bowern 2021) Malay (Latin script), Wikipedia: h2 3.186, 27 characters (Lindemann & Bowern 2021) Malayalam (Malayalam script), Wikipedia: h2 3.702, 77 characters (Lindemann & Bowern 2021) Maltese (Latin script), Wikipedia: h2 3.515, 32 characters (Lindemann & Bowern 2021) Manx (Latin script), Wikipedia: h2 3.373, 33 characters (Lindemann & Bowern 2021) Maori (Latin script), Wikipedia: h2 2.875, 33 characters (Lindemann & Bowern 2021) Marathi (Devanagari script), Wikipedia: h2 3.689, 78 characters (Lindemann & Bowern 2021) Mazandarani (Arabic script), Wikipedia: h2 3.660, 46 characters (Lindemann & Bowern 2021) Meadow Mari (Cyrillic script), Wikipedia: h2 3.549, 38 characters (Lindemann & Bowern 2021) Min Dong (Latin script), Wikipedia: h2 2.841, 48 characters (Lindemann & Bowern 2021) Min Nan (Latin script), Wikipedia: h2 3.066, 49 characters (Lindemann & Bowern 2021) Minangkabau (Latin script), Wikipedia: h2 3.181, 27 characters (Lindemann & Bowern 2021) Mingrelian (Georgian script), Wikipedia: h2 3.580, 40 characters (Lindemann & Bowern 2021) Mirandese (Latin script), Wikipedia: h2 3.309, 33 characters (Lindemann & Bowern 2021) Moksha (Cyrillic script), Wikipedia: h2 3.474, 34 characters (Lindemann & Bowern 2021) Mon (Myanmar script), Wikipedia: h2 3.570, 74 characters (Lindemann & Bowern 2021) Mongolian (Cyrillic script), Wikipedia: h2 3.559, 35 characters (Lindemann & Bowern 2021) Moroccan Arabic (Arabic script), Wikipedia: h2 3.725, 46 characters (Lindemann & Bowern 2021) N’Ko (N’Ko script), Wikipedia: h2 2.970, 48 characters (Lindemann & Bowern 2021) Nahuatl (Latin script), Wikipedia: h2 3.227, 36 characters (Lindemann & Bowern 2021) Nauruan (Latin script), Wikipedia: h2 3.405, 51 characters (Lindemann & Bowern 2021) Navajo (Latin script), Wikipedia: h2 3.366, 37 characters (Lindemann & Bowern 2021) Neapolitan (Latin script), Wikipedia: h2 3.291, 40 characters (Lindemann & Bowern 2021) Nepali (Devanagari script), Wikipedia: h2 3.770, 68 characters (Lindemann & Bowern 2021) Newar (Devanagari script), Wikipedia: h2 3.750, 76 characters (Lindemann & Bowern 2021) Nias (Latin script), Wikipedia: h2 3.077, 29 characters (Lindemann & Bowern 2021) Norfolk (Latin script), Wikipedia: h2 3.497, 34 characters (Lindemann & Bowern 2021) Norman (Latin script), Wikipedia: h2 3.364, 41 characters (Lindemann & Bowern 2021) North Frisian (Latin script), Wikipedia: h2 3.499, 36 characters (Lindemann & Bowern 2021) Northern Sami (Latin script), Wikipedia: h2 3.607, 41 characters (Lindemann & Bowern 2021) Northern Sotho (Latin script), Wikipedia: h2 2.950, 30 characters (Lindemann & Bowern 2021) Norwegian (Bokma˚al) (Latin script), Wikipedia: h2 3.475, 32 characters (Lindemann & Bowern 2021) Norwegian (Nynorsk) (Latin script), Wikipedia: h2 3.496, 32 characters (Lindemann & Bowern 2021) Novial (Latin script), Wikipedia: h2 3.325, 33 characters (Lindemann & Bowern 2021) Occitan (Latin script), Wikipedia: h2 3.358, 38 characters (Lindemann & Bowern 2021) Old Church Slavonic (Cyrillic script), Wikipedia: h2 3.398, 50 characters (Lindemann & Bowern 2021) Oriya (Odia script), Wikipedia: h2 3.742, 66 characters (Lindemann & Bowern 2021) Oromo (Latin script), Wikipedia: h2 3.193, 29 characters (Lindemann & Bowern 2021) Ossetian (Cyrillic script), Wikipedia: h2 3.651, 33 characters (Lindemann & Bowern 2021) Palatinate German (Latin script), Wikipedia: h2 3.440, 38 characters (Lindemann & Bowern 2021) Pali (Devanagari) (Devanagari script), Wikipedia: h2 3.694, 62 characters (Lindemann & Bowern 2021) Pali (Latin) (Latin script), Wikipedia: h2 2.905, 32 characters (Lindemann & Bowern 2021) Pangasinan (Latin script), Wikipedia: h2 3.166, 27 characters (Lindemann & Bowern 2021) Papiamentu (Latin script), Wikipedia: h2 3.344, 38 characters (Lindemann & Bowern 2021) Pashto (Arabic script), Wikipedia: h2 3.651, 52 characters (Lindemann & Bowern 2021) Pennsylvania German (Latin script), Wikipedia: h2 3.381, 31 characters (Lindemann & Bowern 2021) Persian (Arabic script), Wikipedia: h2 3.651, 42 characters (Lindemann & Bowern 2021) Picard (Latin script), Wikipedia: h2 3.397, 39 characters (Lindemann & Bowern 2021) Piedmontese (Latin script), Wikipedia: h2 3.318, 35 characters (Lindemann & Bowern 2021) Polish (Latin script), Wikipedia: h2 3.638, 35 characters (Lindemann & Bowern 2021) Pontic (Greek script), Wikipedia: h2 3.534, 38 characters (Lindemann & Bowern 2021) Portuguese (Latin script), Wikipedia: h2 3.316, 39 characters (Lindemann & Bowern 2021) Punjabi (Gurmukhi script), Wikipedia: h2 3.577, 64 characters (Lindemann & Bowern 2021) Quechua (Latin script), Wikipedia: h2 3.197, 35 characters (Lindemann & Bowern 2021) Ripuarian (Latin script), Wikipedia: h2 3.556, 35 characters (Lindemann & Bowern 2021) Romani (Latin script), Wikipedia: h2 3.294, 38 characters (Lindemann & Bowern 2021) Romanian (Latin script), Wikipedia: h2 3.416, 31 characters (Lindemann & Bowern 2021) Romansh (Latin script), Wikipedia: h2 3.306, 34 characters (Lindemann & Bowern 2021) Russian (Cyrillic script), Wikipedia: h2 3.619, 34 characters (Lindemann & Bowern 2021) Rusyn (Cyrillic script), Wikipedia: h2 3.740, 38 characters (Lindemann & Bowern 2021) Saaraiki (Arabic script), Wikipedia: h2 3.679, 57 characters (Lindemann & Bowern 2021) Sakha (Cyrillic script), Wikipedia: h2 3.617, 39 characters (Lindemann & Bowern 2021) Sakizaya (Latin script), Wikipedia: h2 2.948, 27 characters (Lindemann & Bowern 2021) Samoan (Latin script), Wikipedia: h2 2.992, 32 characters (Lindemann & Bowern 2021) Samogitian (Latin script), Wikipedia: h2 3.599, 36 characters (Lindemann & Bowern 2021) Sango (Latin script), Wikipedia: h2 2.862, 38 characters (Lindemann & Bowern 2021) Sanskrit (Devanagari script), Wikipedia: h2 3.728, 76 characters (Lindemann & Bowern 2021) Santali (Ol Chiki script), Wikipedia: h2 3.391, 37 characters (Lindemann & Bowern 2021) Sardinian (Latin script), Wikipedia: h2 3.230, 33 characters (Lindemann & Bowern 2021) Saterland Frisian (Latin script), Wikipedia: h2 3.384, 30 characters (Lindemann & Bowern 2021) Scots (Latin script), Wikipedia: h2 3.417, 27 characters (Lindemann & Bowern 2021) Scottish Gaelic (Latin script), Wikipedia: h2 3.145, 33 characters (Lindemann & Bowern 2021) Serbian (Cyrillic script), Wikipedia: h2 3.458, 31 characters (Lindemann & Bowern 2021) Serbo-Croatian (Latin script), Wikipedia: h2 3.472, 31 characters (Lindemann & Bowern 2021) Sesotho (Latin script), Wikipedia: h2 3.004, 28 characters (Lindemann & Bowern 2021) Shona (Latin script), Wikipedia: h2 3.169, 27 characters (Lindemann & Bowern 2021) Sicilian (Latin script), Wikipedia: h2 3.214, 38 characters (Lindemann & Bowern 2021) Silesian (Latin script), Wikipedia: h2 3.767, 46 characters (Lindemann & Bowern 2021) Simple English (Latin script), Wikipedia: h2 3.362, 27 characters (Lindemann & Bowern 2021) Sindhi (Arabic script), Wikipedia: h2 3.694, 62 characters (Lindemann & Bowern 2021) Sinhalese (Sinhala script), Wikipedia: h2 3.799, 76 characters (Lindemann & Bowern 2021) Slovak (Latin script), Wikipedia: h2 3.737, 42 characters (Lindemann & Bowern 2021) Slovenian (Latin script), Wikipedia: h2 3.516, 31 characters (Lindemann & Bowern 2021) Somali (Latin script), Wikipedia: h2 3.268, 28 characters (Lindemann & Bowern 2021) Sorani (Arabic script), Wikipedia: h2 3.452, 39 characters (Lindemann & Bowern 2021) South Azerbaijani (Arabic script), Wikipedia: h2 3.717, 49 characters (Lindemann & Bowern 2021) Spanish (Latin script), Wikipedia: h2 3.291, 33 characters (Lindemann & Bowern 2021) Sranan (Latin script), Wikipedia: h2 3.185, 35 characters (Lindemann & Bowern 2021) Sundanese (Latin script), Wikipedia: h2 3.368, 28 characters (Lindemann & Bowern 2021) Swahili (Latin script), Wikipedia: h2 3.084, 26 characters (Lindemann & Bowern 2021) Swati (Latin script), Wikipedia: h2 3.195, 29 characters (Lindemann & Bowern 2021) Swedish (Latin script), Wikipedia: h2 3.539, 31 characters (Lindemann & Bowern 2021) Tagalog (Latin script), Wikipedia: h2 3.059, 27 characters (Lindemann & Bowern 2021) Tahitian (Latin script), Wikipedia: h2 2.846, 43 characters (Lindemann & Bowern 2021) Tajik (Cyrillic script), Wikipedia: h2 3.614, 40 characters (Lindemann & Bowern 2021) Tamil (Tamil script), Wikipedia: h2 3.327, 49 characters (Lindemann & Bowern 2021) Tarantino (Latin script), Wikipedia: h2 3.109, 35 characters (Lindemann & Bowern 2021) Tatar (Cyrillic) (Cyrillic script), Wikipedia: h2 3.670, 38 characters (Lindemann & Bowern 2021) Tatar (Latin) (Latin script), Wikipedia: h2 3.749, 41 characters (Lindemann & Bowern 2021) Telugu (Telugu script), Wikipedia: h2 3.783, 67 characters (Lindemann & Bowern 2021) Tetum (Latin script), Wikipedia: h2 3.446, 37 characters (Lindemann & Bowern 2021) Thai (Thai script), Wikipedia: h2 4.247, 68 characters (Lindemann & Bowern 2021) Tok Pisin (Latin script), Wikipedia: h2 3.135, 27 characters (Lindemann & Bowern 2021) Tongan (Latin script), Wikipedia: h2 2.945, 34 characters (Lindemann & Bowern 2021) Tsonga (Latin script), Wikipedia: h2 2.970, 28 characters (Lindemann & Bowern 2021) Tswana (Latin script), Wikipedia: h2 2.816, 28 characters (Lindemann & Bowern 2021) Tulu (Kannada script), Wikipedia: h2 3.695, 68 characters (Lindemann & Bowern 2021) Tumbuka (Latin script), Wikipedia: h2 2.979, 29 characters (Lindemann & Bowern 2021) Turkish (Latin script), Wikipedia: h2 3.549, 34 characters (Lindemann & Bowern 2021) Turkmen (Latin script), Wikipedia: h2 3.603, 37 characters (Lindemann & Bowern 2021) Tuvan (Cyrillic script), Wikipedia: h2 3.494, 40 characters (Lindemann & Bowern 2021) Twi (Latin script), Wikipedia: h2 3.289, 30 characters (Lindemann & Bowern 2021) Udmurt (Cyrillic script), Wikipedia: h2 3.669, 40 characters (Lindemann & Bowern 2021) Ukrainian (Cyrillic script), Wikipedia: h2 3.653, 34 characters (Lindemann & Bowern 2021) Upper Sorbian (Latin script), Wikipedia: h2 3.559, 38 characters (Lindemann & Bowern 2021) Urdu (Arabic script), Wikipedia: h2 3.575, 52 characters (Lindemann & Bowern 2021) Uyghur (Arabic script), Wikipedia: h2 3.479, 39 characters (Lindemann & Bowern 2021) Uzbek (Latin script), Wikipedia: h2 3.436, 29 characters (Lindemann & Bowern 2021) Venda (Latin script), Wikipedia: h2 2.792, 30 characters (Lindemann & Bowern 2021) Venetian (Latin script), Wikipedia: h2 3.265, 37 characters (Lindemann & Bowern 2021) Vepsian (Latin script), Wikipedia: h2 3.501, 30 characters (Lindemann & Bowern 2021) Volap¨uk (Latin script), Wikipedia: h2 3.237, 30 characters (Lindemann & Bowern 2021) V˜oro (Latin script), Wikipedia: h2 3.635, 34 characters (Lindemann & Bowern 2021) Walloon (Latin script), Wikipedia: h2 3.379, 37 characters (Lindemann & Bowern 2021) Waray-Waray (Latin script), Wikipedia: h2 3.133, 32 characters (Lindemann & Bowern 2021) Welsh (Latin script), Wikipedia: h2 3.465, 32 characters (Lindemann & Bowern 2021) West Flemish (Latin script), Wikipedia: h2 3.434, 32 characters (Lindemann & Bowern 2021) West Frisian (Latin script), Wikipedia: h2 3.374, 33 characters (Lindemann & Bowern 2021) Western Armenian (Armenian script), Wikipedia: h2 3.479, 41 characters (Lindemann & Bowern 2021) Western Punjabi (Arabic script), Wikipedia: h2 3.595, 50 characters (Lindemann & Bowern 2021) Wolof (Latin script), Wikipedia: h2 3.292, 34 characters (Lindemann & Bowern 2021) Xhosa (Latin script), Wikipedia: h2 3.267, 29 characters (Lindemann & Bowern 2021) Yiddish (Hebrew script), Wikipedia: h2 3.311, 30 characters (Lindemann & Bowern 2021) Yoruba (Latin script), Wikipedia: h2 3.591, 43 characters (Lindemann & Bowern 2021) Zamboanga Chavacano (Latin script), Wikipedia: h2 3.310, 33 characters (Lindemann & Bowern 2021) Zazaki (Latin script), Wikipedia: h2 3.528, 38 characters (Lindemann & Bowern 2021) Zeelandic (Latin script), Wikipedia: h2 3.388, 36 characters (Lindemann & Bowern 2021) Zhuang (Latin script), Wikipedia: h2 3.069, 29 characters (Lindemann & Bowern 2021) Zulu (Latin script), Wikipedia: h2 3.262, 28 characters (Lindemann & Bowern 2021) Voynich ZL, EVA: h2 2.117 with space, 2.311 without; 26 characters Voynich ZL, merged glyphs: h2 2.509 with space, 2.870 without; 40 characters Voynich RF1b-er, EVA: h2 2.137 with space, 2.333 without; 25 characters Voynich Takahashi IT2a, EVA: h2 2.129 with space, 2.329 without; 22 characters Voynich Currier CD2a: h2 2.351 with space, 2.660 without; 36 characters Voynich v101 GC2a: h2 2.533 with space, 2.897 without; 71 characters la (Gutenberg): h2 3.364 with space, 3.509 without; 25 characters it (Nuntiaturberichte OCR): h2 3.205 with space, 3.451 without; 22 characters de (Gutenberg): h2 3.164 with space, 3.392 without; 34 characters en (Gutenberg): h2 3.315 with space, 3.601 without; 31 characters fr (Gutenberg): h2 3.280 with space, 3.585 without; 41 characters da (Gutenberg): h2 3.352 with space, 3.669 without; 36 characters nl (Gutenberg): h2 3.218 with space, 3.459 without; 36 characters sv (Gutenberg): h2 3.404 with space, 3.683 without; 37 characters no (Gutenberg): h2 3.226 with space, 3.562 without; 34 characters is (Gutenberg): h2 3.489 with space, 3.870 without; 39 characters fi (Gutenberg): h2 3.297 with space, 3.453 without; 32 characters Hawaiian (Bible 1868): h2 2.589 with space, 2.850 without; 21 characters Tongan (Bible): h2 2.705 with space, 2.964 without; 22 characters Maori (New Testament): h2 2.656 with space, 2.984 without; 20 characters Setswana (New Testament): h2 2.652 with space, 2.954 without; 23 characters Swahili (New Testament 1850): h2 2.980 with space, 3.103 without; 25 characters Latin (Vulgate): h2 3.331 with space, 3.544 without; 28 characters Esperanto (Bible): h2 3.108 with space, 3.441 without; 29 characters Toki Pona (Tatoeba): h2 2.334 with space, 2.675 without; 15 characters Lojban (Tatoeba): h2 2.977 with space, 3.475 without; 25 characters Volapuk (Tatoeba): h2 3.091 with space, 3.359 without; 28 characters Voynich, EVA (ZL, RF1b, Takahashi) Voynich, Currier Voynich, merged glyphs Voynich, v101 Toki Pona Hawaiian 1868 Latin Hawaiian, modern spelling Voynich natural language, this study constructed language Wikipedia, Lindemann & Bowern
Conditional character entropy, space counted, against alphabet size. Grey: Lindemann & Bowern’s Wikipedia samples with up to 80 characters (L). Coloured: measured here (S: c1). Hover a point for its values; the table below has the same numbers.
text (34,116 tokens each)h2, space countedalphabeth2, no spaceh2/h1, no space
Voynich, EVA: ZL / RF1b / Takahashi2.117 / 2.137 / 2.12926 / 25 / 222.311 / 2.333 / 2.3290.598 / 0.603 / 0.603
Voynich, Currier CD2a2.351362.6600.690
Voynich, ZL merged glyphs2.509402.8700.710
Voynich, v101 GC2a2.533712.8970.698
Toki Pona (Tatoeba)2.334152.6750.751
Hawaiian, Bible 1868 spelling2.589212.8500.853
Setswana / Māori / Tongan (Bible)2.652 / 2.656 / 2.70523 / 20 / 222.954 / 2.984 / 2.9640.753 / 0.795 / 0.785
Hawaiian, Wikipedia (Lindemann & Bowern)2.76531
Lojban / Swahili / Volapük / Esperanto2.977 / 2.980 / 3.091 / 3.10825 / 25 / 28 / 293.475 / 3.103 / 3.359 / 3.4410.828 / 0.786 / 0.818 / 0.834
Eleven European languages (Gutenberg; Italian from OCR’d letters)3.164–3.48922–413.392–3.8700.815–0.876
Latin, Vulgate / Gutenberg3.331 / 3.36428 / 253.544 / 3.5090.866 / 0.872

What changes. Raw EVA stays far outside: 0.47 bit below the lowest natural language measured (Hawaiian in its 1868 spelling, which, as Stallings noted against Bennett’s comparison, leaves out the glottal stop and vowel length) and 0.65 bit below Lindemann & Bowern’s floor. The merged transliterations do not. Currier, merged ZL and v101 sit 0.06 to 0.24 bit below Hawaiian 1868 with the space counted, and without it Hawaiian 1868 (2.850) is lower than merged ZL (2.870) and v101 (2.897). Toki Pona, a constructed language with fourteen letters and strict consonant–vowel syllables, is lower than every Voynich transliteration except the three EVA ones. The absolute h2 of Voynichese is therefore reachable by a meaningful text with a small alphabet and rigid syllables; it is an outlier in raw EVA, not in every transliteration (S: c1).

What does not change. At its own alphabet size Voynichese has no neighbour: among the natural and constructed languages whose alphabets are within a fifth of the transliteration’s size, the lowest is 0.47 bit above EVA, 0.41 above Currier, 0.33 above merged ZL and 0.54 above v101. On h2/h1 every Voynich transliteration (0.60 to 0.71 without the space) is below every natural language (0.75 and up). Toki Pona comes closest, 0.04 above merged ZL. The redundancy in Voynichese comes from a large alphabet used in a rigid order, not from a small alphabet (S: c1). And the languages that approach its h2 fail its word statistics outright: the Polynesian and Setswana texts have words of 3.1 to 3.8 letters against 5.07, a fifth to a half of its vocabulary growth (type–token ratio 0.04–0.09 against 0.21) and next-word predictability seven to nine times higher; Toki Pona has about 120 words in all (S: c1). Esperanto, Volapük and Lojban fall among the European languages, as RBA’s post found for Esperanto (h2 3.21 there, 3.11 here; section 06).

Higher orders and intervals (S: b4, v_b4). Resampling folios puts h2 at ±0.03 bit (raw EVA 2.28–2.34). The raw gap persists one order up: h3 is 2.07 against 2.89 to 3.04 for languages. The merged-glyph gap does not. It shrinks from 0.52 bit at h2 to 0.20 at h3, and by h4 the merged text (2.46) sits inside the language range (2.27–2.51), though h4 is poorly estimated at this length for every text. The redundancy is short-range, as rigid two- or three-glyph groups predict, so merged h2 should not be quoted as if the deficit held at every order. A and B differ in h2 well beyond folio sampling (permutation p = 0.0005). Across a word space, the last glyph of a word tells more about the first glyph of the next (0.17 bit above a shuffle) than in any language tested (0.03 to 0.07; French 0.13, from elided one-letter words). In Voynichese the space acts less like a word boundary than it does in those languages.

Where the redundancy sits. Inside words. Within-word h2 is 1.92 to 2.13 bits raw against 2.94 to 3.41 for languages. Mutual information between glyph and word position is 0.69 to 0.73 bits across ZL, Currier and v101 against 0.17 to 0.27; 21% to 31% of glyphs are locked to one word position against 0% to 8% of letters (S: a5, v_a5).

Pair merging. Greedy merging of frequent glyph pairs closes the h1−h2 gap only after about 40 merges, so an encoding of two- to three-glyph units drawn from 50 to 60 unit types is compatible with the character statistics and a plain letter cipher is not (S: a5). Greedy merging tests one heuristic, not the whole verbose class (S: v_a5).

Information budget. The word stream carries 425,468 bits, 12.47 bits per token, 0.82 times a Latin prose text of equal length under the same model (S: a5, v_a5).

04 Word level

At word level Voynichese looks like a language, as Landini (2001) and Reddy & Knight (2011) reported (L). Table (S), a2 and v_a2, 34,116 tokens.

corpusZipf slope, ranks 1–1000hapax % of typesHeaps betatop-word share
Voynich all−1.04069.70.7102.25%
Voynich A / B−0.994 / −1.06872.2 / 68.60.743 / 0.6794.27% / 2.13%
Latin (Aeneid)−0.82067.00.7494.9%
German−1.04565.10.7793.46%
English−1.05655.10.6754.68%

Word-type entropy is 9.8 to 10.3 bits against 10.3 to 10.8 for Latin prose and 9.4 to 9.8 for Italian, French and German (S: v_a1). The low pooled top-word share is an A+B mixture effect (S: v_a2); against single-book samples the hapax rate is above every language (S: v_a5), though with the parsing defect of section 13 corrected it falls to 67.7%, inside that range (S: v_b1).

None of this discriminates, and the reason is mechanical. A Zipf-like rank–frequency curve appears whenever words are strings cut from a stream of characters with a boundary symbol (Miller 1957, the typing monkey; L). At equal size, 10,053 tokens, Voynichese has a slope of −0.99 and 72.5% hapax types. Glyphs drawn at random with the Voynich frequencies give −0.87; an order-1 character Markov chain trained on Latin gives −0.92; English and Italian give −1.07 and −0.94. An order-3 chain trained on Voynichese matches both numbers (−1.03, 72.2%) without containing a single word (S: c1, b3). The chart shows which corpora land within the bake-off’s tolerance of Voynichese (section 06).

Zipf slope, ranks 1-1000 -2 -1.5 -1 -0.5 Voynich, all: -0.992 (inside the Voynich tolerance -1.091 to -0.892) Voynich, Currier A: -1.005 (inside the Voynich tolerance -1.091 to -0.892) Voynich, Currier B: -1.148 (outside the Voynich tolerance -1.091 to -0.892) Latin (Gutenberg): -0.678 (outside the Voynich tolerance -1.091 to -0.892) Italian: -0.987 (inside the Voynich tolerance -1.091 to -0.892) English: -1.069 (inside the Voynich tolerance -1.091 to -0.892) Hawaiian 1868: -1.353 (outside the Voynich tolerance -1.091 to -0.892) Maori: -1.249 (outside the Voynich tolerance -1.091 to -0.892) Swahili: -0.898 (inside the Voynich tolerance -1.091 to -0.892) Esperanto: -1.105 (outside the Voynich tolerance -1.091 to -0.892) Toki Pona: -1.865 (outside the Voynich tolerance -1.091 to -0.892) Lojban: -1.123 (outside the Voynich tolerance -1.091 to -0.892) Volapuk: -0.909 (inside the Voynich tolerance -1.091 to -0.892) random glyphs: -0.872 (outside the Voynich tolerance -1.091 to -0.892) Markov 1, Latin-trained: -0.922 (inside the Voynich tolerance -1.091 to -0.892) Markov 1, Voynich-trained: -1.057 (inside the Voynich tolerance -1.091 to -0.892) Markov 3, Voynich-trained: -1.032 (inside the Voynich tolerance -1.091 to -0.892) autocopist (Timm-Schinner): -0.756 (outside the Voynich tolerance -1.091 to -0.892) Rugg grille: -0.459 (outside the Voynich tolerance -1.091 to -0.892) Naibbe cipher (Pliny): -0.877 (outside the Voynich tolerance -1.091 to -0.892) Gaskell & Bowern: -0.630 (outside the Voynich tolerance -1.091 to -0.892) hapax share of word types 0 0.25 0.5 0.75 1 Voynich, all: 0.725 (inside the Voynich tolerance 0.652 to 0.797) Voynich, Currier A: 0.726 (inside the Voynich tolerance 0.652 to 0.797) Voynich, Currier B: 0.701 (inside the Voynich tolerance 0.652 to 0.797) Latin (Gutenberg): 0.694 (inside the Voynich tolerance 0.652 to 0.797) Italian: 0.678 (inside the Voynich tolerance 0.652 to 0.797) English: 0.605 (outside the Voynich tolerance 0.652 to 0.797) Hawaiian 1868: 0.407 (outside the Voynich tolerance 0.652 to 0.797) Maori: 0.390 (outside the Voynich tolerance 0.652 to 0.797) Swahili: 0.614 (outside the Voynich tolerance 0.652 to 0.797) Esperanto: 0.523 (outside the Voynich tolerance 0.652 to 0.797) Toki Pona: 0.373 (outside the Voynich tolerance 0.652 to 0.797) Lojban: 0.508 (outside the Voynich tolerance 0.652 to 0.797) Volapuk: 0.618 (outside the Voynich tolerance 0.652 to 0.797) random glyphs: 0.941 (outside the Voynich tolerance 0.652 to 0.797) Markov 1, Latin-trained: 0.922 (outside the Voynich tolerance 0.652 to 0.797) Markov 1, Voynich-trained: 0.836 (outside the Voynich tolerance 0.652 to 0.797) Markov 3, Voynich-trained: 0.722 (inside the Voynich tolerance 0.652 to 0.797) autocopist (Timm-Schinner): 0.718 (inside the Voynich tolerance 0.652 to 0.797) Rugg grille: 0.064 (outside the Voynich tolerance 0.652 to 0.797) Naibbe cipher (Pliny): 0.574 (outside the Voynich tolerance 0.652 to 0.797) Gaskell & Bowern: 0.852 (outside the Voynich tolerance 0.652 to 0.797) Voynich Voynich, all Voynich, Currier A Voynich, Currier B languages Latin (Gutenberg) Italian English Hawaiian 1868 Maori Swahili constructed Esperanto Toki Pona Lojban Volapuk generators random glyphs Markov 1, Latin-trained Markov 1, Voynich-trained Markov 3, Voynich-trained autocopist (Timm-Schinner) Rugg grille cipher Naibbe cipher (Pliny) human gibberish Gaskell & Bowern within the bake-off tolerance of Voynichese (shaded band) outside it
Zipf slope (ranks 1–1000) and hapax share of word types, every corpus cut to 10,053 tokens, the size of the human-gibberish sample. Filled: within the bake-off tolerance of Voynichese (shaded band); hollow: outside it (S: c1, b3).

A correction. Until October this page said that Zipf and hapax “are reproduced by human gibberish (Gaskell & Bowern 2022)”. Measured here on their published sample, pooled from 38 writers, that is not so: slope −0.63 and 85% hapax types, because 38 people invent 38 vocabularies (S: b3). What Gaskell & Bowern showed is that individual gibberish samples fall close to Voynichese on most of their own metrics, character bias excepted (L). Generators (Rugg & Taylor 2016; Timm & Schinner 2020) and a hand cipher from Latin (Greshko 2025) do produce language-like Zipf (L), and so, at full length, does the Naibbe ciphertext run here (−0.92; S: b3).

Word length

Merged EVA word lengths (S: a2, v_a2):

corpusmeanvariancevariance / mean of (length−1)
Voynich all (raw EVA 5.07 / 3.73 / 0.92)4.112.480.80
Voynich A3.932.890.99
Voynich B4.202.270.71
Aeneid alone / Confessions alone4.97 /1.04 / 1.74
Italian / German / English / Danish4.53 / 4.99 / 4.23 / 4.676.52 / 7.04 / 5.41 / 7.401.85 / 1.77 / 1.67 / 2.02

The famous under-dispersion, “binomial word lengths”, is a Currier-B property. B has variance-to-mean 0.71, A has 0.99 and single-text Latin verse 1.04, so Currier A matches Latin verse and the binomial-fit contrast in a2 was a search-cap artefact. B and the pooled text stay far from the 1.67 to 2.02 of modern prose.

Word length is where the simplest generators fail. An order-1 Markov chain, which knows only the previous glyph, ends words at a constant rate and so gives a geometric length distribution (standard deviation 3.47 letters against 1.93); an order-3 chain trained on Voynichese reproduces the peaked shape (2.08), because the word grammar is short-range (S: c1).

0% 10% 20% 30% 1 3 5 7 9 11 13 15+ word length in letters (15 = 15 or more) Voynich: length 1, 3.2% of tokens Voynich: length 2, 6.3% of tokens Voynich: length 3, 9.0% of tokens Voynich: length 4, 17.8% of tokens Voynich: length 5, 24.8% of tokens Voynich: length 6, 19.4% of tokens Voynich: length 7, 11.4% of tokens Voynich: length 8, 4.6% of tokens Voynich: length 9, 1.9% of tokens Voynich: length 10, 0.7% of tokens Voynich: length 11, 0.3% of tokens Voynich: length 12, 0.2% of tokens Voynich: length 13, 0.1% of tokens Voynich: length 14, 0.1% of tokens Voynich: length 15, 0.1% of tokens Markov 1, Voynich-trained: length 1, 11.3% of tokens Markov 1, Voynich-trained: length 2, 13.4% of tokens Markov 1, Voynich-trained: length 3, 14.4% of tokens Markov 1, Voynich-trained: length 4, 13.6% of tokens Markov 1, Voynich-trained: length 5, 11.8% of tokens Markov 1, Voynich-trained: length 6, 9.3% of tokens Markov 1, Voynich-trained: length 7, 6.9% of tokens Markov 1, Voynich-trained: length 8, 5.2% of tokens Markov 1, Voynich-trained: length 9, 3.9% of tokens Markov 1, Voynich-trained: length 10, 2.9% of tokens Markov 1, Voynich-trained: length 11, 2.0% of tokens Markov 1, Voynich-trained: length 12, 1.5% of tokens Markov 1, Voynich-trained: length 13, 1.1% of tokens Markov 1, Voynich-trained: length 14, 0.8% of tokens Markov 1, Voynich-trained: length 15, 2.0% of tokens Markov 3, Voynich-trained: length 1, 3.1% of tokens Markov 3, Voynich-trained: length 2, 6.4% of tokens Markov 3, Voynich-trained: length 3, 10.1% of tokens Markov 3, Voynich-trained: length 4, 20.0% of tokens Markov 3, Voynich-trained: length 5, 24.5% of tokens Markov 3, Voynich-trained: length 6, 16.8% of tokens Markov 3, Voynich-trained: length 7, 9.3% of tokens Markov 3, Voynich-trained: length 8, 4.4% of tokens Markov 3, Voynich-trained: length 9, 2.4% of tokens Markov 3, Voynich-trained: length 10, 1.4% of tokens Markov 3, Voynich-trained: length 11, 0.7% of tokens Markov 3, Voynich-trained: length 12, 0.4% of tokens Markov 3, Voynich-trained: length 13, 0.2% of tokens Markov 3, Voynich-trained: length 14, 0.2% of tokens Markov 3, Voynich-trained: length 15, 0.2% of tokens Latin: length 1, 0.4% of tokens Latin: length 2, 7.8% of tokens Latin: length 3, 8.6% of tokens Latin: length 4, 11.7% of tokens Latin: length 5, 17.9% of tokens Latin: length 6, 17.3% of tokens Latin: length 7, 14.7% of tokens Latin: length 8, 10.5% of tokens Latin: length 9, 6.3% of tokens Latin: length 10, 3.0% of tokens Latin: length 11, 1.1% of tokens Latin: length 12, 0.5% of tokens Latin: length 13, 0.1% of tokens Latin: length 14, 0.1% of tokens Latin: length 15, 0.0% of tokens Voynich Markov 1 Voynich-trained Markov 3 Voynich-trained Latin
Word-length distributions in EVA letters, 34,116 tokens each (S: c1). The Markov chains are trained on the ZL text; Latin is the Gutenberg sample.

05 Word grammar and repetition

Tiltman (1951), Stolfi (2000) and Zattera (2022) described a rigid positional grammar inside Voynichese words (L). Measured here as the fraction of glyph pairs whose order violates the single best glyph ordering, length-matched; a shuffle null gives 0.49. All rows (S): a3, a2, v_a2.

statisticVoynichLatinItalianGermanEnglish
Pair-order violations against the best glyph order, length-matched (shuffle null 0.49)0.160 (v101 0.140)0.3630.3180.2780.308
Adjacent identical tokens within a line, % and observed:shuffled (0.82% counting pairs across line breaks)0.907 / 2.50.047 / 0.10.047 / 0.10.157 / 0.30.137 / 0.2
Line-initial first-glyph effect, Cramér’s V, paragraph-first lines excluded0.277pseudo-lined prose 0.02–0.03; hexameter 0.148

Voynichese is 1.7 to 2.3 times more rigid than any tested language. The glyph order derived from the data with no assumptions, q, then p f sh, then ch, then o t k, then e ee, then d s a, then l r y, then g n iin m, is the Stolfi and Zandbergen layout recovered blind (S: a3).

Line position matters, as Currier (1976) said (L). The line-initial effect exceeds hexameter verse and is an order of magnitude above pseudo-lined prose; the line-final effect a2 reported collapses to V 0.07 to 0.16 once the final m and g allographs are removed (S: v_a2).

06 Self-citation and the generator bake-off

Timm (2014, 2016) argued that similar words cluster on the page, the fingerprint of copying an earlier word and modifying it; Timm & Schinner (2020) published an algorithm that does this (L). The test finds, for each token, the nearest earlier token on the same page within edit distance 1, with every corpus poured into the identical page and line skeleton. Two Rugg-style generators and a re-implemented autocopist ran through the same code. All rows (S), a4 and v_a4.

corpusmedian distancewithin 10 tokenswithin-page shuffleglobal shufflelong tokens (5+) within 10
Voynich ZL140.2690.2380.1670.225
Latin (Aeneid)410.0350.0340.0300.006
English (Italian, German similar)170.1760.1770.1640.019
Danish (verse)150.1960.1720.1380.035
Autocopist (Timm–Schinner re-implementation)130.3290.2750.0790.257
Rugg grille360.0670.2490.0660.033
Rugg sorted table340.3290.1620.1120.341
Order-3 character Markov model trained on Voynichese190.1940.1940.1940.119

Sequential excess, real minus within-page shuffle, measures copying order: Voynich +0.031, Danish verse +0.024, autocopist +0.054, prose about zero. Page-vocabulary excess, real minus global shuffle: Voynich +0.102, languages at most +0.058, autocopist +0.250. For tokens of five or more glyphs the language baselines collapse to 0.035 or less while Voynichese stays at 0.225, but an order-3 character Markov model that copies nothing reaches 0.119: about half the long-token density is word-internal structure, not copying (S: v_a4).

The bake-off: one battery for every candidate

The first comparison (S: a4) used seven columns. The September follow-up b3 fixed a battery of 37 one-number items before scoring: character entropies, word length, vocabulary growth, adjacent repetition, self-citation, slot grammar, line position, long-range keyword information, word predictability and drift across the book. Every candidate was poured into the manuscript’s own pages and lines. An item counts as a match when it falls within 10% of the Voynich value, or within the spread between two runs of the autocopist where that is wider (S: b3). The October check reproduced every value and recomputed 20 items with independent code to within 0.2% (S: v_b3). It also corrected the wording. The battery cannot be called pre-registered: it and its results entered the repository together. The autocopist and the Naibbe cipher both fail Zipf, which b3 had said they matched. And the autocopist’s excess glyph entropy is 0.4 to 0.6 bit, not 1 bit. The October comparators from c1 went through the same code (S: c1).

a a_h0_raw: h0 raw a_h1_raw: h1 raw a_h2_raw: h2 raw a_h3_raw: h3 raw a_h2_mrg: h2 mrg a_h3_mrg: h3 mrg b b_len_mean: len mean b_len_sd: len sd b_len1: len=1 b_len9: len>=9 c c_zipf: Zipf c_ttr: TTR c_hapax_types: hapax/types c_hapax_tokens: hapax/tokens c_heaps: Heaps d d_adj_exact: adj exact d_adj_ld1: adj LD<=1 e e_cover: sc cover e_w10: sc <=10 e_prev2: sc prev2 e_w10_shuf: sc <=10 shuf e_ratio: sc ratio f f_irrev: irrev bigr f_lock: pos lock g g_len_first: len first g_len_mid: len mid g_len_last: len last g_gal_init: gallows init g_gal_mid: gallows mid h h_peak_log2s: MZ peak log2 s h_peak_R: MZ peak R i i_tok_acc: tok pred i_char_bits: char 3g bits j j_one_page: types 1 page j_jacc_excess: adj Jaccard xs k k_jsd_halves: JSD halves k_jsd_oddeven: JSD odd/even Voynich, all37/37 Voynich, all - h0 raw: matches Voynich, all - h1 raw: matches Voynich, all - h2 raw: matches Voynich, all - h3 raw: matches Voynich, all - h2 mrg: matches Voynich, all - h3 mrg: matches Voynich, all - len mean: matches Voynich, all - len sd: matches Voynich, all - len=1: matches Voynich, all - len>=9: matches Voynich, all - Zipf: matches Voynich, all - TTR: matches Voynich, all - hapax/types: matches Voynich, all - hapax/tokens: matches Voynich, all - Heaps: matches Voynich, all - adj exact: matches Voynich, all - adj LD<=1: matches Voynich, all - sc cover: matches Voynich, all - sc <=10: matches Voynich, all - sc prev2: matches Voynich, all - sc <=10 shuf: matches Voynich, all - sc ratio: matches Voynich, all - irrev bigr: matches Voynich, all - pos lock: matches Voynich, all - len first: matches Voynich, all - len mid: matches Voynich, all - len last: matches Voynich, all - gallows init: matches Voynich, all - gallows mid: matches Voynich, all - MZ peak log2 s: matches Voynich, all - MZ peak R: matches Voynich, all - tok pred: matches Voynich, all - char 3g bits: matches Voynich, all - types 1 page: matches Voynich, all - adj Jaccard xs: matches Voynich, all - JSD halves: matches Voynich, all - JSD odd/even: matches Voynich, Currier A27/37 Voynich, Currier A - h0 raw: matches Voynich, Currier A - h1 raw: matches Voynich, Currier A - h2 raw: matches Voynich, Currier A - h3 raw: matches Voynich, Currier A - h2 mrg: matches Voynich, Currier A - h3 mrg: matches Voynich, Currier A - len mean: matches Voynich, Currier A - len sd: matches Voynich, Currier A - len=1: does not match Voynich, Currier A - len>=9: matches Voynich, Currier A - Zipf: matches Voynich, Currier A - TTR: does not match Voynich, Currier A - hapax/types: matches Voynich, Currier A - hapax/tokens: does not match Voynich, Currier A - Heaps: matches Voynich, Currier A - adj exact: matches Voynich, Currier A - adj LD<=1: matches Voynich, Currier A - sc cover: does not match Voynich, Currier A - sc <=10: matches Voynich, Currier A - sc prev2: does not match Voynich, Currier A - sc <=10 shuf: matches Voynich, Currier A - sc ratio: matches Voynich, Currier A - irrev bigr: does not match Voynich, Currier A - pos lock: matches Voynich, Currier A - len first: matches Voynich, Currier A - len mid: matches Voynich, Currier A - len last: matches Voynich, Currier A - gallows init: matches Voynich, Currier A - gallows mid: matches Voynich, Currier A - MZ peak log2 s: matches Voynich, Currier A - MZ peak R: does not match Voynich, Currier A - tok pred: does not match Voynich, Currier A - char 3g bits: matches Voynich, Currier A - types 1 page: matches Voynich, Currier A - adj Jaccard xs: does not match Voynich, Currier A - JSD halves: does not match Voynich, Currier A - JSD odd/even: matches Voynich, Currier B34/37 Voynich, Currier B - h0 raw: matches Voynich, Currier B - h1 raw: matches Voynich, Currier B - h2 raw: matches Voynich, Currier B - h3 raw: matches Voynich, Currier B - h2 mrg: matches Voynich, Currier B - h3 mrg: matches Voynich, Currier B - len mean: matches Voynich, Currier B - len sd: matches Voynich, Currier B - len=1: matches Voynich, Currier B - len>=9: matches Voynich, Currier B - Zipf: matches Voynich, Currier B - TTR: matches Voynich, Currier B - hapax/types: matches Voynich, Currier B - hapax/tokens: matches Voynich, Currier B - Heaps: matches Voynich, Currier B - adj exact: matches Voynich, Currier B - adj LD<=1: matches Voynich, Currier B - sc cover: does not match Voynich, Currier B - sc <=10: matches Voynich, Currier B - sc prev2: matches Voynich, Currier B - sc <=10 shuf: matches Voynich, Currier B - sc ratio: matches Voynich, Currier B - irrev bigr: matches Voynich, Currier B - pos lock: matches Voynich, Currier B - len first: matches Voynich, Currier B - len mid: matches Voynich, Currier B - len last: matches Voynich, Currier B - gallows init: matches Voynich, Currier B - gallows mid: matches Voynich, Currier B - MZ peak log2 s: matches Voynich, Currier B - MZ peak R: does not match Voynich, Currier B - tok pred: matches Voynich, Currier B - char 3g bits: matches Voynich, Currier B - types 1 page: matches Voynich, Currier B - adj Jaccard xs: matches Voynich, Currier B - JSD halves: does not match Voynich, Currier B - JSD odd/even: matches Latin (Gutenberg)9/37 Latin (Gutenberg) - h0 raw: matches Latin (Gutenberg) - h1 raw: matches Latin (Gutenberg) - h2 raw: does not match Latin (Gutenberg) - h3 raw: does not match Latin (Gutenberg) - h2 mrg: does not match Latin (Gutenberg) - h3 mrg: does not match Latin (Gutenberg) - len mean: does not match Latin (Gutenberg) - len sd: does not match Latin (Gutenberg) - len=1: does not match Latin (Gutenberg) - len>=9: does not match Latin (Gutenberg) - Zipf: does not match Latin (Gutenberg) - TTR: does not match Latin (Gutenberg) - hapax/types: does not match Latin (Gutenberg) - hapax/tokens: does not match Latin (Gutenberg) - Heaps: matches Latin (Gutenberg) - adj exact: does not match Latin (Gutenberg) - adj LD<=1: does not match Latin (Gutenberg) - sc cover: does not match Latin (Gutenberg) - sc <=10: does not match Latin (Gutenberg) - sc prev2: does not match Latin (Gutenberg) - sc <=10 shuf: does not match Latin (Gutenberg) - sc ratio: matches Latin (Gutenberg) - irrev bigr: matches Latin (Gutenberg) - pos lock: does not match Latin (Gutenberg) - len first: matches Latin (Gutenberg) - len mid: does not match Latin (Gutenberg) - len last: does not match Latin (Gutenberg) - gallows init: matches Latin (Gutenberg) - gallows mid: does not match Latin (Gutenberg) - MZ peak log2 s: matches Latin (Gutenberg) - MZ peak R: does not match Latin (Gutenberg) - tok pred: does not match Latin (Gutenberg) - char 3g bits: does not match Latin (Gutenberg) - types 1 page: does not match Latin (Gutenberg) - adj Jaccard xs: does not match Latin (Gutenberg) - JSD halves: does not match Latin (Gutenberg) - JSD odd/even: matches Italian letters (OCR)14/37 Italian letters (OCR) - h0 raw: matches Italian letters (OCR) - h1 raw: matches Italian letters (OCR) - h2 raw: does not match Italian letters (OCR) - h3 raw: does not match Italian letters (OCR) - h2 mrg: does not match Italian letters (OCR) - h3 mrg: does not match Italian letters (OCR) - len mean: does not match Italian letters (OCR) - len sd: does not match Italian letters (OCR) - len=1: does not match Italian letters (OCR) - len>=9: does not match Italian letters (OCR) - Zipf: matches Italian letters (OCR) - TTR: matches Italian letters (OCR) - hapax/types: matches Italian letters (OCR) - hapax/tokens: matches Italian letters (OCR) - Heaps: matches Italian letters (OCR) - adj exact: does not match Italian letters (OCR) - adj LD<=1: does not match Italian letters (OCR) - sc cover: does not match Italian letters (OCR) - sc <=10: does not match Italian letters (OCR) - sc prev2: does not match Italian letters (OCR) - sc <=10 shuf: does not match Italian letters (OCR) - sc ratio: does not match Italian letters (OCR) - irrev bigr: matches Italian letters (OCR) - pos lock: does not match Italian letters (OCR) - len first: does not match Italian letters (OCR) - len mid: matches Italian letters (OCR) - len last: matches Italian letters (OCR) - gallows init: does not match Italian letters (OCR) - gallows mid: matches Italian letters (OCR) - MZ peak log2 s: matches Italian letters (OCR) - MZ peak R: does not match Italian letters (OCR) - tok pred: does not match Italian letters (OCR) - char 3g bits: does not match Italian letters (OCR) - types 1 page: matches Italian letters (OCR) - adj Jaccard xs: does not match Italian letters (OCR) - JSD halves: does not match Italian letters (OCR) - JSD odd/even: matches English9/37 English - h0 raw: matches English - h1 raw: matches English - h2 raw: does not match English - h3 raw: does not match English - h2 mrg: does not match English - h3 mrg: does not match English - len mean: does not match English - len sd: does not match English - len=1: does not match English - len>=9: does not match English - Zipf: matches English - TTR: does not match English - hapax/types: does not match English - hapax/tokens: does not match English - Heaps: matches English - adj exact: does not match English - adj LD<=1: does not match English - sc cover: does not match English - sc <=10: does not match English - sc prev2: does not match English - sc <=10 shuf: does not match English - sc ratio: does not match English - irrev bigr: matches English - pos lock: does not match English - len first: does not match English - len mid: does not match English - len last: matches English - gallows init: matches English - gallows mid: does not match English - MZ peak log2 s: does not match English - MZ peak R: does not match English - tok pred: does not match English - char 3g bits: does not match English - types 1 page: does not match English - adj Jaccard xs: matches English - JSD halves: does not match English - JSD odd/even: matches autocopist, seed 199/37 autocopist, seed 19 - h0 raw: matches autocopist, seed 19 - h1 raw: matches autocopist, seed 19 - h2 raw: does not match autocopist, seed 19 - h3 raw: does not match autocopist, seed 19 - h2 mrg: does not match autocopist, seed 19 - h3 mrg: does not match autocopist, seed 19 - len mean: matches autocopist, seed 19 - len sd: does not match autocopist, seed 19 - len=1: does not match autocopist, seed 19 - len>=9: does not match autocopist, seed 19 - Zipf: does not match autocopist, seed 19 - TTR: does not match autocopist, seed 19 - hapax/types: matches autocopist, seed 19 - hapax/tokens: does not match autocopist, seed 19 - Heaps: does not match autocopist, seed 19 - adj exact: does not match autocopist, seed 19 - adj LD<=1: does not match autocopist, seed 19 - sc cover: does not match autocopist, seed 19 - sc <=10: does not match autocopist, seed 19 - sc prev2: does not match autocopist, seed 19 - sc <=10 shuf: does not match autocopist, seed 19 - sc ratio: matches autocopist, seed 19 - irrev bigr: matches autocopist, seed 19 - pos lock: does not match autocopist, seed 19 - len first: does not match autocopist, seed 19 - len mid: matches autocopist, seed 19 - len last: matches autocopist, seed 19 - gallows init: does not match autocopist, seed 19 - gallows mid: does not match autocopist, seed 19 - MZ peak log2 s: matches autocopist, seed 19 - MZ peak R: does not match autocopist, seed 19 - tok pred: does not match autocopist, seed 19 - char 3g bits: does not match autocopist, seed 19 - types 1 page: does not match autocopist, seed 19 - adj Jaccard xs: does not match autocopist, seed 19 - JSD halves: does not match autocopist, seed 19 - JSD odd/even: does not match autocopist, seed 79/37 autocopist, seed 7 - h0 raw: matches autocopist, seed 7 - h1 raw: matches autocopist, seed 7 - h2 raw: does not match autocopist, seed 7 - h3 raw: does not match autocopist, seed 7 - h2 mrg: does not match autocopist, seed 7 - h3 mrg: does not match autocopist, seed 7 - len mean: matches autocopist, seed 7 - len sd: does not match autocopist, seed 7 - len=1: does not match autocopist, seed 7 - len>=9: does not match autocopist, seed 7 - Zipf: does not match autocopist, seed 7 - TTR: does not match autocopist, seed 7 - hapax/types: matches autocopist, seed 7 - hapax/tokens: does not match autocopist, seed 7 - Heaps: does not match autocopist, seed 7 - adj exact: does not match autocopist, seed 7 - adj LD<=1: does not match autocopist, seed 7 - sc cover: does not match autocopist, seed 7 - sc <=10: does not match autocopist, seed 7 - sc prev2: does not match autocopist, seed 7 - sc <=10 shuf: does not match autocopist, seed 7 - sc ratio: matches autocopist, seed 7 - irrev bigr: does not match autocopist, seed 7 - pos lock: does not match autocopist, seed 7 - len first: matches autocopist, seed 7 - len mid: matches autocopist, seed 7 - len last: matches autocopist, seed 7 - gallows init: does not match autocopist, seed 7 - gallows mid: does not match autocopist, seed 7 - MZ peak log2 s: matches autocopist, seed 7 - MZ peak R: does not match autocopist, seed 7 - tok pred: does not match autocopist, seed 7 - char 3g bits: does not match autocopist, seed 7 - types 1 page: does not match autocopist, seed 7 - adj Jaccard xs: does not match autocopist, seed 7 - JSD halves: does not match autocopist, seed 7 - JSD odd/even: does not match Rugg grille8/37 Rugg grille - h0 raw: does not match Rugg grille - h1 raw: matches Rugg grille - h2 raw: does not match Rugg grille - h3 raw: does not match Rugg grille - h2 mrg: does not match Rugg grille - h3 mrg: does not match Rugg grille - len mean: matches Rugg grille - len sd: does not match Rugg grille - len=1: does not match Rugg grille - len>=9: does not match Rugg grille - Zipf: does not match Rugg grille - TTR: does not match Rugg grille - hapax/types: does not match Rugg grille - hapax/tokens: does not match Rugg grille - Heaps: does not match Rugg grille - adj exact: does not match Rugg grille - adj LD<=1: does not match Rugg grille - sc cover: does not match Rugg grille - sc <=10: does not match Rugg grille - sc prev2: does not match Rugg grille - sc <=10 shuf: matches Rugg grille - sc ratio: does not match Rugg grille - irrev bigr: does not match Rugg grille - pos lock: does not match Rugg grille - len first: does not match Rugg grille - len mid: matches Rugg grille - len last: matches Rugg grille - gallows init: does not match Rugg grille - gallows mid: matches Rugg grille - MZ peak log2 s: matches Rugg grille - MZ peak R: does not match Rugg grille - tok pred: does not match Rugg grille - char 3g bits: does not match Rugg grille - types 1 page: does not match Rugg grille - adj Jaccard xs: does not match Rugg grille - JSD halves: does not match Rugg grille - JSD odd/even: matches Rugg sorted table14/37 Rugg sorted table - h0 raw: does not match Rugg sorted table - h1 raw: matches Rugg sorted table - h2 raw: does not match Rugg sorted table - h3 raw: matches Rugg sorted table - h2 mrg: matches Rugg sorted table - h3 mrg: matches Rugg sorted table - len mean: matches Rugg sorted table - len sd: does not match Rugg sorted table - len=1: does not match Rugg sorted table - len>=9: matches Rugg sorted table - Zipf: does not match Rugg sorted table - TTR: does not match Rugg sorted table - hapax/types: does not match Rugg sorted table - hapax/tokens: does not match Rugg sorted table - Heaps: does not match Rugg sorted table - adj exact: does not match Rugg sorted table - adj LD<=1: does not match Rugg sorted table - sc cover: matches Rugg sorted table - sc <=10: does not match Rugg sorted table - sc prev2: does not match Rugg sorted table - sc <=10 shuf: does not match Rugg sorted table - sc ratio: does not match Rugg sorted table - irrev bigr: does not match Rugg sorted table - pos lock: does not match Rugg sorted table - len first: does not match Rugg sorted table - len mid: matches Rugg sorted table - len last: matches Rugg sorted table - gallows init: does not match Rugg sorted table - gallows mid: matches Rugg sorted table - MZ peak log2 s: matches Rugg sorted table - MZ peak R: does not match Rugg sorted table - tok pred: does not match Rugg sorted table - char 3g bits: matches Rugg sorted table - types 1 page: does not match Rugg sorted table - adj Jaccard xs: matches Rugg sorted table - JSD halves: does not match Rugg sorted table - JSD odd/even: matches Naibbe, Pliny17/37 Naibbe, Pliny - h0 raw: matches Naibbe, Pliny - h1 raw: matches Naibbe, Pliny - h2 raw: matches Naibbe, Pliny - h3 raw: matches Naibbe, Pliny - h2 mrg: matches Naibbe, Pliny - h3 mrg: matches Naibbe, Pliny - len mean: matches Naibbe, Pliny - len sd: does not match Naibbe, Pliny - len=1: does not match Naibbe, Pliny - len>=9: matches Naibbe, Pliny - Zipf: does not match Naibbe, Pliny - TTR: does not match Naibbe, Pliny - hapax/types: does not match Naibbe, Pliny - hapax/tokens: does not match Naibbe, Pliny - Heaps: matches Naibbe, Pliny - adj exact: does not match Naibbe, Pliny - adj LD<=1: does not match Naibbe, Pliny - sc cover: does not match Naibbe, Pliny - sc <=10: does not match Naibbe, Pliny - sc prev2: does not match Naibbe, Pliny - sc <=10 shuf: does not match Naibbe, Pliny - sc ratio: does not match Naibbe, Pliny - irrev bigr: does not match Naibbe, Pliny - pos lock: matches Naibbe, Pliny - len first: matches Naibbe, Pliny - len mid: matches Naibbe, Pliny - len last: matches Naibbe, Pliny - gallows init: does not match Naibbe, Pliny - gallows mid: matches Naibbe, Pliny - MZ peak log2 s: matches Naibbe, Pliny - MZ peak R: does not match Naibbe, Pliny - tok pred: does not match Naibbe, Pliny - char 3g bits: matches Naibbe, Pliny - types 1 page: does not match Naibbe, Pliny - adj Jaccard xs: does not match Naibbe, Pliny - JSD halves: does not match Naibbe, Pliny - JSD odd/even: matches Naibbe, Pliny, own lines17/37 Naibbe, Pliny, own lines - h0 raw: matches Naibbe, Pliny, own lines - h1 raw: matches Naibbe, Pliny, own lines - h2 raw: matches Naibbe, Pliny, own lines - h3 raw: matches Naibbe, Pliny, own lines - h2 mrg: matches Naibbe, Pliny, own lines - h3 mrg: matches Naibbe, Pliny, own lines - len mean: matches Naibbe, Pliny, own lines - len sd: does not match Naibbe, Pliny, own lines - len=1: does not match Naibbe, Pliny, own lines - len>=9: matches Naibbe, Pliny, own lines - Zipf: does not match Naibbe, Pliny, own lines - TTR: does not match Naibbe, Pliny, own lines - hapax/types: does not match Naibbe, Pliny, own lines - hapax/tokens: does not match Naibbe, Pliny, own lines - Heaps: matches Naibbe, Pliny, own lines - adj exact: does not match Naibbe, Pliny, own lines - adj LD<=1: does not match Naibbe, Pliny, own lines - sc cover: does not match Naibbe, Pliny, own lines - sc <=10: does not match Naibbe, Pliny, own lines - sc prev2: does not match Naibbe, Pliny, own lines - sc <=10 shuf: does not match Naibbe, Pliny, own lines - sc ratio: does not match Naibbe, Pliny, own lines - irrev bigr: does not match Naibbe, Pliny, own lines - pos lock: matches Naibbe, Pliny, own lines - len first: matches Naibbe, Pliny, own lines - len mid: matches Naibbe, Pliny, own lines - len last: matches Naibbe, Pliny, own lines - gallows init: does not match Naibbe, Pliny, own lines - gallows mid: matches Naibbe, Pliny, own lines - MZ peak log2 s: matches Naibbe, Pliny, own lines - MZ peak R: does not match Naibbe, Pliny, own lines - tok pred: does not match Naibbe, Pliny, own lines - char 3g bits: matches Naibbe, Pliny, own lines - types 1 page: does not match Naibbe, Pliny, own lines - adj Jaccard xs: does not match Naibbe, Pliny, own lines - JSD halves: does not match Naibbe, Pliny, own lines - JSD odd/even: matches Naibbe, Dante17/37 Naibbe, Dante - h0 raw: matches Naibbe, Dante - h1 raw: matches Naibbe, Dante - h2 raw: matches Naibbe, Dante - h3 raw: matches Naibbe, Dante - h2 mrg: matches Naibbe, Dante - h3 mrg: matches Naibbe, Dante - len mean: matches Naibbe, Dante - len sd: does not match Naibbe, Dante - len=1: does not match Naibbe, Dante - len>=9: matches Naibbe, Dante - Zipf: does not match Naibbe, Dante - TTR: does not match Naibbe, Dante - hapax/types: does not match Naibbe, Dante - hapax/tokens: does not match Naibbe, Dante - Heaps: matches Naibbe, Dante - adj exact: does not match Naibbe, Dante - adj LD<=1: does not match Naibbe, Dante - sc cover: does not match Naibbe, Dante - sc <=10: does not match Naibbe, Dante - sc prev2: does not match Naibbe, Dante - sc <=10 shuf: does not match Naibbe, Dante - sc ratio: does not match Naibbe, Dante - irrev bigr: does not match Naibbe, Dante - pos lock: matches Naibbe, Dante - len first: matches Naibbe, Dante - len mid: matches Naibbe, Dante - len last: matches Naibbe, Dante - gallows init: does not match Naibbe, Dante - gallows mid: matches Naibbe, Dante - MZ peak log2 s: matches Naibbe, Dante - MZ peak R: does not match Naibbe, Dante - tok pred: does not match Naibbe, Dante - char 3g bits: matches Naibbe, Dante - types 1 page: does not match Naibbe, Dante - adj Jaccard xs: does not match Naibbe, Dante - JSD halves: does not match Naibbe, Dante - JSD odd/even: matches human gibberish (cycled)9/37 human gibberish (cycled) - h0 raw: matches human gibberish (cycled) - h1 raw: does not match human gibberish (cycled) - h2 raw: does not match human gibberish (cycled) - h3 raw: does not match human gibberish (cycled) - h2 mrg: does not match human gibberish (cycled) - h3 mrg: does not match human gibberish (cycled) - len mean: matches human gibberish (cycled) - len sd: does not match human gibberish (cycled) - len=1: does not match human gibberish (cycled) - len>=9: does not match human gibberish (cycled) - Zipf: does not match human gibberish (cycled) - TTR: matches human gibberish (cycled) - hapax/types: does not match human gibberish (cycled) - hapax/tokens: does not match human gibberish (cycled) - Heaps: does not match human gibberish (cycled) - adj exact: does not match human gibberish (cycled) - adj LD<=1: does not match human gibberish (cycled) - sc cover: does not match human gibberish (cycled) - sc <=10: does not match human gibberish (cycled) - sc prev2: does not match human gibberish (cycled) - sc <=10 shuf: does not match human gibberish (cycled) - sc ratio: matches human gibberish (cycled) - irrev bigr: does not match human gibberish (cycled) - pos lock: does not match human gibberish (cycled) - len first: matches human gibberish (cycled) - len mid: matches human gibberish (cycled) - len last: matches human gibberish (cycled) - gallows init: matches human gibberish (cycled) - gallows mid: does not match human gibberish (cycled) - MZ peak log2 s: matches human gibberish (cycled) - MZ peak R: does not match human gibberish (cycled) - tok pred: does not match human gibberish (cycled) - char 3g bits: does not match human gibberish (cycled) - types 1 page: does not match human gibberish (cycled) - adj Jaccard xs: does not match human gibberish (cycled) - JSD halves: does not match human gibberish (cycled) - JSD odd/even: does not match Hawaiian 18689/37 Hawaiian 1868 - h0 raw: matches Hawaiian 1868 - h1 raw: does not match Hawaiian 1868 - h2 raw: does not match Hawaiian 1868 - h3 raw: does not match Hawaiian 1868 - h2 mrg: does not match Hawaiian 1868 - h3 mrg: matches Hawaiian 1868 - len mean: does not match Hawaiian 1868 - len sd: does not match Hawaiian 1868 - len=1: does not match Hawaiian 1868 - len>=9: matches Hawaiian 1868 - Zipf: does not match Hawaiian 1868 - TTR: does not match Hawaiian 1868 - hapax/types: does not match Hawaiian 1868 - hapax/tokens: does not match Hawaiian 1868 - Heaps: does not match Hawaiian 1868 - adj exact: does not match Hawaiian 1868 - adj LD<=1: does not match Hawaiian 1868 - sc cover: does not match Hawaiian 1868 - sc <=10: does not match Hawaiian 1868 - sc prev2: does not match Hawaiian 1868 - sc <=10 shuf: does not match Hawaiian 1868 - sc ratio: matches Hawaiian 1868 - irrev bigr: matches Hawaiian 1868 - pos lock: matches Hawaiian 1868 - len first: does not match Hawaiian 1868 - len mid: does not match Hawaiian 1868 - len last: does not match Hawaiian 1868 - gallows init: matches Hawaiian 1868 - gallows mid: does not match Hawaiian 1868 - MZ peak log2 s: matches Hawaiian 1868 - MZ peak R: does not match Hawaiian 1868 - tok pred: does not match Hawaiian 1868 - char 3g bits: does not match Hawaiian 1868 - types 1 page: does not match Hawaiian 1868 - adj Jaccard xs: does not match Hawaiian 1868 - JSD halves: does not match Hawaiian 1868 - JSD odd/even: matches Tongan9/37 Tongan - h0 raw: matches Tongan - h1 raw: matches Tongan - h2 raw: does not match Tongan - h3 raw: does not match Tongan - h2 mrg: does not match Tongan - h3 mrg: matches Tongan - len mean: does not match Tongan - len sd: matches Tongan - len=1: matches Tongan - len>=9: matches Tongan - Zipf: does not match Tongan - TTR: does not match Tongan - hapax/types: does not match Tongan - hapax/tokens: does not match Tongan - Heaps: does not match Tongan - adj exact: does not match Tongan - adj LD<=1: does not match Tongan - sc cover: does not match Tongan - sc <=10: does not match Tongan - sc prev2: does not match Tongan - sc <=10 shuf: does not match Tongan - sc ratio: does not match Tongan - irrev bigr: does not match Tongan - pos lock: matches Tongan - len first: does not match Tongan - len mid: does not match Tongan - len last: does not match Tongan - gallows init: does not match Tongan - gallows mid: does not match Tongan - MZ peak log2 s: matches Tongan - MZ peak R: does not match Tongan - tok pred: does not match Tongan - char 3g bits: does not match Tongan - types 1 page: does not match Tongan - adj Jaccard xs: does not match Tongan - JSD halves: does not match Tongan - JSD odd/even: matches Maori8/37 Maori - h0 raw: matches Maori - h1 raw: matches Maori - h2 raw: does not match Maori - h3 raw: does not match Maori - h2 mrg: does not match Maori - h3 mrg: matches Maori - len mean: does not match Maori - len sd: matches Maori - len=1: does not match Maori - len>=9: matches Maori - Zipf: does not match Maori - TTR: does not match Maori - hapax/types: does not match Maori - hapax/tokens: does not match Maori - Heaps: does not match Maori - adj exact: does not match Maori - adj LD<=1: does not match Maori - sc cover: does not match Maori - sc <=10: does not match Maori - sc prev2: does not match Maori - sc <=10 shuf: does not match Maori - sc ratio: matches Maori - irrev bigr: matches Maori - pos lock: does not match Maori - len first: does not match Maori - len mid: does not match Maori - len last: does not match Maori - gallows init: does not match Maori - gallows mid: does not match Maori - MZ peak log2 s: does not match Maori - MZ peak R: does not match Maori - tok pred: does not match Maori - char 3g bits: does not match Maori - types 1 page: does not match Maori - adj Jaccard xs: does not match Maori - JSD halves: does not match Maori - JSD odd/even: matches Setswana8/37 Setswana - h0 raw: matches Setswana - h1 raw: matches Setswana - h2 raw: does not match Setswana - h3 raw: does not match Setswana - h2 mrg: does not match Setswana - h3 mrg: matches Setswana - len mean: does not match Setswana - len sd: does not match Setswana - len=1: does not match Setswana - len>=9: matches Setswana - Zipf: does not match Setswana - TTR: does not match Setswana - hapax/types: does not match Setswana - hapax/tokens: does not match Setswana - Heaps: matches Setswana - adj exact: does not match Setswana - adj LD<=1: does not match Setswana - sc cover: matches Setswana - sc <=10: does not match Setswana - sc prev2: does not match Setswana - sc <=10 shuf: does not match Setswana - sc ratio: does not match Setswana - irrev bigr: does not match Setswana - pos lock: does not match Setswana - len first: does not match Setswana - len mid: does not match Setswana - len last: does not match Setswana - gallows init: matches Setswana - gallows mid: does not match Setswana - MZ peak log2 s: does not match Setswana - MZ peak R: does not match Setswana - tok pred: does not match Setswana - char 3g bits: does not match Setswana - types 1 page: does not match Setswana - adj Jaccard xs: does not match Setswana - JSD halves: does not match Setswana - JSD odd/even: matches Swahili13/37 Swahili - h0 raw: matches Swahili - h1 raw: matches Swahili - h2 raw: does not match Swahili - h3 raw: does not match Swahili - h2 mrg: does not match Swahili - h3 mrg: does not match Swahili - len mean: does not match Swahili - len sd: does not match Swahili - len=1: does not match Swahili - len>=9: does not match Swahili - Zipf: matches Swahili - TTR: does not match Swahili - hapax/types: does not match Swahili - hapax/tokens: does not match Swahili - Heaps: matches Swahili - adj exact: does not match Swahili - adj LD<=1: does not match Swahili - sc cover: does not match Swahili - sc <=10: does not match Swahili - sc prev2: does not match Swahili - sc <=10 shuf: does not match Swahili - sc ratio: matches Swahili - irrev bigr: matches Swahili - pos lock: matches Swahili - len first: matches Swahili - len mid: does not match Swahili - len last: does not match Swahili - gallows init: does not match Swahili - gallows mid: matches Swahili - MZ peak log2 s: matches Swahili - MZ peak R: matches Swahili - tok pred: does not match Swahili - char 3g bits: does not match Swahili - types 1 page: does not match Swahili - adj Jaccard xs: matches Swahili - JSD halves: does not match Swahili - JSD odd/even: matches Latin Vulgate12/37 Latin Vulgate - h0 raw: matches Latin Vulgate - h1 raw: matches Latin Vulgate - h2 raw: does not match Latin Vulgate - h3 raw: does not match Latin Vulgate - h2 mrg: does not match Latin Vulgate - h3 mrg: does not match Latin Vulgate - len mean: matches Latin Vulgate - len sd: does not match Latin Vulgate - len=1: does not match Latin Vulgate - len>=9: does not match Latin Vulgate - Zipf: does not match Latin Vulgate - TTR: matches Latin Vulgate - hapax/types: does not match Latin Vulgate - hapax/tokens: matches Latin Vulgate - Heaps: does not match Latin Vulgate - adj exact: does not match Latin Vulgate - adj LD<=1: does not match Latin Vulgate - sc cover: does not match Latin Vulgate - sc <=10: does not match Latin Vulgate - sc prev2: does not match Latin Vulgate - sc <=10 shuf: does not match Latin Vulgate - sc ratio: does not match Latin Vulgate - irrev bigr: matches Latin Vulgate - pos lock: does not match Latin Vulgate - len first: matches Latin Vulgate - len mid: matches Latin Vulgate - len last: matches Latin Vulgate - gallows init: does not match Latin Vulgate - gallows mid: matches Latin Vulgate - MZ peak log2 s: matches Latin Vulgate - MZ peak R: does not match Latin Vulgate - tok pred: does not match Latin Vulgate - char 3g bits: does not match Latin Vulgate - types 1 page: does not match Latin Vulgate - adj Jaccard xs: does not match Latin Vulgate - JSD halves: does not match Latin Vulgate - JSD odd/even: matches Esperanto13/37 Esperanto - h0 raw: matches Esperanto - h1 raw: matches Esperanto - h2 raw: does not match Esperanto - h3 raw: does not match Esperanto - h2 mrg: does not match Esperanto - h3 mrg: matches Esperanto - len mean: does not match Esperanto - len sd: matches Esperanto - len=1: does not match Esperanto - len>=9: matches Esperanto - Zipf: matches Esperanto - TTR: does not match Esperanto - hapax/types: does not match Esperanto - hapax/tokens: does not match Esperanto - Heaps: matches Esperanto - adj exact: does not match Esperanto - adj LD<=1: does not match Esperanto - sc cover: matches Esperanto - sc <=10: does not match Esperanto - sc prev2: does not match Esperanto - sc <=10 shuf: does not match Esperanto - sc ratio: matches Esperanto - irrev bigr: matches Esperanto - pos lock: does not match Esperanto - len first: does not match Esperanto - len mid: does not match Esperanto - len last: does not match Esperanto - gallows init: matches Esperanto - gallows mid: does not match Esperanto - MZ peak log2 s: matches Esperanto - MZ peak R: does not match Esperanto - tok pred: does not match Esperanto - char 3g bits: does not match Esperanto - types 1 page: does not match Esperanto - adj Jaccard xs: does not match Esperanto - JSD halves: does not match Esperanto - JSD odd/even: matches Toki Pona8/37 Toki Pona - h0 raw: does not match Toki Pona - h1 raw: matches Toki Pona - h2 raw: does not match Toki Pona - h3 raw: matches Toki Pona - h2 mrg: matches Toki Pona - h3 mrg: does not match Toki Pona - len mean: does not match Toki Pona - len sd: does not match Toki Pona - len=1: does not match Toki Pona - len>=9: does not match Toki Pona - Zipf: does not match Toki Pona - TTR: does not match Toki Pona - hapax/types: does not match Toki Pona - hapax/tokens: does not match Toki Pona - Heaps: does not match Toki Pona - adj exact: matches Toki Pona - adj LD<=1: does not match Toki Pona - sc cover: does not match Toki Pona - sc <=10: does not match Toki Pona - sc prev2: does not match Toki Pona - sc <=10 shuf: does not match Toki Pona - sc ratio: matches Toki Pona - irrev bigr: does not match Toki Pona - pos lock: does not match Toki Pona - len first: does not match Toki Pona - len mid: does not match Toki Pona - len last: does not match Toki Pona - gallows init: matches Toki Pona - gallows mid: does not match Toki Pona - MZ peak log2 s: does not match Toki Pona - MZ peak R: does not match Toki Pona - tok pred: does not match Toki Pona - char 3g bits: matches Toki Pona - types 1 page: does not match Toki Pona - adj Jaccard xs: does not match Toki Pona - JSD halves: does not match Toki Pona - JSD odd/even: matches Lojban9/37 Lojban - h0 raw: matches Lojban - h1 raw: matches Lojban - h2 raw: does not match Lojban - h3 raw: does not match Lojban - h2 mrg: does not match Lojban - h3 mrg: does not match Lojban - len mean: does not match Lojban - len sd: matches Lojban - len=1: does not match Lojban - len>=9: matches Lojban - Zipf: matches Lojban - TTR: does not match Lojban - hapax/types: does not match Lojban - hapax/tokens: does not match Lojban - Heaps: does not match Lojban - adj exact: does not match Lojban - adj LD<=1: does not match Lojban - sc cover: matches Lojban - sc <=10: does not match Lojban - sc prev2: does not match Lojban - sc <=10 shuf: does not match Lojban - sc ratio: matches Lojban - irrev bigr: does not match Lojban - pos lock: does not match Lojban - len first: does not match Lojban - len mid: does not match Lojban - len last: does not match Lojban - gallows init: matches Lojban - gallows mid: does not match Lojban - MZ peak log2 s: does not match Lojban - MZ peak R: does not match Lojban - tok pred: does not match Lojban - char 3g bits: does not match Lojban - types 1 page: does not match Lojban - adj Jaccard xs: does not match Lojban - JSD halves: does not match Lojban - JSD odd/even: matches Markov 1, Voynich-trained17/37 Markov 1, Voynich-trained - h0 raw: matches Markov 1, Voynich-trained - h1 raw: matches Markov 1, Voynich-trained - h2 raw: matches Markov 1, Voynich-trained - h3 raw: does not match Markov 1, Voynich-trained - h2 mrg: matches Markov 1, Voynich-trained - h3 mrg: does not match Markov 1, Voynich-trained - len mean: matches Markov 1, Voynich-trained - len sd: does not match Markov 1, Voynich-trained - len=1: does not match Markov 1, Voynich-trained - len>=9: does not match Markov 1, Voynich-trained - Zipf: matches Markov 1, Voynich-trained - TTR: does not match Markov 1, Voynich-trained - hapax/types: does not match Markov 1, Voynich-trained - hapax/tokens: does not match Markov 1, Voynich-trained - Heaps: does not match Markov 1, Voynich-trained - adj exact: matches Markov 1, Voynich-trained - adj LD<=1: matches Markov 1, Voynich-trained - sc cover: does not match Markov 1, Voynich-trained - sc <=10: matches Markov 1, Voynich-trained - sc prev2: matches Markov 1, Voynich-trained - sc <=10 shuf: matches Markov 1, Voynich-trained - sc ratio: does not match Markov 1, Voynich-trained - irrev bigr: does not match Markov 1, Voynich-trained - pos lock: matches Markov 1, Voynich-trained - len first: matches Markov 1, Voynich-trained - len mid: matches Markov 1, Voynich-trained - len last: matches Markov 1, Voynich-trained - gallows init: does not match Markov 1, Voynich-trained - gallows mid: matches Markov 1, Voynich-trained - MZ peak log2 s: does not match Markov 1, Voynich-trained - MZ peak R: does not match Markov 1, Voynich-trained - tok pred: does not match Markov 1, Voynich-trained - char 3g bits: does not match Markov 1, Voynich-trained - types 1 page: does not match Markov 1, Voynich-trained - adj Jaccard xs: does not match Markov 1, Voynich-trained - JSD halves: does not match Markov 1, Voynich-trained - JSD odd/even: matches Markov 2, Voynich-trained22/37 Markov 2, Voynich-trained - h0 raw: matches Markov 2, Voynich-trained - h1 raw: matches Markov 2, Voynich-trained - h2 raw: matches Markov 2, Voynich-trained - h3 raw: matches Markov 2, Voynich-trained - h2 mrg: matches Markov 2, Voynich-trained - h3 mrg: matches Markov 2, Voynich-trained - len mean: matches Markov 2, Voynich-trained - len sd: does not match Markov 2, Voynich-trained - len=1: matches Markov 2, Voynich-trained - len>=9: does not match Markov 2, Voynich-trained - Zipf: matches Markov 2, Voynich-trained - TTR: matches Markov 2, Voynich-trained - hapax/types: matches Markov 2, Voynich-trained - hapax/tokens: does not match Markov 2, Voynich-trained - Heaps: matches Markov 2, Voynich-trained - adj exact: does not match Markov 2, Voynich-trained - adj LD<=1: does not match Markov 2, Voynich-trained - sc cover: does not match Markov 2, Voynich-trained - sc <=10: does not match Markov 2, Voynich-trained - sc prev2: does not match Markov 2, Voynich-trained - sc <=10 shuf: does not match Markov 2, Voynich-trained - sc ratio: matches Markov 2, Voynich-trained - irrev bigr: matches Markov 2, Voynich-trained - pos lock: matches Markov 2, Voynich-trained - len first: matches Markov 2, Voynich-trained - len mid: matches Markov 2, Voynich-trained - len last: matches Markov 2, Voynich-trained - gallows init: does not match Markov 2, Voynich-trained - gallows mid: matches Markov 2, Voynich-trained - MZ peak log2 s: does not match Markov 2, Voynich-trained - MZ peak R: does not match Markov 2, Voynich-trained - tok pred: does not match Markov 2, Voynich-trained - char 3g bits: matches Markov 2, Voynich-trained - types 1 page: matches Markov 2, Voynich-trained - adj Jaccard xs: does not match Markov 2, Voynich-trained - JSD halves: does not match Markov 2, Voynich-trained - JSD odd/even: matches Markov 3, Voynich-trained25/37 Markov 3, Voynich-trained - h0 raw: matches Markov 3, Voynich-trained - h1 raw: matches Markov 3, Voynich-trained - h2 raw: matches Markov 3, Voynich-trained - h3 raw: matches Markov 3, Voynich-trained - h2 mrg: matches Markov 3, Voynich-trained - h3 mrg: matches Markov 3, Voynich-trained - len mean: matches Markov 3, Voynich-trained - len sd: matches Markov 3, Voynich-trained - len=1: matches Markov 3, Voynich-trained - len>=9: matches Markov 3, Voynich-trained - Zipf: matches Markov 3, Voynich-trained - TTR: matches Markov 3, Voynich-trained - hapax/types: matches Markov 3, Voynich-trained - hapax/tokens: matches Markov 3, Voynich-trained - Heaps: matches Markov 3, Voynich-trained - adj exact: does not match Markov 3, Voynich-trained - adj LD<=1: does not match Markov 3, Voynich-trained - sc cover: matches Markov 3, Voynich-trained - sc <=10: does not match Markov 3, Voynich-trained - sc prev2: does not match Markov 3, Voynich-trained - sc <=10 shuf: does not match Markov 3, Voynich-trained - sc ratio: does not match Markov 3, Voynich-trained - irrev bigr: matches Markov 3, Voynich-trained - pos lock: matches Markov 3, Voynich-trained - len first: matches Markov 3, Voynich-trained - len mid: matches Markov 3, Voynich-trained - len last: matches Markov 3, Voynich-trained - gallows init: does not match Markov 3, Voynich-trained - gallows mid: matches Markov 3, Voynich-trained - MZ peak log2 s: does not match Markov 3, Voynich-trained - MZ peak R: does not match Markov 3, Voynich-trained - tok pred: does not match Markov 3, Voynich-trained - char 3g bits: matches Markov 3, Voynich-trained - types 1 page: matches Markov 3, Voynich-trained - adj Jaccard xs: does not match Markov 3, Voynich-trained - JSD halves: does not match Markov 3, Voynich-trained - JSD odd/even: matches Markov 1, Latin-trained9/37 Markov 1, Latin-trained - h0 raw: matches Markov 1, Latin-trained - h1 raw: matches Markov 1, Latin-trained - h2 raw: does not match Markov 1, Latin-trained - h3 raw: does not match Markov 1, Latin-trained - h2 mrg: does not match Markov 1, Latin-trained - h3 mrg: does not match Markov 1, Latin-trained - len mean: does not match Markov 1, Latin-trained - len sd: does not match Markov 1, Latin-trained - len=1: does not match Markov 1, Latin-trained - len>=9: does not match Markov 1, Latin-trained - Zipf: matches Markov 1, Latin-trained - TTR: does not match Markov 1, Latin-trained - hapax/types: does not match Markov 1, Latin-trained - hapax/tokens: does not match Markov 1, Latin-trained - Heaps: does not match Markov 1, Latin-trained - adj exact: does not match Markov 1, Latin-trained - adj LD<=1: matches Markov 1, Latin-trained - sc cover: does not match Markov 1, Latin-trained - sc <=10: does not match Markov 1, Latin-trained - sc prev2: does not match Markov 1, Latin-trained - sc <=10 shuf: does not match Markov 1, Latin-trained - sc ratio: does not match Markov 1, Latin-trained - irrev bigr: matches Markov 1, Latin-trained - pos lock: does not match Markov 1, Latin-trained - len first: matches Markov 1, Latin-trained - len mid: does not match Markov 1, Latin-trained - len last: does not match Markov 1, Latin-trained - gallows init: matches Markov 1, Latin-trained - gallows mid: does not match Markov 1, Latin-trained - MZ peak log2 s: matches Markov 1, Latin-trained - MZ peak R: does not match Markov 1, Latin-trained - tok pred: does not match Markov 1, Latin-trained - char 3g bits: does not match Markov 1, Latin-trained - types 1 page: does not match Markov 1, Latin-trained - adj Jaccard xs: does not match Markov 1, Latin-trained - JSD halves: does not match Markov 1, Latin-trained - JSD odd/even: matches Markov 3, Latin-trained7/37 Markov 3, Latin-trained - h0 raw: matches Markov 3, Latin-trained - h1 raw: matches Markov 3, Latin-trained - h2 raw: does not match Markov 3, Latin-trained - h3 raw: does not match Markov 3, Latin-trained - h2 mrg: does not match Markov 3, Latin-trained - h3 mrg: does not match Markov 3, Latin-trained - len mean: does not match Markov 3, Latin-trained - len sd: does not match Markov 3, Latin-trained - len=1: does not match Markov 3, Latin-trained - len>=9: does not match Markov 3, Latin-trained - Zipf: does not match Markov 3, Latin-trained - TTR: does not match Markov 3, Latin-trained - hapax/types: does not match Markov 3, Latin-trained - hapax/tokens: does not match Markov 3, Latin-trained - Heaps: does not match Markov 3, Latin-trained - adj exact: does not match Markov 3, Latin-trained - adj LD<=1: does not match Markov 3, Latin-trained - sc cover: does not match Markov 3, Latin-trained - sc <=10: does not match Markov 3, Latin-trained - sc prev2: does not match Markov 3, Latin-trained - sc <=10 shuf: does not match Markov 3, Latin-trained - sc ratio: does not match Markov 3, Latin-trained - irrev bigr: matches Markov 3, Latin-trained - pos lock: does not match Markov 3, Latin-trained - len first: matches Markov 3, Latin-trained - len mid: does not match Markov 3, Latin-trained - len last: does not match Markov 3, Latin-trained - gallows init: matches Markov 3, Latin-trained - gallows mid: does not match Markov 3, Latin-trained - MZ peak log2 s: matches Markov 3, Latin-trained - MZ peak R: does not match Markov 3, Latin-trained - tok pred: does not match Markov 3, Latin-trained - char 3g bits: does not match Markov 3, Latin-trained - types 1 page: does not match Markov 3, Latin-trained - adj Jaccard xs: does not match Markov 3, Latin-trained - JSD halves: does not match Markov 3, Latin-trained - JSD odd/even: matches random glyphs6/37 random glyphs - h0 raw: matches random glyphs - h1 raw: matches random glyphs - h2 raw: does not match random glyphs - h3 raw: does not match random glyphs - h2 mrg: does not match random glyphs - h3 mrg: does not match random glyphs - len mean: does not match random glyphs - len sd: does not match random glyphs - len=1: does not match random glyphs - len>=9: does not match random glyphs - Zipf: matches random glyphs - TTR: does not match random glyphs - hapax/types: does not match random glyphs - hapax/tokens: does not match random glyphs - Heaps: does not match random glyphs - adj exact: does not match random glyphs - adj LD<=1: does not match random glyphs - sc cover: does not match random glyphs - sc <=10: does not match random glyphs - sc prev2: does not match random glyphs - sc <=10 shuf: does not match random glyphs - sc ratio: does not match random glyphs - irrev bigr: matches random glyphs - pos lock: does not match random glyphs - len first: does not match random glyphs - len mid: does not match random glyphs - len last: does not match random glyphs - gallows init: does not match random glyphs - gallows mid: matches random glyphs - MZ peak log2 s: does not match random glyphs - MZ peak R: does not match random glyphs - tok pred: does not match random glyphs - char 3g bits: does not match random glyphs - types 1 page: does not match random glyphs - adj Jaccard xs: does not match random glyphs - JSD halves: does not match random glyphs - JSD odd/even: matches
Which of the 37 items each corpus matches (filled) at full length, 34,116 tokens; the letters are the battery’s item groups a–k. Hover a cell for the item. Gibberish is cycled four times to reach full length, so its vocabulary items are void here; the text compares it at equal size (S: b3, c1).

Results. As a calibration, the manuscript’s own Currier B pages, scored against the whole, match 34 of 37 items; the Currier A pages match 27. The best outside scores, 17, 22 and 25, belong to character Markov chains of order 1, 2 and 3 trained on Voynichese itself. Those are fits, not hypotheses. The order-3 chain reproduces every character and vocabulary item and fails everything above the word: adjacent repetition, self-citation, line-initial gallows, long-range keyword information, word predictability and drift (S: c1). Among real hypotheses the three Naibbe ciphertexts score best, 16 to 17. The Rugg sorted table and the Italian control score 14, Swahili and Esperanto 13, the Latin Vulgate 12, and every other language, conlang, generator and the human gibberish 6 to 10 (S: b3, c1).

What fails, by family (S: b3, v_b3, c1).

Caveats. On six items the 10% tolerance is tighter than Voynichese’s own sampling noise, though every candidate still misses them by 7 to 18 standard errors. Two items, the drift between the two halves of the book and the height of the long-range peak, reward the A+B mixture, which no single-regime generator could have: the Currier A and B pages each fail them alone. The battery’s gallows and merged-glyph items are defined on EVA and mean nothing for other alphabets (S: v_b3). The reading that survives is this. No family as built reproduces Voynichese. The glyph-level items favour a verbose cipher. Local repetition favours copy-and-modify. Long-range drift needs topical structure plus a change of regime between A and B, which neither supplies. A Naibbe ciphertext that switches plaintext halfway, Pliny then Dante, still drifts only 0.003 against 0.063, so a cipher account needs the tables themselves to change between A and B (S: v_b3).

RBA’s post

RBA’s post reaches the same character-level result from the same transliteration: h2 2.07 for Voynichese and 3.36 for Augustine’s Latin, against 2.12 and 3.33 to 3.36 here with the space counted (the post does not say which convention it uses; its values match this one). Three points differ.

Two generators built to pass, scored on items they never saw (b5, 28 October 2026)

The rules came first: b5_PREREG.md was committed before any generator code, and the tuned parameters were committed before scoring. Each candidate has five free parameters, tuned only on 17 fit items (character entropies, word length, vocabulary, glyph slots). It is then scored once on the other 20 held-out items (adjacent repeats, self-citation, line position, long range, predictability, page level, drift), with five seeds. Neither generator reads Voynich word types or counts. The bar is the real text disagreeing with itself: the Currier A pages alone match 15 of the 20 held-out items when scored against the whole text. Every analysis was first re-run on a corrected transliteration parse (drawing-interruption marks read as word breaks, ligature groups kept; 34,774 tokens). Headline values moved by less than 0.01 bit (S: b5).

candidatefit items (of 17)held-out, full text (of 20)held-out, 10,053 tokens
C: verbose slot cipher of Pliny’s Latin (books in section order, one table per Currier language, nomenclator)15–1610.8 (9–13)8.2
G: copy-and-modify with section-local sources and per-scribe habits5–68.4 (6–11)9.6
Timm & Schinner’s autocopist, as published5–85–64–5
Voynich, Currier A pages alone (the bar)151519

Neither reproduces the held-out structure. The cipher fits the character and vocabulary statistics with a handful of parameters; the copy-and-modify family cannot, because its character entropy and word-length spread come from the inherited modification rules. Both fail, on every seed, the same three things: adjacent repeats; vocabulary shared by neighbouring pages (excess Jaccard 0.037 real, 0.011 cipher, 0.007 copy); and the drift between the first and second halves of the book (JSD 0.062 real, 0.003 cipher, 0.013 copy). Enciphering a topic-ordered Latin text also wipes out the long-range peak (0.045 bit against 0.31). This favours neither meaning nor nonsense. What it does is name the target: any account, cipher or hoax, has to produce those three page-level patterns. Results in results/b5.md.

07 Real ciphers of the period

The cipher hypotheses are usually argued from what 15th-century cryptography could have done: Alberti’s polyalphabet of 1467, nomenclators, Naibbe-style tables. This project has transcribed actual ciphertexts of the period, so c3 measures them directly. It takes every cipher passage of 250 signs or more transcribed sign by sign from the manuscript: Mantua 1428–30 (R1854), Siena’s file of letters in cipher (Concistoro 2308), the Sforza ciphers of 1446 (BnF italien 1583) and Buda 1490 (Sforzesco, Ungheria). Most write no word division, so h2 is measured without spaces. Plug-in h2 falls with sample length and rises with alphabet size, so each text is set against random stretches of Voynichese and of Latin of exactly its own length (S: c3).

1 2 3 4 5 h2 without spaces, bits per sign, at each text’s own length Siena no. 14 (c. 1420)1453 signs, 56 kinds voynich raw windows of 1453: mean 2.06, 5-95% 1.80-2.30 latin windows of 1453: mean 3.33, 5-95% 3.27-3.38 plaintext reading: h2 3.06 (1260 letters) ciphertext: h2 3.53, 1453 signs, 56 kinds Mantua R1854 p. 1 (1428)261 signs, 28 kinds voynich raw windows of 261: mean 1.77, 5-95% 1.49-2.03 latin windows of 261: mean 2.79, 5-95% 2.68-2.89 ciphertext: h2 2.85, 261 signs, 28 kinds Mantua R1854 p. 2 (1428)1802 signs, 53 kinds voynich raw windows of 1802: mean 2.07, 5-95% 1.82-2.32 latin windows of 1802: mean 3.36, 5-95% 3.31-3.41 plaintext reading: h2 3.27 (1651 letters) ciphertext: h2 3.89, 1802 signs, 53 kinds Mantua R1854 p. 3 (1428)893 signs, 55 kinds voynich raw windows of 893: mean 1.99, 5-95% 1.73-2.24 latin windows of 893: mean 3.25, 5-95% 3.18-3.31 plaintext reading: h2 2.99 (985 letters) ciphertext: h2 3.51, 893 signs, 55 kinds Mantua R1854 pp. 4-5 (1430)1736 signs, 47 kinds voynich raw windows of 1736: mean 2.10, 5-95% 1.83-2.34 latin windows of 1736: mean 3.36, 5-95% 3.31-3.41 plaintext reading: h2 3.31 (1685 letters) ciphertext: h2 3.80, 1736 signs, 47 kinds Sforza, BnF it. 1583 f. 68 (1446)404 signs, 26 kinds voynich raw windows of 404: mean 1.86, 5-95% 1.59-2.10 latin windows of 404: mean 2.99, 5-95% 2.90-3.08 ciphertext: h2 3.01, 404 signs, 26 kinds Sforza, BnF it. 1583 f. 70 (1446)390 signs, 31 kinds voynich raw windows of 390: mean 1.86, 5-95% 1.56-2.11 latin windows of 390: mean 2.99, 5-95% 2.88-3.07 ciphertext: h2 3.10, 390 signs, 31 kinds Siena no. 7 (c. 1454)363 signs, 45 kinds voynich raw windows of 363: mean 1.85, 5-95% 1.56-2.09 latin windows of 363: mean 2.95, 5-95% 2.87-3.04 ciphertext: h2 2.78, 363 signs, 45 kinds Siena no. 11 (1478)409 signs, 44 kinds voynich raw windows of 409: mean 1.86, 5-95% 1.59-2.10 latin windows of 409: mean 3.00, 5-95% 2.90-3.09 ciphertext: h2 2.83, 409 signs, 44 kinds Buda, to Milan (1490)690 signs, 75 kinds voynich raw windows of 690: mean 1.97, 5-95% 1.72-2.18 latin windows of 690: mean 3.18, 5-95% 3.10-3.24 plaintext reading: h2 3.01 (684 letters) ciphertext: h2 3.25, 690 signs, 75 kinds Siena nos. 6, 24 (undated)3694 signs, 73 kinds voynich raw windows of 3694: mean 2.13, 5-95% 1.87-2.35 latin windows of 3694: mean 3.43, 5-95% 3.40-3.46 ciphertext: h2 4.37, 3694 signs, 73 kinds Siena nos. 20-23 (undated)4931 signs, 86 kinds voynich raw windows of 4931: mean 2.15, 5-95% 1.89-2.36 latin windows of 4931: mean 3.45, 5-95% 3.42-3.48 ciphertext: h2 3.87, 4931 signs, 86 kinds Siena no. 25 (undated)496 signs, 21 kinds voynich raw windows of 496: mean 1.91, 5-95% 1.62-2.13 latin windows of 496: mean 3.07, 5-95% 2.98-3.15 plaintext reading: h2 2.74 (495 letters) ciphertext: h2 2.76, 496 signs, 21 kinds ciphertext its plaintext Voynich, same length Latin, same length
Conditional entropy of real 15th-century ciphertexts (diamonds), of their plaintexts where read (squares), and of random stretches of Voynichese and Latin of the same length (dots: mean; bars: 5–95% of 300 stretches). Benedict XIII’s 1400 cipher is left out: its signs were re-created from the printed plaintext, not transcribed (S: c3).
ciphertextdatesystemsigns / kindsh2 cipherh2 plaintextVoynich, same lengthLatin, same length
Siena no. 14c. 1409–29substitution, a few homophones1,453 / 563.533.062.053.33
Mantua R1854, 9 Aug 14281428homophonic, 13 nulls1,802 / 533.893.272.073.36
Mantua R1854, 6 Nov 14281428homophonic, nulls, name codes893 / 553.512.992.003.24
Mantua R1854, Feb 14301430homophonic, up to 4 signs a letter1,736 / 473.803.312.093.36
Mantua R1854, 22 Apr 14281428unread261 / 282.851.772.79
Sforza, BnF it. 1583 ff. 68, 701446signs with syllable signs, unread404, 390 / 26, 313.01, 3.101.87, 1.862.99, 2.98
Siena nos. 7, 11c. 1454, 1478homophonic-looking, unread363, 409 / 45, 442.78, 2.831.85, 1.892.95, 2.99
Buda, to Milan1490homophonic, syllable signs, nulls690 / 753.253.011.973.18
Siena nos. 6 and 2415th-century handunidentified, crossed signs3,694 / 734.372.153.43
Siena nos. 20–23undatedunidentified, superscript signs4,931 / 863.872.163.45
Siena no. 25undatedsimple substitution496 / 212.762.741.913.08

Every one of them sits 0.85 to 2.2 bits above Voynichese of the same length, and between 0.3 bit below and 0.9 bit above Latin of the same length. The ones below Latin are the short Siena pieces, which are Italian and of a few hundred signs only. Simple substitution keeps the plaintext’s h2 (Siena no. 25: 2.76 against 2.74). Homophones and nulls raise it, by 0.24 to 0.62 bit over the plaintext in the four read homophonic letters, because they are there to flatten frequencies. The texts with the most unusual systems, Siena nos. 6, 24 and 20–23, are the furthest from Voynichese. No cipher actually in use in Italy between 1409 and 1490 produces Voynich-like statistics. Hypothesis (a) therefore needs a system unlike anything the chanceries used: a verbose design such as Naibbe, which reproduces the glyph statistics but is a modern construction (S: c3, b3). The texts under 250 signs (Florence 1425, María 1435, Siena no. 4) are too short for a stable h2 and are listed in results/c3.md only.

08 Long-range structure, pages and pictures

The literature’s strongest case for meaning has been structure above the word: keywords that cluster over hundreds of words (Montemurro & Zanette 2013), neighbouring pages that resemble each other, and vocabulary that follows the pictures (L). b2 recomputed all three with scribe and quire held fixed, against Latin, English and Italian poured into the manuscript’s pages (S: b2, v_b2).

0.0 0.2 0.4 0.6 16 32 64 128 256 512 1024 2048 block size in tokens bits, real minus shuffled Voynich: block 16 tokens, 0.064 bits Voynich: block 32 tokens, 0.111 bits Voynich: block 64 tokens, 0.172 bits Voynich: block 128 tokens, 0.232 bits Voynich: block 256 tokens, 0.280 bits Voynich: block 512 tokens, 0.285 bits Voynich: block 1024 tokens, 0.287 bits Voynich: block 2048 tokens, 0.279 bits Latin: block 16 tokens, 0.006 bits Latin: block 32 tokens, 0.013 bits Latin: block 64 tokens, 0.019 bits Latin: block 128 tokens, 0.032 bits Latin: block 256 tokens, 0.047 bits Latin: block 512 tokens, 0.069 bits Latin: block 1024 tokens, 0.080 bits Latin: block 2048 tokens, 0.082 bits autocopist: block 16 tokens, 0.075 bits autocopist: block 32 tokens, 0.148 bits autocopist: block 64 tokens, 0.249 bits autocopist: block 128 tokens, 0.356 bits autocopist: block 256 tokens, 0.435 bits autocopist: block 512 tokens, 0.472 bits autocopist: block 1024 tokens, 0.446 bits autocopist: block 2048 tokens, 0.357 bits Naibbe cipher: block 16 tokens, -0.008 bits Naibbe cipher: block 32 tokens, -0.008 bits Naibbe cipher: block 64 tokens, -0.008 bits Naibbe cipher: block 128 tokens, -0.009 bits Naibbe cipher: block 256 tokens, -0.003 bits Naibbe cipher: block 512 tokens, 0.003 bits Naibbe cipher: block 1024 tokens, 0.003 bits Naibbe cipher: block 2048 tokens, -0.004 bits Markov 3: block 16 tokens, -0.001 bits Markov 3: block 32 tokens, 0.003 bits Markov 3: block 64 tokens, 0.003 bits Markov 3: block 128 tokens, 0.003 bits Markov 3: block 256 tokens, -0.002 bits Markov 3: block 512 tokens, -0.000 bits Markov 3: block 1024 tokens, -0.000 bits Markov 3: block 2048 tokens, 0.001 bits Naibbe cipher Markov 3 Latin Voynich autocopist
Long-range keyword information: how much more unevenly the words are spread over blocks of a given size than in the same text shuffled. This is the simplified form of Montemurro & Zanette’s measure used in the bake-off battery; the figures quoted in the text are b2’s full estimator, which gives the same ordering. Every text is 34,116 tokens in the manuscript’s layout (S: b3, c1).

None of the four separates meaningful text from generated text. What they show is variation by production campaign. The frequent words drift page by page within a scribe’s run, break at every change of scribe, and change between gatherings, while the drawing on a page adds nothing once its gathering is known. A text compiled or copied gathering by gathering would do that, and so would a generator re-set for each batch. They rule out a generator that draws every page independently from one distribution, or one that never changes regime. The “section-conditioned production” that b2 read into the picture result does not survive the check (S: v_b2).

09 Currier A and B

Currier (1976) found two statistical languages in the manuscript (L). What separates them (S: a6, v_a6):

statisticAB
Tokens ending -edy / containing ed0.20% / 0.29%17.34% / 20.84%
Containing cho / starting qo- / ending -ol16.1 / 10.0 / 14.5%2.7 / 17.7 / 7.1%
Glyph after ch: e / o24.5 / 46.1%60.1 / 10.1%
daiin per thousand tokens42.513.0

Unsupervised clustering of 197 folios recovers Currier’s labels at 95.4% to 99.5%. A single -edy threshold separates them at 99.5% leave-one-out: A a spike, 112 of 114 folios below 2%, B a continuum from 3% to 42%; the same in IT2a. Parisel’s 2026 preprint reaches the same single-switch description independently (L).

Hand determines language. With Davis’s (2020) five hands from the IVTFF headers, H(language | hand) is 0.09 bits and 98.2% of lines are predicted from hand alone; the only mixed cell is hand 3 in the stars section. The scribe, not the subject matter, sets the language.

Vocabulary sharing, calibrated. Size-matched A against B gives Jaccard 0.147 and top-100 overlap 0.95, against 0.207 and 1.00 for two halves of A, 0.172 and 0.91 for two English novels, 0.116 and 0.67 for Danish against Norwegian. A word-final pattern moving from 0.2% to 17% has no parallel between books in one language but does between languages: French against Italian, final -o, 0.19% to 17.5% (S: v_a6).

Section words. Section-specific vocabulary exists, mean chi-square per token 0.654 against 0.121 shuffled and 0.40 for Italian, and persists within one scribe and one language. But the section words belong to the same sub-word families, qokain, qol, qokeedy, okeol, not to anything resembling content vocabulary (S: v_a6).

10 Hypothesis status

excluded

  1. Plaintext or monoalphabetic substitution of the eleven tested languages: h2 gap at least 1.0 bit raw, at least 0.4 bit merged (S: a1, v_a1; L: Bennett 1976, Zandbergen, Lindemann & Bowern 2021).
  2. Homophonic substitution with nulls and a nomenclator, the system of the Italian chanceries in 1409–1490: every real example measured sits 0.85 to 2.2 bits above Voynichese at the same length, and the homophonic ones above their own plaintext (S: c3).
  3. Substitution plus vowel removal or conventional abbreviation (S: a1, a5; L: Lindemann & Bowern 2021).
  4. Letter-level transposition of a real plaintext, including grille rearrangement (S: v_a5; L: Parisel 2026).
  5. Vigenère-type polyalphabetics (L: D’Imperio 1978, Stolfi 2000).
  6. Single-glyph nulls as the source of the redundancy (S: a5).
  7. Named decipherments: Cheshire 2019 (refuted by its reviewers), Hauer & Kondrak 2016 read as a decipherment (the authors’ own caveat), Bax 2014, Gibbs 2017, Ardic, Gladyseva 2023, Schechter 2025 and the 2025–2026 LLM-assisted readings: no reproducible key, none survives blind application (L).
  8. Modern forgery (L: radiocarbon, ink, provenance).

disfavoured*

live

Judgement*: the October additions narrow both live hypotheses without separating them, and the September balance, about 45:50, stands.

11 What the physical evidence adds

All (L). Radiocarbon on four folios: 1404–1438 (Hodgins, University of Arizona, 2009). Iron-gall ink and period pigments throughout (McCrone 2009; Yale 2014). Five hands, three writing 188 of the 227 pages, share one writing system (Davis 2020). Romance-dialect month names and a German-hand note on f116v put it in German- and French/Occitan-speaking hands within decades. Multispectral images of ten folios (taken 2014, released 2024) recovered an erased alphabet trial on f1r and Tepenecz’s ex libris, not new Voynichese. Provenance runs from Prague c.1600 through Baresch (1639), Marci (1665) and Kircher to 1912.

The consequence is symmetric. A meaningless-text account must be a 1420s production on fresh calfskin by several collaborating scribes who kept one slot grammar and one A/B switch consistent across 200-plus pages, a cost no statistic addresses. A cipher account must explain why the scribe rather than the subject matter sets the language (section 09).

12 What would settle the rest

Done since September: the battery bake-off (section 06, b3 and c1), the pre-registered generator round b5 (section 06), illustration-to-text information and page adjacency (section 08, b2), re-tokenisation and syllabic Latin and Italian (section 02, b1), and real period ciphers (section 07, c3). Still open:

  1. A generator that produces the page-level patterns. Attempted on 28 October (b5, section 06): a verbose cipher of Latin and a drifting copy-and-modify generator, each tuned on 17 items, scored 10.8 and 8.4 of 20 held-out items, against a bar of 15. Both fail adjacent repeats, neighbouring-page vocabulary overlap and the A-to-B drift. The next round should pre-register mechanisms for exactly those three, with the same fit/held-out split.
  2. Manuscript-length human gibberish written over weeks with illustrations and sections, the open test named by Gaskell & Bowern (2022) (L).
  3. RBA’s masking test with the missing controls: Voynichese shuffled within each page, verse, a formulaic Latin herbal or recipe text, and the Naibbe ciphertext. This would show whether the look-alike effect is copying order or page vocabulary.
  4. The f and p rules and the line-initial effect as battery items, defined so that they apply to any alphabet.
  5. For any claimed key: blind application by a third party to five A and five B folios, with a shuffled-glyph control.

13 Checked, not checked, must verify

Checked. Every headline number in a1 to a6 was reproduced by an independent re-implementation, v_a1 to v_a6, including the Levenshtein code, entropy formulas, estimator bias, corpus contents and Gutenberg boilerplate. Robustness across ZL, RF1b, IT2a, GC2a and CD2a. Corrections applied: single-book samples; Latin word entropy from prose, not verse; a folded floor of 3.32; the rigidity ratio at 1.7 to 2.3; under-dispersion as a Currier-B property; the line-final effect as the m/g allograph; the A/B rule at 99.5% leave-one-out.

Checked in October. All corpora were downloaded again from the same sources (Project Gutenberg ids recorded in the results; voynich.nu ZL version of 13 May 2025, which parses to the committed file line for line), and b1 to b4 were re-run. Every value reproduced. The exception was the Italian control: its OCR source had been rebuilt with the documents in another order, so the September sample was re-anchored at its first words, after which every Italian value reproduced too. Separate agents re-implemented b1, b2 and b3 (v_b1 to v_b3, reports in results/), and v_b4 re-checked b4’s entropies, intervals and tests. Their corrections are in the text above: the bake-off was not pre-registered; the autocopist and Naibbe fail Zipf; the consonant–vowel syllable match is an artefact of token shape.

Resolved. Merged h2 appears as 2.870 and as 2.646 because two merge lists were used (a1’s, which also merges aiin, ain and qo, against a4’s shorter one); both leave out the space. The adjacent-repeat rate is 0.907% for pairs within a line and 0.82% for all consecutive pairs across line breaks (S: c1 reconciliation).

Known defect, not yet propagated. The parser behind every figure deletes the IVTFF <-> marks (a word interrupted by a drawing) without leaving a break, gluing 655 false compounds. It also drops 394 {..} ligature groups with their glyphs. Re-parsed with both fixed, h2 is unchanged (merged 2.635 to 2.646). Pair violation falls from 0.160 to 0.145, merged word-length variance from 2.48 to 2.12, and hapax from 69.5% to 67.7%. That last figure is inside the single-book language range, so the claim that Voynich hapax exceeds every language should not be relied on (S: v_b1). A full re-run on the corrected parse is the next step.

Not checked. Paywalled Cryptologia full texts (Rugg 2004, Schinner 2007, Timm & Schinner 2020 and 2023, Daruka 2020, Greshko 2025) were characterised from abstracts and secondary summaries. Davis’s hand assignments were taken from the IVTFF headers. RBA’s network was not re-run. Physical evidence beyond radiocarbon, ink, hands and the 1639 letter, including ink layering, pigment order and quire order, was not examined.

User must verify before quoting. The corpus choices: single Gutenberg books; an OCR Italian corpus with Latin passages; Bibles for the low-entropy languages; Tatoeba sentences, not running text, for Toki Pona, Lojban and Volapük. Also the glyph merge lists, the design of the 24-symbol verbose controls, the period-cipher transcriptions (several unread, two undated), and the labels excluded, disfavoured and live. All output is unvalidated until review.

14 Files and reproduction

Everything lives in targets/voynich/. fetch_corpora.py downloads every comparison text and transliteration into git-ignored folders (Gutenberg, eBible.org, Tatoeba, voynich.nu, which refuses plain requests without browser headers). It also freezes the Italian sample. parse_ivtff.py converts IVTFF to TSV; data/ZL3b-n.words.tsv is the parsed main transliteration. baseline.py and baseline2.py are the independent baselines. Tests: a1_charstats.py to a6_structure.py with re-runs v_a1.py to v_a6.py; b1_segmentation.py, b2_longrange.py, b3_bakeoff.py, b4_robustness.py with v_b1.py to v_b4.py; c1_comparators.py, c3_period.py (period data in data/period/, built by its _extract.py from this project’s target folders) and c2_charts.py, which writes the charts into this page. data/lb2021_wikipedia_h2.tsv is Lindemann & Bowern’s appendix table. results/ holds per-script JSON and Markdown. NOTES.md is the adjudication this page condenses; SOURCES.md the five literature sweeps.