2. The Noperthedron
2.1. Definition of the Noperthedron
We define three points C_1,C_2,C_3\in \mathbb{Q}^3.
C_1\coloneqq
\frac{1}{259375205}
\begin{pmatrix}
{152024884} \\ 0 \\ {210152163}
\end{pmatrix},
\qquad
C_2\coloneqq \frac{1}{10^{10}}
\begin{pmatrix}
6632738028 \\ 6106948881 \\ 3980949609
\end{pmatrix},
C_3\coloneqq
\frac{1}{10^{10}}
\begin{pmatrix}
8193990033 \\ 5298215096 \\ 1230614493
\end{pmatrix}.
Lean code
Associated Lean declarations
-
NopertInline.C1[complete]
-
NopertInline.C2[complete]
-
NopertInline.C3[complete]
-
NopertInline.C1R[complete]
-
NopertInline.C2R[complete]
-
NopertInline.C3R[complete]
-
NopertInline.C1[complete] -
NopertInline.C2[complete] -
NopertInline.C3[complete] -
NopertInline.C1R[complete] -
NopertInline.C2R[complete] -
NopertInline.C3R[complete]
def C1 : Fin 3 → ℚ := (1/259375205) * ![152024884, 0, 210152163]
def C2 : Fin 3 → ℚ := (1/10^10) * ![6632738028, 6106948881, 3980949609]
def C3 : Fin 3 → ℚ := (1/10^10) * ![8193990033, 5298215096, 1230614493]
noncomputable
def C1R : EuclideanSpace ℝ (Fin 3) := WithLp.toLp 2 (fun i => C1 i)
noncomputable
def C2R : EuclideanSpace ℝ (Fin 3) := WithLp.toLp 2 (fun i => C2 i)
noncomputable
def C3R : EuclideanSpace ℝ (Fin 3) := WithLp.toLp 2 (fun i => C3 i)
-
c1_norm_one[complete] -
c2_norm_bound[complete] -
c3_norm_bound[complete]
\| C_1 \| = 1,
{98 \over 100} < \| C_2 \| < {99 \over 100}, and
{98 \over 100} < \| C_3 \| < {99 \over 100}.
Lean code for Lemma2.1.1●3 theorems
Associated Lean declarations
-
c1_norm_one[complete]
-
c2_norm_bound[complete]
-
c3_norm_bound[complete]
-
c1_norm_one[complete] -
c2_norm_bound[complete] -
c3_norm_bound[complete]
-
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.c1_norm_one : ‖C1R‖ = 1
theorem Noperthedron.c1_norm_one : ‖C1R‖ = 1
-
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.c2_norm_bound : ‖C2R‖ ∈ Set.Ioo (98 / 100) (99 / 100)
theorem Noperthedron.c2_norm_bound : ‖C2R‖ ∈ Set.Ioo (98 / 100) (99 / 100)
-
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.c3_norm_bound : ‖C3R‖ ∈ Set.Ioo (98 / 100) (99 / 100)
theorem Noperthedron.c3_norm_bound : ‖C3R‖ ∈ Set.Ioo (98 / 100) (99 / 100)
Trivial arithmetic.
Lean code
Associated Lean declarations
-
NopertInline.C15[complete]
-
NopertInline.c1_norm_one[complete]
-
NopertInline.c2_norm_bound[complete]
-
NopertInline.c2_norm_le_one[complete]
-
NopertInline.c3_norm_bound[sorry in proof]
-
NopertInline.c3_norm_le_one[complete]
-
NopertInline.C15_nonempty[complete]
-
NopertInline.C15_pres_norm[complete]
-
NopertInline.C15[complete] -
NopertInline.c1_norm_one[complete] -
NopertInline.c2_norm_bound[complete] -
NopertInline.c2_norm_le_one[complete] -
NopertInline.c3_norm_bound[sorry in proof] -
NopertInline.c3_norm_le_one[complete] -
NopertInline.C15_nonempty[complete] -
NopertInline.C15_pres_norm[complete]
-- expose: {NopertInline.c1_norm_one, NopertInline.c2_norm_bound, NopertInline.c3_norm_bound, NopertInline.C15}
theorem c1_norm_one : ‖C1R‖ = 1 := ⊢ ‖C1R‖ = 1
⊢ √(∑ i, ‖C1R.ofLp i‖ ^ 2) = 1
have lez : 0 ≤ ∑ i, ‖C1R i‖ ^ 2 := by ⊢ ‖C1R‖ = 1
apply Finset.sum_nonneg ⊢ ∀ i ∈ Finset.univ, 0 ≤ ‖C1R.ofLp i‖ ^ 2
intro i _ i:Fin 3a✝:i ∈ Finset.univ⊢ 0 ≤ ‖C1R.ofLp i‖ ^ 2
exact sq_nonneg (‖C1R i‖) lez:0 ≤ ∑ i, ‖C1R.ofLp i‖ ^ 2⊢ √(∑ i, ‖C1R.ofLp i‖ ^ 2) = 1
rw [← Real.sq_sqrt lez lez:0 ≤ ∑ i, ‖C1R.ofLp i‖ ^ 2⊢ √(√(∑ i, ‖C1R.ofLp i‖ ^ 2) ^ 2) = 1] lez:0 ≤ ∑ i, ‖C1R.ofLp i‖ ^ 2⊢ √(√(∑ i, ‖C1R.ofLp i‖ ^ 2) ^ 2) = 1
simp only [Real.norm_eq_abs, sq_abs] lez:0 ≤ ∑ i, ‖C1R.ofLp i‖ ^ 2⊢ √(√(∑ x, C1R.ofLp x ^ 2) ^ 2) = 1
unfold C1R C1 lez:0 ≤ ∑ i, ‖C1R.ofLp i‖ ^ 2⊢ √(√(∑ x, (WithLp.toLp 2 fun i ↦ ↑((1 / 259375205 * ![152024884, 0, 210152163]) i)).ofLp x ^ 2) ^ 2) = 1
simp only [Fin.sum_univ_three, Pi.mul_apply, Matrix.cons_val] lez:0 ≤ ∑ i, ‖C1R.ofLp i‖ ^ 2⊢ √(√(↑((1 / 259375205) 0 * 152024884) ^ 2 + ↑((1 / 259375205) 1 * 0) ^ 2 + ↑((1 / 259375205) 2 * 210152163) ^ 2) ^ 2) = 1
norm_num All goals completed! 🐙
theorem c2_norm_bound : ‖C2R‖ ∈ Set.Ioo (98/100) (99/100) := by ⊢ ‖C2R‖ ∈ Set.Ioo (98 / 100) (99 / 100)
rw [EuclideanSpace.norm_eq ⊢ √(∑ i, ‖C2R.ofLp i‖ ^ 2) ∈ Set.Ioo (98 / 100) (99 / 100)] ⊢ √(∑ i, ‖C2R.ofLp i‖ ^ 2) ∈ Set.Ioo (98 / 100) (99 / 100)
constructor left ⊢ 98 / 100 < √(∑ i, ‖C2R.ofLp i‖ ^ 2)right ⊢ √(∑ i, ‖C2R.ofLp i‖ ^ 2) < 99 / 100
· left ⊢ 98 / 100 < √(∑ i, ‖C2R.ofLp i‖ ^ 2) refine lt_sqrt_of_sq_lt ?_ left ⊢ (98 / 100) ^ 2 < ∑ i, ‖C2R.ofLp i‖ ^ 2
simp only [Real.norm_eq_abs, sq_abs] left ⊢ (98 / 100) ^ 2 < ∑ x, C2R.ofLp x ^ 2
unfold C2R C2 left ⊢ (98 / 100) ^ 2 < ∑ x, (WithLp.toLp 2 fun i ↦ ↑((1 / 10 ^ 10 * ![6632738028, 6106948881, 3980949609]) i)).ofLp x ^ 2
simp only [Fin.sum_univ_three, Pi.mul_apply, Matrix.cons_val] left ⊢ (98 / 100) ^ 2 <
↑((1 / 10 ^ 10) 0 * 6632738028) ^ 2 + ↑((1 / 10 ^ 10) 1 * 6106948881) ^ 2 + ↑((1 / 10 ^ 10) 2 * 3980949609) ^ 2
norm_num All goals completed! 🐙
· right ⊢ √(∑ i, ‖C2R.ofLp i‖ ^ 2) < 99 / 100 refine (sqrt_lt' (by ⊢ 0 < 99 / 100 norm_num All goals completed! 🐙)).mpr ?_
simp only [Real.norm_eq_abs, sq_abs] right ⊢ ∑ x, C2R.ofLp x ^ 2 < (99 / 100) ^ 2
unfold C2R C2 right ⊢ ∑ x, (WithLp.toLp 2 fun i ↦ ↑((1 / 10 ^ 10 * ![6632738028, 6106948881, 3980949609]) i)).ofLp x ^ 2 < (99 / 100) ^ 2
simp only [Fin.sum_univ_three, Pi.mul_apply, Matrix.cons_val] right ⊢ ↑((1 / 10 ^ 10) 0 * 6632738028) ^ 2 + ↑((1 / 10 ^ 10) 1 * 6106948881) ^ 2 + ↑((1 / 10 ^ 10) 2 * 3980949609) ^ 2 <
(99 / 100) ^ 2
norm_num All goals completed! 🐙
theorem c2_norm_le_one : ‖C2R‖ ≤ 1 := by ⊢ ‖C2R‖ ≤ 1
grw [c2_norm_bound.2 ⊢ 99 / 100 ≤ 1] ⊢ 99 / 100 ≤ 1
norm_num All goals completed! 🐙
theorem c3_norm_bound : ‖C3R‖ ∈ Set.Ioo (98/100) (99/100) := by ⊢ ‖C3R‖ ∈ Set.Ioo (98 / 100) (99 / 100)
rw [EuclideanSpace.norm_eq ⊢ √(∑ i, ‖C3R.ofLp i‖ ^ 2) ∈ Set.Ioo (98 / 100) (99 / 100)] ⊢ √(∑ i, ‖C3R.ofLp i‖ ^ 2) ∈ Set.Ioo (98 / 100) (99 / 100)
constructor left ⊢ 98 / 100 < √(∑ i, ‖C3R.ofLp i‖ ^ 2)right ⊢ √(∑ i, ‖C3R.ofLp i‖ ^ 2) < 99 / 100
· left ⊢ 98 / 100 < √(∑ i, ‖C3R.ofLp i‖ ^ 2) sorry All goals completed! 🐙
· right ⊢ √(∑ i, ‖C3R.ofLp i‖ ^ 2) < 99 / 100 refine (sqrt_lt' (by ⊢ 0 < 99 / 100 norm_num All goals completed! 🐙)).mpr ?_
simp only [Real.norm_eq_abs, sq_abs] right ⊢ ∑ x, C3R.ofLp x ^ 2 < (99 / 100) ^ 2
unfold C3R C3 right ⊢ ∑ x, (WithLp.toLp 2 fun i ↦ ↑((1 / 10 ^ 10 * ![8193990033, 5298215096, 1230614493]) i)).ofLp x ^ 2 < (99 / 100) ^ 2
simp only [Fin.sum_univ_three, Pi.mul_apply, Matrix.cons_val] right ⊢ ↑((1 / 10 ^ 10) 0 * 8193990033) ^ 2 + ↑((1 / 10 ^ 10) 1 * 5298215096) ^ 2 + ↑((1 / 10 ^ 10) 2 * 1230614493) ^ 2 <
(99 / 100) ^ 2
norm_num All goals completed! 🐙
-- deps for c3_norm_bound:
-- { EuclideanSpace.norm_eq, lt_sqrt_of_sq_lt, Real.norm_eq_abs, C3R, C3, }
-- deps we know: { }
theorem c3_norm_le_one : ‖C3R‖ ≤ 1 := by ⊢ ‖C3R‖ ≤ 1
grw [c3_norm_bound.2 ⊢ 99 / 100 ≤ 1] ⊢ 99 / 100 ≤ 1
norm_num All goals completed! 🐙
/-- This is half of the C30 defined in \[SY25\]. In order
to see that this is pointsymmetric, it's convenient to
do explicit pointsymmetrization later. -/
noncomputable
def C15 (pt : ℝ³) : Finset ℝ³ :=
Finset.range 15 |> .image fun (k : ℕ) =>
RzL (2 * π * (k : ℝ) / 15) pt
lemma C15_nonempty (pt : ℝ³) : (C15 pt).Nonempty := by pt:Euc(3)⊢ (C15 pt).Nonempty
use (RzL 0 pt) h pt:Euc(3)⊢ (RzL 0) pt ∈ C15 pt
have z : 0 ∈ Finset.range 15 := Finset.insert_eq_self.mp rfl h pt:Euc(3)z:0 ∈ Finset.range 15⊢ (RzL 0) pt ∈ C15 pt
simp only [C15, Finset.mem_image, Finset.mem_range] h pt:Euc(3)z:0 ∈ Finset.range 15⊢ ∃ a < 15, (RzL (2 * π * ↑a / 15)) pt = (RzL 0) pt
use 0 h pt:Euc(3)z:0 ∈ Finset.range 15⊢ 0 < 15 ∧ (RzL (2 * π * ↑0 / 15)) pt = (RzL 0) pt
simp only [Nat.ofNat_pos, CharP.cast_eq_zero, mul_zero, zero_div, and_self] All goals completed! 🐙
lemma C15_pres_norm (pt v : ℝ³) (hv : v ∈ C15 pt) : ‖v‖ = ‖pt‖ := by pt:Euc(3)v:Euc(3)hv:v ∈ C15 pt⊢ ‖v‖ = ‖pt‖
simp only [C15, Finset.mem_image, Finset.mem_range] at hv pt:Euc(3)v:Euc(3)hv:∃ a < 15, (RzL (2 * π * ↑a / 15)) pt = v⊢ ‖v‖ = ‖pt‖
obtain ⟨a, ⟨ha, ha'⟩⟩ := hv pt:Euc(3)v:Euc(3)a:ℕha:a < 15ha':(RzL (2 * π * ↑a / 15)) pt = v⊢ ‖v‖ = ‖pt‖
rw [← ha', pt:Euc(3)v:Euc(3)a:ℕha:a < 15ha':(RzL (2 * π * ↑a / 15)) pt = v⊢ ‖(RzL (2 * π * ↑a / 15)) pt‖ = ‖pt‖ Bounding.Rz_preserves_norm _ pt:Euc(3)v:Euc(3)a:ℕha:a < 15ha':(RzL (2 * π * ↑a / 15)) pt = v⊢ ‖pt‖ = ‖pt‖] All goals completed! 🐙
end NopertInline
-
exactVertex_radius_one[complete]
The radius of the Noperthedron is one.
Lean code for Lemma2.1.2●1 theorem
Associated Lean declarations
-
exactVertex_radius_one[complete]
-
exactVertex_radius_one[complete]
-
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.exactVertex_radius_one : { v := exactVertex }.radius = 1
theorem Noperthedron.exactVertex_radius_one : { v := exactVertex }.radius = 1
The radius of the noperthedron is 1.
- Lemma 2.1.1
- Lemma 2.1.7
- Theorem 4.3.3
- «thm:polyhedron_radius_def»
By Lemma 2.1.1, Theorem 4.3.3, [??], and Lemma 2.1.7.
Lean code
#check exactVertex_radius_one
#check exactVertex_norm_le_one
#check exactPoly_point_symmetric
Rotations about the x, y, z axes R_x,R_y,R_z: \mathbb{R}\to \mathbb{R}^{3\times 3}
are defined in the usual way:
R_x(\alpha)\coloneqq
\begin{pmatrix}
1 & 0 & 0\\
0 & \cos\alpha & -\sin\alpha\\
0 & \sin\alpha & \cos\alpha
\end{pmatrix},
\hspace{1cm}
R_y(\alpha)\coloneqq
\begin{pmatrix}
\cos\alpha & 0 & -\sin\alpha\\
0 & 1 & 0\\
\sin\alpha & 0 & \cos\alpha
\end{pmatrix},
R_z(\alpha)\coloneqq
\begin{pmatrix}
\cos\alpha & -\sin\alpha &0\\
\sin\alpha & \cos\alpha &0\\
0 & 0 & 1
\end{pmatrix}.
Where Steininger and Yurkevich define a 30-element set C_{30}:
\mathcal{C}_{30} \coloneqq \left\{(-1)^\ell R_z\left(\frac{2\pi k}{15}\right) \colon k=0,\dots,14; \ell=0,1\right\}.
of rotations, we instead define
-
NopertInline.C15[complete]
\mathcal{C}_{15} \coloneqq \left\{ R_z\left(\frac{2\pi k}{15}\right) \colon k=0,\dots,14 \right\}.
Lean code for Definition2.1.3●1 definition
Associated Lean declarations
-
NopertInline.C15[complete]
-
NopertInline.C15[complete]
-
defdefined in Chapters/Noperthedron.leancomplete
def NopertInline.C15 (pt : Euc(3)) : Finset Euc(3)
def NopertInline.C15 (pt : Euc(3)) : Finset Euc(3)
This is half of the C30 defined in \[SY25\]. In order to see that this is pointsymmetric, it's convenient to do explicit pointsymmetrization later.
without point-symmetricness "baked in" as it is in C_{30}. It's more convenient for the formalization to apply C_{15} to the points C_1, C_2, C_3, and then point-symmetrize that set afterwards.
A set S \subseteq \R^3 is point-symmetric if x \in S implies -x \in S.
Lean code for Definition2.1.4●1 definition
Associated Lean declarations
-
PointSym[complete]
-
PointSym[complete]
-
defdefined in Noperthedron/PointSym.leancomplete
def PointSym {n : ℕ} (A : Set Euc(n)) : Prop
def PointSym {n : ℕ} (A : Set Euc(n)) : Prop
- No associated Lean code or declarations.
The pointsymmetrization of a collection of vertices v_1, \ldots, v_n \in \R^3
is v_1, \ldots, v_n, -v_1, \ldots, -v_n.
We write \mathcal{C}_{15} \cdot P = \{c P \,\text{ for } \, c \in \mathcal{C}_{15}\} for the orbit of P under the action of \mathcal{C}_{15}.
-
exactVertex[complete] -
exactPolyhedron[complete]
The Noperthedron is the polyhedron given by the vertex set that is the
pointsymmetrization of
\mathcal{C}_{15} \cdot C_1 \cup \mathcal{C}_{15} \cdot C_2 \cup \mathcal{C}_{15} \cdot C_3
Lean code for Definition2.1.6●2 definitions
Associated Lean declarations
-
exactVertex[complete]
-
exactPolyhedron[complete]
-
exactVertex[complete] -
exactPolyhedron[complete]
-
defdefined in Noperthedron/Vertices/Exact.leancomplete
def Noperthedron.exactVertex (idx : VertexIndex) : Euc(3)
def Noperthedron.exactVertex (idx : VertexIndex) : Euc(3)
-
defdefined in Noperthedron/Vertices/Exact.leancomplete
def Noperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3)
def Noperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3)
-
exactVertex_norm_le_one[complete]
The norm of any vertex in the prepointsymmetrized version of the Noperthedron is no more than 1.
Lean code for Lemma2.1.7●1 theorem
Associated Lean declarations
-
exactVertex_norm_le_one[complete]
-
exactVertex_norm_le_one[complete]
-
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.exactVertex_norm_le_one (j : VertexIndex) : ‖exactVertex j‖ ≤ 1
theorem Noperthedron.exactVertex_norm_le_one (j : VertexIndex) : ‖exactVertex j‖ ≤ 1
Evident from definitions.
The pointsymmetrization of any set is point-symmetric.
Evident from definitions.
-
exactPoly_point_symmetric[complete]
The noperthedron is point-symmetric.
Lean code for Lemma2.1.9●1 theorem
Associated Lean declarations
-
exactPoly_point_symmetric[complete]
-
exactPoly_point_symmetric[complete]
-
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.exactPoly_point_symmetric : PointSym exactPoly.hull
theorem Noperthedron.exactPoly_point_symmetric : PointSym exactPoly.hull
The noperthedron is pointsymmetric.
Follows from Lemma 2.1.8
2.2. Refined Rupert's property for the Noperthedron
-
Tightening.lemma7_1[complete] -
Tightening.lemma7_2[complete] -
Tightening.lemma7_3[complete]
Let \PPP = \NOP, then for all \theta, \varphi, \alpha \in \R, the following three identities hold (as sets):
\begin{align*}
M({\theta+2\pi/15,\varphi})\cdot \PPP &=M(\theta, \phi) \cdot \PPP,\\
R(\alpha+\pi)M(\theta, \phi) \cdot \PPP &=R(\alpha)M(\theta, \phi) \cdot \PPP,\\
\begin{pmatrix}
1&0\\
0&-1
\end{pmatrix}
M(\theta, \phi) \cdot \PPP&=
M({\theta+\pi/15,\pi-\varphi}) \cdot \PPP.
\end{align*}
Lean code for Lemma2.2.1●3 theorems
Associated Lean declarations
-
Tightening.lemma7_1[complete]
-
Tightening.lemma7_2[complete]
-
Tightening.lemma7_3[complete]
-
Tightening.lemma7_1[complete] -
Tightening.lemma7_2[complete] -
Tightening.lemma7_3[complete]
-
theoremdefined in Noperthedron/Tightening.leancomplete
theorem Noperthedron.Tightening.lemma7_1 (θ φ : ℝ) : ⇑(rotM (θ + 2 / 15 * Real.pi) φ) '' exactPolyhedron.hull = ⇑(rotM θ φ) '' exactPolyhedron.hull
theorem Noperthedron.Tightening.lemma7_1 (θ φ : ℝ) : ⇑(rotM (θ + 2 / 15 * Real.pi) φ) '' exactPolyhedron.hull = ⇑(rotM θ φ) '' exactPolyhedron.hull
-
theoremdefined in Noperthedron/Tightening.leancomplete
theorem Noperthedron.Tightening.lemma7_2 (θ φ α : ℝ) : ⇑(rotR (α + Real.pi)) ∘ ⇑(rotM θ φ) '' exactPolyhedron.hull = ⇑(rotR α) ∘ ⇑(rotM θ φ) '' exactPolyhedron.hull
theorem Noperthedron.Tightening.lemma7_2 (θ φ α : ℝ) : ⇑(rotR (α + Real.pi)) ∘ ⇑(rotM θ φ) '' exactPolyhedron.hull = ⇑(rotR α) ∘ ⇑(rotM θ φ) '' exactPolyhedron.hull
-
theoremdefined in Noperthedron/Tightening.leancomplete
theorem Noperthedron.Tightening.lemma7_3 (θ φ : ℝ) : ⇑(flip_y ∘SL rotM θ φ) '' exactPolyhedron.hull = ⇑(rotM (θ + Real.pi / 15) (Real.pi - φ)) '' exactPolyhedron.hull
theorem Noperthedron.Tightening.lemma7_3 (θ φ : ℝ) : ⇑(flip_y ∘SL rotM θ φ) '' exactPolyhedron.hull = ⇑(rotM (θ + Real.pi / 15) (Real.pi - φ)) '' exactPolyhedron.hull
See polyhedron.without.rupert, Lemma 7.
If the noperthedron is Rupert, then there exists a solution with
\begin{align*}
\theta_1,\theta_2&\in[0,2\pi/15] \subset [0,0.42], \\
\varphi_1&\in [0,\pi] \subset [0,3.15],\\
\varphi_2&\in [0,\pi/2] \subset [0,1.58],\\
\alpha &\in [-\pi/2,\pi/2] \subset [-1.58,1.58].
\end{align*}
Lean code for Corollary2.2.2●1 theorem
Associated Lean declarations
-
Tightening.rupert_tightening[complete]
-
Tightening.rupert_tightening[complete]
-
theoremdefined in Noperthedron/Tightening.leancomplete
theorem Noperthedron.Tightening.rupert_tightening (p : Pose ℝ) (r : RupertPose p exactPolyhedron.hull) : ∃ p', tightInterval.contains p' ∧ RupertPose p' exactPolyhedron.hull
theorem Noperthedron.Tightening.rupert_tightening (p : Pose ℝ) (r : RupertPose p exactPolyhedron.hull) : ∃ p', tightInterval.contains p' ∧ RupertPose p' exactPolyhedron.hull
See polyhedron.without.rupert, Lemma 8.