#!/usr/bin/env node /** * Build Euclid's Elements Book X discourse JSON and Mermaid charts. * 16 definitions (4+6+6), 115 propositions. Incommensurables, binomials, apotomes. * Depends on Books I, V, VI. Source: David E. Joyce. * * Charts: 8. Props 1-15, 16-30, 31-45, 46-60, 61-75, 76-90, 91-105, 106-115. */ const fs = require('fs'); const path = require('path'); const PROPS = [ { n: 1, short: "Antenaresis for magnitudes", full: "Two unequal magnitudes: subtract more than half repeatedly; remainder less than lesser" }, { n: 2, short: "Incommensurable criterion", full: "If less subtracted from greater repeatedly and remainder never measures prior: incommensurable" }, { n: 3, short: "GCM of two commensurable", full: "To find greatest common measure of two commensurable magnitudes" }, { n: 4, short: "GCM of three commensurable", full: "To find greatest common measure of three commensurable magnitudes" }, { n: 5, short: "Commensurable: number ratio", full: "Commensurable magnitudes have ratio which a number has to a number" }, { n: 6, short: "Number ratio: commensurable", full: "If two magnitudes have number-to-number ratio, they are commensurable" }, { n: 7, short: "Incommensurable: no number ratio", full: "Incommensurable magnitudes do not have number-to-number ratio" }, { n: 8, short: "No number ratio: incommensurable", full: "If magnitudes lack number-to-number ratio, they are incommensurable" }, { n: 9, short: "Squares: commensurable iff square ratio", full: "Squares on commensurable lines have square-to-square ratio; converse" }, { n: 10, short: "Find incommensurable lines", full: "To find two lines incommensurable with assigned: one in length, one in square" }, { n: 11, short: "Proportion preserves commensurability", full: "Four proportional: first commensurable with second iff third with fourth" }, { n: 12, short: "Commensurable with same", full: "Magnitudes commensurable with same magnitude are commensurable" }, { n: 13, short: "Commensurable: incommensurable partner", full: "If two commensurable, one incommensurable with third, so is the other" }, { n: 14, short: "Square difference, sum of squares", full: "Given two lines: find square by which greater square exceeds less; find line whose square equals sum" }, { n: 15, short: "Commensurable sum", full: "Two commensurable added: whole commensurable with each" }, { n: 16, short: "Incommensurable sum", full: "Two incommensurable added: sum incommensurable with each" }, { n: 17, short: "Parallelogram falling short", full: "Applied parallelogram falling short by square: parts commensurable iff square difference commensurable" }, { n: 18, short: "Parallelogram: incommensurable parts", full: "Applied parallelogram: parts incommensurable iff square difference incommensurable" }, { n: 19, short: "Rational rectangle from rational", full: "Rectangle by rational lines commensurable in length is rational" }, { n: 20, short: "Rational area on rational", full: "Rational area applied to rational line: breadth rational and commensurable" }, { n: 21, short: "Medial: rational in square only", full: "Rectangle by rational in square only is irrational; side called medial" }, { n: 22, short: "Medial applied to rational", full: "Square on medial applied to rational: breadth rational, incommensurable in length" }, { n: 23, short: "Commensurable with medial", full: "Line commensurable with medial is medial" }, { n: 24, short: "Medial rectangle: commensurable length", full: "Rectangle by medial lines commensurable in length is medial" }, { n: 25, short: "Medial: square only", full: "Rectangle by medial in square only: rational or medial" }, { n: 26, short: "Medial minus medial", full: "Medial area does not exceed medial by rational area" }, { n: 27, short: "Find medial in square only, rational rect", full: "To find medial lines commensurable in square only containing rational rectangle" }, { n: 28, short: "Find medial in square only, medial rect", full: "To find medial lines commensurable in square only containing medial rectangle" }, { n: 29, short: "Find rational in square only, commensurable diff", full: "To find two rational in square only: square diff commensurable with greater" }, { n: 30, short: "Find rational in square only, incommensurable diff", full: "To find two rational in square only: square diff incommensurable with greater" }, { n: 31, short: "Find medial, rational rect, commensurable diff", full: "To find two medial in square only, rational rect: diff commensurable with greater" }, { n: 32, short: "Find medial, medial rect, commensurable diff", full: "To find two medial in square only, medial rect: diff commensurable with greater" }, { n: 33, short: "Find incommensurable: rational sum, medial rect", full: "To find two incommensurable in square: sum of squares rational, rectangle medial" }, { n: 34, short: "Find incommensurable: medial sum, rational rect", full: "To find two incommensurable in square: sum medial, rectangle rational" }, { n: 35, short: "Find incommensurable: both medial", full: "To find two incommensurable in square: sum and rect medial, incommensurable" }, { n: 36, short: "Binomial defined", full: "Two rational in square only added: whole irrational, called binomial" }, { n: 37, short: "First bimedial defined", full: "Two medial in square only, rational rect added: first bimedial" }, { n: 38, short: "Second bimedial defined", full: "Two medial in square only, medial rect added: second bimedial" }, { n: 39, short: "Major defined", full: "Two incommensurable in square, rational sum, medial rect added: major" }, { n: 40, short: "Side of rational plus medial", full: "Two incommensurable in square, medial sum, rational rect added: side of rational plus medial" }, { n: 41, short: "Side of sum of two medial", full: "Two incommensurable in square, both medial added: side of sum of two medial" }, { n: 42, short: "Binomial: unique division", full: "Binomial divided into terms at one point only" }, { n: 43, short: "First bimedial: unique division", full: "First bimedial divided at one point only" }, { n: 44, short: "Second bimedial: unique division", full: "Second bimedial divided at one point only" }, { n: 45, short: "Major: unique division", full: "Major divided at one point only" }, { n: 46, short: "Side rational+medial: unique division", full: "Side of rational plus medial divided at one point only" }, { n: 47, short: "Side two medial: unique division", full: "Side of sum of two medial divided at one point only" }, { n: 48, short: "Find first binomial", full: "To find the first binomial line" }, { n: 49, short: "Find second binomial", full: "To find the second binomial line" }, { n: 50, short: "Find third binomial", full: "To find the third binomial line" }, { n: 51, short: "Find fourth binomial", full: "To find the fourth binomial line" }, { n: 52, short: "Find fifth binomial", full: "To find the fifth binomial line" }, { n: 53, short: "Find sixth binomial", full: "To find the sixth binomial line" }, { n: 54, short: "Rational × first binomial", full: "Area by rational and first binomial: side is binomial" }, { n: 55, short: "Rational × second binomial", full: "Area by rational and second binomial: side is first bimedial" }, { n: 56, short: "Rational × third binomial", full: "Area by rational and third binomial: side is second bimedial" }, { n: 57, short: "Rational × fourth binomial", full: "Area by rational and fourth binomial: side is major" }, { n: 58, short: "Rational × fifth binomial", full: "Area by rational and fifth binomial: side is rational plus medial" }, { n: 59, short: "Rational × sixth binomial", full: "Area by rational and sixth binomial: side is sum of two medial" }, { n: 60, short: "Square on binomial", full: "Square on binomial applied to rational: breadth first binomial" }, { n: 61, short: "Square on first bimedial", full: "Square on first bimedial applied to rational: breadth second binomial" }, { n: 62, short: "Square on second bimedial", full: "Square on second bimedial applied to rational: breadth third binomial" }, { n: 63, short: "Square on major", full: "Square on major applied to rational: breadth fourth binomial" }, { n: 64, short: "Square on rational+medial", full: "Square on rational+medial applied to rational: breadth fifth binomial" }, { n: 65, short: "Square on two medial", full: "Square on sum of two medial applied to rational: breadth sixth binomial" }, { n: 66, short: "Commensurable with binomial", full: "Line commensurable with binomial is binomial, same order" }, { n: 67, short: "Commensurable with bimedial", full: "Line commensurable with bimedial is bimedial, same order" }, { n: 68, short: "Commensurable with major", full: "Line commensurable with major is major" }, { n: 69, short: "Commensurable with rational+medial", full: "Line commensurable with rational+medial is rational+medial" }, { n: 70, short: "Commensurable with two medial", full: "Line commensurable with sum of two medial is sum of two medial" }, { n: 71, short: "Rational + medial: four irrationals", full: "Rational and medial added: four irrationals arise" }, { n: 72, short: "Two medial: two irrationals", full: "Two medial incommensurable added: two irrationals arise" }, { n: 73, short: "Apotome defined", full: "Rational minus rational in square only: remainder irrational, apotome" }, { n: 74, short: "First apotome of medial", full: "Medial minus medial, rational rect: first apotome of medial" }, { n: 75, short: "Second apotome of medial", full: "Medial minus medial, medial rect: second apotome of medial" }, { n: 76, short: "Minor defined", full: "Line minus incommensurable: sum rational, rect medial: remainder minor" }, { n: 77, short: "Produces rational+medial", full: "Line minus incommensurable: sum medial, rect rational: produces rational+medial" }, { n: 78, short: "Produces medial+medial", full: "Line minus incommensurable: both medial, incommensurable: produces medial+medial" }, { n: 79, short: "Apotome: unique annex", full: "To apotome only one rational can be annexed in square only" }, { n: 80, short: "First apotome medial: unique annex", full: "To first apotome of medial: unique medial annex, rational rect" }, { n: 81, short: "Second apotome medial: unique annex", full: "To second apotome of medial: unique medial annex, medial rect" }, { n: 82, short: "Minor: unique annex", full: "To minor: unique annex incommensurable in square" }, { n: 83, short: "Rational+medial: unique annex", full: "To produces rational+medial: unique annex" }, { n: 84, short: "Medial+medial: unique annex", full: "To produces medial+medial: unique annex" }, { n: 85, short: "Find first apotome", full: "To find the first apotome" }, { n: 86, short: "Find second apotome", full: "To find the second apotome" }, { n: 87, short: "Find third apotome", full: "To find the third apotome" }, { n: 88, short: "Find fourth apotome", full: "To find the fourth apotome" }, { n: 89, short: "Find fifth apotome", full: "To find the fifth apotome" }, { n: 90, short: "Find sixth apotome", full: "To find the sixth apotome" }, { n: 91, short: "Rational × first apotome", full: "Area by rational and first apotome: side is apotome" }, { n: 92, short: "Rational × second apotome", full: "Area by rational and second apotome: side is first apotome of medial" }, { n: 93, short: "Rational × third apotome", full: "Area by rational and third apotome: side is second apotome of medial" }, { n: 94, short: "Rational × fourth apotome", full: "Area by rational and fourth apotome: side is minor" }, { n: 95, short: "Rational × fifth apotome", full: "Area by rational and fifth apotome: side produces rational+medial" }, { n: 96, short: "Rational × sixth apotome", full: "Area by rational and sixth apotome: side produces medial+medial" }, { n: 97, short: "Square on apotome medial", full: "Square on apotome of medial applied to rational: breadth first apotome" }, { n: 98, short: "Square on first apotome medial", full: "Square on first apotome of medial: breadth second apotome" }, { n: 99, short: "Square on second apotome medial", full: "Square on second apotome of medial: breadth third apotome" }, { n: 100, short: "Square on minor", full: "Square on minor applied to rational: breadth fourth apotome" }, { n: 101, short: "Square on rational+medial", full: "Square on produces rational+medial: breadth fifth apotome" }, { n: 102, short: "Square on medial+medial", full: "Square on produces medial+medial: breadth sixth apotome" }, { n: 103, short: "Commensurable with apotome", full: "Line commensurable with apotome is apotome, same order" }, { n: 104, short: "Commensurable with apotome medial", full: "Line commensurable with apotome of medial is apotome of medial" }, { n: 105, short: "Commensurable with minor", full: "Line commensurable with minor is minor" }, { n: 106, short: "Commensurable with rational+medial", full: "Line commensurable with produces rational+medial is same" }, { n: 107, short: "Commensurable with medial+medial", full: "Line commensurable with produces medial+medial is same" }, { n: 108, short: "Rational minus medial", full: "From rational area subtract medial: side is apotome or minor" }, { n: 109, short: "Medial minus rational", full: "From medial subtract rational: first apotome of medial or rational+medial" }, { n: 110, short: "Medial minus medial", full: "From medial subtract medial incommensurable: second apotome or medial+medial" }, { n: 111, short: "Apotome ≠ binomial", full: "Apotome is not the same as binomial" }, { n: 112, short: "Rational on binomial", full: "Square on rational applied to binomial: breadth apotome, same order" }, { n: 113, short: "Rational on apotome", full: "Square on rational applied to apotome: breadth binomial, same order" }, { n: 114, short: "Apotome × binomial: rational", full: "Area by apotome and binomial (commensurable terms): side is rational" }, { n: 115, short: "Medial: infinite irrationals", full: "From medial arise irrationals infinite in number, none same as preceding" } ]; const FOUNDATIONS = ["BookI", "BookV", "BookVI"]; const DEPS = {}; for (let i = 1; i <= 115; i++) DEPS[i] = FOUNDATIONS; const discourse = { schemaVersion: "1.0", discourse: { id: "euclid-elements-book-x", name: "Euclid's Elements, Book X", subject: "incommensurables", variant: "classical", description: "Incommensurables, binomials, apotomes. 16 definitions, 115 propositions. Depends on Books I, V, VI. Source: David E. Joyce.", structure: { books: 10, definitions: 16, propositions: 115, foundationTypes: ["foundation"] } }, metadata: { created: "2026-03-18", lastUpdated: "2026-03-18", version: "1.0.0", license: "CC BY 4.0", authors: ["Welz, G."], methodology: "Programming Framework", citation: "Welz, G. (2026). Euclid's Elements Book X Dependency Graph. Programming Framework.", keywords: ["Euclid", "Elements", "Book X", "incommensurable", "binomial", "apotome", "medial"] }, sources: [ { id: "joyce", type: "digital", authors: "Joyce, David E.", title: "Euclid's Elements, Book X", year: "1996", url: "https://mathcs.clarku.edu/~djoyce/java/elements/bookX/bookX.html", notes: "Clark University" } ], nodes: [], edges: [], colorScheme: { foundation: { fill: "#95a5a6", stroke: "#7f8c8d" }, proposition: { fill: "#1abc9c", stroke: "#16a085" } } }; discourse.nodes.push( { id: "BookI", type: "foundation", label: "Book I — Plane geometry", shortLabel: "Book I", short: "Foundation", book: 1, colorClass: "foundation" }, { id: "BookV", type: "foundation", label: "Book V — Proportions", shortLabel: "Book V", short: "Foundation", book: 5, colorClass: "foundation" }, { id: "BookVI", type: "foundation", label: "Book VI — Similar figures", shortLabel: "Book VI", short: "Foundation", book: 6, colorClass: "foundation" } ); for (const prop of PROPS) { discourse.nodes.push({ id: `Prop${prop.n}`, type: "proposition", label: prop.full, shortLabel: `Prop. X.${prop.n}`, short: prop.short, book: 10, number: prop.n, colorClass: "proposition" }); for (const dep of DEPS[prop.n]) { discourse.edges.push({ from: dep, to: `Prop${prop.n}` }); } } const dataDir = path.join(__dirname, "..", "data"); fs.mkdirSync(dataDir, { recursive: true }); fs.writeFileSync(path.join(dataDir, "euclid-elements-book-x.json"), JSON.stringify(discourse, null, 2), "utf8"); console.log("Wrote euclid-elements-book-x.json"); function toMermaid(filter) { const nodes = filter ? discourse.nodes.filter(filter) : discourse.nodes; const nodeIds = new Set(nodes.map(n => n.id)); const edges = discourse.edges.filter(e => nodeIds.has(e.from) && nodeIds.has(e.to)); const lines = ["graph TD"]; for (const n of nodes) { const desc = n.short || (n.label && n.label.length > 35 ? n.label.slice(0, 32) + "..." : n.label || n.id); const lbl = (n.shortLabel || n.id) + "\\n" + (desc || ""); lines.push(` ${n.id}["${String(lbl).replace(/"/g, '\\"')}"]`); } for (const e of edges) { lines.push(` ${e.from} --> ${e.to}`); } lines.push(" classDef foundation fill:#95a5a6,color:#fff,stroke:#7f8c8d"); lines.push(" classDef proposition fill:#1abc9c,color:#fff,stroke:#16a085"); const foundIds = nodes.filter(n => n.type === "foundation").map(n => n.id).join(","); const propIds = nodes.filter(n => n.type === "proposition").map(n => n.id).join(","); if (foundIds) lines.push(` class ${foundIds} foundation`); lines.push(` class ${propIds} proposition`); return lines.join("\n"); } function closure(propMax) { const needed = new Set(FOUNDATIONS); for (let i = 1; i <= propMax; i++) needed.add(`Prop${i}`); return n => needed.has(n.id); } const MATH_DB = process.env.MATH_DB || "/home/gdubs/copernicus-web-public/huggingface-space/mathematics-processes-database"; const GEOM_DIR = path.join(MATH_DB, "processes", "geometry_topology"); function htmlTemplate(title, subtitle, mermaid, nodes, edges) { const mermaidEscaped = mermaid.replace(//g, ">"); return ` ${title} - Mathematics Process

${title}

Mathematics Incommensurables Source: Euclid's Elements

Description

${subtitle}

Source: Euclid's Elements, Book X (David E. Joyce, Clark University)

Dependency Flowchart

${mermaidEscaped}

Color Scheme

Gray
Book I, V, VI (foundation)
Teal
Propositions

Statistics

  • Nodes: ${nodes}
  • Edges: ${edges}

Keywords

  • Euclid
  • Elements
  • Book X
  • incommensurable
  • binomial
  • apotome
  • medial
`; } const CHARTS = [ [15, "1-15", "Commensurable, incommensurable, GCM, ratio, squares"], [30, "16-30", "Medial, rational, parallelogram, find lines"], [45, "31-45", "Binomial, bimedial, major, unique division"], [60, "46-60", "Find binomials, area by rational"], [75, "61-75", "Square on binomial, commensurable, apotome"], [90, "76-90", "Apotome types, find apotomes"], [105, "91-105", "Area by apotome, square on apotome, commensurable"], [115, "106-115", "Rational from irrational, order, infinite irrationals"] ]; if (fs.existsSync(GEOM_DIR)) { CHARTS.forEach(([max, range, desc]) => { const filter = closure(max); const m = toMermaid(filter); const nodes = discourse.nodes.filter(filter); const edges = discourse.edges.filter(e => filter({ id: e.from }) && filter({ id: e.to })); const fname = `geometry_topology-euclid-elements-book-x-props-${range.replace(/–/g, "-").replace(" ", "-")}.html`; fs.writeFileSync(path.join(GEOM_DIR, fname), htmlTemplate(`Euclid's Elements Book X — Propositions ${range}`, desc, m, nodes.length, edges.length), "utf8"); console.log("Wrote", fname); }); } // Book X index if (fs.existsSync(GEOM_DIR)) { const indexHtml = ` Euclid's Elements Book X - Mathematics Process

Euclid's Elements Book X

Incommensurables, binomials, apotomes. 115 propositions, 16 definitions. Depends on Books I, V, VI. Thirteen irrational straight lines; X.115: infinite irrationals from medial.

Propositions 1–15 Commensurable, incommensurable, GCM, ratio Propositions 16–30 Medial, rational, parallelogram Propositions 31–45 Binomial, bimedial, major Propositions 46–60 Find binomials, area by rational Propositions 61–75 Square on binomial, apotome Propositions 76–90 Apotome types, find apotomes Propositions 91–105 Area by apotome, commensurable Propositions 106–115 Rational from irrational, order
`; fs.writeFileSync(path.join(GEOM_DIR, "geometry_topology-euclid-elements-book-x.html"), indexHtml, "utf8"); console.log("Wrote geometry_topology-euclid-elements-book-x.html"); } console.log("Done. Nodes:", discourse.nodes.length, "Edges:", discourse.edges.length);