Rupert Counterexample

7. Rational Versions🔗

Definition7.1
Group: Rational trigonometric approximations. (2)
Hover another entry in this group to preview it.
Preview
Lemma 7.2
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

Define \ssin, \scos : \mathbb{R} \to \mathbb{R} by truncated Taylor series:

  • \ssin(x) := x-\frac{x^3}{3!}+\frac{x^5}{5!}\mp\dots+\frac{x^{25}}{25!}

  • \scos(x) := 1-\frac{x^2}{2!}+\frac{x^4}{4!}\mp\dots+\frac{x^{24}}{24!}

Replacing \sin,\cos with \ssin,\scos defines R_\mathbb{Q}(\alpha), R'_\mathbb{Q}(\alpha), X_\mathbb{Q}(\theta,\phi), M_\mathbb{Q}(\theta,\phi), M^\theta_\mathbb{Q}(\theta,\varphi), M^\phi_\mathbb{Q}(\theta,\varphi).

Lean code for Definition7.12 definitions
  • def RationalApprox.sinℚRationalApprox.sinℚ {k : Type} [Field k] (x : k) : kSine partial sum $x - x^3/3! + x^5/5! - ⋯ + x^{25}/25!$
     {kType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  kType] (xk : kType) : kType
    def RationalApprox.sinℚRationalApprox.sinℚ {k : Type} [Field k] (x : k) : kSine partial sum $x - x^3/3! + x^5/5! - ⋯ + x^{25}/25!$
     {kType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  kType]
      (xk : kType) : kType
    Sine partial sum $x - x^3/3! + x^5/5! - ⋯ + x^{25}/25!$
    
  • def RationalApprox.cosℚRationalApprox.cosℚ {k : Type} [Field k] (x : k) : kCosine partial sum $1 - x^2/2! + x^4/4! - ⋯ + x^{24}/24!$
     {kType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  kType] (xk : kType) : kType
    def RationalApprox.cosℚRationalApprox.cosℚ {k : Type} [Field k] (x : k) : kCosine partial sum $1 - x^2/2! + x^4/4! - ⋯ + x^{24}/24!$
     {kType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  kType]
      (xk : kType) : kType
    Cosine partial sum $1 - x^2/2! + x^4/4! - ⋯ + x^{24}/24!$
    
Lemma7.2
Group: Rational trigonometric approximations. (2)
Hover another entry in this group to preview it.
Preview
Definition 7.1
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

Using Definition 7.1.

|\ssin(x)-\sin(x)|\leq \frac{|x|^{27}}{27!} \qquad\text{and}\qquad |\scos(x)-\cos(x)|\leq \frac{|x|^{26}}{26!}.

Lean code for Lemma7.22 theorems
  • complete
    theorem RationalApprox.sinℚ_approxRationalApprox.sinℚ_approx (x : ℝ) : |Real.sin x - RationalApprox.sinℚ x| ≤ |x| ^ 27 / ↑(Nat.factorial 27) (x : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Real.sinReal.sin (x : ℝ) : ℝThe real sine function, defined as the real part of the complex sine  x -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.sinℚRationalApprox.sinℚ {k : Type} [Field k] (x : k) : kSine partial sum $x - x^3/3! + x^5/5! - ⋯ + x^{25}/25!$
     x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 27 /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. (Nat.factorialNat.factorial : ℕ → ℕ`Nat.factorial n` is the factorial of `n`.  27)
    theorem RationalApprox.sinℚ_approxRationalApprox.sinℚ_approx (x : ℝ) : |Real.sin x - RationalApprox.sinℚ x| ≤ |x| ^ 27 / ↑(Nat.factorial 27) (x : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Real.sinReal.sin (x : ℝ) : ℝThe real sine function, defined as the real part of the complex sine  x -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.sinℚRationalApprox.sinℚ {k : Type} [Field k] (x : k) : kSine partial sum $x - x^3/3! + x^5/5! - ⋯ + x^{25}/25!$
     x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 27 /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. (Nat.factorialNat.factorial : ℕ → ℕ`Nat.factorial n` is the factorial of `n`.  27)
  • complete
    theorem RationalApprox.cosℚ_approxRationalApprox.cosℚ_approx (x : ℝ) : |Real.cos x - RationalApprox.cosℚ x| ≤ |x| ^ 26 / ↑(Nat.factorial 26) (x : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Real.cosReal.cos (x : ℝ) : ℝThe real cosine function, defined as the real part of the complex cosine  x -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.cosℚRationalApprox.cosℚ {k : Type} [Field k] (x : k) : kCosine partial sum $1 - x^2/2! + x^4/4! - ⋯ + x^{24}/24!$
     x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 26 /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. (Nat.factorialNat.factorial : ℕ → ℕ`Nat.factorial n` is the factorial of `n`.  26)
    theorem RationalApprox.cosℚ_approxRationalApprox.cosℚ_approx (x : ℝ) : |Real.cos x - RationalApprox.cosℚ x| ≤ |x| ^ 26 / ↑(Nat.factorial 26) (x : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Real.cosReal.cos (x : ℝ) : ℝThe real cosine function, defined as the real part of the complex cosine  x -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.cosℚRationalApprox.cosℚ {k : Type} [Field k] (x : k) : kCosine partial sum $1 - x^2/2! + x^4/4! - ⋯ + x^{24}/24!$
     x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 26 /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. (Nat.factorialNat.factorial : ℕ → ℕ`Nat.factorial n` is the factorial of `n`.  26)
Proof

Appeal to Taylor series bounds, using the fact that all absolute values of higher derivatives of sine and cosine never exceed 1.

Lemma7.3
Group: Rational trigonometric approximations. (2)
Hover another entry in this group to preview it.
Preview
Definition 7.1
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

For every x\in [-4,4], |\ssin(x)-\sin(x)| \leq \kappa/7 and |\scos(x)-\cos(x)|\leq \kappa/7.

Lean code for Lemma7.32 theorems
  • complete
    theorem RationalApprox.sinℚ_approx'RationalApprox.sinℚ_approx' (x : ℝ) (hx : x ∈ Set.Icc (-4) 4) :
      |Real.sin x - RationalApprox.sinℚ x| ≤ RationalApprox.κ / 7 (x : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (hxx ∈ Set.Icc (-4) 4 : x Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Real.sinReal.sin (x : ℝ) : ℝThe real sine function, defined as the real part of the complex sine  x -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.sinℚRationalApprox.sinℚ {k : Type} [Field k] (x : k) : kSine partial sum $x - x^3/3! + x^5/5! - ⋯ + x^{25}/25!$
     x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. 7
    theorem RationalApprox.sinℚ_approx'RationalApprox.sinℚ_approx' (x : ℝ) (hx : x ∈ Set.Icc (-4) 4) :
      |Real.sin x - RationalApprox.sinℚ x| ≤ RationalApprox.κ / 7 (x : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (hxx ∈ Set.Icc (-4) 4 : x Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Real.sinReal.sin (x : ℝ) : ℝThe real sine function, defined as the real part of the complex sine  x -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.sinℚRationalApprox.sinℚ {k : Type} [Field k] (x : k) : kSine partial sum $x - x^3/3! + x^5/5! - ⋯ + x^{25}/25!$
     x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.κRationalApprox.κ : ℝ /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. 7
  • complete
    theorem RationalApprox.cosℚ_approx'RationalApprox.cosℚ_approx' (x : ℝ) (hx : x ∈ Set.Icc (-4) 4) :
      |Real.cos x - RationalApprox.cosℚ x| ≤ RationalApprox.κ / 7 (x : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (hxx ∈ Set.Icc (-4) 4 : x Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Real.cosReal.cos (x : ℝ) : ℝThe real cosine function, defined as the real part of the complex cosine  x -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.cosℚRationalApprox.cosℚ {k : Type} [Field k] (x : k) : kCosine partial sum $1 - x^2/2! + x^4/4! - ⋯ + x^{24}/24!$
     x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. 7
    theorem RationalApprox.cosℚ_approx'RationalApprox.cosℚ_approx' (x : ℝ) (hx : x ∈ Set.Icc (-4) 4) :
      |Real.cos x - RationalApprox.cosℚ x| ≤ RationalApprox.κ / 7 (x : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (hxx ∈ Set.Icc (-4) 4 : x Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Real.cosReal.cos (x : ℝ) : ℝThe real cosine function, defined as the real part of the complex cosine  x -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.cosℚRationalApprox.cosℚ {k : Type} [Field k] (x : k) : kCosine partial sum $1 - x^2/2! + x^4/4! - ⋯ + x^{24}/24!$
     x|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.κRationalApprox.κ : ℝ /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. 7
Proof

Using Lemma 7.2. Straightforward numerical calculation from Lemma Lemma 7.2.

Lemma7.4
Group: Matrix approximation error bounds. (4)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Let A = (a_{i,j})_{1 \leq i \leq m,\,1 \leq j \leq n} \in \mathbb{R}^{m \times n} and \delta >0. If |a_{i,j}| \leq \delta for all entries, then \|A\| \leq \delta \sqrt{mn}.

Lean code for Lemma7.41 theorem
  • complete
    theorem RationalApprox.norm_le_delta_sqrt_dimsRationalApprox.norm_le_delta_sqrt_dims {m n : ℕ} {δ : ℝ} (A : Matrix (Fin m) (Fin n) ℝ) (hδ : 0 < δ)
      (hle : ∀ (i : Fin m) (j : Fin n), |A i j| ≤ δ) :
      ‖LinearMap.toContinuousLinearMap (Matrix.toEuclideanLin A)‖ ≤ δ * √(↑m * ↑n)[SY25] Lemma 39  {m n : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    } {δ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. }
      (AMatrix (Fin m) (Fin n) ℝ : MatrixMatrix.{u, u', v} (m : Type u) (n : Type u') (α : Type v) : Type (max u u' v)`Matrix m n R` is the type of matrices with entries in `R`, whose rows are indexed by `m`
    and whose columns are indexed by `n`.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     m) (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     n) Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (0 < δ : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. δ)
      (hle∀ (i : Fin m) (j : Fin n), |A i j| ≤ δ :  (iFin m : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     m) (jFin n : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     n), |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` AMatrix (Fin m) (Fin n) ℝ iFin m jFin n|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. δ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. LinearMap.toContinuousLinearMapLinearMap.toContinuousLinearMap.{u, v, x} {𝕜 : Type u} [hnorm : NontriviallyNormedField 𝕜] {E : Type v} [AddCommGroup E]
      [Module 𝕜 E] [TopologicalSpace E] [IsTopologicalAddGroup E] [ContinuousSMul 𝕜 E] {F' : Type x} [AddCommGroup F']
      [Module 𝕜 F'] [TopologicalSpace F'] [IsTopologicalAddGroup F'] [ContinuousSMul 𝕜 F'] [CompleteSpace 𝕜] [T2Space E]
      [FiniteDimensional 𝕜 E] : (E →ₗ[𝕜] F') ≃ₗ[𝕜] E →L[𝕜] F'The continuous linear map induced by a linear map on a finite-dimensional space  (Matrix.toEuclideanLinMatrix.toEuclideanLin.{u_3, u_7, u_8} {𝕜 : Type u_3} [RCLike 𝕜] {m : Type u_7} {n : Type u_8} [Fintype n]
      [DecidableEq n] : Matrix m n 𝕜 ≃ₗ[𝕜] EuclideanSpace 𝕜 n →ₗ[𝕜] EuclideanSpace 𝕜 mA shorthand for `Matrix.toLpLin 2 2`.  AMatrix (Fin m) (Fin n) ℝ)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        δ *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Real.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.m *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. n)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
    theorem RationalApprox.norm_le_delta_sqrt_dimsRationalApprox.norm_le_delta_sqrt_dims {m n : ℕ} {δ : ℝ} (A : Matrix (Fin m) (Fin n) ℝ) (hδ : 0 < δ)
      (hle : ∀ (i : Fin m) (j : Fin n), |A i j| ≤ δ) :
      ‖LinearMap.toContinuousLinearMap (Matrix.toEuclideanLin A)‖ ≤ δ * √(↑m * ↑n)[SY25] Lemma 39 
      {m n : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    } {δ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. }
      (AMatrix (Fin m) (Fin n) ℝ : MatrixMatrix.{u, u', v} (m : Type u) (n : Type u') (α : Type v) : Type (max u u' v)`Matrix m n R` is the type of matrices with entries in `R`, whose rows are indexed by `m`
    and whose columns are indexed by `n`.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     m) (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     n) Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (0 < δ : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. δ)
      (hle∀ (i : Fin m) (j : Fin n), |A i j| ≤ δ :
         (iFin m : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     m) (jFin n : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     n),
          |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` AMatrix (Fin m) (Fin n) ℝ iFin m jFin n|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. δ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. LinearMap.toContinuousLinearMapLinearMap.toContinuousLinearMap.{u, v, x} {𝕜 : Type u} [hnorm : NontriviallyNormedField 𝕜] {E : Type v} [AddCommGroup E]
      [Module 𝕜 E] [TopologicalSpace E] [IsTopologicalAddGroup E] [ContinuousSMul 𝕜 E] {F' : Type x} [AddCommGroup F']
      [Module 𝕜 F'] [TopologicalSpace F'] [IsTopologicalAddGroup F'] [ContinuousSMul 𝕜 F'] [CompleteSpace 𝕜] [T2Space E]
      [FiniteDimensional 𝕜 E] : (E →ₗ[𝕜] F') ≃ₗ[𝕜] E →L[𝕜] F'The continuous linear map induced by a linear map on a finite-dimensional space 
            (Matrix.toEuclideanLinMatrix.toEuclideanLin.{u_3, u_7, u_8} {𝕜 : Type u_3} [RCLike 𝕜] {m : Type u_7} {n : Type u_8} [Fintype n]
      [DecidableEq n] : Matrix m n 𝕜 ≃ₗ[𝕜] EuclideanSpace 𝕜 n →ₗ[𝕜] EuclideanSpace 𝕜 mA shorthand for `Matrix.toLpLin 2 2`.  AMatrix (Fin m) (Fin n) ℝ)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        δ *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Real.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.m *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. n)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
    [SY25] Lemma 39 
Proof

For any v\in \R^n we have

\begin{align*} \|Av\|^2 &=\sum_{i=1}^m \left(\sum_{j=1}^na_{i,j}v_j\right)^2 \leq \sum_{i=1}^m\left(\sum_{j=1}^n \delta |v_j|\right)^2 = \delta^2 m\left(\sum_{j=1}^n |v_j|\right)^2 \leq \delta^2 m n \|v\|^2 \end{align*} $$

using the Cauchy-Schwarz inequality. Dividing by \|v\| and taking the square root proves the claim.

Lemma7.5
Group: Matrix approximation error bounds. (4)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Let A(x,y) be an m\times n matrix (1\le m,n\le 3) whose entries are products of terms in \{0,1,-1,\pm\sin(z),\pm\cos(z)\}. Let A_\mathbb{Q}(x,y) be obtained by replacing \sin,\cos with \ssin,\scos. Then for x,y\in[-4,4], \|A(x,y)-A_{\mathbb{Q}}(x,y)\|\leq\kappa.

Lean code for Lemma7.51 theorem
  • theorem RationalApprox.norm_matrix_actual_approx_le_kappaRationalApprox.norm_matrix_actual_approx_le_kappa {m n : ↥(Finset.Icc 1 3)}
      (A : Matrix (Fin ↑m) (Fin ↑n) RationalApprox.DistLeKappaEntry) (x y : ↑(Set.Icc (-4) 4)) :
      ‖RationalApprox.clinActual A ↑x ↑y - RationalApprox.clinApprox A ↑x ↑y‖ ≤ RationalApprox.κ[SY25] Lemma 40 
      {m↥(Finset.Icc 1 3) n↥(Finset.Icc 1 3) : (Finset.IccFinset.Icc.{u_1} {α : Type u_1} [Preorder α] [LocallyFiniteOrder α] (a b : α) : Finset αThe finset $[a, b]$ of elements `x` such that `a ≤ x` and `x ≤ b`. Basically `Set.Icc a b` as a
    finset.  1 3)}
      (AMatrix (Fin ↑m) (Fin ↑n) RationalApprox.DistLeKappaEntry : MatrixMatrix.{u, u', v} (m : Type u) (n : Type u') (α : Type v) : Type (max u u' v)`Matrix m n R` is the type of matrices with entries in `R`, whose rows are indexed by `m`
    and whose columns are indexed by `n`.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     m↥(Finset.Icc 1 3)) (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     n↥(Finset.Icc 1 3)) RationalApprox.DistLeKappaEntryRationalApprox.DistLeKappaEntry : Type)
      (x↑(Set.Icc (-4) 4) y↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.clinActualRationalApprox.clinActual {m n : ℕ} (A : Matrix (Fin m) (Fin n) RationalApprox.DistLeKappaEntry) (x y : ℝ) :
      E n →L[ℝ] E m AMatrix (Fin ↑m) (Fin ↑n) RationalApprox.DistLeKappaEntry x↑(Set.Icc (-4) 4) y↑(Set.Icc (-4) 4) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            RationalApprox.clinApproxRationalApprox.clinApprox {m n : ℕ} (A : Matrix (Fin m) (Fin n) RationalApprox.DistLeKappaEntry) (x y : ℝ) :
      E n →L[ℝ] E m AMatrix (Fin ↑m) (Fin ↑n) RationalApprox.DistLeKappaEntry x↑(Set.Icc (-4) 4) y↑(Set.Icc (-4) 4)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.norm_matrix_actual_approx_le_kappaRationalApprox.norm_matrix_actual_approx_le_kappa {m n : ↥(Finset.Icc 1 3)}
      (A : Matrix (Fin ↑m) (Fin ↑n) RationalApprox.DistLeKappaEntry) (x y : ↑(Set.Icc (-4) 4)) :
      ‖RationalApprox.clinActual A ↑x ↑y - RationalApprox.clinApprox A ↑x ↑y‖ ≤ RationalApprox.κ[SY25] Lemma 40 
      {m↥(Finset.Icc 1 3) n↥(Finset.Icc 1 3) : (Finset.IccFinset.Icc.{u_1} {α : Type u_1} [Preorder α] [LocallyFiniteOrder α] (a b : α) : Finset αThe finset $[a, b]$ of elements `x` such that `a ≤ x` and `x ≤ b`. Basically `Set.Icc a b` as a
    finset.  1 3)}
      (AMatrix (Fin ↑m) (Fin ↑n) RationalApprox.DistLeKappaEntry :
        MatrixMatrix.{u, u', v} (m : Type u) (n : Type u') (α : Type v) : Type (max u u' v)`Matrix m n R` is the type of matrices with entries in `R`, whose rows are indexed by `m`
    and whose columns are indexed by `n`.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     m↥(Finset.Icc 1 3)) (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     n↥(Finset.Icc 1 3))
          RationalApprox.DistLeKappaEntryRationalApprox.DistLeKappaEntry : Type)
      (x↑(Set.Icc (-4) 4) y↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.clinActualRationalApprox.clinActual {m n : ℕ} (A : Matrix (Fin m) (Fin n) RationalApprox.DistLeKappaEntry) (x y : ℝ) :
      E n →L[ℝ] E m AMatrix (Fin ↑m) (Fin ↑n) RationalApprox.DistLeKappaEntry x↑(Set.Icc (-4) 4) y↑(Set.Icc (-4) 4) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            RationalApprox.clinApproxRationalApprox.clinApprox {m n : ℕ} (A : Matrix (Fin m) (Fin n) RationalApprox.DistLeKappaEntry) (x y : ℝ) :
      E n →L[ℝ] E m AMatrix (Fin ↑m) (Fin ↑n) RationalApprox.DistLeKappaEntry x↑(Set.Icc (-4) 4)
              y↑(Set.Icc (-4) 4)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.κRationalApprox.κ : ℝ
    [SY25] Lemma 40 
Proof

Using Lemma 7.3 and Lemma 7.4. We've replaced the assumption a_i(z)\in \{0,1,-1,\pm\sin(z),\pm\cos(z)\} in Steininger and Yurkevich (2025)'s Lemma 40 with a_i(z)\in [-1,1].

By assumption, for fixed x,y every entry of A(x,y)-A_{\mathbb{Q}}(x,y) is of the form a b - \widetilde{a}\widetilde{b} for some a,b\in[-1,1] and |a-\widetilde{a}|,|b-\widetilde{b}|\leq \kappa/7 by Lemma 7.3. This implies that

\begin{align*} |ab-\widetilde{a}\widetilde{b}|&\leq |a b-a\widetilde{b}|+|a \widetilde{b}-\widetilde{a}\widetilde{b}| \\ &=|a|\cdot |b-\widetilde{b}|+|\widetilde{b}|\cdot |a-\widetilde{a}| \leq 1\cdot \kappa/7+(1+\kappa/7) \cdot \kappa/7 <\kappa/3. \end{align*} $$

So we can apply Lemma 7.4 and obtain that \|A(x,y)-A_{\Q}(x,y)\|<\kappa/3\cdot \sqrt{3\cdot 3}=\kappa.

Corollary7.6
Group: Matrix approximation error bounds. (4)
Hover another entry in this group to preview it.
L∃∀N
Used by 3
Hover a use site to preview it.

Let \alpha,\theta,\phi\in[-4,4]. Then \|R(\alpha)-R_\mathbb{Q}(\alpha)\|, \|R'(\alpha)-R'_\mathbb{Q}(\alpha)\|, \|X(\theta,\phi)-X_\mathbb{Q}(\theta,\phi)\|, \|M(\theta,\phi)-M_\mathbb{Q}(\theta,\phi)\|, \|M^\theta(\theta,\phi)-M^\theta_\mathbb{Q}(\theta,\phi)\|, \|M^\phi(\theta,\phi)-M^\phi_\mathbb{Q}(\theta,\phi)\| are all at most \kappa. Moreover \|R_\mathbb{Q}(\alpha)\|, \|R'_\mathbb{Q}(\alpha)\|, \|M_\mathbb{Q}(\theta, \phi)\|, \|M_{\Q}^{\theta}(\theta,\varphi)\|, \|M_{\Q}^{\phi}(\theta,\varphi)\| \leq 1+\kappa.

Lean code for Corollary7.611 theorems
  • theorem RationalApprox.R_difference_norm_boundedRationalApprox.R_difference_norm_bounded (α : ℝ) (hα : α ∈ Set.Icc (-4) 4) :
      ‖rotR α - RationalApprox.rotRℚℝ α‖ ≤ RationalApprox.κProof of [SY25] Corollary 41  (α : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (α ∈ Set.Icc (-4) 4 : α Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.rotRℚℝRationalApprox.rotRℚℝ (α : ℝ) : Euc(2) →L[ℝ] Euc(2) αNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.R_difference_norm_boundedRationalApprox.R_difference_norm_bounded (α : ℝ) (hα : α ∈ Set.Icc (-4) 4) :
      ‖rotR α - RationalApprox.rotRℚℝ α‖ ≤ RationalApprox.κProof of [SY25] Corollary 41 
      (α : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (α ∈ Set.Icc (-4) 4 : α Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.rotRℚℝRationalApprox.rotRℚℝ (α : ℝ) : Euc(2) →L[ℝ] Euc(2) αNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.κRationalApprox.κ : ℝ
    Proof of [SY25] Corollary 41 
  • theorem RationalApprox.R'_difference_norm_boundedRationalApprox.R'_difference_norm_bounded (α : ℝ) (hα : α ∈ Set.Icc (-4) 4) :
      ‖rotR' α - RationalApprox.rotR'ℚℝ α‖ ≤ RationalApprox.κ (α : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (α ∈ Set.Icc (-4) 4 : α Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. rotR'rotR' (α : ℝ) : Euc(2) →L[ℝ] Euc(2) α -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.rotR'ℚℝRationalApprox.rotR'ℚℝ (α : ℝ) : Euc(2) →L[ℝ] Euc(2) αNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.R'_difference_norm_boundedRationalApprox.R'_difference_norm_bounded (α : ℝ) (hα : α ∈ Set.Icc (-4) 4) :
      ‖rotR' α - RationalApprox.rotR'ℚℝ α‖ ≤ RationalApprox.κ
      (α : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (α ∈ Set.Icc (-4) 4 : α Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. rotR'rotR' (α : ℝ) : Euc(2) →L[ℝ] Euc(2) α -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.rotR'ℚℝRationalApprox.rotR'ℚℝ (α : ℝ) : Euc(2) →L[ℝ] Euc(2) αNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.M_difference_norm_boundedRationalApprox.M_difference_norm_bounded (θ φ : ℝ) (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖rotM θ φ - RationalApprox.rotMℚℝ θ φ‖ ≤ RationalApprox.κ (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.M_difference_norm_boundedRationalApprox.M_difference_norm_bounded (θ φ : ℝ) (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖rotM θ φ - RationalApprox.rotMℚℝ θ φ‖ ≤ RationalApprox.κ
      (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.Mθ_difference_norm_boundedRationalApprox.Mθ_difference_norm_bounded (θ φ : ℝ) (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖rotMθ θ φ - RationalApprox.rotMθℚℝ θ φ‖ ≤ RationalApprox.κ (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. rotMθrotMθ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.rotMθℚℝRationalApprox.rotMθℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.Mθ_difference_norm_boundedRationalApprox.Mθ_difference_norm_bounded (θ φ : ℝ) (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖rotMθ θ φ - RationalApprox.rotMθℚℝ θ φ‖ ≤ RationalApprox.κ
      (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. rotMθrotMθ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            RationalApprox.rotMθℚℝRationalApprox.rotMθℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.Mφ_difference_norm_boundedRationalApprox.Mφ_difference_norm_bounded (θ φ : ℝ) (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖rotMφ θ φ - RationalApprox.rotMφℚℝ θ φ‖ ≤ RationalApprox.κ (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. rotMφrotMφ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.rotMφℚℝRationalApprox.rotMφℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.Mφ_difference_norm_boundedRationalApprox.Mφ_difference_norm_bounded (θ φ : ℝ) (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖rotMφ θ φ - RationalApprox.rotMφℚℝ θ φ‖ ≤ RationalApprox.κ
      (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. rotMφrotMφ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            RationalApprox.rotMφℚℝRationalApprox.rotMφℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.X_difference_norm_boundedRationalApprox.X_difference_norm_bounded (θ φ : ℝ) (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖vecXL θ φ - RationalApprox.vecXLℚℝ θ φ‖ ≤ RationalApprox.κ (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. vecXLvecXL (θ φ : ℝ) : Euc(1) →L[ℝ] Euc(3) θ φ -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). RationalApprox.vecXLℚℝRationalApprox.vecXLℚℝ (θ φ : ℝ) : Euc(1) →L[ℝ] Euc(3) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.X_difference_norm_boundedRationalApprox.X_difference_norm_bounded (θ φ : ℝ) (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖vecXL θ φ - RationalApprox.vecXLℚℝ θ φ‖ ≤ RationalApprox.κ
      (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. vecXLvecXL (θ φ : ℝ) : Euc(1) →L[ℝ] Euc(3) θ φ -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            RationalApprox.vecXLℚℝRationalApprox.vecXLℚℝ (θ φ : ℝ) : Euc(1) →L[ℝ] Euc(3) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.Rℚ_norm_boundedRationalApprox.Rℚ_norm_bounded (α : ℝ) (hα : α ∈ Set.Icc (-4) 4) : ‖RationalApprox.rotRℚℝ α‖ ≤ 1 + RationalApprox.κ (α : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (α ∈ Set.Icc (-4) 4 : α Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.rotRℚℝRationalApprox.rotRℚℝ (α : ℝ) : Euc(2) →L[ℝ] Euc(2) αNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.Rℚ_norm_boundedRationalApprox.Rℚ_norm_bounded (α : ℝ) (hα : α ∈ Set.Icc (-4) 4) : ‖RationalApprox.rotRℚℝ α‖ ≤ 1 + RationalApprox.κ (α : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (α ∈ Set.Icc (-4) 4 : α Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.rotRℚℝRationalApprox.rotRℚℝ (α : ℝ) : Euc(2) →L[ℝ] Euc(2) αNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.Mℚ_norm_boundedRationalApprox.Mℚ_norm_bounded {θ φ : ℝ} (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖RationalApprox.rotMℚℝ θ φ‖ ≤ 1 + RationalApprox.κ {θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.Mℚ_norm_boundedRationalApprox.Mℚ_norm_bounded {θ φ : ℝ} (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖RationalApprox.rotMℚℝ θ φ‖ ≤ 1 + RationalApprox.κ {θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. }
      (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.R'ℚ_norm_boundedRationalApprox.R'ℚ_norm_bounded (α : ℝ) (hα : α ∈ Set.Icc (-4) 4) : ‖RationalApprox.rotR'ℚℝ α‖ ≤ 1 + RationalApprox.κ (α : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (α ∈ Set.Icc (-4) 4 : α Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.rotR'ℚℝRationalApprox.rotR'ℚℝ (α : ℝ) : Euc(2) →L[ℝ] Euc(2) αNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.R'ℚ_norm_boundedRationalApprox.R'ℚ_norm_bounded (α : ℝ) (hα : α ∈ Set.Icc (-4) 4) : ‖RationalApprox.rotR'ℚℝ α‖ ≤ 1 + RationalApprox.κ (α : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (α ∈ Set.Icc (-4) 4 : α Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.rotR'ℚℝRationalApprox.rotR'ℚℝ (α : ℝ) : Euc(2) →L[ℝ] Euc(2) αNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.Mθℚ_norm_boundedRationalApprox.Mθℚ_norm_bounded {θ φ : ℝ} (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖RationalApprox.rotMθℚℝ θ φ‖ ≤ 1 + RationalApprox.κ {θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.rotMθℚℝRationalApprox.rotMθℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.Mθℚ_norm_boundedRationalApprox.Mθℚ_norm_bounded {θ φ : ℝ} (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖RationalApprox.rotMθℚℝ θ φ‖ ≤ 1 + RationalApprox.κ {θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. }
      (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.rotMθℚℝRationalApprox.rotMθℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.Mφℚ_norm_boundedRationalApprox.Mφℚ_norm_bounded {θ φ : ℝ} (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖RationalApprox.rotMφℚℝ θ φ‖ ≤ 1 + RationalApprox.κ {θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.rotMφℚℝRationalApprox.rotMφℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.Mφℚ_norm_boundedRationalApprox.Mφℚ_norm_bounded {θ φ : ℝ} (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4) :
      ‖RationalApprox.rotMφℚℝ θ φ‖ ≤ 1 + RationalApprox.κ {θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. }
      (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. RationalApprox.rotMφℚℝRationalApprox.rotMφℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. RationalApprox.κRationalApprox.κ : ℝ
Proof

Using Lemma 7.5 and Lemma 3.1.

The first statement is a direct application of Lemma 7.5 and the second statement follows immediately after using Lemma 3.1 and the triangle inequality. The derivative norm bounds follow similarly, using that the operator norms of R', M^\theta, and M^\phi are at most 1.

Lemma7.7
Group: Matrix approximation error bounds. (4)
Hover another entry in this group to preview it.
L∃∀N
Used by 3
Hover a use site to preview it.

Let (A_i,B_i) for 1\le i\le n be pairs of same-size real matrices, with products A_1\cdots A_n and B_1\cdots B_n defined. If \|A_i-B_i\|\leq \kappa and \delta_i\geq \max(\|A_i\|,\|B_i\|,1), then \|A_1\cdots A_n-B_1\cdots B_n\|\leq n\kappa\,\delta_1\cdots\delta_n.

Lean code for Lemma7.71 theorem
  • complete
    theorem RationalApprox.norm_sub_le_prodRationalApprox.norm_sub_le_prod {n m : ℕ} (mv : RationalApprox.MatVec n m) (κ : ℝ) (κ_pos : κ > 0)
      (hκ : mv.DiffBoundedBy κ) : ‖mv.compA - mv.compB‖ ≤ ↑mv.size * κ * mv.maxNormList.prod[SY25] Lemma 42  {n m : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    }
      (mvRationalApprox.MatVec n m : RationalApprox.MatVecRationalApprox.MatVec (n m : ℕ) : TypeTwo sequences of matrices A₁,...,Aₖ and B₁,...,Bₖ with sizes that make
    the products A₁...Aₖ and B₁...Bₖ well-defined, as in [SY25] Lemma 42.
     n m) (κ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (κ_posκ > 0 : κ >GT.gt.{u} {α : Type u} [LT α] (a b : α) : Prop`a > b` is an abbreviation for `b < a`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `>` in identifiers is `gt`. 0)
      (mv.DiffBoundedBy κ : mvRationalApprox.MatVec n m.DiffBoundedByRationalApprox.MatVec.DiffBoundedBy {n m : ℕ} (mv : RationalApprox.MatVec n m) (κ : ℝ) : Prop κ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. mvRationalApprox.MatVec n m.compARationalApprox.MatVec.compA {n m : ℕ} (mv : RationalApprox.MatVec n m) : Euc(m) →L[ℝ] Euc(n) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). mvRationalApprox.MatVec n m.compBRationalApprox.MatVec.compB {n m : ℕ} (mv : RationalApprox.MatVec n m) : Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. mvRationalApprox.MatVec n m.sizeRationalApprox.MatVec.size {n m : ℕ} (mv : RationalApprox.MatVec n m) : ℕ *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. κ *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. mvRationalApprox.MatVec n m.maxNormListRationalApprox.MatVec.maxNormList {n m : ℕ} (mv : RationalApprox.MatVec n m) : List ℝ.prodList.prod.{u_1} {α : Type u_1} [Mul α] [One α] (xs : List α) : αComputes the product of the elements of a list.
    
    Examples:
    
    [a, b, c].prod = a * (b * (c * 1))
    [2, 3, 5].prod = 30
    
    theorem RationalApprox.norm_sub_le_prodRationalApprox.norm_sub_le_prod {n m : ℕ} (mv : RationalApprox.MatVec n m) (κ : ℝ) (κ_pos : κ > 0)
      (hκ : mv.DiffBoundedBy κ) : ‖mv.compA - mv.compB‖ ≤ ↑mv.size * κ * mv.maxNormList.prod[SY25] Lemma 42  {n m : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    }
      (mvRationalApprox.MatVec n m : RationalApprox.MatVecRationalApprox.MatVec (n m : ℕ) : TypeTwo sequences of matrices A₁,...,Aₖ and B₁,...,Bₖ with sizes that make
    the products A₁...Aₖ and B₁...Bₖ well-defined, as in [SY25] Lemma 42.
     n m) (κ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (κ_posκ > 0 : κ >GT.gt.{u} {α : Type u} [LT α] (a b : α) : Prop`a > b` is an abbreviation for `b < a`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `>` in identifiers is `gt`. 0)
      (mv.DiffBoundedBy κ : mvRationalApprox.MatVec n m.DiffBoundedByRationalApprox.MatVec.DiffBoundedBy {n m : ℕ} (mv : RationalApprox.MatVec n m) (κ : ℝ) : Prop κ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. mvRationalApprox.MatVec n m.compARationalApprox.MatVec.compA {n m : ℕ} (mv : RationalApprox.MatVec n m) : Euc(m) →L[ℝ] Euc(n) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). mvRationalApprox.MatVec n m.compBRationalApprox.MatVec.compB {n m : ℕ} (mv : RationalApprox.MatVec n m) : Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        mvRationalApprox.MatVec n m.sizeRationalApprox.MatVec.size {n m : ℕ} (mv : RationalApprox.MatVec n m) : ℕ *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. κ *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. mvRationalApprox.MatVec n m.maxNormListRationalApprox.MatVec.maxNormList {n m : ℕ} (mv : RationalApprox.MatVec n m) : List ℝ.prodList.prod.{u_1} {α : Type u_1} [Mul α] [One α] (xs : List α) : αComputes the product of the elements of a list.
    
    Examples:
    
    [a, b, c].prod = a * (b * (c * 1))
    [2, 3, 5].prod = 30
    
    [SY25] Lemma 42 
Proof

See polyhedron.without.rupert, Lemma 42.

Lemma7.8
Group: Matrix approximation error bounds. (4)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Let \alpha, \theta, \phi \in [-4,4], P\in \R^3 with \|P\| \leq 1 and let \widetilde{P} be a \kappa-rational approximation of P. Set M = M(\theta, \phi) and M_{\Q} = M_{\Q}(\theta, \phi), M^\theta = M^\theta(\theta, \phi) and M^\theta_{\Q} = M^\theta_{\Q}(\theta, \phi), M^\phi = M^\phi(\theta, \phi) and M^\phi_{\Q} = M^\phi_{\Q}(\theta, \phi), as well as R = R(\alpha), R_{\Q} = R_{\Q}(\alpha), R' = R'(\alpha), R'_{\Q} = R'_{\Q}(\alpha). Finally let w \in \R^2 with \|w\| = 1. Then:

\begin{align} | \langle M P, w\rangle - \langle M_{\Q} \widetilde{P}, w\rangle | & \leq 3\kappa \\ | \langle M^\theta P, w\rangle - \langle M^\theta_{\Q} \widetilde{P}, w\rangle | & \leq 3\kappa,\\ | \langle M^\phi P, w\rangle - \langle M^\phi_{\Q} \widetilde{P}, w\rangle | & \leq 3\kappa,\\ | \langle R M P, w\rangle - \langle R_{\Q} M_{\Q} \widetilde{P}, w\rangle | & \leq 4\kappa \\ | \langle R' M P, w\rangle - \langle R'_{\Q} M_{\Q} \widetilde{P}, w\rangle | & \leq 4\kappa,\\ | \langle R M^\theta P, w\rangle - \langle R_{\Q} M^\theta_{\Q} \widetilde{P}, w\rangle | & \leq 4\kappa,\\ | \langle R M^\phi P, w\rangle - \langle R_{\Q} M^\phi_{\Q} \widetilde{P}, w\rangle | & \leq 4\kappa. \end{align} $$

Lean code for Lemma7.87 theorems
  • theorem RationalApprox.bounds_kappa_MRationalApprox.bounds_kappa_M {P : Euc(3)} {P_ : Fin 3 → ℚ} {θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotM ↑↑θ ↑↑φ) P) (toR2 w) - ↑((RationalApprox.rotMℚ ↑θ ↑φ) P_ ⬝ᵥ w)‖ ≤ 3 * RationalApprox.κ {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)) (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotMℚRationalApprox.rotMℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) P_Fin 3 → ℚ ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`.  wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        3 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.bounds_kappa_MRationalApprox.bounds_kappa_M {P : Euc(3)} {P_ : Fin 3 → ℚ} {θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotM ↑↑θ ↑↑φ) P) (toR2 w) - ↑((RationalApprox.rotMℚ ↑θ ↑φ) P_ ⬝ᵥ w)‖ ≤ 3 * RationalApprox.κ {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. }
      {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)}
      {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)) (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotMℚRationalApprox.rotMℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4))
                  P_Fin 3 → ℚ ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        3 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.bounds_kappa_MθRationalApprox.bounds_kappa_Mθ {P : Euc(3)} {P_ : Fin 3 → ℚ} {θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotMθ ↑↑θ ↑↑φ) P) (toR2 w) - ↑((RationalApprox.rotMθℚ ↑θ ↑φ) P_ ⬝ᵥ w)‖ ≤ 3 * RationalApprox.κ {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotMθrotMθ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)) (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotMθℚRationalApprox.rotMθℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) P_Fin 3 → ℚ ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`.  wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        3 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.bounds_kappa_MθRationalApprox.bounds_kappa_Mθ {P : Euc(3)} {P_ : Fin 3 → ℚ} {θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotMθ ↑↑θ ↑↑φ) P) (toR2 w) - ↑((RationalApprox.rotMθℚ ↑θ ↑φ) P_ ⬝ᵥ w)‖ ≤ 3 * RationalApprox.κ
      {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)}
      {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotMθrotMθ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)) (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotMθℚRationalApprox.rotMθℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4))
                  P_Fin 3 → ℚ ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        3 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.bounds_kappa_MφRationalApprox.bounds_kappa_Mφ {P : Euc(3)} {P_ : Fin 3 → ℚ} {θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotMφ ↑↑θ ↑↑φ) P) (toR2 w) - ↑((RationalApprox.rotMφℚ ↑θ ↑φ) P_ ⬝ᵥ w)‖ ≤ 3 * RationalApprox.κ {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotMφrotMφ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)) (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotMφℚRationalApprox.rotMφℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) P_Fin 3 → ℚ ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`.  wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        3 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.bounds_kappa_MφRationalApprox.bounds_kappa_Mφ {P : Euc(3)} {P_ : Fin 3 → ℚ} {θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotMφ ↑↑θ ↑↑φ) P) (toR2 w) - ↑((RationalApprox.rotMφℚ ↑θ ↑φ) P_ ⬝ᵥ w)‖ ≤ 3 * RationalApprox.κ
      {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)}
      {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotMφrotMφ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)) (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotMφℚRationalApprox.rotMφℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4))
                  P_Fin 3 → ℚ ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        3 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.bounds_kappa_RMRationalApprox.bounds_kappa_RM {P : Euc(3)} {P_ : Fin 3 → ℚ} {α θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotR ↑↑α) ((rotM ↑↑θ ↑↑φ) P)) (toR2 w) -
            ↑((RationalApprox.rotRℚ ↑α) ((RationalApprox.rotMℚ ↑θ ↑φ) P_) ⬝ᵥ w)‖ ≤
        4 * RationalApprox.κ {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {α↑(Set.Icc (-4) 4) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α↑(Set.Icc (-4) 4)) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3))) (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotRℚRationalApprox.rotRℚ (α : ℚ) : (Fin 2 → ℚ) →ₗ[ℚ] Fin 2 → ℚ α↑(Set.Icc (-4) 4)) ((RationalApprox.rotMℚRationalApprox.rotMℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) P_Fin 3 → ℚ) ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        4 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.bounds_kappa_RMRationalApprox.bounds_kappa_RM {P : Euc(3)} {P_ : Fin 3 → ℚ} {α θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotR ↑↑α) ((rotM ↑↑θ ↑↑φ) P)) (toR2 w) -
            ↑((RationalApprox.rotRℚ ↑α) ((RationalApprox.rotMℚ ↑θ ↑φ) P_) ⬝ᵥ w)‖ ≤
        4 * RationalApprox.κ
      {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {α↑(Set.Icc (-4) 4) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)}
      {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α↑(Set.Icc (-4) 4)) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)))
              (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotRℚRationalApprox.rotRℚ (α : ℚ) : (Fin 2 → ℚ) →ₗ[ℚ] Fin 2 → ℚ α↑(Set.Icc (-4) 4))
                  ((RationalApprox.rotMℚRationalApprox.rotMℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4)
                      φ↑(Set.Icc (-4) 4))
                    P_Fin 3 → ℚ) ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        4 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.bounds_kappa_R'MRationalApprox.bounds_kappa_R'M {P : Euc(3)} {P_ : Fin 3 → ℚ} {α θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotR' ↑↑α) ((rotM ↑↑θ ↑↑φ) P)) (toR2 w) -
            ↑((RationalApprox.rotR'ℚ ↑α) ((RationalApprox.rotMℚ ↑θ ↑φ) P_) ⬝ᵥ w)‖ ≤
        4 * RationalApprox.κ {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {α↑(Set.Icc (-4) 4) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotR'rotR' (α : ℝ) : Euc(2) →L[ℝ] Euc(2) α↑(Set.Icc (-4) 4)) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3))) (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotR'ℚRationalApprox.rotR'ℚ (α : ℚ) : (Fin 2 → ℚ) →ₗ[ℚ] Fin 2 → ℚ α↑(Set.Icc (-4) 4))
                  ((RationalApprox.rotMℚRationalApprox.rotMℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) P_Fin 3 → ℚ) ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        4 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.bounds_kappa_R'MRationalApprox.bounds_kappa_R'M {P : Euc(3)} {P_ : Fin 3 → ℚ} {α θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotR' ↑↑α) ((rotM ↑↑θ ↑↑φ) P)) (toR2 w) -
            ↑((RationalApprox.rotR'ℚ ↑α) ((RationalApprox.rotMℚ ↑θ ↑φ) P_) ⬝ᵥ w)‖ ≤
        4 * RationalApprox.κ
      {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {α↑(Set.Icc (-4) 4) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)}
      {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. 
              ((rotR'rotR' (α : ℝ) : Euc(2) →L[ℝ] Euc(2) α↑(Set.Icc (-4) 4)) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)))
              (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotR'ℚRationalApprox.rotR'ℚ (α : ℚ) : (Fin 2 → ℚ) →ₗ[ℚ] Fin 2 → ℚ α↑(Set.Icc (-4) 4))
                  ((RationalApprox.rotMℚRationalApprox.rotMℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4)
                      φ↑(Set.Icc (-4) 4))
                    P_Fin 3 → ℚ) ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        4 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.bounds_kappa_RMθRationalApprox.bounds_kappa_RMθ {P : Euc(3)} {P_ : Fin 3 → ℚ} {α θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotR ↑↑α) ((rotMθ ↑↑θ ↑↑φ) P)) (toR2 w) -
            ↑((RationalApprox.rotRℚ ↑α) ((RationalApprox.rotMθℚ ↑θ ↑φ) P_) ⬝ᵥ w)‖ ≤
        4 * RationalApprox.κ {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {α↑(Set.Icc (-4) 4) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α↑(Set.Icc (-4) 4)) ((rotMθrotMθ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3))) (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotRℚRationalApprox.rotRℚ (α : ℚ) : (Fin 2 → ℚ) →ₗ[ℚ] Fin 2 → ℚ α↑(Set.Icc (-4) 4))
                  ((RationalApprox.rotMθℚRationalApprox.rotMθℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) P_Fin 3 → ℚ) ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        4 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.bounds_kappa_RMθRationalApprox.bounds_kappa_RMθ {P : Euc(3)} {P_ : Fin 3 → ℚ} {α θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotR ↑↑α) ((rotMθ ↑↑θ ↑↑φ) P)) (toR2 w) -
            ↑((RationalApprox.rotRℚ ↑α) ((RationalApprox.rotMθℚ ↑θ ↑φ) P_) ⬝ᵥ w)‖ ≤
        4 * RationalApprox.κ
      {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {α↑(Set.Icc (-4) 4) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)}
      {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. 
              ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α↑(Set.Icc (-4) 4)) ((rotMθrotMθ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)))
              (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotRℚRationalApprox.rotRℚ (α : ℚ) : (Fin 2 → ℚ) →ₗ[ℚ] Fin 2 → ℚ α↑(Set.Icc (-4) 4))
                  ((RationalApprox.rotMθℚRationalApprox.rotMθℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4)
                      φ↑(Set.Icc (-4) 4))
                    P_Fin 3 → ℚ) ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        4 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.bounds_kappa_RMφRationalApprox.bounds_kappa_RMφ {P : Euc(3)} {P_ : Fin 3 → ℚ} {α θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotR ↑↑α) ((rotMφ ↑↑θ ↑↑φ) P)) (toR2 w) -
            ↑((RationalApprox.rotRℚ ↑α) ((RationalApprox.rotMφℚ ↑θ ↑φ) P_) ⬝ᵥ w)‖ ≤
        4 * RationalApprox.κ {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {α↑(Set.Icc (-4) 4) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α↑(Set.Icc (-4) 4)) ((rotMφrotMφ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3))) (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotRℚRationalApprox.rotRℚ (α : ℚ) : (Fin 2 → ℚ) →ₗ[ℚ] Fin 2 → ℚ α↑(Set.Icc (-4) 4))
                  ((RationalApprox.rotMφℚRationalApprox.rotMφℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) P_Fin 3 → ℚ) ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        4 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.bounds_kappa_RMφRationalApprox.bounds_kappa_RMφ {P : Euc(3)} {P_ : Fin 3 → ℚ} {α θ φ : ↑(Set.Icc (-4) 4)} {w : Fin 2 → ℚ} (hP : ‖P‖ ≤ 1)
      (approx : ‖P - toR3 P_‖ ≤ RationalApprox.κ) (hw : ‖toR2 w‖ = 1) :
      ‖inner ℝ ((rotR ↑↑α) ((rotMφ ↑↑θ ↑↑φ) P)) (toR2 w) -
            ↑((RationalApprox.rotRℚ ↑α) ((RationalApprox.rotMφℚ ↑θ ↑φ) P_) ⬝ᵥ w)‖ ≤
        4 * RationalApprox.κ
      {PEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {P_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    }
      {α↑(Set.Icc (-4) 4) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)}
      {wFin 2 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     2  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (approx‖P - toR3 P_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (hw‖toR2 w‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. 
              ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α↑(Set.Icc (-4) 4)) ((rotMφrotMφ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)))
              (toR2toR2 (v : Fin 2 → ℚ) : Euc(2)Cast a `Fin 2 → ℚ` to an `ℝ²` point.  wFin 2 → ℚ) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            (dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. (RationalApprox.rotRℚRationalApprox.rotRℚ (α : ℚ) : (Fin 2 → ℚ) →ₗ[ℚ] Fin 2 → ℚ α↑(Set.Icc (-4) 4))
                  ((RationalApprox.rotMφℚRationalApprox.rotMφℚ (θ φ : ℚ) : (Fin 3 → ℚ) →ₗ[ℚ] Fin 2 → ℚ θ↑(Set.Icc (-4) 4)
                      φ↑(Set.Icc (-4) 4))
                    P_Fin 3 → ℚ) ⬝ᵥdotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. 
                wFin 2 → ℚ)dotProduct.{v, u_2} {m : Type u_2} {α : Type v} [Fintype m] [Mul α] [AddCommMonoid α] (v w : m → α) : α`dotProduct v w` is the sum of the entrywise products `v i * w i`.
    
    See also `dotProductEquiv`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        4 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
Proof

Using Lemma 7.7 and Corollary 7.6. See polyhedron.without.rupert, Lemma 44.

Theorem7.9
L∃∀Nused by 1

Let \PPP be a pointsymmetric convex polyhedron with radius \rho =1 and \widetilde{\PPP} a \kappa-rational approximation. Let \widetilde{S} \in \widetilde{\PPP}. Further let \epsilon>0 and \thetab_1,\phib_1,\thetab_2,\phib_2,\alphab \in \Q \cap [-4,4]. Let w\in\Q^2 be a unit vector. Denote \Mib \coloneqq M_{\Q}(\thetab_1, \phib_1), \Miib \coloneqq M_{\Q}(\thetab_2, \phib_2) as well as \Mib^{\theta} \coloneqq M_{\Q}^\theta(\thetab_1, \phib_1), \Mib^{\phi} \coloneqq M_{\Q}^\phi(\thetab_1, \phib_1) and analogously for \Miib^{\theta}, \Miib^{\phi}. Finally set

\begin{align*} G^{\Q}& \coloneqq \langle R_{\Q}(\alphab) \Mib \widetilde{S},w \rangle - \epsilon\cdot\big(|\langle R_{\Q}'(\alphab) \Mib \widetilde{S},w \rangle|+|\langle R_{\Q}(\alphab) \Mib^\theta \widetilde{S},w \rangle|+|\langle R_{\Q}(\alphab) \Mib^\phi \widetilde{S},w \rangle|\big) \\ & \hspace{11cm}- 9\epsilon^2/2 - 4\kappa ( 1 + 3 \epsilon),\\ H^{\Q}_P & \coloneqq \langle \Miib P,w \rangle + \epsilon\cdot\big(|\langle \Miib^\theta P,w \rangle|+|\langle \Miib^\varphi P,w \rangle|\big) + 2\epsilon^2 + 3\kappa( 1+2\epsilon). \end{align*} $$

If G^{\Q}>\max_{P\in \widetilde{\PPP}} H^{\Q}_P then there does not exist a solution to Rupert's condition to \PPP with

(\theta_1,\varphi_1,\theta_2,\varphi_2,\alpha) \in [\thetab_1\pm\epsilon,\phib_1\pm\epsilon,\thetab_2\pm\epsilon,\phib_2\pm\epsilon,\alphab\pm\epsilon]. $$

Lean code for Theorem7.91 theorem
  • theorem RationalApprox.GlobalTheorem.rational_globalRationalApprox.GlobalTheorem.rational_global {ι : Type} [Fintype ι] [Nonempty ι] (p : Pose ℚ) (ε : ℚ) (hε : 0 ≤ ε)
      (poly : GoodPoly ι) (poly_ : Polyhedron ι (Fin 3 → ℚ)) (happrox : RationalApprox.κApproxPoly poly.vertices poly_)
      (pc : RationalApprox.GlobalTheorem.RationalGlobalTheoremPrecondition poly poly_ happrox p ε) :
      ¬∃ q ∈ Metric.closedBall p.toReal ↑ε, RupertPose q poly.hull[SY25] Theorem 43
     {ιType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only
    finitely many distinct elements of type `α`. The evidence of this
    is a finset `elems` (a list up to permutation without duplicates),
    together with a proof that everything of type `α` is in the list.  ιType]
      [NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type,
    that is, there exists an element in the type. It differs from `Inhabited α`
    in that `Nonempty α` is a `Prop`, which means that it does not actually carry
    an element of `α`, only a proof that *there exists* such an element.
    Given `Nonempty α`, you can construct an element of `α` *nonconstructively*
    using `Classical.choice`.
     ιType] (pPose ℚ : PosePose (R : Type) : Type Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ) (ε : Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ) (0 ≤ ε : 0 LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. ε) (polyGoodPoly ι : GoodPolyGoodPoly (ι : Type) [Fintype ι] [Nonempty ι] : Type ιType)
      (poly_Polyhedron ι (Fin 3 → ℚ) : PolyhedronPolyhedron (ι X : Type) : TypeA convex polyhedron, given as a finite indexed set of vertices.  ιType (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ))
      (happroxRationalApprox.κApproxPoly poly.vertices poly_ : RationalApprox.κApproxPolyRationalApprox.κApproxPoly {ι₁ ι₂ : Type} [Fintype ι₁] [Fintype ι₂] (A : Polyhedron ι₁ Euc(3))
      (B : Polyhedron ι₂ (Fin 3 → ℚ)) : TypeA real polyhedron A and a rational polyhedron B that is a κ-approximation of A.
     polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3) poly_Polyhedron ι (Fin 3 → ℚ))
      (pcRationalApprox.GlobalTheorem.RationalGlobalTheoremPrecondition poly poly_ happrox p ε :
        RationalApprox.GlobalTheorem.RationalGlobalTheoremPreconditionRationalApprox.GlobalTheorem.RationalGlobalTheoremPrecondition {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι)
      (poly_ : Polyhedron ι (Fin 3 → ℚ)) (happrox : RationalApprox.κApproxPoly poly.vertices poly_) (p : Pose ℚ) (ε : ℚ) :
      TypeA compact way of saying "the pose satisfies the rational global theorem precondition at width ε".
    We require the existence of some inner-shadow vertex S from the polyhedron, and a covector w meant to express
    the direction we're projecting ℝ² → ℝ to find that S "sticks out too far" compared to all the
    other outer-shadow vertices P (which the calculation of H iterates over) in the polygon that lies in ℝ².
     polyGoodPoly ι
          poly_Polyhedron ι (Fin 3 → ℚ) happroxRationalApprox.κApproxPoly poly.vertices poly_ pPose ℚ ε) :
      ¬Not (a : Prop) : Prop`Not p`, or `¬p`, is the negation of `p`. It is defined to be `p → False`,
    so if your goal is `¬p` you can use `intro h` to turn the goal into
    `h : p ⊢ False`, and if you have `hn : ¬p` and `h : p` then `hn h : False`
    and `(hn h).elim` will prove anything.
    For more information: [Propositional Logic](https://lean-lang.org/theorem_proving_in_lean4/propositions_and_proofs.html#propositional-logic)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `¬` in identifiers is `not`. qPose ℝ  Metric.closedBallMetric.closedBall.{u} {α : Type u} [PseudoMetricSpace α] (x : α) (ε : ℝ) : Set α`closedBall x ε` is the set of all points `y` with `dist y x ≤ ε`  pPose ℚ.toRealPose.toReal (p : Pose ℚ) : Pose ℝView a `Pose ℚ` as a `Pose ℝ` by `Rat.cast`-ing each component.  ε, RupertPoseRupertPose {P : Type} [PoseLike P] (p : P) (s : Set Euc(3)) : PropA pose `p` demonstrates that a set `s` is rupert if the closure of the
    `p`-inner-shadow of `s` is a subset of the interior of the
    `p`-outer-shadow of `s`.
     qPose ℝ polyGoodPoly ι.hullGoodPoly.hull {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) : Set Euc(3)
    theorem RationalApprox.GlobalTheorem.rational_globalRationalApprox.GlobalTheorem.rational_global {ι : Type} [Fintype ι] [Nonempty ι] (p : Pose ℚ) (ε : ℚ) (hε : 0 ≤ ε)
      (poly : GoodPoly ι) (poly_ : Polyhedron ι (Fin 3 → ℚ)) (happrox : RationalApprox.κApproxPoly poly.vertices poly_)
      (pc : RationalApprox.GlobalTheorem.RationalGlobalTheoremPrecondition poly poly_ happrox p ε) :
      ¬∃ q ∈ Metric.closedBall p.toReal ↑ε, RupertPose q poly.hull[SY25] Theorem 43
    
      {ιType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only
    finitely many distinct elements of type `α`. The evidence of this
    is a finset `elems` (a list up to permutation without duplicates),
    together with a proof that everything of type `α` is in the list.  ιType] [NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type,
    that is, there exists an element in the type. It differs from `Inhabited α`
    in that `Nonempty α` is a `Prop`, which means that it does not actually carry
    an element of `α`, only a proof that *there exists* such an element.
    Given `Nonempty α`, you can construct an element of `α` *nonconstructively*
    using `Classical.choice`.
     ιType]
      (pPose ℚ : PosePose (R : Type) : Type Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ) (ε : Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ) (0 ≤ ε : 0 LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. ε)
      (polyGoodPoly ι : GoodPolyGoodPoly (ι : Type) [Fintype ι] [Nonempty ι] : Type ιType)
      (poly_Polyhedron ι (Fin 3 → ℚ) : PolyhedronPolyhedron (ι X : Type) : TypeA convex polyhedron, given as a finite indexed set of vertices.  ιType (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ))
      (happroxRationalApprox.κApproxPoly poly.vertices poly_ :
        RationalApprox.κApproxPolyRationalApprox.κApproxPoly {ι₁ ι₂ : Type} [Fintype ι₁] [Fintype ι₂] (A : Polyhedron ι₁ Euc(3))
      (B : Polyhedron ι₂ (Fin 3 → ℚ)) : TypeA real polyhedron A and a rational polyhedron B that is a κ-approximation of A.
    
          polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3) poly_Polyhedron ι (Fin 3 → ℚ))
      (pcRationalApprox.GlobalTheorem.RationalGlobalTheoremPrecondition poly poly_ happrox p ε :
        RationalApprox.GlobalTheorem.RationalGlobalTheoremPreconditionRationalApprox.GlobalTheorem.RationalGlobalTheoremPrecondition {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι)
      (poly_ : Polyhedron ι (Fin 3 → ℚ)) (happrox : RationalApprox.κApproxPoly poly.vertices poly_) (p : Pose ℚ) (ε : ℚ) :
      TypeA compact way of saying "the pose satisfies the rational global theorem precondition at width ε".
    We require the existence of some inner-shadow vertex S from the polyhedron, and a covector w meant to express
    the direction we're projecting ℝ² → ℝ to find that S "sticks out too far" compared to all the
    other outer-shadow vertices P (which the calculation of H iterates over) in the polygon that lies in ℝ².
    
          polyGoodPoly ι poly_Polyhedron ι (Fin 3 → ℚ) happroxRationalApprox.κApproxPoly poly.vertices poly_ pPose ℚ ε) :
      ¬Not (a : Prop) : Prop`Not p`, or `¬p`, is the negation of `p`. It is defined to be `p → False`,
    so if your goal is `¬p` you can use `intro h` to turn the goal into
    `h : p ⊢ False`, and if you have `hn : ¬p` and `h : p` then `hn h : False`
    and `(hn h).elim` will prove anything.
    For more information: [Propositional Logic](https://lean-lang.org/theorem_proving_in_lean4/propositions_and_proofs.html#propositional-logic)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `¬` in identifiers is `not`. qPose ℝ  Metric.closedBallMetric.closedBall.{u} {α : Type u} [PseudoMetricSpace α] (x : α) (ε : ℝ) : Set α`closedBall x ε` is the set of all points `y` with `dist y x ≤ ε`  pPose ℚ.toRealPose.toReal (p : Pose ℚ) : Pose ℝView a `Pose ℚ` as a `Pose ℝ` by `Rat.cast`-ing each component.  ε,
          RupertPoseRupertPose {P : Type} [PoseLike P] (p : P) (s : Set Euc(3)) : PropA pose `p` demonstrates that a set `s` is rupert if the closure of the
    `p`-inner-shadow of `s` is a subset of the interior of the
    `p`-outer-shadow of `s`.
     qPose ℝ polyGoodPoly ι.hullGoodPoly.hull {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) : Set Euc(3)
    [SY25] Theorem 43
    
Definition7.10
Group: Local theorem approximation bounds. (4)
Hover another entry in this group to preview it.
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Lemma 7.11
Loading preview
Hover a use site to preview it.

Let \theta, \phi \in \Q \cap [-4,4] and M_{\Q} \coloneqq M_{\Q}(\theta, \phi). Three points \widetilde{P}_1, \widetilde{P}_2, \widetilde{P}_3 \in \Q^3 with \|\widetilde{P}_1\|, \|\widetilde{P}_2\|, \|\widetilde{P}_3\| \leq 1+\kappa are called \epsilon-\kappa-spanning for (\theta, \phi) if it holds that:

\begin{align*} \langle R(\pi/2) M_{\Q} \widetilde{P}_1,M_{\Q} \widetilde{P}_{2}\rangle > 2 \epsilon(\sqrt{2} + \epsilon) + 6\kappa,\\ \langle R(\pi/2) M_{\Q} \widetilde{P}_2,M_{\Q} \widetilde{P}_{3}\rangle > 2 \epsilon(\sqrt{2} + \epsilon) + 6\kappa,\\ \langle R(\pi/2) M_{\Q} \widetilde{P}_3,M_{\Q} \widetilde{P}_{1}\rangle > 2 \epsilon(\sqrt{2} + \epsilon) + 6\kappa. \end{align*} $$

Lean code for Definition7.101 definition
  • complete
    structure Local.Triangle.κSpanningLocal.Triangle.κSpanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 45. Note that the "+ 1" at the type Fin 3 wraps.
    We don't include in this definition the constraint that θ, φ ∈ [-4, 4] or
    that ‖P₁‖, ‖P₂‖, ‖P₃‖ ≤ 1 + κ.
    If a user of this code wants to impose those, they'll have to separately.  (PLocal.Triangle : Local.TriangleLocal.Triangle : Type) (θ φ ε : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) : PropThe universe of propositions. `Prop ≡ Sort 0`.
    
    Every proposition is propositionally equal to either `True` or `False`. 
    structure Local.Triangle.κSpanningLocal.Triangle.κSpanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 45. Note that the "+ 1" at the type Fin 3 wraps.
    We don't include in this definition the constraint that θ, φ ∈ [-4, 4] or
    that ‖P₁‖, ‖P₂‖, ‖P₃‖ ≤ 1 + κ.
    If a user of this code wants to impose those, they'll have to separately. 
      (PLocal.Triangle : Local.TriangleLocal.Triangle : Type) (θ φ ε : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) : PropThe universe of propositions. `Prop ≡ Sort 0`.
    
    Every proposition is propositionally equal to either `True` or `False`. 
    [SY25] Definition 45. Note that the "+ 1" at the type Fin 3 wraps.
    We don't include in this definition the constraint that θ, φ ∈ [-4, 4] or
    that ‖P₁‖, ‖P₂‖, ‖P₃‖ ≤ 1 + κ.
    If a user of this code wants to impose those, they'll have to separately. 

    Fields

    pos0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε
    lt∀ (i : Fin 3),
      2 * ε * (√2 + ε) + 6 * RationalApprox.κ <
        inner ℝ ((rotR (Real.pi / 2)) ((RationalApprox.rotMℚℝ θ φ) (P i))) ((RationalApprox.rotMℚℝ θ φ) (P (i + 1))) :  (iFin 3 : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3),
      2 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. ε *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.Real.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. ε)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. 6 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`.
        innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) (HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`.Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened.  /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. 2)HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`.) ((RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) (PLocal.Triangle iFin 3))) ((RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) (PLocal.Triangle (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.iFin 3 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. 1)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.))
Lemma7.11
Group: Local theorem approximation bounds. (4)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Using Definition 7.10.

Let P_1, P_2, P_3 \in \R^3 with \|P_i\| \leq 1 and \widetilde{P}_1, \widetilde{P}_2, \widetilde{P}_3 \in \Q^3 be their \kappa-rational approximations. Assume that \widetilde{P}_1, \widetilde{P}_2, \widetilde{P}_3 are \epsilon-\kappa-spanning for some \theta, \phi \in \Q \cap [-4,4], then P_1, P_2, P_3 are \epsilon-spanning for \theta, \phi.

Lean code for Lemma7.111 theorem
  • theorem RationalApprox.ek_spanning_imp_e_spanningRationalApprox.ek_spanning_imp_e_spanning (P P' : Local.Triangle) (hk : RationalApprox.κApproxTri P P')
      (hP : ∀ (i : Fin 3), ‖P i‖ ≤ 1) {θ φ ε : ℝ} (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4)
      (hspan : P'.κSpanning θ φ ε) : P.Spanning θ φ ε (PLocal.Triangle P'Local.Triangle : Local.TriangleLocal.Triangle : Type)
      (hkRationalApprox.κApproxTri P P' : RationalApprox.κApproxTriRationalApprox.κApproxTri (A A' : Local.Triangle) : Prop PLocal.Triangle P'Local.Triangle) (hP∀ (i : Fin 3), ‖P i‖ ≤ 1 :  (iFin 3 : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3), Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PLocal.Triangle iFin 3Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      {θ φ ε : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (hspanP'.κSpanning θ φ ε : P'Local.Triangle.κSpanningLocal.Triangle.κSpanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 45. Note that the "+ 1" at the type Fin 3 wraps.
    We don't include in this definition the constraint that θ, φ ∈ [-4, 4] or
    that ‖P₁‖, ‖P₂‖, ‖P₃‖ ≤ 1 + κ.
    If a user of this code wants to impose those, they'll have to separately.  θ φ ε) : PLocal.Triangle.SpanningLocal.Triangle.Spanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps.  θ φ ε
    theorem RationalApprox.ek_spanning_imp_e_spanningRationalApprox.ek_spanning_imp_e_spanning (P P' : Local.Triangle) (hk : RationalApprox.κApproxTri P P')
      (hP : ∀ (i : Fin 3), ‖P i‖ ≤ 1) {θ φ ε : ℝ} (hθ : θ ∈ Set.Icc (-4) 4) (hφ : φ ∈ Set.Icc (-4) 4)
      (hspan : P'.κSpanning θ φ ε) : P.Spanning θ φ ε
      (PLocal.Triangle P'Local.Triangle : Local.TriangleLocal.Triangle : Type)
      (hkRationalApprox.κApproxTri P P' : RationalApprox.κApproxTriRationalApprox.κApproxTri (A A' : Local.Triangle) : Prop PLocal.Triangle P'Local.Triangle)
      (hP∀ (i : Fin 3), ‖P i‖ ≤ 1 :  (iFin 3 : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3), Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PLocal.Triangle iFin 3Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      {θ φ ε : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } (θ ∈ Set.Icc (-4) 4 : θ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (φ ∈ Set.Icc (-4) 4 : φ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (hspanP'.κSpanning θ φ ε : P'Local.Triangle.κSpanningLocal.Triangle.κSpanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 45. Note that the "+ 1" at the type Fin 3 wraps.
    We don't include in this definition the constraint that θ, φ ∈ [-4, 4] or
    that ‖P₁‖, ‖P₂‖, ‖P₃‖ ≤ 1 + κ.
    If a user of this code wants to impose those, they'll have to separately.  θ φ ε) :
      PLocal.Triangle.SpanningLocal.Triangle.Spanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps.  θ φ ε
Proof

Using Lemma 7.7, Lemma 6.8, and Corollary 7.6. See polyhedron.without.rupert, Lemma 46.

Lemma7.12
Group: Local theorem approximation bounds. (4)
Hover another entry in this group to preview it.
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Corollary 7.14
Loading preview
Hover a use site to preview it.

Let P,Q \in \mathbb{R}^3 with \|P\|,\|Q\|\leq 1, and let \widetilde{P},\widetilde{Q} be \kappa-approximations. Then, for parameters in [-4,4],

  • |\langle X, P \rangle - \langle X_{\mathbb{Q}}, \widetilde{P} \rangle| \leq 3\kappa

  • |\langle MP, MQ \rangle - \langle M_{\mathbb{Q}}\widetilde{P}, M_{\mathbb{Q}}\widetilde{Q} \rangle| \leq 5\kappa

  • |\| M Q \| - \| M_{\mathbb{Q}}\widetilde{Q} \| | \leq 3\kappa

Lean code for Lemma7.123 theorems
  • theorem RationalApprox.bounds_kappa3_XRationalApprox.bounds_kappa3_X {P P_ : Euc(3)} {θ φ : ↑(Set.Icc (-4) 4)} (hP : ‖P‖ ≤ 1)
      (Papprox : ‖P - P_‖ ≤ RationalApprox.κ) :
      ‖inner ℝ (vecX ↑θ ↑φ) P - inner ℝ (RationalApprox.vecXℚℝ ↑θ ↑φ) P_‖ ≤ 3 * RationalApprox.κ {PEuc(3) P_Euc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. } {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)}
      (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1) (Papprox‖P - P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). P_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (vecXvecX (θ φ : ℝ) : Euc(3) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (RationalApprox.vecXℚℝRationalApprox.vecXℚℝ (θ φ : ℝ) : Euc(3) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) P_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        3 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.bounds_kappa3_XRationalApprox.bounds_kappa3_X {P P_ : Euc(3)} {θ φ : ↑(Set.Icc (-4) 4)} (hP : ‖P‖ ≤ 1)
      (Papprox : ‖P - P_‖ ≤ RationalApprox.κ) :
      ‖inner ℝ (vecX ↑θ ↑φ) P - inner ℝ (RationalApprox.vecXℚℝ ↑θ ↑φ) P_‖ ≤ 3 * RationalApprox.κ
      {PEuc(3) P_Euc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (Papprox‖P - P_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). P_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (vecXvecX (θ φ : ℝ) : Euc(3) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. 
              (RationalApprox.vecXℚℝRationalApprox.vecXℚℝ (θ φ : ℝ) : Euc(3) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4))
              P_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        3 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.bounds_kappa3_MRationalApprox.bounds_kappa3_M {P Q Q_ P_ : Euc(3)} {θ φ : ↑(Set.Icc (-4) 4)} (hP : ‖P‖ ≤ 1) (hQ : ‖Q‖ ≤ 1)
      (Papprox : ‖P - P_‖ ≤ RationalApprox.κ) (Qapprox : ‖Q - Q_‖ ≤ RationalApprox.κ) :
      ‖inner ℝ ((rotM ↑θ ↑φ) P) ((rotM ↑θ ↑φ) Q) -
            inner ℝ ((RationalApprox.rotMℚℝ ↑θ ↑φ) P_) ((RationalApprox.rotMℚℝ ↑θ ↑φ) Q_)‖ ≤
        5 * RationalApprox.κ {PEuc(3) QEuc(3) Q_Euc(3) P_Euc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1) (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (Papprox‖P - P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). P_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (Qapprox‖Q - Q_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). Q_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) QEuc(3)) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) P_Euc(3))
              ((RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) Q_Euc(3))Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        5 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.bounds_kappa3_MRationalApprox.bounds_kappa3_M {P Q Q_ P_ : Euc(3)} {θ φ : ↑(Set.Icc (-4) 4)} (hP : ‖P‖ ≤ 1) (hQ : ‖Q‖ ≤ 1)
      (Papprox : ‖P - P_‖ ≤ RationalApprox.κ) (Qapprox : ‖Q - Q_‖ ≤ RationalApprox.κ) :
      ‖inner ℝ ((rotM ↑θ ↑φ) P) ((rotM ↑θ ↑φ) Q) -
            inner ℝ ((RationalApprox.rotMℚℝ ↑θ ↑φ) P_) ((RationalApprox.rotMℚℝ ↑θ ↑φ) Q_)‖ ≤
        5 * RationalApprox.κ
      {PEuc(3) QEuc(3) Q_Euc(3) P_Euc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (Papprox‖P - P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). P_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (Qapprox‖Q - Q_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). Q_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3))
              ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) QEuc(3)) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. 
              ((RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4))
                P_Euc(3))
              ((RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4))
                Q_Euc(3))Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        5 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
  • theorem RationalApprox.bounds_kappa3_MQRationalApprox.bounds_kappa3_MQ {Q Q_ : Euc(3)} {θ φ : ↑(Set.Icc (-4) 4)} (hQ : ‖Q‖ ≤ 1)
      (Qapprox : ‖Q - Q_‖ ≤ RationalApprox.κ) :
      |‖(rotM ↑θ ↑φ) Q‖ - ‖(RationalApprox.rotMℚℝ ↑θ ↑φ) Q_‖| ≤ 3 * RationalApprox.κ {QEuc(3) Q_Euc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (Qapprox‖Q - Q_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). Q_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. (RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) Q_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        3 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.bounds_kappa3_MQRationalApprox.bounds_kappa3_MQ {Q Q_ : Euc(3)} {θ φ : ↑(Set.Icc (-4) 4)} (hQ : ‖Q‖ ≤ 1)
      (Qapprox : ‖Q - Q_‖ ≤ RationalApprox.κ) :
      |‖(rotM ↑θ ↑φ) Q‖ - ‖(RationalApprox.rotMℚℝ ↑θ ↑φ) Q_‖| ≤ 3 * RationalApprox.κ
      {QEuc(3) Q_Euc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. }
      {θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (Qapprox‖Q - Q_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). Q_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. (RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4))
                Q_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        3 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
Proof

Using Lemma 7.7. See polyhedron.without.rupert, Lemma 49.

Corollary7.13
Group: Local theorem approximation bounds. (4)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Let P, Q \in \R^3 with \|P\|, \|Q\| \leq 1 and \widetilde{Q} a \kappa-rational approximation of Q. Let \alpha, \theta, \phi, \thetab, \phib \in [-4,4] and set M = M(\theta, \phi), M_{\Q} = M_{\Q}(\theta, \phi), \overline{M} = M(\thetab, \phib), \overline{M}_{\Q} = M_{\Q}(\thetab, \phib). Then

\big|\|R(\alpha) M P - \overline{M} Q\|- \| R_{\Q}(\alpha) M_{\Q} P - \overline{M}_{\Q} \widetilde{Q}\| \big| \leq 6 \kappa

Note that the rational side uses P directly (not a rational approximation \widetilde{P}).

Lean code for Corollary7.131 theorem
  • complete
    theorem RationalApprox.delta_kappaRationalApprox.delta_kappa {P Q Q_ : Euc(3)} {α θ φ θ_ φ_ : ↑(Set.Icc (-4) 4)} (hP : ‖P‖ ≤ 1) (hQ : ‖Q‖ ≤ 1)
      (Qapprox : ‖Q - Q_‖ ≤ RationalApprox.κ) :
      |‖(rotR ↑α) ((rotM ↑θ ↑φ) P) - (rotM ↑θ_ ↑φ_) Q‖ -
            ‖(RationalApprox.rotRℚℝ ↑α) ((RationalApprox.rotMℚℝ ↑θ ↑φ) P) - (RationalApprox.rotMℚℝ ↑θ_ ↑φ_) Q_‖| ≤
        6 * RationalApprox.κ {PEuc(3) QEuc(3) Q_Euc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. }
      {α↑(Set.Icc (-4) 4) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) θ_↑(Set.Icc (-4) 4) φ_↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)} (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1) (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (Qapprox‖Q - Q_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). Q_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. (rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α↑(Set.Icc (-4) 4)) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ_↑(Set.Icc (-4) 4) φ_↑(Set.Icc (-4) 4)) QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. (RationalApprox.rotRℚℝRationalApprox.rotRℚℝ (α : ℝ) : Euc(2) →L[ℝ] Euc(2) α↑(Set.Icc (-4) 4)) ((RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
                (RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ_↑(Set.Icc (-4) 4) φ_↑(Set.Icc (-4) 4)) Q_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        6 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
    theorem RationalApprox.delta_kappaRationalApprox.delta_kappa {P Q Q_ : Euc(3)} {α θ φ θ_ φ_ : ↑(Set.Icc (-4) 4)} (hP : ‖P‖ ≤ 1) (hQ : ‖Q‖ ≤ 1)
      (Qapprox : ‖Q - Q_‖ ≤ RationalApprox.κ) :
      |‖(rotR ↑α) ((rotM ↑θ ↑φ) P) - (rotM ↑θ_ ↑φ_) Q‖ -
            ‖(RationalApprox.rotRℚℝ ↑α) ((RationalApprox.rotMℚℝ ↑θ ↑φ) P) - (RationalApprox.rotMℚℝ ↑θ_ ↑φ_) Q_‖| ≤
        6 * RationalApprox.κ
      {PEuc(3) QEuc(3) Q_Euc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. }
      {α↑(Set.Icc (-4) 4) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4) θ_↑(Set.Icc (-4) 4) φ_↑(Set.Icc (-4) 4) : (Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)}
      (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1) (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (Qapprox‖Q - Q_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). Q_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. (rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α↑(Set.Icc (-4) 4)) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4) φ↑(Set.Icc (-4) 4)) PEuc(3)) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
                (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ_↑(Set.Icc (-4) 4) φ_↑(Set.Icc (-4) 4)) QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. (RationalApprox.rotRℚℝRationalApprox.rotRℚℝ (α : ℝ) : Euc(2) →L[ℝ] Euc(2) α↑(Set.Icc (-4) 4))
                  ((RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ↑(Set.Icc (-4) 4)
                      φ↑(Set.Icc (-4) 4))
                    PEuc(3)) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
                (RationalApprox.rotMℚℝRationalApprox.rotMℚℝ (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ_↑(Set.Icc (-4) 4)
                    φ_↑(Set.Icc (-4) 4))
                  Q_Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        6 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. RationalApprox.κRationalApprox.κ : ℝ
Proof

Corollary 7.6 Lemma 3.1

See polyhedron.without.rupert, Corollary 50.

Corollary7.14
Group: Local theorem approximation bounds. (4)
Hover another entry in this group to preview it.
L∃∀Nused by 1

In the setting of Lemma 7.12, let \sqrt[+]{x} be an upper square-root function, i.e., \sqrt{x} \leq \sqrt[+]{x} for all real x \geq 0 with rational output on rational input. Set \|x\|_{+} \coloneqq \sqrt[+]{\|x\|^2}. Set

A = \frac{\langle M P, M(P-Q)\rangle - 2 \epsilon \|P-Q\| \cdot (\sqrt{2}+\varepsilon)}{ \big(\| M P\|+\sqrt{2} \varepsilon \big) \cdot \big(\|M(P-Q)\|+2 \sqrt{2} \varepsilon\big)} $$

as well as

A_{\Q} = \frac{\langle M_{\Q} \widetilde{P}, M_{\Q} (\widetilde{P}-\widetilde{Q})\rangle - 10\kappa - 2 \epsilon ( \|\widetilde{P}-\widetilde{Q}\| + 2 \kappa ) \cdot (\sqrt{2}+\varepsilon)}{ \big(\| M_{\Q} \widetilde{P}\|_{+}+\sqrt{2} \varepsilon + 3\kappa \big) \cdot \big(\|M_{\Q}(\widetilde{P}-\widetilde{Q})\|_{+}+2 \sqrt{2} \varepsilon + 6\kappa\big)}. $$

Assume that A \geq 0. Then A \geq A_{\mathbb{Q}}.

Lean code for Corollary7.141 theorem
  • theorem RationalApprox.bounds_kappa4RationalApprox.bounds_kappa4 (P Q : Euc(3)) (P_ Q_ : Fin 3 → ℚ) (p : Pose ℚ) (hθBound : ↑p.θ₂ ∈ Set.Icc (-4) 4)
      (hφBound : ↑p.φ₂ ∈ Set.Icc (-4) 4) (hP : ‖P‖ ≤ 1) (hQ : ‖Q‖ ≤ 1) (Papprox : ‖P - toR3 P_‖ ≤ RationalApprox.κ)
      (Qapprox : ‖Q - toR3 Q_‖ ≤ RationalApprox.κ) (ε : ℝ) (hε : 0 < ε) (s : RationalApprox.UpperSqrt)
      (hA_nonneg : 0 ≤ inner ℝ ((rotM ↑p.θ₂ ↑p.φ₂) P) ((rotM ↑p.θ₂ ↑p.φ₂) (P - Q)) - 2 * ε * ‖P - Q‖ * (√2 + ε)) :
      RationalApprox.bounds_kappa4_Aℚ P_ Q_ p ε s ≤ RationalApprox.bounds_kappa4_A P Q ⟨↑p.θ₂, hθBound⟩ ⟨↑p.φ₂, hφBound⟩ ε[SY25] Corollary 51  (PEuc(3) QEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. ) (P_Fin 3 → ℚ Q_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    )
      (pPose ℚ : PosePose (R : Type) : Type Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ) (hθBound↑p.θ₂ ∈ Set.Icc (-4) 4 : pPose ℚ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (hφBound↑p.φ₂ ∈ Set.Icc (-4) 4 : pPose ℚ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4) (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1) (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (Papprox‖P - toR3 P_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (Qapprox‖Q - toR3 Q_‖ ≤ RationalApprox.κ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  Q_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ) (ε : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε)
      (sRationalApprox.UpperSqrt : RationalApprox.UpperSqrtRationalApprox.UpperSqrt : Type)
      (hA_nonneg0 ≤ inner ℝ ((rotM ↑p.θ₂ ↑p.φ₂) P) ((rotM ↑p.θ₂ ↑p.φ₂) (P - Q)) - 2 * ε * ‖P - Q‖ * (√2 + ε) :
        0 LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
          innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) pPose ℚ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R pPose ℚ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R) PEuc(3)) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) pPose ℚ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R pPose ℚ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R) (HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). QEuc(3))HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            2 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. ε *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.Real.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. ε)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.) :
      RationalApprox.bounds_kappa4_AℚRationalApprox.bounds_kappa4_Aℚ (P_ Q_ : Fin 3 → ℚ) (p : Pose ℚ) (ε : ℝ) (s : RationalApprox.UpperSqrt) : ℝ P_Fin 3 → ℚ Q_Fin 3 → ℚ pPose ℚ ε sRationalApprox.UpperSqrt LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.bounds_kappa4_ARationalApprox.bounds_kappa4_A (P Q : Euc(3)) (θ φ : ↑(Set.Icc (-4) 4)) (ε : ℝ) : ℝ PEuc(3) QEuc(3) Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype ppPose ℚ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R,Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype p hθBound↑p.θ₂ ∈ Set.Icc (-4) 4Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype p Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype ppPose ℚ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R,Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype p hφBound↑p.φ₂ ∈ Set.Icc (-4) 4Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype p
          ε
    theorem RationalApprox.bounds_kappa4RationalApprox.bounds_kappa4 (P Q : Euc(3)) (P_ Q_ : Fin 3 → ℚ) (p : Pose ℚ) (hθBound : ↑p.θ₂ ∈ Set.Icc (-4) 4)
      (hφBound : ↑p.φ₂ ∈ Set.Icc (-4) 4) (hP : ‖P‖ ≤ 1) (hQ : ‖Q‖ ≤ 1) (Papprox : ‖P - toR3 P_‖ ≤ RationalApprox.κ)
      (Qapprox : ‖Q - toR3 Q_‖ ≤ RationalApprox.κ) (ε : ℝ) (hε : 0 < ε) (s : RationalApprox.UpperSqrt)
      (hA_nonneg : 0 ≤ inner ℝ ((rotM ↑p.θ₂ ↑p.φ₂) P) ((rotM ↑p.θ₂ ↑p.φ₂) (P - Q)) - 2 * ε * ‖P - Q‖ * (√2 + ε)) :
      RationalApprox.bounds_kappa4_Aℚ P_ Q_ p ε s ≤ RationalApprox.bounds_kappa4_A P Q ⟨↑p.θ₂, hθBound⟩ ⟨↑p.φ₂, hφBound⟩ ε[SY25] Corollary 51 
      (PEuc(3) QEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. ) (P_Fin 3 → ℚ Q_Fin 3 → ℚ : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    )
      (pPose ℚ : PosePose (R : Type) : Type Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    )
      (hθBound↑p.θ₂ ∈ Set.Icc (-4) 4 : pPose ℚ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (hφBound↑p.φ₂ ∈ Set.Icc (-4) 4 : pPose ℚ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IccSet.Icc.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Icc a b` is the left-closed right-closed interval $[a, b]$.  (-4) 4)
      (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1) (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1)
      (Papprox‖P - toR3 P_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  P_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (Qapprox‖Q - toR3 Q_‖ ≤ RationalApprox.κ :
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). toR3toR3 (v : Fin 3 → ℚ) : Euc(3)Cast a `Fin 3 → ℚ` to an `ℝ³` point.  Q_Fin 3 → ℚNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. RationalApprox.κRationalApprox.κ : ℝ)
      (ε : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε)
      (sRationalApprox.UpperSqrt : RationalApprox.UpperSqrtRationalApprox.UpperSqrt : Type)
      (hA_nonneg0 ≤ inner ℝ ((rotM ↑p.θ₂ ↑p.φ₂) P) ((rotM ↑p.θ₂ ↑p.φ₂) (P - Q)) - 2 * ε * ‖P - Q‖ * (√2 + ε) :
        0 LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
          innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) pPose ℚ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R pPose ℚ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R) PEuc(3))
              ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) pPose ℚ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R pPose ℚ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R) (HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). QEuc(3))HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).
            2 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. ε *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.Real.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. ε)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.) :
      RationalApprox.bounds_kappa4_AℚRationalApprox.bounds_kappa4_Aℚ (P_ Q_ : Fin 3 → ℚ) (p : Pose ℚ) (ε : ℝ) (s : RationalApprox.UpperSqrt) : ℝ P_Fin 3 → ℚ Q_Fin 3 → ℚ pPose ℚ
          ε sRationalApprox.UpperSqrt LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`.
        RationalApprox.bounds_kappa4_ARationalApprox.bounds_kappa4_A (P Q : Euc(3)) (θ φ : ↑(Set.Icc (-4) 4)) (ε : ℝ) : ℝ PEuc(3) QEuc(3)
          Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype ppPose ℚ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R,Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype p hθBound↑p.θ₂ ∈ Set.Icc (-4) 4Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype p Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype ppPose ℚ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R,Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype p hφBound↑p.φ₂ ∈ Set.Icc (-4) 4Subtype.mk.{u} {α : Sort u} {p : α → Prop} (val : α) (property : p val) : Subtype p ε
    [SY25] Corollary 51 
Proof

Lemma 7.12

See polyhedron.without.rupert, Corollary 51.

Theorem7.15
L∃∀Nused by 1

Definition 7.10

Let \PPP be a polyhedron with radius \rho=1 and \widetilde{P}_i be a \kappa-rational approximation of P_i \in \PPP. Set \widetilde{\PPP} = \{\widetilde{P}_i \text{ for } P_i \in \PPP \}. Let P_1, P_2, P_3, Q_1, Q_2, Q_3 \in \PPP be not necessarily distinct and assume that P_1, P_2, P_3 and Q_1, Q_2, Q_3 are congruent. Let \epsilon>0 and \thetab_1,\phib_1,\thetab_2,\phib_2,\alphab \in \Q \cap [-4,4]. Set \Xib \coloneqq X_{\Q}(\thetab_1,\phib_1), \Xiib \coloneqq X_{\Q}(\thetab_2,\phib_2) as well as \Mib \coloneqq M_{\Q}(\thetab_1,\phib_1), \Miib \coloneqq M_{\Q}(\thetab_2,\phib_2). Assume that there exist \sigma_P, \sigma_Q \in \{0,1\} such that

(-1)^{\sigma_P} \langle \Xib,\widetilde{P}_i\rangle>\sqrt{2}\varepsilon + 3\kappa \quad \text{and} \quad (-1)^{\sigma_Q} \langle \Xiib , \widetilde{Q}_i\rangle>\sqrt{2}\varepsilon + 3\kappa, $$

for all i=1,2,3. Moreover, assume that \widetilde{P}_1,\widetilde{P}_2,\widetilde{P}_3 are \epsilon-\kappa-spanning for (\thetab_1,\phib_1) and that \widetilde{Q}_1,\widetilde{Q}_2,\widetilde{Q}_3 are \epsilon-\kappa-spanning for (\thetab_2,\phib_2). Let \sqrt[+]{x} and \sqrt[-]{x} be upper- and lower-square-root functions, then set \|Z\|_{+} \coloneqq \sqrt[+]{\|Z\|^2} and \|Z\|_{-} \coloneqq \sqrt[-]{\|Z\|^2} for Z \in \R^n. Finally, assume that for all i = 1,2,3 and any \widetilde{Q}_j \in \widetilde{\PPP} \setminus \widetilde{Q}_i it holds that the rational inequality (B^{\Q}_\epsilon) from the paper is satisfied, for some r >0 such that \min_{i=1,2,3}\| \Miib \widetilde{Q}_i \|_{-} > r + \sqrt{2} \epsilon + 3\kappa and for some \delta \in \R with

\delta \geq \max_{i=1,2,3}\left\|R_{\Q}(\alphab) \Mib \widetilde{P}_i-\Miib \widetilde{Q}_i\right\|_{+}/2 + 3\kappa. $$

Then there exists no solution to Rupert's problem R(\alpha) M(\theta_1,\phi_1)\PPP \subset M(\theta_2,\phi_2)\PPP^\circ with

(\theta_1, \phi_1, \theta_2, \phi_2, \alpha) \in [\thetab_1\pm\epsilon,\phib_1\pm\epsilon,\thetab_2\pm\epsilon,\phib_2\pm\epsilon,\alphab\pm\epsilon] \subseteq \R^5. $$

Lean code for Theorem7.151 theorem
  • theorem RationalApprox.LocalTheorem.rational_localRationalApprox.LocalTheorem.rational_local {ι : Type} [Fintype ι] [DecidableEq ι] [Nonempty ι] (poly : GoodPoly ι)
      (poly_ : Polyhedron ι (Fin 3 → ℚ)) (hpoly : RationalApprox.κApproxPoly poly.vertices poly_) (Pi Qi : Fin 3 → ι)
      (cong_tri : Local.Triangle.Congruent (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi)) (p_ : Pose ℚ)
      (hp : p_ ∈ fourInterval ℚ) (ε δ r : ℚ) (hε : 0 < ε) (hr : 0 < r) (approx : RationalApprox.Approx)
      (hr₁ : RationalApprox.LocalTheorem.BoundRℚ r ε p_ (RationalApprox.κApproxPoly.transportTri Qi hpoly) approx)
      (hδ :
        RationalApprox.LocalTheorem.BoundDeltaℚ δ p_ (RationalApprox.κApproxPoly.transportTri Pi hpoly)
          (RationalApprox.κApproxPoly.transportTri Qi hpoly) approx)
      (ae₁ : Local.TriangleQ.Aεℚ p_.vecX₁ℚ (RationalApprox.κApproxPoly.transportTri Pi hpoly) ε approx)
      (ae₂ : Local.TriangleQ.Aεℚ p_.vecX₂ℚ (RationalApprox.κApproxPoly.transportTri Qi hpoly) ε approx)
      (span₁ : (RationalApprox.κApproxPoly.transportTri Pi hpoly).toReal.κSpanning ↑p_.θ₁ ↑p_.φ₁ ↑ε)
      (span₂ : (RationalApprox.κApproxPoly.transportTri Qi hpoly).toReal.κSpanning ↑p_.θ₂ ↑p_.φ₂ ↑ε)
      (be :
        (RationalApprox.κApproxPoly.transportTri Qi hpoly).Bεℚ Qi (fun k ↦ poly_.v (hpoly.bijection k)) p_ ε δ r approx) :
      ¬∃ p ∈ Metric.closedBall p_.toReal ↑ε, RupertPose p poly.hull[SY25] Theorem 48 "The Rational Local Theorem"
     {ιType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only
    finitely many distinct elements of type `α`. The evidence of this
    is a finset `elems` (a list up to permutation without duplicates),
    together with a proof that everything of type `α` is in the list.  ιType]
      [DecidableEqDecidableEq.{u} (α : Sort u) : Sort (max 1 u)Propositional equality is `Decidable` for all elements of a type.
    
    In other words, an instance of `DecidableEq α` is a means of deciding the proposition `a = b` is
    for all `a b : α`.
     ιType] [NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type,
    that is, there exists an element in the type. It differs from `Inhabited α`
    in that `Nonempty α` is a `Prop`, which means that it does not actually carry
    an element of `α`, only a proof that *there exists* such an element.
    Given `Nonempty α`, you can construct an element of `α` *nonconstructively*
    using `Classical.choice`.
     ιType] (polyGoodPoly ι : GoodPolyGoodPoly (ι : Type) [Fintype ι] [Nonempty ι] : Type ιType)
      (poly_Polyhedron ι (Fin 3 → ℚ) : PolyhedronPolyhedron (ι X : Type) : TypeA convex polyhedron, given as a finite indexed set of vertices.  ιType (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ))
      (hpolyRationalApprox.κApproxPoly poly.vertices poly_ : RationalApprox.κApproxPolyRationalApprox.κApproxPoly {ι₁ ι₂ : Type} [Fintype ι₁] [Fintype ι₂] (A : Polyhedron ι₁ Euc(3))
      (B : Polyhedron ι₂ (Fin 3 → ℚ)) : TypeA real polyhedron A and a rational polyhedron B that is a κ-approximation of A.
     polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3) poly_Polyhedron ι (Fin 3 → ℚ))
      (PiFin 3 → ι QiFin 3 → ι : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  ιType)
      (cong_triLocal.Triangle.Congruent (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi) :
        Local.Triangle.CongruentLocal.Triangle.Congruent (P Q : Local.Triangle) : Prop[SY25] Definition 34.
    We define "congruent" to mean "there exists a linear isometry". Note that this is
    stronger than "there exists an *affine* isometry", which might be the definition
    you usually think of.
     (Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`. PiFin 3 → ι)Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`.
          (Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`. QiFin 3 → ι)Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`.)
      (p_Pose ℚ : PosePose (R : Type) : Type Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ) (hpp_ ∈ fourInterval ℚ : p_Pose ℚ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. fourIntervalfourInterval (R : Type) [Field R] [LinearOrder R] [IsStrictOrderedRing R] : PoseInterval RThe `[-4, 4]^5` box, used to constrain poses for rational approximation reasoning.
    Polymorphic over the value type so the same name works at both `ℚ` and `ℝ`.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ) (ε δ r : Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ) (0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε)
      (hr0 < r : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. r) (approxRationalApprox.Approx : RationalApprox.ApproxRationalApprox.Approx : Type)
      (hr₁RationalApprox.LocalTheorem.BoundRℚ r ε p_ (RationalApprox.κApproxPoly.transportTri Qi hpoly) approx :
        RationalApprox.LocalTheorem.BoundRℚRationalApprox.LocalTheorem.BoundRℚ (r ε : ℚ) (p : Pose ℚ) (Q_ : Local.TriangleQ) (approx : RationalApprox.Approx) :
      PropThe condition on r  r ε p_Pose ℚ
          (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
     QiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_) approxRationalApprox.Approx)
      (RationalApprox.LocalTheorem.BoundDeltaℚ δ p_ (RationalApprox.κApproxPoly.transportTri Pi hpoly)
      (RationalApprox.κApproxPoly.transportTri Qi hpoly) approx :
        RationalApprox.LocalTheorem.BoundDeltaℚRationalApprox.LocalTheorem.BoundDeltaℚ (δ : ℚ) (p : Pose ℚ) (P_ Q_ : Local.TriangleQ)
      (approx : RationalApprox.Approx) : PropThe condition on δ  δ p_Pose ℚ
          (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
     PiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_)
          (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
     QiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_) approxRationalApprox.Approx)
      (ae₁Local.TriangleQ.Aεℚ p_.vecX₁ℚ (RationalApprox.κApproxPoly.transportTri Pi hpoly) ε approx :
        Local.TriangleQ.AεℚLocal.TriangleQ.Aεℚ (X : Fin 3 → ℚ) (P_ : Local.TriangleQ) (ε : ℚ) (approx : RationalApprox.Approx) : PropCondition A_ε^ℚ from [SY25] Theorem 48
     p_Pose ℚ.vecX₁ℚPose.vecX₁ℚ (p : Pose ℚ) : Fin 3 → ℚ
          (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
     PiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_) ε approxRationalApprox.Approx)
      (ae₂Local.TriangleQ.Aεℚ p_.vecX₂ℚ (RationalApprox.κApproxPoly.transportTri Qi hpoly) ε approx :
        Local.TriangleQ.AεℚLocal.TriangleQ.Aεℚ (X : Fin 3 → ℚ) (P_ : Local.TriangleQ) (ε : ℚ) (approx : RationalApprox.Approx) : PropCondition A_ε^ℚ from [SY25] Theorem 48
     p_Pose ℚ.vecX₂ℚPose.vecX₂ℚ (p : Pose ℚ) : Fin 3 → ℚ
          (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
     QiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_) ε approxRationalApprox.Approx)
      (span₁(RationalApprox.κApproxPoly.transportTri Pi hpoly).toReal.κSpanning ↑p_.θ₁ ↑p_.φ₁ ↑ε :
        (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
     PiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_).toRealLocal.TriangleQ.toReal (t : Local.TriangleQ) : Local.Triangle.κSpanningLocal.Triangle.κSpanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 45. Note that the "+ 1" at the type Fin 3 wraps.
    We don't include in this definition the constraint that θ, φ ∈ [-4, 4] or
    that ‖P₁‖, ‖P₂‖, ‖P₃‖ ≤ 1 + κ.
    If a user of this code wants to impose those, they'll have to separately. 
          p_Pose ℚ.θ₁Pose.θ₁ {R : Type} (self : Pose R) : R p_Pose ℚ.φ₁Pose.φ₁ {R : Type} (self : Pose R) : R ε)
      (span₂(RationalApprox.κApproxPoly.transportTri Qi hpoly).toReal.κSpanning ↑p_.θ₂ ↑p_.φ₂ ↑ε :
        (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
     QiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_).toRealLocal.TriangleQ.toReal (t : Local.TriangleQ) : Local.Triangle.κSpanningLocal.Triangle.κSpanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 45. Note that the "+ 1" at the type Fin 3 wraps.
    We don't include in this definition the constraint that θ, φ ∈ [-4, 4] or
    that ‖P₁‖, ‖P₂‖, ‖P₃‖ ≤ 1 + κ.
    If a user of this code wants to impose those, they'll have to separately. 
          p_Pose ℚ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R p_Pose ℚ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R ε)
      (be(RationalApprox.κApproxPoly.transportTri Qi hpoly).Bεℚ Qi (fun k ↦ poly_.v (hpoly.bijection k)) p_ ε δ r approx :
        (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
     QiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_).BεℚLocal.TriangleQ.Bεℚ {ι : Type} [Fintype ι] [DecidableEq ι] (Q_ : Local.TriangleQ) (Qi : Fin 3 → ι) (v_ : ι → Fin 3 → ℚ)
      (p : Pose ℚ) (ε δ r : ℚ) (approx : RationalApprox.Approx) : PropCondition B_ε^ℚ from [SY25] Theorem 48
     QiFin 3 → ι
          (fun kι  poly_Polyhedron ι (Fin 3 → ℚ).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X (hpolyRationalApprox.κApproxPoly poly.vertices poly_.bijectionRationalApprox.κApproxPoly.bijection {ι₁ ι₂ : Type} [Fintype ι₁] [Fintype ι₂] {A : Polyhedron ι₁ Euc(3)}
      {B : Polyhedron ι₂ (Fin 3 → ℚ)} (self : RationalApprox.κApproxPoly A B) : ι₁ ≃ ι₂ kι)) p_Pose ℚ ε δ r approxRationalApprox.Approx) :
      ¬Not (a : Prop) : Prop`Not p`, or `¬p`, is the negation of `p`. It is defined to be `p → False`,
    so if your goal is `¬p` you can use `intro h` to turn the goal into
    `h : p ⊢ False`, and if you have `hn : ¬p` and `h : p` then `hn h : False`
    and `(hn h).elim` will prove anything.
    For more information: [Propositional Logic](https://lean-lang.org/theorem_proving_in_lean4/propositions_and_proofs.html#propositional-logic)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `¬` in identifiers is `not`. pPose ℝ  Metric.closedBallMetric.closedBall.{u} {α : Type u} [PseudoMetricSpace α] (x : α) (ε : ℝ) : Set α`closedBall x ε` is the set of all points `y` with `dist y x ≤ ε`  p_Pose ℚ.toRealPose.toReal (p : Pose ℚ) : Pose ℝView a `Pose ℚ` as a `Pose ℝ` by `Rat.cast`-ing each component.  ε, RupertPoseRupertPose {P : Type} [PoseLike P] (p : P) (s : Set Euc(3)) : PropA pose `p` demonstrates that a set `s` is rupert if the closure of the
    `p`-inner-shadow of `s` is a subset of the interior of the
    `p`-outer-shadow of `s`.
     pPose ℝ polyGoodPoly ι.hullGoodPoly.hull {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) : Set Euc(3)
    theorem RationalApprox.LocalTheorem.rational_localRationalApprox.LocalTheorem.rational_local {ι : Type} [Fintype ι] [DecidableEq ι] [Nonempty ι] (poly : GoodPoly ι)
      (poly_ : Polyhedron ι (Fin 3 → ℚ)) (hpoly : RationalApprox.κApproxPoly poly.vertices poly_) (Pi Qi : Fin 3 → ι)
      (cong_tri : Local.Triangle.Congruent (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi)) (p_ : Pose ℚ)
      (hp : p_ ∈ fourInterval ℚ) (ε δ r : ℚ) (hε : 0 < ε) (hr : 0 < r) (approx : RationalApprox.Approx)
      (hr₁ : RationalApprox.LocalTheorem.BoundRℚ r ε p_ (RationalApprox.κApproxPoly.transportTri Qi hpoly) approx)
      (hδ :
        RationalApprox.LocalTheorem.BoundDeltaℚ δ p_ (RationalApprox.κApproxPoly.transportTri Pi hpoly)
          (RationalApprox.κApproxPoly.transportTri Qi hpoly) approx)
      (ae₁ : Local.TriangleQ.Aεℚ p_.vecX₁ℚ (RationalApprox.κApproxPoly.transportTri Pi hpoly) ε approx)
      (ae₂ : Local.TriangleQ.Aεℚ p_.vecX₂ℚ (RationalApprox.κApproxPoly.transportTri Qi hpoly) ε approx)
      (span₁ : (RationalApprox.κApproxPoly.transportTri Pi hpoly).toReal.κSpanning ↑p_.θ₁ ↑p_.φ₁ ↑ε)
      (span₂ : (RationalApprox.κApproxPoly.transportTri Qi hpoly).toReal.κSpanning ↑p_.θ₂ ↑p_.φ₂ ↑ε)
      (be :
        (RationalApprox.κApproxPoly.transportTri Qi hpoly).Bεℚ Qi (fun k ↦ poly_.v (hpoly.bijection k)) p_ ε δ r approx) :
      ¬∃ p ∈ Metric.closedBall p_.toReal ↑ε, RupertPose p poly.hull[SY25] Theorem 48 "The Rational Local Theorem"
    
      {ιType : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only
    finitely many distinct elements of type `α`. The evidence of this
    is a finset `elems` (a list up to permutation without duplicates),
    together with a proof that everything of type `α` is in the list.  ιType] [DecidableEqDecidableEq.{u} (α : Sort u) : Sort (max 1 u)Propositional equality is `Decidable` for all elements of a type.
    
    In other words, an instance of `DecidableEq α` is a means of deciding the proposition `a = b` is
    for all `a b : α`.
     ιType]
      [NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type,
    that is, there exists an element in the type. It differs from `Inhabited α`
    in that `Nonempty α` is a `Prop`, which means that it does not actually carry
    an element of `α`, only a proof that *there exists* such an element.
    Given `Nonempty α`, you can construct an element of `α` *nonconstructively*
    using `Classical.choice`.
     ιType] (polyGoodPoly ι : GoodPolyGoodPoly (ι : Type) [Fintype ι] [Nonempty ι] : Type ιType)
      (poly_Polyhedron ι (Fin 3 → ℚ) : PolyhedronPolyhedron (ι X : Type) : TypeA convex polyhedron, given as a finite indexed set of vertices.  ιType (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ))
      (hpolyRationalApprox.κApproxPoly poly.vertices poly_ :
        RationalApprox.κApproxPolyRationalApprox.κApproxPoly {ι₁ ι₂ : Type} [Fintype ι₁] [Fintype ι₂] (A : Polyhedron ι₁ Euc(3))
      (B : Polyhedron ι₂ (Fin 3 → ℚ)) : TypeA real polyhedron A and a rational polyhedron B that is a κ-approximation of A.
    
          polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3) poly_Polyhedron ι (Fin 3 → ℚ))
      (PiFin 3 → ι QiFin 3 → ι : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  ιType)
      (cong_triLocal.Triangle.Congruent (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi) :
        Local.Triangle.CongruentLocal.Triangle.Congruent (P Q : Local.Triangle) : Prop[SY25] Definition 34.
    We define "congruent" to mean "there exists a linear isometry". Note that this is
    stronger than "there exists an *affine* isometry", which might be the definition
    you usually think of.
    
          (Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`. PiFin 3 → ι)Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`.
          (Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`. QiFin 3 → ι)Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`.)
      (p_Pose ℚ : PosePose (R : Type) : Type Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ) (hpp_ ∈ fourInterval ℚ : p_Pose ℚ Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. fourIntervalfourInterval (R : Type) [Field R] [LinearOrder R] [IsStrictOrderedRing R] : PoseInterval RThe `[-4, 4]^5` box, used to constrain poses for rational approximation reasoning.
    Polymorphic over the value type so the same name works at both `ℚ` and `ℝ`.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    )
      (ε δ r : Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
    ) (0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε) (hr0 < r : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. r)
      (approxRationalApprox.Approx : RationalApprox.ApproxRationalApprox.Approx : Type)
      (hr₁RationalApprox.LocalTheorem.BoundRℚ r ε p_ (RationalApprox.κApproxPoly.transportTri Qi hpoly) approx :
        RationalApprox.LocalTheorem.BoundRℚRationalApprox.LocalTheorem.BoundRℚ (r ε : ℚ) (p : Pose ℚ) (Q_ : Local.TriangleQ) (approx : RationalApprox.Approx) :
      PropThe condition on r  r
          ε p_Pose ℚ
          (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
    
            QiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_)
          approxRationalApprox.Approx)
      (RationalApprox.LocalTheorem.BoundDeltaℚ δ p_ (RationalApprox.κApproxPoly.transportTri Pi hpoly)
      (RationalApprox.κApproxPoly.transportTri Qi hpoly) approx :
        RationalApprox.LocalTheorem.BoundDeltaℚRationalApprox.LocalTheorem.BoundDeltaℚ (δ : ℚ) (p : Pose ℚ) (P_ Q_ : Local.TriangleQ)
      (approx : RationalApprox.Approx) : PropThe condition on δ 
          δ p_Pose ℚ
          (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
    
            PiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_)
          (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
    
            QiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_)
          approxRationalApprox.Approx)
      (ae₁Local.TriangleQ.Aεℚ p_.vecX₁ℚ (RationalApprox.κApproxPoly.transportTri Pi hpoly) ε approx :
        Local.TriangleQ.AεℚLocal.TriangleQ.Aεℚ (X : Fin 3 → ℚ) (P_ : Local.TriangleQ) (ε : ℚ) (approx : RationalApprox.Approx) : PropCondition A_ε^ℚ from [SY25] Theorem 48
     p_Pose ℚ.vecX₁ℚPose.vecX₁ℚ (p : Pose ℚ) : Fin 3 → ℚ
          (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
    
            PiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_)
          ε approxRationalApprox.Approx)
      (ae₂Local.TriangleQ.Aεℚ p_.vecX₂ℚ (RationalApprox.κApproxPoly.transportTri Qi hpoly) ε approx :
        Local.TriangleQ.AεℚLocal.TriangleQ.Aεℚ (X : Fin 3 → ℚ) (P_ : Local.TriangleQ) (ε : ℚ) (approx : RationalApprox.Approx) : PropCondition A_ε^ℚ from [SY25] Theorem 48
     p_Pose ℚ.vecX₂ℚPose.vecX₂ℚ (p : Pose ℚ) : Fin 3 → ℚ
          (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
    
            QiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_)
          ε approxRationalApprox.Approx)
      (span₁(RationalApprox.κApproxPoly.transportTri Pi hpoly).toReal.κSpanning ↑p_.θ₁ ↑p_.φ₁ ↑ε :
        (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
    
                PiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_).toRealLocal.TriangleQ.toReal (t : Local.TriangleQ) : Local.Triangle.κSpanningLocal.Triangle.κSpanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 45. Note that the "+ 1" at the type Fin 3 wraps.
    We don't include in this definition the constraint that θ, φ ∈ [-4, 4] or
    that ‖P₁‖, ‖P₂‖, ‖P₃‖ ≤ 1 + κ.
    If a user of this code wants to impose those, they'll have to separately. 
          p_Pose ℚ.θ₁Pose.θ₁ {R : Type} (self : Pose R) : R p_Pose ℚ.φ₁Pose.φ₁ {R : Type} (self : Pose R) : R ε)
      (span₂(RationalApprox.κApproxPoly.transportTri Qi hpoly).toReal.κSpanning ↑p_.θ₂ ↑p_.φ₂ ↑ε :
        (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
    
                QiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_).toRealLocal.TriangleQ.toReal (t : Local.TriangleQ) : Local.Triangle.κSpanningLocal.Triangle.κSpanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 45. Note that the "+ 1" at the type Fin 3 wraps.
    We don't include in this definition the constraint that θ, φ ∈ [-4, 4] or
    that ‖P₁‖, ‖P₂‖, ‖P₃‖ ≤ 1 + κ.
    If a user of this code wants to impose those, they'll have to separately. 
          p_Pose ℚ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R p_Pose ℚ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R ε)
      (be(RationalApprox.κApproxPoly.transportTri Qi hpoly).Bεℚ Qi (fun k ↦ poly_.v (hpoly.bijection k)) p_ ε δ r approx :
        (RationalApprox.κApproxPoly.transportTriRationalApprox.κApproxPoly.transportTri {ι : Type} [Fintype ι] {A : Polyhedron ι Euc(3)} {B : Polyhedron ι (Fin 3 → ℚ)}
      (Pi : Fin 3 → ι) (hpoly : RationalApprox.κApproxPoly A B) : Local.TriangleQIf we have indices `Pi` for a triangle in `poly`, yield the corresponding
    triangle in `poly_` which κ-approximates it.
    
              QiFin 3 → ι hpolyRationalApprox.κApproxPoly poly.vertices poly_).BεℚLocal.TriangleQ.Bεℚ {ι : Type} [Fintype ι] [DecidableEq ι] (Q_ : Local.TriangleQ) (Qi : Fin 3 → ι) (v_ : ι → Fin 3 → ℚ)
      (p : Pose ℚ) (ε δ r : ℚ) (approx : RationalApprox.Approx) : PropCondition B_ε^ℚ from [SY25] Theorem 48
    
          QiFin 3 → ι
          (fun kι 
            poly_Polyhedron ι (Fin 3 → ℚ).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X (hpolyRationalApprox.κApproxPoly poly.vertices poly_.bijectionRationalApprox.κApproxPoly.bijection {ι₁ ι₂ : Type} [Fintype ι₁] [Fintype ι₂] {A : Polyhedron ι₁ Euc(3)}
      {B : Polyhedron ι₂ (Fin 3 → ℚ)} (self : RationalApprox.κApproxPoly A B) : ι₁ ≃ ι₂ kι))
          p_Pose ℚ ε δ r approxRationalApprox.Approx) :
      ¬Not (a : Prop) : Prop`Not p`, or `¬p`, is the negation of `p`. It is defined to be `p → False`,
    so if your goal is `¬p` you can use `intro h` to turn the goal into
    `h : p ⊢ False`, and if you have `hn : ¬p` and `h : p` then `hn h : False`
    and `(hn h).elim` will prove anything.
    For more information: [Propositional Logic](https://lean-lang.org/theorem_proving_in_lean4/propositions_and_proofs.html#propositional-logic)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `¬` in identifiers is `not`. pPose ℝ  Metric.closedBallMetric.closedBall.{u} {α : Type u} [PseudoMetricSpace α] (x : α) (ε : ℝ) : Set α`closedBall x ε` is the set of all points `y` with `dist y x ≤ ε`  p_Pose ℚ.toRealPose.toReal (p : Pose ℚ) : Pose ℝView a `Pose ℚ` as a `Pose ℝ` by `Rat.cast`-ing each component.  ε,
          RupertPoseRupertPose {P : Type} [PoseLike P] (p : P) (s : Set Euc(3)) : PropA pose `p` demonstrates that a set `s` is rupert if the closure of the
    `p`-inner-shadow of `s` is a subset of the interior of the
    `p`-outer-shadow of `s`.
     pPose ℝ polyGoodPoly ι.hullGoodPoly.hull {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) : Set Euc(3)
    [SY25] Theorem 48 "The Rational Local Theorem"