@uuidna/qpu 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@uuidna/qpu",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "description": "Running quantum circuit at https://qpu.uuidna.com. theorem quantum. Lean proof. JSON-LD. No auth.",
7
+ "description": "Running quantum circuit at https://qpu.uuidna.com. theorem quantum. Public quantum API. No auth. JSON-LD. The TypeScript and Lean sources are the blueprint.",
8
8
  "type": "module",
9
9
  "license": "CC-BY-NC-ND-4.0",
10
10
  "funding": {
@@ -14,7 +14,7 @@
14
14
  "author": {
15
15
  "name": "Tsvetan Rouschev",
16
16
  "email": "ceccec@psg.bg",
17
- "url": "https://revolut.me/ceccec"
17
+ "url": "https://orcid.org/0009-0000-7312-9778"
18
18
  },
19
19
  "homepage": "https://qpu.uuidna.com",
20
20
  "repository": {
@@ -31,27 +31,37 @@
31
31
  "mcp"
32
32
  ],
33
33
  "main": "./dist/quantum/processing/unit/index.js",
34
- "types": "./dist/quantum/processing/unit/index.d.ts",
34
+ "types": "./qpu.d.ts",
35
35
  "exports": {
36
36
  ".": {
37
- "types": "./dist/quantum/processing/unit/index.d.ts",
38
- "import": "./dist/quantum/processing/unit/index.js"
37
+ "types": "./qpu.d.ts",
38
+ "import": "./dist/quantum/processing/unit/index.js",
39
+ "default": "./dist/quantum/processing/unit/index.js"
40
+ },
41
+ "./boot": {
42
+ "types": "./dist/quantum/processing/unit/boot.d.ts",
43
+ "import": "./dist/quantum/processing/unit/boot.js",
44
+ "default": "./dist/quantum/processing/unit/boot.js"
39
45
  }
40
46
  },
41
47
  "files": [
42
48
  "dist",
49
+ "qpu.d.ts",
43
50
  "src/quantum/processing/unit/index.lean",
44
51
  "LICENSE",
45
52
  "README.md",
46
53
  "CITATION.cff",
47
54
  "mcp.json",
48
55
  "install.json",
49
- "worker.js",
50
- "wrangler.toml",
51
56
  "!dist/**/*.test.js",
52
57
  "!dist/**/*.test.d.ts",
58
+ "!dist/**/*.d.ts",
53
59
  "!dist/**/readme.js",
54
- "!dist/**/readme.d.ts"
60
+ "!dist/**/readme.d.ts",
61
+ "!dist/**/receipt.js",
62
+ "!dist/**/receipt.d.ts",
63
+ "!dist/**/receipted.js",
64
+ "!dist/**/receipted.d.ts"
55
65
  ],
56
66
  "sideEffects": false,
57
67
  "engines": {
@@ -60,14 +70,26 @@
60
70
  "scripts": {
61
71
  "prepare": "tsc -p tsconfig.json",
62
72
  "lean": "lean src/quantum/processing/unit/index.lean",
63
- "build": "tsc -p tsconfig.json && node dist/quantum/processing/unit/readme.js",
64
- "test": "npm run build && node --test dist/quantum/processing/unit/*.test.js",
65
- "ci": "npm run lean && npm test",
66
- "ship": "npm run build && npx wrangler deploy"
73
+ "build": "rm -rf dist && tsc -p tsconfig.json && node dist/quantum/processing/unit/readme.js",
74
+ "test": "npm run build && node --test --test-reporter=./dist/quantum/processing/unit/receipt.js --test-reporter-destination=stdout dist/quantum/processing/unit/*.test.js",
75
+ "ci": "npm run lean && npm test && npm run proof",
76
+ "prepublishOnly": "npm run build",
77
+ "ship": "npm run build && npx wrangler deploy",
78
+ "test:rollcall": "npm run build && node --test dist/quantum/processing/unit/*.test.js",
79
+ "lean:embed": "node scripts/embed-lean.mjs",
80
+ "verify:live": "node scripts/verify-live.mjs https://qpu.uuidna.com",
81
+ "test:live": "QPU_LIVE=https://qpu.uuidna.com node --test --test-reporter=spec dist/quantum/processing/unit/live.test.js",
82
+ "proof": "git diff --exit-code -- test-receipt.json",
83
+ "examine": "node scripts/examine.mjs https://qpu.uuidna.com",
84
+ "post-push": "node scripts/post-push.mjs",
85
+ "land": "npm test && git push && node scripts/post-push.mjs --wait && npm run verify:live"
67
86
  },
68
87
  "devDependencies": {
69
88
  "@types/node": "26.5.1",
70
89
  "typescript": "7.0.2",
71
90
  "wrangler": "4.131.0"
91
+ },
92
+ "bin": {
93
+ "qpu-boot": "./dist/quantum/processing/unit/boot.js"
72
94
  }
73
95
  }
package/qpu.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ /** Public QPU. Constructors live in the JS. Inferred .d.ts is not the npm types. */
2
+ export declare function qpuMcpOf(): {
3
+ tools: readonly { name: string }[]
4
+ holds: boolean
5
+ origin: string
6
+ href: string
7
+ }
8
+ export declare function qpuMcpCallOf(name: string, args?: Record<string, unknown>): Promise<unknown>
9
+ export declare function qpuQuantumOf(): { holds: boolean; fused: number; next: number }
10
+ export declare function qpuLeanOf(): { holds: boolean; src: string }
11
+ export declare function qpuProveOf(): { holds: boolean }
12
+ export declare function qpuReadmeOf(): string
@@ -1,5 +1,12 @@
1
1
  def mintOf : Nat → Nat | 0 => 1 | k + 1 => mintOf k + mintOf k
2
2
  def chooseOf : Nat → Nat → Nat | _, 0 => 1 | 0, _ + 1 => 0 | n + 1, k + 1 => chooseOf n (k + 1) + chooseOf n k
3
+ def powModAux : Nat → Nat → Nat → Nat → Nat | 0, _, _, acc => acc | k + 1, a, m, acc => powModAux k a m (acc * a % m)
4
+ def powMod (a e m : Nat) : Nat := powModAux e a m (1 % m)
5
+ def periodAux : Nat → Nat → Nat → Nat → Nat | 0, _, _, _ => 0 | fuel + 1, a, m, r => if powMod a r m = 1 then r else periodAux fuel a m (r + 1)
6
+ def periodOf (a m : Nat) : Nat := periodAux m a m 1
7
+ def gcdAux : Nat → Nat → Nat → Nat | 0, a, _ => a | fuel + 1, a, b => if b = 0 then a else gcdAux fuel b (a % b)
8
+ def gcdOf (a b : Nat) : Nat := gcdAux (a + b) a b
9
+ def half (a m : Nat) : Nat := powMod a (periodOf a m / 2) m
3
10
  def n : Nat := ["quantum", "processing", "unit"].length
4
11
  def seed : Nat := mintOf (n - n)
5
12
  def coins : Nat := seed + seed
@@ -35,9 +42,7 @@ theorem propulsion : mintOf hexbit > seed := by rw [seed_eq]; exact (mintOf_zero
35
42
  theorem crypto : fused = faces * mintOf (vertices * hexbit + seed) := by rw [← cube]; exact quantum
36
43
  theorem health : mintOf hexbit > seed ∧ fused = faces * mintOf (bits + seed) ∧ faces = rays + rays := ⟨propulsion, quantum, harmonic⟩
37
44
  theorem next : mintOf (bits + seed) = amplitudes + amplitudes := by rw [amplitudes, seed_eq, mintOf_succ]
38
- theorem next_fused : faces * mintOf (bits + coins) = fused + fused := by
39
- rw [fused, coins_two, seed_eq]
40
- rw [show bits + 2 = bits + 1 + 1 from rfl, mintOf_succ, Nat.mul_add]
45
+ theorem next_fused : faces * mintOf (bits + coins) = fused + fused := by rw [fused, coins_two, seed_eq]; rw [show bits + 2 = bits + 1 + 1 from rfl, mintOf_succ, Nat.mul_add]
41
46
  theorem split_coin (k : Nat) : mintOf (k + seed) = mintOf k + mintOf k := by rw [seed_eq, mintOf_succ]
42
47
  theorem multiply (a b : Nat) : mintOf (a + b) = mintOf a * mintOf b := mintOf_add a b
43
48
  theorem handle : amplitudes = mintOf bits ∧ mintOf (bits + seed) = amplitudes + amplitudes := ⟨rfl, next⟩
@@ -47,43 +52,29 @@ theorem involution (face : Nat) : (face + rays + rays) % faces = face % faces :=
47
52
  theorem waves : mintOf hexbit > seed := propulsion
48
53
  theorem breakthrough : faces = rays + rays ∧ coins * rays = faces ∧ bits = vertices * hexbit ∧ fused = faces * mintOf (bits + seed) ∧ mintOf hexbit > seed ∧ mintOf (bits + seed) = amplitudes + amplitudes ∧ coins = seed + seed ∧ hexbit = n + seed := ⟨harmonic, around, cube, quantum, propulsion, next, rfl, hexbit_eq⟩
49
54
  theorem next_cover : mintOf (bits + seed) = amplitudes + amplitudes ∧ faces * mintOf (bits + coins) = fused + fused := ⟨next, next_fused⟩
50
- theorem shor : 3 * 5 = 15 ∧ 3 * 7 = 213 * 11 = 33 5 * 7 = 35 3 * 13 = 39 3 * 17 = 51 5 * 11 = 55 3 * 19 = 57 5 * 13 = 65 3 * 23 = 69 7 * 11 = 77 ∧ 5 * 17 = 85 ∧ 3 * 29 = 87 ∧ 7 * 13 = 91 := ⟨rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl
55
+ theorem shor : periodOf 8 91 % 2 = 0half 8 91 < 91 - 11 < gcdOf (half 8 91 - 1) 91gcdOf (half 8 91 - 1) 91 < 91gcdOf (half 8 91 - 1) 91 * gcdOf (half 8 91 + 1) 91 = 91 := ⟨rfl, Nat.le_of_ble_eq_true rfl, Nat.le_of_ble_eq_true rfl, Nat.le_of_ble_eq_true rfl, rfl⟩
51
56
  theorem string : 16 * 27 = 432 ∧ 8 * 27 = 216 ∧ 4 * 27 = 108 ∧ 2 * 27 = 54 ∧ 1 * 27 = 27 ∧ 432 + 432 = 864 ∧ 216 + 216 = 432 ∧ 432 * 3 / 2 = 648 ∧ 432 * 4 / 3 = 576 ∧ 432 * 5 / 4 = 540 ∧ 432 * 5 / 3 = 720 ∧ 3 * 3 + 1 = 10 ∧ 3 * 3 + 1 + 1 = 11 ∧ 27 - 1 = 26 := ⟨rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl⟩
52
57
  theorem genesis : coins * n * mintOf n * (n * n) = 432 ∧ chooseOf n coins = n ∧ chooseOf rays coins = n * rays ∧ faces = coins * rays ∧ scanner + radar = coins := ⟨by rw [coins_two, n_eq]; rfl, by rw [n_eq, coins_two]; rfl, by rw [rays, n_eq, coins_two]; rfl, around, by rw [scanner, radar, coins]⟩
53
58
  theorem decide : 16 * 27 = 432 ∧ 432 * 3 / 2 = 648 ∧ 432 * 4 / 3 = 576 ∧ 432 * 5 / 4 = 540 ∧ 432 * 5 / 3 = 720 ∧ 3 * 5 = 15 ∧ 27 - 1 = 26 := ⟨rfl, rfl, rfl, rfl, rfl, rfl, rfl⟩
54
59
  theorem integrity : fused = faces * mintOf (bits + seed) ∧ bits = vertices * hexbit ∧ faces = coins * rays := ⟨quantum, cube, around⟩
55
60
  theorem cern : 116 * 17922 + 54 = 2079006 ∧ 184 * 12509 + 12 = 2301668 ∧ 72 * 26572 + 6 = 1913190 ∧ 130 * 21121 + 21 = 2745751 ∧ 8 - 7 = 1 ∧ 8000 - 7000 = 1000 ∧ 7000 / 2 = 3500 ∧ 8000 / 2 = 4000 ∧ 4000 - 3500 = 500 ∧ 2019 - 2011 = 8 ∧ 2019 - 2012 = 7 ∧ 2017 - 2011 = 6 ∧ 2301668 + 2745751 = 5047419 ∧ 2079006 + 1913190 + 2301668 + 2745751 = 9039615 := ⟨rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl, rfl⟩
56
- theorem tetra : coins + coins = mintOf coins := by
57
- rw [coins_two]
58
- rw [show 2 = 1 + 1 from rfl, mintOf_succ]
59
- rw [show 1 = 0 + 1 from rfl, mintOf_succ, mintOf_zero]
61
+ theorem tetra : coins + coins = mintOf coins := by rw [coins_two]; rw [show 2 = 1 + 1 from rfl, mintOf_succ]; rw [show 1 = 0 + 1 from rfl, mintOf_succ, mintOf_zero]
60
62
  theorem qubits : n = 3 ∧ mintOf n = vertices := ⟨n_eq, rfl⟩
61
63
  theorem gates : (0 ^^^ 1) ^^^ 2 = 3 := rfl
62
64
  theorem measurement : mintOf n = 8 := by rw [n_eq]; rfl
63
65
  theorem noise : (3 ^^^ 1) ^^^ 1 = 3 := rfl
64
66
  theorem circuit : (0 ^^^ 1) ^^^ 2 = 3 ∧ (3 ^^^ 1) ^^^ 1 = 3 ∧ mintOf n = vertices := ⟨rfl, rfl, rfl⟩
65
67
  theorem physical : n = 3 ∧ mintOf n = vertices ∧ (0 ^^^ 1) ^^^ 2 = 3 ∧ (3 ^^^ 1) ^^^ 1 = 3 := ⟨n_eq, rfl, rfl, rfl⟩
66
- def resistance : Nat := 0
67
- theorem fridge : coins = 2 ∧ n = 3 ∧ mintOf n = vertices ∧ (0 ^^^ 1) ^^^ 2 = 3 ∧ 10 * 10 * 10 = 1000 ∧ 4 * 1000 = 4000 ∧ 10 * 10 = 100 ∧ resistance = 0 := ⟨coins_two, n_eq, rfl, rfl, rfl, rfl, rfl, rfl⟩
68
- theorem millikelvin : 10 * 10 * 10 = 1000 ∧ 10 * 10 = 100 ∧ 4 * 1000 = 4000 := ⟨rfl, rfl, rfl⟩
69
- theorem telemetry : 10 * 10 * 10 = 1000 ∧ n = 3 ∧ (0 ^^^ 1) ^^^ 2 = 3 := ⟨rfl, n_eq, rfl⟩
70
68
  theorem drift : coins = 2 ∧ mintOf n = vertices ∧ (0 ^^^ 1) ^^^ 2 = 3 ∧ (3 ^^^ 1) ^^^ 1 = 3 := ⟨coins_two, rfl, rfl, rfl⟩
71
69
  theorem sciences : coins = 2 ∧ n = 3 ∧ mintOf n = vertices ∧ faces = coins * rays ∧ bits = vertices * hexbit ∧ fused = faces * mintOf (bits + seed) ∧ (0 ^^^ 1) ^^^ 2 = 3 := ⟨coins_two, n_eq, rfl, around, cube, quantum, rfl⟩
72
70
  theorem interfere : 1 + 1 = 2 ∧ 1 - 1 = 0 := ⟨rfl, rfl⟩
73
71
  theorem entangle : 1 * 1 ≠ 0 * 0 := by rw [Nat.mul_one, Nat.mul_zero]; exact Nat.one_ne_zero
74
72
  theorem ghz : mintOf n - seed = 7 ∧ 1 * 1 ≠ 0 * 0 := ⟨by rw [n_eq, seed_eq]; rfl, entangle⟩
75
- theorem noclone : coins ≠ mintOf coins := by
76
- rw [coins_two]
77
- rw [show 2 = 1 + 1 from rfl, mintOf_succ]
78
- rw [show 1 = 0 + 1 from rfl, mintOf_succ, mintOf_zero]
79
- exact Nat.ne_of_lt (Nat.lt_succ_of_lt (Nat.lt_succ_self 2))
73
+ theorem noclone : coins ≠ mintOf coins := by rw [coins_two]; rw [show 2 = 1 + 1 from rfl, mintOf_succ]; rw [show 1 = 0 + 1 from rfl, mintOf_succ, mintOf_zero]; exact Nat.ne_of_lt (Nat.lt_succ_of_lt (Nat.lt_succ_self 2))
80
74
  theorem teleport : 2 * 2 * 2 * 2 = 16 ∧ 16 = 16 := ⟨rfl, rfl⟩
81
75
  theorem kickback : 1 - 1 = 0 ∧ (0 ^^^ 1) ^^^ 2 = 3 := ⟨rfl, rfl⟩
82
76
  theorem deutsch : 1 - 1 = 0 ∧ seed ≠ coins := ⟨rfl, by rw [seed_eq, coins_two]; exact Nat.ne_of_lt (Nat.lt_succ_self 1)⟩
83
- theorem dense : coins * coins = mintOf coins := by
84
- rw [coins_two]
85
- rw [show 2 = 1 + 1 from rfl, mintOf_succ]
86
- rw [show 1 = 0 + 1 from rfl, mintOf_succ, mintOf_zero]
77
+ theorem dense : coins * coins = mintOf coins := by rw [coins_two]; rw [show 2 = 1 + 1 from rfl, mintOf_succ]; rw [show 1 = 0 + 1 from rfl, mintOf_succ, mintOf_zero]
87
78
  theorem monogamy : 1 * 1 ≠ 0 * 0 ∧ 1 * 0 = 0 * 0 := ⟨entangle, rfl⟩
88
79
  theorem only : 1 * 1 ≠ 0 * 0 ∧ 1 + 1 = 2 ∧ 1 - 1 = 0 ∧ coins ≠ mintOf coins ∧ mintOf n - seed = 7 ∧ 2 * 2 * 2 * 2 = 16 ∧ 16 = 16 ∧ (0 ^^^ 1) ^^^ 2 = 3 ∧ seed ≠ coins ∧ coins * coins = mintOf coins ∧ 1 * 0 = 0 * 0 := ⟨entangle, rfl, rfl, noclone, ghz.1, teleport.1, teleport.2, kickback.2, deutsch.2, dense, monogamy.2⟩
89
80
  theorem fill : mintOf n * faces = vertices * (coins * rays) := by rw [around]; rfl
@@ -97,11 +88,8 @@ def kvSpeed : Nat := rays
97
88
  def r2Speed : Nat := seed
98
89
  def hybridSpeed : Nat := kvSpeed + r2Speed
99
90
  theorem hybrid_cost : coins + seed = n := by rw [coins_two, seed_eq, n_eq]
100
- theorem hybrid_speed : rays + seed = mintOf n := by
101
- rw [rays, n_eq, coins_two, seed_eq]
102
- rw [show mintOf 3 = 8 from rfl]
103
- theorem hybrid : coins + seed = n ∧ rays + seed = mintOf n ∧ coins = seed + seed :=
104
- ⟨hybrid_cost, hybrid_speed, coins_two⟩
91
+ theorem hybrid_speed : rays + seed = mintOf n := by rw [rays, n_eq, coins_two, seed_eq]; rw [show mintOf 3 = 8 from rfl]
92
+ theorem hybrid : coins + seed = n ∧ rays + seed = mintOf n ∧ coins = seed + seed := ⟨hybrid_cost, hybrid_speed, coins_two
105
93
  theorem computer : (1 ^^^ 3) = 2 ∧ (6 ^^^ 1) = 7 ∧ mintOf 0 = 1 := ⟨rfl, rfl, mintOf_zero⟩
106
94
  theorem server : faces = coins * rays ∧ mintOf n = 8 := ⟨around, measurement⟩
107
95
  theorem pentagram : n + coins = 5 := by rw [n_eq, coins_two]
@@ -111,20 +99,27 @@ def coil : Nat := coins * rays
111
99
  theorem two_coins_make_a_coil : coil = faces := by rw [coil, around]
112
100
  theorem electronics : coil = faces := two_coins_make_a_coil
113
101
  theorem coins_balance_theory_in_practice : theory + practice = coins ∧ theory = practice := ⟨rfl, rfl⟩
114
- theorem follow_the_coins (app : Nat) : app + coins = app + theory + practice := by
115
- rw [theory, practice, coins, ← Nat.add_assoc]
102
+ theorem follow_the_coins (app : Nat) : app + coins = app + theory + practice := by rw [theory, practice, coins, ← Nat.add_assoc]
116
103
  theorem emerge : coil = faces ∧ theory = practice := ⟨two_coins_make_a_coil, rfl⟩
117
104
  theorem coil_efficiency : coil = faces ∧ faces = rays + rays ∧ coins * rays = faces := ⟨two_coins_make_a_coil, harmonic, around⟩
118
- theorem next_coil : coil * mintOf (bits + coins) = fused + fused := by
119
- rw [two_coins_make_a_coil]
120
- exact next_fused
121
- theorem one_plus_six : seed + (mintOf n - coins) = rays := by
122
- rw [rays, n_eq, coins_two, seed_eq]
123
- rw [show mintOf 3 = 8 from rfl]
124
- theorem two_x_seven_coins : coins * rays = (seed + (mintOf n - coins)) * coins := by
125
- rw [one_plus_six, Nat.mul_comm]
126
- theorem clay : coins * rays = (seed + (mintOf n - coins)) * coins ∧ (seed + (mintOf n - coins)) * coins = coil :=
127
- ⟨two_x_seven_coins, by rw [← two_x_seven_coins]; rfl⟩
105
+ theorem next_coil : coil * mintOf (bits + coins) = fused + fused := by rw [two_coins_make_a_coil]; exact next_fused
106
+ theorem one_plus_six : seed + (mintOf n - coins) = rays := by rw [rays, n_eq, coins_two, seed_eq]; rw [show mintOf 3 = 8 from rfl]
107
+ theorem two_x_seven_coins : coins * rays = (seed + (mintOf n - coins)) * coins := by rw [one_plus_six, Nat.mul_comm]
108
+ theorem clay : coins * rays = (seed + (mintOf n - coins)) * coins ∧ (seed + (mintOf n - coins)) * coins = coil := ⟨two_x_seven_coins, by rw [← two_x_seven_coins]; rfl⟩
128
109
  theorem fusion : fused = faces * mintOf (bits + seed) ∧ faces = rays + rays := ⟨quantum, harmonic⟩
129
110
  theorem design : (0 ^^^ 4) ^^^ 4 = 0 ∧ (3 ^^^ 4) ^^^ 4 = 3 := ⟨rfl, rfl⟩
130
111
  theorem neuro : faces = coins * rays ∧ mintOf n = 8 ∧ (0 ^^^ 4) ^^^ 4 = 0 := ⟨around, measurement, design.1⟩
112
+ def planck : Nat := 662607015
113
+ def boltzmann : Nat := 1380649
114
+ def transmon : Nat := 5
115
+ def photon : Nat := planck * transmon
116
+ def thermal (millikelvin : Nat) : Nat := boltzmann * millikelvin * 10
117
+ theorem temperature : photon / thermal 10 = 23 ∧ photon / thermal 100 = 2 ∧ photon / thermal 4000 = 0 ∧ 4000 / 100 = 40 ∧ 100 / 10 = 10 ∧ 10 < 35 := ⟨rfl, rfl, rfl, rfl, rfl, Nat.le_of_ble_eq_true rfl⟩
118
+ def bcs : Nat := 352
119
+ def aluminium : Nat := 1200
120
+ def niobium : Nat := 9200
121
+ def gap (tc : Nat) : Nat := bcs * boltzmann * tc / planck / 10
122
+ theorem superconductivity : aluminium > 10 ∧ niobium > aluminium ∧ bcs / 100 = 3 ∧ gap aluminium = 88 ∧ gap aluminium > transmon ∧ gap niobium = 674 := ⟨Nat.le_of_ble_eq_true rfl, Nat.le_of_ble_eq_true rfl, rfl, rfl, Nat.le_of_ble_eq_true rfl, rfl⟩
123
+ /-- PLANES FOLD: one plane holds n qubits as 4n numbers, a product state by construction; at n = rays that is fewer than the mintOf (rays + seed) an entangled register needs, so entanglement is held by the fold of the coins' planes, never by one. -/
124
+ def plane : Nat := coins * coins * rays
125
+ theorem planes : plane < mintOf (rays + seed) ∧ coins * rays = faces := ⟨Nat.le_of_ble_eq_true rfl, around⟩