Trace — 2607.20422v1
**Planning complex task approach**
I’ll first extract the exact main theorem and dependency structure from the local paper, then audit mathlib for the required machinery before choosing the Lean formulation. I’ll keep the formal statement tied to the paper’s naïve definitions and validate every file offline with `lake env lean`.
**Inspecting root files**
$ /bin/bash -lc "pwd && rg --files -g 'AGENTS.md' -g 'paper.txt' -g 'paper.json' -g 'paper.pdf' -g 'lakefile.*' -g 'lean-toolchain' | sort | sed -n '1,120p'" /work paper.json paper.pdf paper.txt repro/DownstreamTest/lakefile.toml repro/lakefile.lean repro/lean-toolchain repro/scripts/SideSkimmer/lakefile.lean
**Planning paper reading strategy**
$ /bin/bash -lc "wc -l paper.txt && sed -n '1,220p' paper.txt" 802 paper.txt THE SHARP EXPONENT FOR THE MINIMAL DISTANCE PROBLEM COSMIN POHOATA Abstract. We show that for every fixed ε > 0, there exist arbitrarily large families of point–line pairs ( x1 , ℓ1 ), . . . , ( xn , ℓn ) in [0, 1]2 , with xi ∈ ℓi for all i, and such that dist( xi , ℓ j ) ≥ n−2/3−ε ( i ̸ = j ). Combined with a previous result of Cohen, the author, and Zakharov, this solves the minimal distance problem. arXiv:2607.20422v1 [math.CO] 22 Jul 2026 1. Introduction Choose points x1 , . . . , xn ∈ [0, 1]2 and, for each i = 1, . . . , n, let ℓi be a line through xi . The minimal distance problem asks how far every point can be kept from every line to which it is not assigned. More precisely, we define ∆PL (n) := sup min dist( xi , ℓ j ), i̸= j (1) where the supremum is over all configurations of points x1 , . . . , xn ∈ [0, 1]2 and lines ℓ1 , . . . , ℓn ⊂ R2 such that xi ∈ ℓi . For convenience, let us call these point-line incidence configurations of size n. The quantity ∆PL (n) can therefore be regarded as the largest scale at which one can realize n prescribed point–line incidences while avoiding every nontrivial incidence. In [7], Cohen, the author, and Zakharov introduced the problem of determining the asymptotics of ∆PL (n) as n grows, in connection with the Heilbronn triangle problem. Trivially, taking xi = (i/n, 0) and ℓi = xi + (0, 1)R, for i = 1, . . . n, gives a point-line incidence configuration with dist( xi , ℓ j ) ≥ 1/n for all i ̸= j. Thus, ∆PL (n) ≥ 1/n. In the other direction, it is not difficult to see that in any point-line incidence configuration of size n, we must have dist( xi , ℓ j ) ≤ | xi − x j | ≲ n−1/2 for some i ̸= j. Hence ∆PL (n) ≲ n−1/2 . In [7], Cohen-Pohoata-Zakharov improved this upper bound to ∆PL (n) ≤ n−2/3+o(1) , (2) and used this estimate to establish the latest record for the Heilbronn triangle problem. For more history and context, see this recent survey by Zakharov [24]. The connection itself between the Heilbro
$ /bin/bash -lc 'rg -n "''^(Theorem|THEOREM|Definition|Proposition|Lemma|Corollary|Conjecture)|main theorem|minimal distance|Theorem 1|sharp" paper.txt'
10:minimal distance problem.
16:The minimal distance problem asks how far every point can be kept from every line to
41:The connection itself between the Heilbronn triangle problem and the minimal distance
72:several new connections between the minimal distance problem and various other topics
81:circle-method proof was quantitative. This estimate was subsequently sharpened by Pintz–
87:In [11, Theorem 1.15 and Proposition 2.3], Hunter–Pohoata–Verstraëte–Zhang proved
89:minimal distance problem:
140:Theorem 1.1. For every ε > 0, there exists n0 (ε) such that, for every integer n ≥ n0 (ε), there are
155:Combining Theorem 1.1 with (2), it thus follows that the correct exponent for the
156:minimal distance problem is 2/3.
157:Corollary 1.2. As n → ∞,
159:The proof of Theorem 1.1 will build upon the ideas from [11]. Roughly speaking, the
177:(4) would readily convert into the exponent γ = 4/5 + o (1) for the minimal distance
185:The proof of Theorem 1.1 bypasses this barrier and the Ruzsa limit altogether, by
191:Curiously, the high degree number fields enter the proof of Theorem 1.1 in a very
206:number-field construction and the proof of Theorem 1.1.
287:Corollary 2.2. If A ⊂ F is square-difference-free, then the pairs {( p, L p ) : p ∈ P ( A, Y )} form
323:Proposition 2.3. The set Pq ( A) has q| A| elements, every p∗ lies in [0, 1]2 , and p∗ ∈ ℓ∗p . For
374:Proposition 2.4. The number of incidences between Pq and Lq is
429:Thus the unrestricted parabola model is simultaneously a sharp incidence configuration
490:Proposition 3.2. The set AK ( R) is square-difference-free. Moreover, for every R, M ≥ 1,
543:Proposition 2.3.
544:Proposition 4.1. Let A ⊂ 2OK ∩ BK ( R) be square-difference-free, and let Y ⊂ 2OK ∩ BK ( M ),
663:Corollary 4.2. Let M ≥ 1, and take
683:We are now ready to derive Theorem 1.1.
686:Proof of Theorem 1.1. Fix ε > 0. Choose an odd prime p so large that 9p−
705:n, which yields ∆PL (n) ≥ n−2/3−ε . This completes the proof of Theorem 1.1.
708:We do not$ /bin/bash -lc 'git status --short && find . -maxdepth 2 -name AGENTS.md -print'
**Identifying key document sections**
The main target is Theorem 1.1 itself (the eventual, all-\(n\) lower bound), not merely the construction at a subsequence. The proof’s distinctive core is now clear: a trace-zero lattice slice in a fixed high-degree totally real field, followed by an exact-size padding/restriction argument. I’m reading Sections 2–4 closely to isolate which algebraic-number-theory facts can come directly from mathlib and which need explicit hypotheses or new proofs.
$ /bin/bash -lc "sed -n '460,710p' paper.txt"
ker(TrK/Q ) ∩ {z2 : z ∈ K } = {0}.
(20)
Geometrically, every nonzero square lies in the open half-space TrK/Q > 0, whose boundary is the trace-zero hyperplane.
THE SHARP EXPONENT FOR THE MINIMAL DISTANCE PROBLEM
7
For X ≥ 0, let us now define the symmetric Minkowski box of radius X
BK ( X ) := { a ∈ OK : |σj ( a)| ≤ X for 1 ≤ j ≤ d}.
(21)
One of the main new ideas in this construction is to consider the trace-zero lattice
Λ0K := { a ∈ 2OK : TrK/Q ( a) = 0}.
(22)
The additive group 2OK has rank d, and the trace map is nonzero because TrK/Q (2) = 2d.
Hence Λ0K has rank d − 1 (it lives in the trace-zero hyperplane x1 + · · · + xd = 0).
For two parameters R, M ≥ 1 (to be balanced appropriately later), let us denote
AK ( R) := Λ0K ∩ BK ( R),
YK ( M ) := 2OK ∩ BK ( M ).
(23)
We record two important facts about AK ( R) and YK ( M ).
Proposition 3.2. The set AK ( R) is square-difference-free. Moreover, for every R, M ≥ 1,
| AK ( R)| ≍K Rd−1 ,
|YK ( M)| ≍K Md .
(24)
Proof. Let’s first check the square-difference-freeness. Suppose that a − a′ = z2 with
a, a′ ∈ AK ( R) and z ∈ OK . Then
0 = TrK/Q ( a − a′ ) = TrK/Q (z2 ) = qK (z).
By the positive definiteness from Observation 3.1, one has z = 0, and therefore a = a′ .
The size estimates for AK ( R) and YK ( M ) immediately follow from the following standard fact about lattices:
Fact 3.3. Let Λ ⊂ Rm be a lattice of rank r ≥ 1. Then
|Λ ∩ [− T, T ]m | ≍Λ T r
for every T ≥ 1.
Therefore, | AK ( R)| ≍K Rd−1 comes from the fact that the lattice Λ0K has rank d − 1,
whereas |YK ( M )| ≍K Md follows from the fact that 2OK has full rank d.
□
The fixed factor 2 in (22) only clears the possible half-integral first coordinate in (13). If
a, y ∈ 2OK , then
a + y2
x=
∈ OK .
2
Consequently, for two points p = ( x, y) and p′ = ( x ′ , y′ ) arising from A × Y, the quantity
a − a ′ − ( y ′ − y )2
2
is also an algebraic integer. Passing from OK to the finite-index sublattice 2OK has no
effect on any exponent.
D ( p, p′ ) = x − x $ /bin/bash -lc "sed -n '206,460p' paper.txt"
number-field construction and the proof of Theorem 1.1.
COSMIN POHOATA
4
2. The Hunter-Pohoata-Verstraëte-Zhang construction
With an eye on the number field story that will follow, let us first isolate some basic
facts that hold in greater generality.
2.1. The induced-matching identity. Let F be any field of characteristic different from
2, and let us Q( x, y) := 2x − y2 as a polynomial in F [ x, y]. In particular, the level set
Q( x, y) = a is a parabola in F2 . For a point p = ( x, y) ∈ F2 , let
L p := p + F (y, 1) = {( x + ty, y + t) : t ∈ F }.
(7)
This is the tangent line to the parabola Q = Q( p) at p. For two points p = ( x, y) and
p′ = ( x ′ , y′ ), let us also single out the following recurring quantity:
D ( p, p′ ) := x − x ′ + y(y′ − y).
(8)
We next record the key identity mentioned above, along with some important consequences.
Observation 2.1. For p = ( x, y) ∈ F2 and t ∈ F, Q p + t(y, 1) = Q( p) − t2 . Moreover, for
p′ = ( x ′ , y′ ), we have that Q( p) − Q( p′ ) = 2D ( p, p′ ) + (y′ − y)2 , and
p′ ∈ L p
D ( p, p′ ) = 0.
⇐⇒
(9)
In particular, Observation 2.1 gives us the following important implication:
p′ ∈ L p
=⇒
Q ( p ) − Q ( p ′ ) = ( y ′ − y )2 .
(10)
For the sake of completeness, we include the easy proof as well.
Proof. The parametrisation in (7) gives
Q( x + ty, y + t) = 2( x + ty) − (y + t)2 = 2x − y2 − t2 ,
which gives the first equality. Expanding 2D ( p, p′ ) + (y′ − y)2 gives
2x − 2x ′ + 2y(y′ − y) + (y′ − y)2 = 2x − y2 − (2x ′ − y′2 ) = Q( p) − Q( p′ ).
Finally, a defining equation for L p is
Λ p ( X, Y ) := X − yY + (y2 − x ) = 0.
(11)
Its value at p′ is Λ p ( p′ ) = x ′ − yy′ + y2 − x = − D ( p, p′ ), so it vanishes exactly when
p′ ∈ L p .
□
A useful take-away is that the quantity D ( p, p′ ) is precisely the negative of the value
at p′ of the normalized affine equation (11) for L p (so it detects incidences). For any
A, Y ⊂ F, let us next define the set
P ( A, Y ) := {( x, y) ∈ F2 : y ∈ Y, Q( x, y) ∈ A}.
(12)
Bec$ /bin/bash -lc "sed -n '730,770p' paper.txt" translating, it follows that sQ ( X ) = s(2⌊ X ⌋ + 1). See also the closely related version from [16] for general number fields. For a totally real field K of degree d ≥ 2, the trace-zero lattice used in our proof of Theorem 1.1 gives sK ( X ) ≳K X d−1 . Conversely, Z · 1 is a primitive direct summand of the additive group OK , so one may partition BK ( X ) into OK ( X d−1 ) fibers parallel to this copy of Z. The intersection of A with each such fiber, after translation, is an ordinary square-difference-free set contained in an interval of length OK ( X ). The result of [9] therefore implies p X d−1 ≲K sK ( X ) ≲K X d exp −c log X for an absolute constant c > 0. It would be interesting to narrow this gap for large d. Acknowledgments The author would like to acknowledge the important role of OpenAI’s GPT-5.6 Sol Pro in preparing the manuscript and in developing the proof of Theorem 1.1. The author’s original idea was to use a high-degree number field analogue of the Hunter–Pohoata– Verstraëte–Zhang construction to get from ∆PL (n) ≳ n−0.81075... to the Ruzsa endpoint ∆PL (n) ≥ n−4/5−o(1) . Naturally, the point was to leverage a better behaved version of the Ruzsa construction (5) inside the rings of integers of such number fields. The decisive new idea of using the codimension one, square-difference-free, trace-zero lattice Λ0K ⊂ 2OK instead of a Ruzsa-like set, in order to subsequently upgrade the exponent 4/5 to the sharp exponent 2/3, is entirely due to GPT-5.6 Sol Pro. References [1] N. Alon, T. F. Bloom, W. T. Gowers, D. Litt, W. Sawin, A. Shankar, J. Tsimerman, V. Wang, and M. Matchett Wood, Remarks on the disproof of the unit distance conjecture, arXiv:2605.20695, 2026. [2] R. Beigel and W. Gasarch, Square-difference-free sets of size Ω(n0.7334... ), arXiv:0804.4892, 2008. [3] T. F. Bloom, Sum-product, unit distances, and number fields, Blog post, May 31, 2026. https://www.erdosp roblems.com/forum/thread/blog:6. [4] T. F. Bloom and J. Maynard, A new upper bo
$ /bin/bash -lc "sed -n '1,220p' lakefile.lean && sed -n '1,80p' lean-toolchain"
import Lake
open Lake DSL
/-!
## Mathlib dependencies on upstream projects
-/
require "leanprover-community" / "batteries" @ git "main"
require "leanprover-community" / "Qq" @ git "master"
require "leanprover-community" / "aesop" @ git "master"
require "leanprover-community" / "proofwidgets" @ git "main"
with NameMap.empty.insert `errorOnBuild
"ProofWidgets failed to reuse pre-built JS code. \
Please report this issue on the Lean Zulip."
require "leanprover-community" / "importGraph" @ git "main"
require "leanprover-community" / "LeanSearchClient" @ git "main"
require "leanprover-community" / "plausible" @ git "main"
/-!
## Options for building mathlib
-/
/-- These options are used as `leanOptions`, prefixed by `` `weak``, so that
`lake build` uses them, as well as `Archive` and `Counterexamples`. -/
abbrev mathlibOnlyLinters : Array LeanOption := #[
⟨`linter.mathlibStandardSet, true⟩,
-- Explicitly enable the header linter, since the standard set is defined in `Mathlib.Init`
-- but we want to run this linter in files imported by `Mathlib.Init`.
⟨`linter.style.header, true⟩,
⟨`linter.checkInitImports, true⟩,
⟨`linter.allScriptsDocumented, true⟩,
⟨`linter.pythonStyle, true⟩,
⟨`linter.style.longFile, .ofNat 1500⟩,
-- ⟨`linter.nightlyRegressionSet, true⟩,
-- `latest_import.yml` uses this comment: if you edit it, make sure that the workflow still works
]
/-- These options are passed as `leanOptions` to building mathlib, as well as the
`Archive` and `Counterexamples`. (`tests` omits the first two options.) -/
abbrev mathlibLeanOptions := #[
⟨`pp.unicode.fun, true⟩, -- pretty-prints `fun a ↦ b`
⟨`autoImplicit, false⟩,
⟨`maxSynthPendingDepth, .ofNat 3⟩,
] ++ -- options that are used in `lake build`
mathlibOnlyLinters.map fun s ↦ { s with name := `weak ++ s.name }
package mathlib where
testDriver := "MathlibTest"
lintDriver := "batteries/runLinter"
lintDriverArgs := #["Mathlib"]
-- A version of Mathlib only su**Identifying potential proof inconsistencies** **Planning explicit algebraic lattice constructions** **Developing elementary conjugate algebra model**
**Planning proof of algebra injectivity** **Exploring polynomial construction for integral domain proof** **Investigating polynomial irreducibility conditions**
**Exploring rational vector embeddings** **Planning algebra construction with quadratic extensions**
A useful simplification has emerged: the proof does not actually need the full ring-of-integers/Minkowski-lattice apparatus. A concrete multiquadratic order can supply exactly the same mechanism, with an explicit coefficient box: the trace-zero condition becomes “zero constant coefficient,” and the cardinalities become exact powers instead of asymptotic lattice counts. I’m checking whether mathlib already proves the needed linear independence of squarefree radicals; that determines whether this route stays elementary or needs a small algebraic-number lemma library.
$ /bin/bash -lc "rg -n \"TotallyReal|totally real|NumberField.*Trace|trace.*positive|Algebra.trace|Algebra.norm|norm_eq_prod_embeddings|prod.*embedding|Minkowski\" Mathlib/NumberTheory Mathlib/FieldTheory | sed -n '1,260p'" Mathlib/FieldTheory/KummerExtension.lean:129: apply ha q hq (dvd_mul_of_dvd_right hqn p) (Algebra.norm _ b) Mathlib/FieldTheory/KummerPolynomial.lean:112: have key : (Algebra.norm K (AdjoinRoot.root g)) ^ p = a ^ g.natDegree := by Mathlib/FieldTheory/KummerPolynomial.lean:115: rw [← map_pow, this, ← AdjoinRoot.algebraMap_eq, Algebra.norm_algebraMap, Mathlib/FieldTheory/LinearDisjoint.lean:746: Algebra.trace A E (algebraMap B E x) = algebraMap F A (Algebra.trace F B x) := by Mathlib/FieldTheory/LinearDisjoint.lean:756: Algebra.norm A (algebraMap B E x) = algebraMap F A (Algebra.norm F x) := by Mathlib/FieldTheory/Finite/GaloisField.lean:225: algebraMap K K' (Algebra.norm K x) = x ^ ((Nat.card K' - 1) / (Nat.card K - 1)) := by Mathlib/FieldTheory/Finite/GaloisField.lean:229: simp_rw [← Fintype.card_eq_nat_card, Algebra.norm_eq_prod_automorphisms, Mathlib/FieldTheory/Finite/GaloisField.lean:236:theorem unitsMap_norm_surjective : Function.Surjective (Units.map <| Algebra.norm K (S := K')) := Mathlib/FieldTheory/Finite/GaloisField.lean:251:theorem norm_surjective : Function.Surjective (Algebra.norm K (S := K')) := fun k ↦ by Mathlib/FieldTheory/Finite/GaloisField.lean:253: · exact ⟨0, Algebra.norm_zero ..⟩ Mathlib/NumberTheory/Cyclotomic/Discriminant.lean:101: replace H := congr_arg (Algebra.norm K) H Mathlib/NumberTheory/Cyclotomic/Discriminant.lean:107: Algebra.norm_algebraMap, finrank L hirr, ← succ_eq_add_one, Mathlib/NumberTheory/Cyclotomic/PrimitiveRoots.lean:284: rw [hζ.eq_neg_one_of_two_right, show -1 = algebraMap K L (-1) by simp, Algebra.norm_algebraMap] Mathlib/NumberTheory/Cyclotomic/PrimitiveRoots.lean:296: rw [hζ, show 1 = algebraMap K L 1 by simp, Algebra.norm_algebraMap, one_pow] Mathlib/NumberTheory/Cyclotomic/PrimitiveRoots.lean:309: rw [← (algebraMap K L).map_one, Algebra.norm_algebraMap, one_pow, map_pow, ← one_pow n] at hz Mathlib/NumberTheory/Cyclotomic/PrimitiveRoots.lean:341: rw [norm_eq_prod_embeddings] Mathlib/Num
$ /bin/bash -lc "rg -n \"Nat\\.squarefree|Squarefree.*prod|Prime.*not_isSquare|not.*IsSquare.*prime|irrational_sqrt\" Mathlib | sed -n '1,240p'"
Mathlib/NumberTheory/Real/GoldenRatio.lean:121: have := Nat.Prime.irrational_sqrt (show Nat.Prime 5 by norm_num)
Mathlib/NumberTheory/Real/GoldenRatio.lean:129: have := Nat.Prime.irrational_sqrt (show Nat.Prime 5 by norm_num)
Mathlib/NumberTheory/Real/Irrational.lean:97:theorem irrational_sqrt_of_multiplicity_odd (m : ℤ) (hm : 0 < m) (p : ℕ) [hp : Fact p.Prime]
Mathlib/NumberTheory/Real/Irrational.lean:106:theorem irrational_sqrt_ratCast_iff_of_nonneg {q : ℚ} (hq : 0 ≤ q) :
Mathlib/NumberTheory/Real/Irrational.lean:116:theorem irrational_sqrt_ratCast_iff {q : ℚ} :
Mathlib/NumberTheory/Real/Irrational.lean:119: · simp_rw [irrational_sqrt_ratCast_iff_of_nonneg hq, and_iff_left hq]
Mathlib/NumberTheory/Real/Irrational.lean:123:theorem irrational_sqrt_intCast_iff_of_nonneg {z : ℤ} (hz : 0 ≤ z) :
Mathlib/NumberTheory/Real/Irrational.lean:125: rw [← Rat.isSquare_intCast_iff, ← irrational_sqrt_ratCast_iff_of_nonneg (mod_cast hz),
Mathlib/NumberTheory/Real/Irrational.lean:128:theorem irrational_sqrt_intCast_iff {z : ℤ} :
Mathlib/NumberTheory/Real/Irrational.lean:130: rw [← Rat.cast_intCast, irrational_sqrt_ratCast_iff, Rat.isSquare_intCast_iff,
Mathlib/NumberTheory/Real/Irrational.lean:133:theorem irrational_sqrt_natCast_iff {n : ℕ} : Irrational (√n) ↔ ¬IsSquare n := by
Mathlib/NumberTheory/Real/Irrational.lean:134: rw [← Rat.isSquare_natCast_iff, ← irrational_sqrt_ratCast_iff_of_nonneg n.cast_nonneg,
Mathlib/NumberTheory/Real/Irrational.lean:137:theorem irrational_sqrt_ofNat_iff {n : ℕ} [n.AtLeastTwo] :
Mathlib/NumberTheory/Real/Irrational.lean:139: irrational_sqrt_natCast_iff
Mathlib/NumberTheory/Real/Irrational.lean:141:theorem Nat.Prime.irrational_sqrt {p : ℕ} (hp : Nat.Prime p) : Irrational (√p) :=
Mathlib/NumberTheory/Real/Irrational.lean:142: irrational_sqrt_natCast_iff.mpr hp.not_isSquare
Mathlib/NumberTheory/Real/Irrational.lean:145:theorem irrational_sqrt_two : Irrational (√2) := by
Mathlib/NumberTheory/Real/Irrational.lean:146: simpa using Nat.prime_two.$ /bin/bash -lc "rg -n \"LinearIndependent.*sqrt|linearIndependent.*sqrt|sqrt.*LinearIndependent|squarefree.*sqrt|Multiquadratic|multi.?quadratic|QuadraticExtension|IsSquare.*Rat|irrational.*sqrt|sqrt.*irrational\" Mathlib | sed -n '1,240p'"
Mathlib/NumberTheory/Real/GoldenRatio.lean:121: have := Nat.Prime.irrational_sqrt (show Nat.Prime 5 by norm_num)
Mathlib/NumberTheory/Real/GoldenRatio.lean:129: have := Nat.Prime.irrational_sqrt (show Nat.Prime 5 by norm_num)
Mathlib/NumberTheory/Real/Irrational.lean:97:theorem irrational_sqrt_of_multiplicity_odd (m : ℤ) (hm : 0 < m) (p : ℕ) [hp : Fact p.Prime]
Mathlib/NumberTheory/Real/Irrational.lean:106:theorem irrational_sqrt_ratCast_iff_of_nonneg {q : ℚ} (hq : 0 ≤ q) :
Mathlib/NumberTheory/Real/Irrational.lean:116:theorem irrational_sqrt_ratCast_iff {q : ℚ} :
Mathlib/NumberTheory/Real/Irrational.lean:119: · simp_rw [irrational_sqrt_ratCast_iff_of_nonneg hq, and_iff_left hq]
Mathlib/NumberTheory/Real/Irrational.lean:123:theorem irrational_sqrt_intCast_iff_of_nonneg {z : ℤ} (hz : 0 ≤ z) :
Mathlib/NumberTheory/Real/Irrational.lean:125: rw [← Rat.isSquare_intCast_iff, ← irrational_sqrt_ratCast_iff_of_nonneg (mod_cast hz),
Mathlib/NumberTheory/Real/Irrational.lean:128:theorem irrational_sqrt_intCast_iff {z : ℤ} :
Mathlib/NumberTheory/Real/Irrational.lean:130: rw [← Rat.cast_intCast, irrational_sqrt_ratCast_iff, Rat.isSquare_intCast_iff,
Mathlib/NumberTheory/Real/Irrational.lean:133:theorem irrational_sqrt_natCast_iff {n : ℕ} : Irrational (√n) ↔ ¬IsSquare n := by
Mathlib/NumberTheory/Real/Irrational.lean:134: rw [← Rat.isSquare_natCast_iff, ← irrational_sqrt_ratCast_iff_of_nonneg n.cast_nonneg,
Mathlib/NumberTheory/Real/Irrational.lean:137:theorem irrational_sqrt_ofNat_iff {n : ℕ} [n.AtLeastTwo] :
Mathlib/NumberTheory/Real/Irrational.lean:139: irrational_sqrt_natCast_iff
Mathlib/NumberTheory/Real/Irrational.lean:141:theorem Nat.Prime.irrational_sqrt {p : ℕ} (hp : Nat.Prime p) : Irrational (√p) :=
Mathlib/NumberTheory/Real/Irrational.lean:142: irrational_sqrt_natCast_iff.mpr hp.not_isSquare
Mathlib/NumberTheory/Real/Irrational.lean:145:theorem irrational_sqrt_two : Irrational (√2) := by
Mathlib/NumberTheory/Real/Irrational.lean:146: simpa using Nat.prime_two.**Planning abstract number field setup**
$ /bin/bash -lc "sed -n '1,240p' Mathlib/NumberTheory/NumberField/Cyclotomic/Embeddings.lean && sed -n '1,230p' Mathlib/NumberTheory/NumberField/CMField.lean"
/-
Copyright (c) 2024 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-/
module
public import Mathlib.NumberTheory.Cyclotomic.PrimitiveRoots
public import Mathlib.NumberTheory.NumberField.InfinitePlace.TotallyRealComplex
/-!
# Cyclotomic extensions of `ℚ` are totally complex number fields.
We prove that cyclotomic extensions of `ℚ` are totally complex, meaning that
`NrRealPlaces K = 0` if `IsCyclotomicExtension {n} ℚ K` and `2 < n`.
## Main results
* `nrRealPlaces_eq_zero`: If `K` is an `n`-th cyclotomic extension of `ℚ`, where `2 < n`,
then there are no real places of `K`.
-/
public section
universe u
namespace IsCyclotomicExtension.Rat
open NumberField InfinitePlace Module Complex Nat Polynomial
variable {n : ℕ} [NeZero n] (K : Type u) [Field K] [CharZero K]
/-- If `K` is an `n`-th cyclotomic extension of `ℚ`, where `2 < n`, then there are no real places
of `K`. -/
theorem nrRealPlaces_eq_zero [IsCyclotomicExtension {n} ℚ K] (hn : 2 < n) :
haveI := IsCyclotomicExtension.numberField {n} ℚ K
nrRealPlaces K = 0 := by
have := IsCyclotomicExtension.numberField {n} ℚ K
apply (IsCyclotomicExtension.zeta_spec n ℚ K).nrRealPlaces_eq_zero_of_two_lt hn
theorem isTotallyComplex [IsCyclotomicExtension {n} ℚ K] (hn : 2 < n) :
IsTotallyComplex K := by
have := IsCyclotomicExtension.numberField {n} ℚ K
exact nrRealPlaces_eq_zero_iff.mp <| nrRealPlaces_eq_zero K hn
variable (n)
/-- If `K` is an `n`-th cyclotomic extension of `ℚ`, then there are `φ n / n` complex places
of `K`. Note that this uses `1 / 2 = 0` in the cases `n = 1, 2`. -/
theorem nrComplexPlaces_eq_totient_div_two [h : IsCyclotomicExtension {n} ℚ K] :
haveI := IsCyclotomicExtension.numberField {n} ℚ K
nrComplexPlaces K = φ n / 2 := by
have := IsCyclotomicExtension.numberField {n} ℚ K
by_cases hn : 2 < n
· obtain ⟨k, hk : φ n = k + k⟩ := totient_even hn
have key := card_add_two_mul_car$ /bin/bash -lc "rg -n \"maximalRealSubfield.*finrank|finrank.*maximalRealSubfield|maximalRealSubfield.*degree|IsTotallyReal.*Cyclotomic|cyclotomic.*totally\" Mathlib/NumberTheory | sed -n '1,260p'" Mathlib/NumberTheory/NumberField/Cyclotomic/Embeddings.lean:14:We prove that cyclotomic extensions of `ℚ` are totally complex, meaning that
$ /bin/bash -lc "rg -n \"exists.*NumberField|NumberField.*exists|finrank.*CyclotomicField|CyclotomicField.*finrank|totient.*finrank|IsCyclotomicExtension.*finrank|finrank.*totient\" Mathlib/NumberTheory Mathlib/FieldTheory | sed -n '1,300p'"
Mathlib/NumberTheory/NumberField/ExistsRamified.lean:31:lemma NumberField.exists_not_isUnramifiedIn (H : Module.finrank ℚ K ≠ 1) :
Mathlib/NumberTheory/NumberField/ExistsRamified.lean:41:lemma NumberField.exists_not_isUnramifiedAt_int (H : Module.finrank ℚ K ≠ 1) :
Mathlib/NumberTheory/NumberField/ExistsRamified.lean:43: obtain ⟨p, hp1, hp2⟩ := NumberField.exists_not_isUnramifiedIn (𝒪 := 𝒪) H
Mathlib/NumberTheory/NumberField/ExistsRamified.lean:54: obtain ⟨P, _, H⟩ := NumberField.exists_not_isUnramifiedAt_int (𝒪 := 𝒪) H
Mathlib/NumberTheory/NumberField/ExistsRamified.lean:73:lemma NumberField.exists_not_isUnramifiedAt_int_of_isGalois [IsGalois ℚ K]
Mathlib/NumberTheory/NumberField/ExistsRamified.lean:83: obtain ⟨P, _, hP'⟩ := NumberField.exists_not_isUnramifiedAt_int (𝒪 := 𝒪) H.ne'
Mathlib/NumberTheory/NumberField/CMField.lean:39:* `NumberField.IsCM.ofIsCMExtension`: Assume that there exists `F` such that `K/F` is a
Mathlib/NumberTheory/NumberField/Cyclotomic/Ideal.lean:128: rw [← Nat.totient_prime_pow_succ hp.out, ← finrank _ K,
Mathlib/NumberTheory/NumberField/Cyclotomic/Ideal.lean:383: rw [finrank m, finrank (p ^ (k + 1)), finrank n, hn, mul_comm, Nat.totient_mul]
Mathlib/NumberTheory/NumberField/Cyclotomic/Embeddings.lean:56: rw [nrRealPlaces_eq_zero K hn, zero_add, IsCyclotomicExtension.finrank (n := n) K
Mathlib/NumberTheory/NumberField/Cyclotomic/Embeddings.lean:68: rw [IsCyclotomicExtension.finrank K (cyclotomic.irreducible_rat (NeZero.pos n)), this]
Mathlib/NumberTheory/NumberField/Cyclotomic/PID.lean:36: rw [discr_prime 3 K, IsCyclotomicExtension.finrank (n := 3) K
Mathlib/NumberTheory/NumberField/Cyclotomic/PID.lean:51: rw [discr_prime 5 K, IsCyclotomicExtension.finrank (n := 5) K
Mathlib/NumberTheory/NumberField/Cyclotomic/Basic.lean:45:theorem finrank [NeZero k] [IsCyclotomicExtension {k} ℚ K] : Module.finrank ℚ K = k.totient :=
Mathlib/NumberTheory/NumberField/Cyclotomic/Basic.lean:46: IsCyclotomicExtension.finrank K <| Polynomial.cyclo**Formulating trace-zero basis construction** **Establishing linearly independent integral trace-zero basis** **Planning integral trace-zero element construction**
**Constructing trace-zero basis elements** **Planning arithmetic model and Euclidean geometry setup**
**Exploring EuclideanGeometry line distance**
$ /bin/bash -lc "rg -n \"integralBasis|Basis.*RingOfIntegers|RingOfIntegers.*Basis|trace_eq.*finrank|trace_one|Algebra.trace.*one|trace.*basis\" Mathlib/NumberTheory/NumberField Mathlib/LinearAlgebra | sed -n '1,300p'" Mathlib/NumberTheory/NumberField/FractionalIdeal.lean:23: field `K`, the absolute value of the determinant of the base change from `integralBasis` to Mathlib/NumberTheory/NumberField/FractionalIdeal.lean:95: rw [finrank_eq_card_chooseBasisIndex, RingOfIntegers.rank, Mathlib/NumberTheory/NumberField/FractionalIdeal.lean:104:/-- The absolute value of the determinant of the base change from `integralBasis` to Mathlib/NumberTheory/NumberField/FractionalIdeal.lean:108: |(integralBasis K).det ((basisOfFractionalIdeal K I).reindex e.symm)| = Mathlib/NumberTheory/NumberField/EquivReindex.lean:35: rw [Embeddings.card, ← finrank_eq_card_chooseBasisIndex, RingOfIntegers.rank] Mathlib/NumberTheory/NumberField/EquivReindex.lean:45: (integralBasis K ∘ (equivReindex K)) (RingHom.equivRatAlgHom K ℂ) := by Mathlib/NumberTheory/NumberField/EquivReindex.lean:58: (Algebra.discr_not_zero_of_basis ℚ (integralBasis K)) Mathlib/NumberTheory/NumberField/EquivReindex.lean:59: rw [← Algebra.discr_reindex ℚ (integralBasis K) (equivReindex K).symm] Mathlib/NumberTheory/NumberField/EquivReindex.lean:61: (integralBasis K ∘ (equivReindex K)) (RingHom.equivRatAlgHom K ℂ)).symm Mathlib/NumberTheory/NumberField/EquivReindex.lean:70: (fun i ↦ (((integralBasis K).reindex (equivReindex K).symm).repr α i : ℂ)) := by Mathlib/NumberTheory/NumberField/EquivReindex.lean:73: simp only [canonicalEmbedding.integralBasis_repr_apply, mulVec, dotProduct, Mathlib/NumberTheory/NumberField/EquivReindex.lean:80: ((integralBasis K).reindex (equivReindex K).symm).repr α i := fun i => by Mathlib/NumberTheory/NumberField/Discriminant/Defs.lean:38:theorem coe_discr : (discr K : ℚ) = Algebra.discr ℚ (integralBasis K) := Mathlib/NumberTheory/NumberField/Discriminant/Defs.lean:43: exact Algebra.discr_not_zero_of_basis ℚ (integralBasis K) Mathlib/NumberTheory/NumberField/Discriminant/Defs.lean:47: let b₀ := Basis.reindex (RingOfIntegers.basis K) (Basis.indexEquiv (RingOfIntegers.basis K) b) M
$ /bin/bash -lc "rg -n \"dist.*affine.*line|infDist.*line|dist.*AffineSubspace|AffineSubspace.*dist|distance.*line|point.*line.*dist|dist_eq.*inner|infDist.*hyperplane\" Mathlib/Geometry Mathlib/Analysis Mathlib/Topology | sed -n '1,300p'"
Mathlib/Analysis/Complex/UpperHalfPlane/Metric.lean:201:/-- For two points on the same vertical line, the distance is equal to the distance between the
Mathlib/Analysis/InnerProductSpace/Affine.lean:49: rw [dist_eq_norm_vsub V, inner_eq_norm_sq_left_iff, vsub_sub_vsub_cancel_left,
Mathlib/Analysis/InnerProductSpace/Affine.lean:58: rw [dist_eq_norm_vsub V, inner_eq_norm_sq_left_iff, vsub_sub_vsub_cancel_right,
Mathlib/Analysis/InnerProductSpace/Affine.lean:66:/-- Squared distance between two points on lines from a common origin,
Mathlib/Analysis/InnerProductSpace/Affine.lean:80:/-- Squared distance from `p` to a point on the line from `a` to `b`,
Mathlib/Geometry/Euclidean/Circumcenter.lean:54:theorem existsUnique_dist_eq_of_insert {s : AffineSubspace ℝ P}
Mathlib/Geometry/Euclidean/SignedDist.lean:21:* `AffineSubspace.signedInfDist` is the signed distance between an affine subspace and a point.
Mathlib/Geometry/Euclidean/SignedDist.lean:23: In the case of a triangle, these distances are trilinear coordinates.
Mathlib/Geometry/Euclidean/SignedDist.lean:174: rw [signedDist_apply_apply, dist_eq_norm_vsub', NormedSpace.normalize, real_inner_smul_left,
Mathlib/Geometry/Euclidean/SignedDist.lean:185: rw [signedDist_apply_apply, dist_eq_norm_vsub', NormedSpace.normalize, real_inner_smul_left]
Mathlib/Geometry/Euclidean/SignedDist.lean:343: rw [signedInfDist, AffineSubspace.abs_signedInfDist_eq_dist_of_mem_affineSpan_insert,
Mathlib/Geometry/Euclidean/Sphere/Tangent.lean:100:lemma IsTangentAt.dist_sq_eq_of_mem {s : Sphere P} {p q : P} {as : AffineSubspace ℝ P}
Mathlib/Geometry/Euclidean/Sphere/Tangent.lean:130:lemma IsTangentAt.radius_lt_dist_center {s : Sphere P} {as : AffineSubspace ℝ P} {p q : P}
Mathlib/Geometry/Euclidean/Sphere/Tangent.lean:165:lemma IsTangent.radius_le_dist_center {s : Sphere P} {as : AffineSubspace ℝ P} (h : s.IsTangent as)
Mathlib/Geometry/Euclidean/Sphere/Tangent.lean:172:lemma IsTangent.notMem_of_dist_lt {s : Sphere P} {as : AffineSubspace ℝ$ /bin/bash -lc "rg -n \"Nat.*eventually.*pow|atTop.*rpow|exists.*pow.*le|Real.rpow.*eventually|isLittleO.*rpow|tendsto.*rpow.*atTop|eventually.*n \\"'^" Mathlib/Analysis Mathlib/Topology Mathlib/NumberTheory | sed -n '"'1,280p'"
Mathlib/Analysis/SpecialFunctions/Complex/LogBounds.lean:447: tendsto_one_add_div_rpow_exp t |>.comp tendsto_natCast_atTop_atTop |>.congr (by simp)
Mathlib/Topology/Algebra/Valued/WithZeroMulInt.lean:50:lemma exists_pow_lt_of_le_exp_neg_one [Valued R ℤᵐ⁰] {x : R} (hx : v x ≤ exp (-1)) (γ : ℤᵐ⁰ˣ) :
Mathlib/NumberTheory/Transcendental/Liouville/LiouvilleWith.lean:102: ((tendsto_rpow_atTop (sub_pos.2 hlt)).comp tendsto_natCast_atTop_atTop).eventually
Mathlib/NumberTheory/Transcendental/Liouville/LiouvilleWith.lean:271: rcases ((eventually_gt_atTop 0).and_frequently (h.frequently_lt_rpow_neg hp)).exists with
Mathlib/NumberTheory/Transcendental/Liouville/Basic.lean:149: -- Use the key lemma `exists_one_le_pow_mul_dist`: we are left to show that ...
Mathlib/Topology/Algebra/Order/Field.lean:84:A version for positive real powers exists as `tendsto_rpow_neg_atTop`. -/
Mathlib/NumberTheory/Harmonic/ZetaAsymp.lean:232: refine tendsto_const_nhds.div_atTop <| (tendsto_rpow_atTop (by linarith)).comp ?_
Mathlib/NumberTheory/Ostrowski.lean:56: exact Tendsto.comp tendsto_rpow_div tendsto_natCast_atTop_atTop
Mathlib/NumberTheory/NumberField/CanonicalEmbedding/ConvexBody.lean:594: obtain ⟨⟨x, hx⟩, h_nz, h_mem⟩ := exists_ne_zero_mem_lattice_of_measure_mul_two_pow_le_measure
Mathlib/NumberTheory/LSeries/HurwitzZetaOdd.lean:318: simpa using hv'.trans (isLittleO_exp_neg_mul_rpow_atTop hv _).isBigO
Mathlib/NumberTheory/LSeries/HurwitzZetaOdd.lean:322: simpa using hv'.trans (isLittleO_exp_neg_mul_rpow_atTop hv _).isBigO
Mathlib/NumberTheory/LSeries/Injectivity.lean:106: (tendsto_rpow_atTop_of_base_lt_one _ (neg_one_lt_zero.trans_le H₀') H₂).ofReal.const_mul _
Mathlib/NumberTheory/Chebyshev.lean:738: apply isLittleO_log_rpow_rpow_atTop _ (by norm_num)
Mathlib/NumberTheory/LSeries/SumCoeff.lean:66: · refine (IsBigO.mul_atTop_rpow_natCast_of_isBigO_rpow _ _ _ ?_ hO h₂).congr_right (by simp)
Mathlib/NumberTheory/LSeries/SumCoeff.lean:68: · refine h₄.isBigO.of_c**Planning box construction theorem proof** **Setting up Lean file with imports**
**Confirming successful compilation**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean'
CyclotomicField.{w} (n : ℕ) (K : Type w) [Field K] : Type w
SharpDistanceScratch.lean:10:7: error(lean.unknownIdentifier): Unknown constant `CyclotomicField.instIsCyclotomicExtension`
SharpDistanceScratch.lean:11:7: error(lean.unknownIdentifier): Unknown constant `IsCyclotomicExtension.Rat.finrank`
IsCyclotomicExtension.Rat.isCMField.{u_1} (K : Type u_1) [Field K] [CharZero K] {S : Set ℕ} (hS : ∃ n ∈ S, 2 < n)
[IsCyclotomicExtension S ℚ K] : NumberField.IsCMField K
NumberField.maximalRealSubfield.{u_2} (K : Type u_2) [Field K] : Subfield K
NumberField.IsCMField.isQuadraticExtension.{u_1} (K : Type u_1) [Field K] [CharZero K] [NumberField.IsCMField K] :
Algebra.IsQuadraticExtension (↥(NumberField.maximalRealSubfield K)) K
NumberField.IsTotallyReal.finrank.{u_2} (K : Type u_2) [Field K] [NumberField K] [h : NumberField.IsTotallyReal K] :
Module.finrank ℚ K = NumberField.InfinitePlace.nrRealPlaces K
Module.finrank_mul_finrank.{u, v, w} (F : Type u) (K : Type v) (A : Type w) [Semiring F] [Semiring K] [AddCommMonoid A]
[Module F K] [Module K A] [Module F A] [IsScalarTower F K A] [StrongRankCondition F] [StrongRankCondition K]
[Module.Free F K] [Module.Free K A] : Module.finrank F K * Module.finrank K A = Module.finrank F A
NumberField.RingOfIntegers.basis.{u_1} (K : Type u_1) [Field K] [NumberField K] :
Module.Basis (Module.Free.ChooseBasisIndex ℤ (NumberField.RingOfIntegers K)) ℤ (NumberField.RingOfIntegers K)
NumberField.integralBasis.{u_1} (K : Type u_1) [Field K] [NumberField K] :
Module.Basis (Module.Free.ChooseBasisIndex ℤ (NumberField.RingOfIntegers K)) ℚ K
SharpDistanceScratch.lean:19:7: error(lean.unknownIdentifier): Unknown constant `Algebra.trace_one`
Algebra.trace.{u_1, u_2} (R : Type u_1) (S : Type u_2) [CommRing R] [CommRing S] [Algebra R S] : S →ₗ[R] R
Algebra.norm.{u_1, u_2} (R : Type u_1) {S : Type u_2} [CommRing R] [Ring S] [Algebra R S] : S →* R
Algebra.norm_eq_prod_embeddings.{u_6, u_7, u_9} {L : Type u_6} (K : Type u_7) [Field K] [Field$ /bin/bash -lc "sed -n '1,85p' Mathlib/NumberTheory/NumberField/Cyclotomic/Basic.lean && rg -n \"isCMField|trace_one|dist_orthogonalProjection_eq_infDist|def line|lineMap\" Mathlib/NumberTheory/NumberField/CMField.lean Mathlib/LinearAlgebra Mathlib/Geometry/Euclidean/Projection.lean Mathlib/Geometry/Euclidean/Basic.lean | sed -n '1,260p'"
/-
Copyright (c) 2022 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-/
module
public import Mathlib.LinearAlgebra.FreeModule.IdealQuotient
public import Mathlib.NumberTheory.Cyclotomic.Discriminant
public import Mathlib.NumberTheory.NumberField.Cyclotomic.Embeddings
public import Mathlib.NumberTheory.NumberField.Discriminant.Different
public import Mathlib.RingTheory.Polynomial.Eisenstein.IsIntegral
public import Mathlib.RingTheory.Prime
/-!
# Ring of integers of cyclotomic fields
We gather results about cyclotomic extensions of `ℚ`. In particular, we compute the ring of
integers of a cyclotomic extension of `ℚ`.
## Main results
* `IsCyclotomicExtension.Rat.isIntegralClosure_adjoin_singleton`: if `K` is a cyclotomic
extension of `ℚ`, then `adjoin ℤ {ζ}` is the integral closure of `ℤ` in `K`.
* `IsCyclotomicExtension.Rat.cyclotomicRing_isIntegralClosure`: the integral
closure of `ℤ` inside `CyclotomicField n ℚ` is `CyclotomicRing n ℤ ℚ`.
* `IsCyclotomicExtension.Rat.discr` and related results: the absolute discriminant
of cyclotomic fields.
-/
@[expose] public section
universe u
open Algebra IsCyclotomicExtension Polynomial NumberField
open scoped Cyclotomic Nat
variable {p k n : ℕ} {K : Type u} [Field K] {ζ : K} [hp : Fact p.Prime]
namespace IsCyclotomicExtension.Rat
variable [CharZero K]
variable (k K) in
theorem finrank [NeZero k] [IsCyclotomicExtension {k} ℚ K] : Module.finrank ℚ K = k.totient :=
IsCyclotomicExtension.finrank K <| Polynomial.cyclotomic.irreducible_rat (NeZero.pos _)
/-- The discriminant of the power basis given by `ζ - 1`. -/
theorem discr_prime_pow_ne_two' [IsCyclotomicExtension {p ^ (k + 1)} ℚ K]
(hζ : IsPrimitiveRoot ζ (p ^ (k + 1))) (hk : p ^ (k + 1) ≠ 2) :
discr ℚ (hζ.subOnePowerBasis ℚ).basis =
(-1) ^ ((p ^ (k + 1)).totient / 2) * p ^ (p ^ k * ((p - 1) * (k + 1) - 1)) := by
rw [← discr_prime_pow_ne_two hζ (cyclotomic.irr$ /bin/bash -lc "sed -n '305,335p' Mathlib/Geometry/Euclidean/Projection.lean; sed -n '180,200p' Mathlib/LinearAlgebra/Trace.lean; rg -n \"CyclotomicField.*instance|instance.*CyclotomicField|IsCyclotomicExtension.*CyclotomicField\" Mathlib/NumberTheory/Cyclotomic Mathlib/NumberTheory/NumberField/Cyclotomic | sed -n '1,180p'"
lemma dist_orthogonalProjection_eq_dist_iff_eq_of_mem {s : AffineSubspace 𝕜 P}
[s.direction.HasOrthogonalProjection] {p₁ p₂ : P} (hp₂ : p₂ ∈ s) :
haveI : Nonempty s := ⟨p₂, hp₂⟩
dist p₁ (orthogonalProjection s p₁) = dist p₁ p₂ ↔ orthogonalProjection s p₁ = p₂ := by
have : Nonempty s := ⟨p₂, hp₂⟩
constructor
· intro h
rwa [← sq_eq_sq₀ dist_nonneg dist_nonneg, pow_two, pow_two, dist_comm _ p₂,
dist_sq_eq_dist_orthogonalProjection_sq_add_dist_orthogonalProjection_sq _ hp₂,
right_eq_add, mul_eq_zero, dist_eq_zero, or_self, eq_comm] at h
· intro h
nth_rw 4 [← h]
/-- The distance between a point and its orthogonal projection to a subspace equals the distance
to that subspace as given by `Metric.infDist`. This is not a `simp` lemma since the simplest form
depends on the context (if any calculations are to be done with the distance, the version with
the orthogonal projection gives access to more lemmas about orthogonal projections that may be
useful). -/
lemma dist_orthogonalProjection_eq_infDist (s : AffineSubspace 𝕜 P) [Nonempty s]
[s.direction.HasOrthogonalProjection] (p : P) :
dist p (orthogonalProjection s p) = Metric.infDist p s := by
refine le_antisymm ?_ (Metric.infDist_le_dist_of_mem (orthogonalProjection_mem _))
rw [Metric.infDist_eq_iInf]
refine le_ciInf fun x ↦ le_of_sq_le_sq ?_ dist_nonneg
rw [dist_comm _ (x : P)]
simp_rw [pow_two,
dist_sq_eq_dist_orthogonalProjection_sq_add_dist_orthogonalProjection_sq p x.property]
simp [mul_self_nonneg]
/-- The nonnegative distance between a point and its orthogonal projection to a subspace equals
the distance to that subspace as given by `Metric.infNndist`. This is not a `simp` lemma since
/-- When `M` is finite free, the trace of a linear map corresponds to the contraction pairing under
the isomorphism `End(M) ≃ M* ⊗ M`. -/
theorem trace_eq_contract' :
LinearMap.trace R M = contractLeft R M ∘ₗ (dualTensorHomEquiv R M M).symm.toLinearMap := by
rw [dual**Planning imports and geometry proof approach** **Developing lower bound proof for infDist** **Defining RealLine structure and distance function**
**Analyzing norm and distance definitions** **Formulating line distance via inner product**
**Verifying trace zero square property**
$ /bin/bash -lc "rg -n \"IsTotallyReal.*embedding|isReal.*embedding|embedding_of_isReal|exists.*real.*embedding|RatAlgHom.*Real|K →\\+\\* ℝ\" Mathlib/NumberTheory/NumberField | sed -n '1,300p'"
Mathlib/NumberTheory/NumberField/Completion/InfinitePlace.lean:34: is real, then this extends the embedding `v.embedding_of_isReal : K →+* ℝ` to
Mathlib/NumberTheory/NumberField/Completion/InfinitePlace.lean:71:theorem isometry_embedding_of_isReal (hv : v.IsReal) :
Mathlib/NumberTheory/NumberField/Completion/InfinitePlace.lean:72: Isometry ((v.embedding_of_isReal hv).comp (WithAbs.equiv v.1).toRingHom) :=
Mathlib/NumberTheory/NumberField/Completion/InfinitePlace.lean:74: simpa using! v.norm_embedding_of_isReal hv (WithAbs.equiv v.1 x)
Mathlib/NumberTheory/NumberField/Completion/InfinitePlace.lean:229:/-- The embedding `K →+* ℝ` associated to a real infinite place extended to `v.Completion →+* ℝ`. -/
Mathlib/NumberTheory/NumberField/Completion/InfinitePlace.lean:231: (v.isometry_embedding_of_isReal hv).extensionHom.comp (equiv v).toRingHom
Mathlib/NumberTheory/NumberField/Completion/InfinitePlace.lean:240: extensionEmbeddingOfIsReal hv x = embedding_of_isReal hv (WithAbs.equiv v.1 x) :=
Mathlib/NumberTheory/NumberField/Completion/InfinitePlace.lean:241: (v.isometry_embedding_of_isReal hv).extensionHom_coe _
Mathlib/NumberTheory/NumberField/Completion/InfinitePlace.lean:250: (v.isometry_embedding_of_isReal hv).completion_extension.comp (isometry_toCompletion v)
Mathlib/NumberTheory/NumberField/Completion/InfinitePlace.lean:411: over := (comap_eq w v ▸ comap_embedding_of_isReal _ (comap_eq w v ▸ h)).symm
Mathlib/NumberTheory/NumberField/CanonicalEmbedding/ConvexBody.lean:66: embedding_of_isReal_apply, Subtype.forall, ← forall₂_or_left, ← not_isReal_iff_isComplex, em,
Mathlib/NumberTheory/NumberField/CanonicalEmbedding/ConvexBody.lean:159: embedding_of_isReal_apply, norm_embedding_eq, Subtype.forall]
Mathlib/NumberTheory/NumberField/InfinitePlace/Embeddings.lean:219:def IsReal.embedding {φ : K →+* ℂ} (hφ : IsReal φ) : K →+* ℝ where
Mathlib/NumberTheory/NumberField/CanonicalEmbedding/Basic.lean:34: then `φ_w : K →+* ℝ` and, if `w` is complex, `φ_w` i$ /bin/bash -lc "sed -n '80,115p' Mathlib/NumberTheory/NumberField/House.lean; sed -n '370,405p' Mathlib/NumberTheory/NumberField/InfinitePlace/Basic.lean; rg -n \"house.*embedding|embedding.*le_house|norm_le_house|abs.*house\" Mathlib/NumberTheory/NumberField/House.lean | sed -n '1,180p'"
use w.embedding
rwa [InfinitePlace.norm_embedding_eq]
lemma norm_embedding_le_house (α : K) (σ : K →+* ℂ) : ‖σ α‖ ≤ house α := by
rw [house_eq_sup']
exact Finset.le_sup' (f := (‖· α‖₊)) (Finset.mem_univ σ)
set_option backward.isDefEq.respectTransparency.types false in
lemma one_le_house_of_isIntegral {α : K} (hα : IsIntegral ℤ α) (hα0 : α ≠ 0) :
1 ≤ house α := by
have ⟨σ, hσ⟩ : ∃ σ : K →+* ℂ, 1 ≤ ‖σ α‖ := by
apply exists_conjugate_one_le_norm (K := K) (α := ⟨α, hα⟩)
simpa [RingOfIntegers.ext_iff]
apply hσ.trans (norm_embedding_le_house α σ)
lemma norm_norm_le_norm_mul_house_pow (α : K) (σ : K →+* ℂ) :
‖Algebra.norm ℚ α‖ ≤ ‖σ α‖ * house α ^ (Module.finrank ℚ K - 1) := by
classical
set σ' := σ.toRatAlgHom
calc _ = ‖∏ τ : K →ₐ[ℚ] ℂ, τ α‖ := ?_
_ = ‖(σ' α) * ∏ τ ∈ univ.erase σ', τ α‖ := by rw [mul_prod_erase univ (· α) (mem_univ σ')]
_ ≤ ‖σ' α‖ * ∏ τ ∈ univ.erase σ', ‖τ α‖ := ?_
_ ≤ ‖σ' α‖ * ∏ τ ∈ univ.erase σ', house α := by gcongr; apply norm_embedding_le_house
_ = ‖σ' α‖ * house α ^ (Module.finrank ℚ K - 1) := by simp
· rw [← Algebra.norm_eq_prod_embeddings, ← Rat.norm_cast_real,
Real.norm_eq_abs, eq_ratCast, Complex.norm_ratCast]
· rw [Complex.norm_mul]
gcongr
exact norm_prod_le (univ.erase σ') (· α)
end
end NumberField
namespace NumberField.house
theorem prod_eq_abs_norm (x : K) :
∏ w : InfinitePlace K, w x ^ mult w = abs (Algebra.norm ℚ x) := by
classical
convert! (congr_arg (‖·‖) (Algebra.norm_eq_prod_embeddings ℚ ℂ x)).symm
· rw [norm_prod, ← Fintype.prod_equiv (RingHom.equivRatAlgHom K ℂ) (fun f => ‖f x‖)
(fun φ => ‖φ x‖) fun _ => by simp [RingHom.equivRatAlgHom_apply]]
rw [← Finset.prod_fiberwise Finset.univ mk (fun φ => ‖φ x‖)]
have (w : InfinitePlace K) (φ) (hφ : φ ∈ ({φ | mk φ = w} : Finset _)) :
‖φ x‖ = w x := by rw [← (Finset.mem_filter.mp hφ).2, apply]
simp_rw [Finset.prod_congr rfl (this _), Finset.prod_const, card_filter_mk_eq]
· r$ /bin/bash -lc "rg -n \"trace_eq_sum.*embedding|trace_eq_sum_embeddings|sum_embeddings.*trace|trace.*prod_embeddings|Algebra.trace_eq_sum\" Mathlib | sed -n '1,260p'"
Mathlib/RingTheory/Trace/Basic.lean:36:* `trace_eq_sum_embeddings`: the trace of `x : K(x)` is the sum of all embeddings of `x` into an
Mathlib/RingTheory/Trace/Basic.lean:218:theorem trace_eq_sum_embeddings_gen (pb : PowerBasis K L)
Mathlib/RingTheory/Trace/Basic.lean:252:theorem trace_eq_sum_embeddings [FiniteDimensional K L] [Algebra.IsSeparable K L] {x : L} :
Mathlib/RingTheory/Trace/Basic.lean:257: trace_eq_sum_embeddings_gen E pb (IsAlgClosed.splits _), ← Algebra.smul_def,
Mathlib/RingTheory/Trace/Basic.lean:268: · rw [← trace_eq_sum_embeddings (AlgebraicClosure L) (x := x)]
Mathlib/RingTheory/Trace/Basic.lean:446: ext (i j); simp [trace_eq_sum_embeddings, embeddingsMatrix, Matrix.mul_apply]
Mathlib/RingTheory/Trace/Basic.lean:623: rw [← this, trace_eq_sum_embeddings (E := AlgebraicClosure K)]**Analyzing trace positivity for embeddings** **Planning Lean lemma for positive trace**
$ /bin/bash -lc "sed -n '240,265p' Mathlib/RingTheory/Trace/Basic.lean; sed -n '45,65p' Mathlib/NumberTheory/NumberField/InfinitePlace/TotallyRealComplex.lean; sed -n '210,250p' Mathlib/NumberTheory/NumberField/InfinitePlace/Embeddings.lean"
have : FiniteDimensional L F := FiniteDimensional.right K L F
have : Algebra.IsSeparable L F := Algebra.isSeparable_tower_top_of_isSeparable K L F
let : Fintype (L →ₐ[K] E) := PowerBasis.AlgHom.fintype pb
rw [Fintype.sum_equiv algHomEquivSigma (fun σ : F →ₐ[K] E => _) fun σ => σ.1 pb.gen,
← Finset.univ_sigma_univ, Finset.sum_sigma, ← Finset.sum_nsmul]
· refine Finset.sum_congr rfl fun σ _ => ?_
let : Algebra L E := σ.toRingHom.toAlgebra
simp_rw [Finset.sum_const, Finset.card_univ, ← AlgHom.card L F E]
· intro σ
simp only [algHomEquivSigma, Equiv.coe_fn_mk, AlgHom.domRestrict, AlgHom.comp_apply,
IsScalarTower.coe_toAlgHom']
theorem trace_eq_sum_embeddings [FiniteDimensional K L] [Algebra.IsSeparable K L] {x : L} :
algebraMap K E (Algebra.trace K L x) = ∑ σ : L →ₐ[K] E, σ x := by
have hx := Algebra.IsSeparable.isIntegral K x
let pb := adjoin.powerBasis hx
rw [trace_eq_trace_adjoin K x, Algebra.smul_def, map_mul, ← adjoin.powerBasis_gen hx,
trace_eq_sum_embeddings_gen E pb (IsAlgClosed.splits _), ← Algebra.smul_def,
algebraMap_smul]
· exact (sum_embeddings_eq_finrank_mul L E pb).symm
· have := Algebra.isSeparable_tower_bot_of_isSeparable K K⟮x⟯ L
exact Algebra.IsSeparable.isSeparable K _
theorem trace_eq_sum_automorphisms (x : L) [FiniteDimensional K L] [IsGalois K L] :
algebraMap K L (Algebra.trace K L x) = ∑ σ : Gal(L/K), σ x := by
apply FaithfulSMul.algebraMap_injective L (AlgebraicClosure L)
/-- A field `K` is totally real if all of its infinite places are real. In other words,
the image of every ring homomorphism `K → ℂ` is a subset of `ℝ`. -/
@[mk_iff] class IsTotallyReal (K : Type*) [Field K] where
isReal : ∀ v : InfinitePlace K, v.IsReal
variable {F : Type*} [Field F] {K : Type*} [Field K]
theorem nrComplexPlaces_eq_zero_iff [NumberField K] :
nrComplexPlaces K = 0 ↔ IsTotallyReal K := by
simp [Fintype.card_eq_zero_iff, isEmpty_subtype, isTotallyReal_iff]
theorem IsTotallyReal.complexEm$ /bin/bash -lc "rg -n \"complexEmbedding_isReal|IsTotallyReal.isReal|isReal_iff.*re|IsReal.*coe|IsReal.*im|map.*re\" Mathlib/NumberTheory/NumberField/InfinitePlace | sed -n '1,260p'"
Mathlib/NumberTheory/NumberField/InfinitePlace/Embeddings.lean:221: map_one' := by simp only [map_one, one_re]
Mathlib/NumberTheory/NumberField/InfinitePlace/Embeddings.lean:223: simp only [Complex.conj_eq_iff_im.mp (RingHom.congr_fun hφ _), map_mul, mul_re,
Mathlib/NumberTheory/NumberField/InfinitePlace/Embeddings.lean:225: map_zero' := by simp only [map_zero, zero_re]
Mathlib/NumberTheory/NumberField/InfinitePlace/Embeddings.lean:226: map_add' := by simp only [map_add, add_re, forall_const]
Mathlib/NumberTheory/NumberField/InfinitePlace/Embeddings.lean:229:theorem IsReal.coe_embedding_apply {φ : K →+* ℂ} (hφ : IsReal φ) (x : K) :
Mathlib/NumberTheory/NumberField/InfinitePlace/Embeddings.lean:237: IsReal (φ.comp f) := by ext1 x; simpa using RingHom.congr_fun hφ (f x)
Mathlib/NumberTheory/NumberField/InfinitePlace/TotallyRealComplex.lean:56:theorem IsTotallyReal.complexEmbedding_isReal [IsTotallyReal K] (φ : K →+* ℂ) :
Mathlib/NumberTheory/NumberField/InfinitePlace/TotallyRealComplex.lean:65: isReal _ := (isReal_comap_iff f).mp <| IsTotallyReal.isReal _
Mathlib/NumberTheory/NumberField/InfinitePlace/TotallyRealComplex.lean:72: exact IsReal.comap _ (IsTotallyReal.isReal W)
Mathlib/NumberTheory/NumberField/InfinitePlace/Basic.lean:246: ComplexEmbedding.IsReal.coe_embedding_apply (isReal_iff.mp hw) x
Mathlib/NumberTheory/NumberField/InfinitePlace/Basic.lean:344:/-- The map from real embeddings to real infinite places as an equiv -/
Mathlib/NumberTheory/NumberField/InfinitePlace/Basic.lean:353:/-- The map from nonreal embeddings to complex infinite places -/
Mathlib/NumberTheory/NumberField/InfinitePlace/Basic.lean:519: rw [NumberField.InfinitePlace.isReal_iff] at hwreal
Mathlib/NumberTheory/NumberField/InfinitePlace/Ramification.lean:19:* `NumberField.InfinitePlace.comap`: the restriction of an infinite place along an embedding.
Mathlib/NumberTheory/NumberField/InfinitePlace/Ramification.lean:294: exact isReal_iff.1 <| (isUnramified_iff.1 h).resolve_rig$ /bin/bash -lc "rg -n \"traceForm.*pos|pos.*traceForm|trace.*sq.*pos|trace.*mul_self|trace.*pow_two|IsTotallyReal.*trace|TotallyReal.*trace|positive.*trace\" Mathlib | sed -n '1,300p'"
Mathlib/Analysis/Matrix/Order.lean:29: positive semi-definite matrix `M`: `⟪x, y⟫ = (y * M * xᴴ).trace`.
Mathlib/Analysis/Matrix/Order.lean:328: conjTranspose_conjTranspose, mul_assoc, trace_conjTranspose_mul_self_eq_zero_iff] at hx
Mathlib/Analysis/Matrix/PosDef.lean:54: conv_lhs => rw [hA.1.spectral_theorem, conjStarAlgAut_apply, trace_mul_cycle, coe_star_mul_self,
Mathlib/LinearAlgebra/Matrix/Charpoly/Coeff.lean:201: rw [Algebra.smul_def (trace M), ← C_eq_algebraMap, pow_two, ← mul_assoc, add_assoc,
Mathlib/LinearAlgebra/Matrix/PosDef.lean:375:theorem trace_conjTranspose_mul_self_eq_zero_iff {A : Matrix m n R} :
Mathlib/LinearAlgebra/Matrix/PosDef.lean:381: simpa using trace_conjTranspose_mul_self_eq_zero_iff (A := Aᴴ)
Mathlib/RingTheory/Discriminant.lean:148: traceMatrix_eq_embeddingsMatrixReindex_mul_trans, det_mul, det_transpose, pow_two]**Exploring alternate positivity proof approaches** **Formulating integral multiple basis approach**
$ /bin/bash -lc "rg -n \"rank_ker.*LinearMap|finrank_ker_add|finrank_ker|finrank.*ker|rank_nullity|finrank_quotient_add_finrank\" Mathlib/LinearAlgebra | sed -n '1,260p'" Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:48: rw [← s.finrank_quotient_add_finrank, add_comm] Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:96: ← finrank_quotient_add_finrank W] at aux Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:104: · rw [← W.finrank_quotient_add_finrank, add_comm, add_le_add_iff_left, hW] Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:146: rw [← @add_right_cancel_iff _ _ _ (finrank K p), Submodule.finrank_quotient_add_finrank, Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:147: LinearEquiv.finrank_eq f₁, Submodule.finrank_quotient_add_finrank, Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:155: rw [← add_right_cancel_iff, Submodule.finrank_quotient_add_finrank, ← LinearEquiv.finrank_eq f, Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:156: add_comm, Submodule.finrank_quotient_add_finrank] Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:173:theorem finrank_range_add_finrank_ker [FiniteDimensional K V] (f : V →ₗ[K] V₂) : Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:174: finrank K (LinearMap.range f) + finrank K (LinearMap.ker f) = finrank K V := by Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:176: exact Submodule.finrank_quotient_add_finrank _ Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:181: have h₁ := f.finrank_range_add_finrank_ker Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:183: suffices 0 < finrank K (LinearMap.ker f) from Submodule.one_le_finrank_iff.mp this Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:200: have := finrank_range_add_finrank_ker f Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:400: ∃ k : ℕ, k ≤ finrank K V ∧ LinearMap.ker (f ^ k) = LinearMap.ker (f ^ k.succ) := by Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:404: n ≤ finrank K (LinearMap.ker (f ^ n)) := by Mathlib/LinearAlgebra/FiniteDimensional/Lemmas.lean:414: finrank K (LinearMap.ker (f ^ n)) < finrank K (LinearMap.ker (f ^ n.
$ /bin/bash -lc "rg -n \"exists.*IsIntegral.*nsmul|exists.*isIntegral.*mul|exists_nat.*IsIntegral|exists_int.*IsIntegral|IsIntegral.*exists.*nat|denom.*integral|multiple.*integral\" Mathlib/FieldTheory Mathlib/NumberTheory/RingOfIntegers Mathlib/NumberTheory/NumberField | sed -n '1,300p'" rg: Mathlib/NumberTheory/RingOfIntegers: No such file or directory (os error 2)
$ /bin/bash -lc "rg -n \"Basis.*ker|basis.*Submodule|Submodule.*basis|Module.Free.chooseBasis.*ker|basisOf.*ker\" Mathlib/LinearAlgebra | sed -n '1,220p'"
Mathlib/LinearAlgebra/Dual/Basis.lean:179:theorem eval_ker {ι : Type*} (b : Basis ι R M) : LinearMap.ker (Dual.eval R M) = ⊥ :=
Mathlib/LinearAlgebra/FreeModule/PID.lean:34:- `Submodule.exists_basis_of_pid`: if `R` is a PID, then `N : Submodule R M` is
Mathlib/LinearAlgebra/FreeModule/PID.lean:38:- `Submodule.smithNormalForm`: if `R` is a PID, then `M` has a basis
Mathlib/LinearAlgebra/FreeModule/PID.lean:142:/-- The induction hypothesis of `Submodule.basisOfPid` and `Submodule.smithNormalForm`.
Mathlib/LinearAlgebra/FreeModule/PID.lean:153:theorem Submodule.basis_of_pid_aux [Finite ι] {O : Type*} [AddCommGroup O] [Module R O]
Mathlib/LinearAlgebra/FreeModule/PID.lean:276:see `Submodule.basisOfPid`.
Mathlib/LinearAlgebra/FreeModule/PID.lean:280:theorem Submodule.nonempty_basis_of_pid {ι : Type*} [Finite ι] (b : Basis ι R M)
Mathlib/LinearAlgebra/FreeModule/PID.lean:290: Submodule.basis_of_pid_aux ⊤ N b' N_bot le_top
Mathlib/LinearAlgebra/FreeModule/PID.lean:300:noncomputable def Submodule.basisOfPid {ι : Type*} [Finite ι] (b : Basis ι R M)
Mathlib/LinearAlgebra/FreeModule/PID.lean:304:theorem Submodule.basisOfPid_bot {ι : Type*} [Finite ι] (b : Basis ι R M) :
Mathlib/LinearAlgebra/FreeModule/PID.lean:305: Submodule.basisOfPid b ⊥ = ⟨0, Basis.empty _⟩ := by
Mathlib/LinearAlgebra/FreeModule/PID.lean:306: obtain ⟨n, b'⟩ := Submodule.basisOfPid b ⊥
Mathlib/LinearAlgebra/FreeModule/PID.lean:316:noncomputable def Submodule.basisOfPidOfLE {ι : Type*} [Finite ι] {N O : Submodule R M}
Mathlib/LinearAlgebra/FreeModule/PID.lean:318: let ⟨n, bN'⟩ := Submodule.basisOfPid b (N.comap O.subtype)
Mathlib/LinearAlgebra/FreeModule/PID.lean:323:noncomputable def Submodule.basisOfPidOfLESpan {ι : Type*} [Finite ι] {b : ι → M}
Mathlib/LinearAlgebra/FreeModule/PID.lean:326: Submodule.basisOfPidOfLE le (Basis.span hb)
Mathlib/LinearAlgebra/FreeModule/PID.lean:372: obtain ⟨n, b : Basis (Fin n) R (LinearMap.range φ)⟩ := Submodule.basisOfPidOfLE this sI_basis
Mathlib/LinearAlgebra**Expanding command scope due to path error**
$ /bin/bash -lc "rg -n \"exists.*(nsmul|mul).*IsIntegral|exists.*IsIntegral.*(nsmul|mul)|IsIntegral.*(nsmul|mul)|multiple.*integral|integer.*multiple|denominator.*integral\" Mathlib/FieldTheory Mathlib/NumberTheory | sed -n '1,320p'"
Mathlib/NumberTheory/MahlerMeasure.lean:164: grind [IsIntegral, RingHom.IsIntegralElem, mem_roots', IsRoot.def, eval₂_mul, eval_map]
Mathlib/NumberTheory/MahlerMeasure.lean:218:/-- If an integer non-constant polynomial has Mahler measure equal to 1 and is not a multiple of
Mathlib/NumberTheory/Height/NumberField.lean:386: {x : K | IsIntegral ℤ (n * x) ∧ mulHeight₁ x ≤ B}.Finite := by
Mathlib/NumberTheory/Height/NumberField.lean:389: {x | IsIntegral ℤ (n * x) ∧ mulHeight₁ x ≤ B} from
Mathlib/NumberTheory/Height/NumberField.lean:406: ⋃ n : Fin ⌊B⌋₊, {x : K | IsIntegral ℤ ((n + 1) * x) ∧ mulHeight₁ x ≤ B} := by
Mathlib/NumberTheory/FrobeniusNumber.lean:21:largest positive integer that cannot be expressed as a sum of nonnegative multiples of these
Mathlib/NumberTheory/RamificationInertia/Basic.lean:200: obtain ⟨a, hag, j, hjs, hgI⟩ := Ideal.exist_integer_multiples_notMem hRS s g hj's hj'g
Mathlib/FieldTheory/Minpoly/IsIntegrallyClosed.lean:175:lemma _root_.IsIntegrallyClosed.minpoly_smul {r : R} (hr : r ≠ 0) {s : S} (hs : IsIntegral R s) :
Mathlib/FieldTheory/RatFunc/Luroth.lean:126:-- we first define `Φ'` as any integer multiple of `φ`, and then set `Φ` to be its**Defining trace-zero generators framework** **Verifying trace_one theorem existence**
$ /bin/bash -lc "rg -n \"def trace\" Mathlib/RingTheory/Trace Mathlib/LinearAlgebra/Trace.lean | sed -n '1,160p'; sed -n '120,190p' Mathlib/RingTheory/Trace/Defs.lean 2>/dev/null || true"
Mathlib/LinearAlgebra/Trace.lean:48:def traceAux : (M →ₗ[R] M) →ₗ[R] R :=
Mathlib/LinearAlgebra/Trace.lean:75:def trace : (M →ₗ[R] M) →ₗ[R] R :=
Mathlib/RingTheory/Trace/Defs.lean:71:noncomputable def trace : S →ₗ[R] R :=
Mathlib/RingTheory/Trace/Defs.lean:171:noncomputable def traceForm : BilinForm R S :=
Mathlib/RingTheory/Trace/Defs.lean:176:-- This is a nicer lemma than the one produced by `@[simps] def traceForm`.
Mathlib/RingTheory/Trace/Basic.lean:341:noncomputable def traceMatrix (b : κ → B) : Matrix κ κ A :=
trace R S (trace S T x) = trace R T x := by
have := Classical.decEq ι
have := Classical.decEq κ
cases nonempty_fintype ι
cases nonempty_fintype κ
rw [trace_eq_matrix_trace (b.smulTower c), trace_eq_matrix_trace b, trace_eq_matrix_trace c,
Matrix.trace, Matrix.trace, Matrix.trace, ← Finset.univ_product_univ, Finset.sum_product]
refine Finset.sum_congr rfl fun i _ ↦ ?_
simp only [map_sum, smulTower_leftMulMatrix, Finset.sum_apply, Matrix.diag,
Finset.sum_apply i (Finset.univ : Finset κ) fun y => leftMulMatrix b (leftMulMatrix c x y y)]
theorem trace_comp_trace_of_basis [Algebra S T] [IsScalarTower R S T] {ι κ : Type*} [Finite ι]
[Finite κ] (b : Basis ι R S) (c : Basis κ S T) :
(trace R S).comp ((trace S T).restrictScalars R) = trace R T := by
ext
rw [LinearMap.comp_apply, LinearMap.restrictScalars_apply, trace_trace_of_basis b c]
@[simp]
theorem trace_trace [Algebra S T] [IsScalarTower R S T]
[Module.Free R S] [Module.Finite R S] [Module.Free S T] [Module.Finite S T] (x : T) :
trace R S (trace S T x) = trace R T x :=
trace_trace_of_basis (Module.Free.chooseBasis R S) (Module.Free.chooseBasis S T) x
/-- Let `T / S / R` be a tower of finite extensions of fields. Then
$\text{Trace}_{T/R} = \text{Trace}_{S/R} \circ \text{Trace}_{T/S}$. -/
@[simp, stacks 0BIJ "Trace"]
theorem trace_comp_trace [Algebra S T] [IsScalarTower R S T]
[Module.Free R S] [Module.Finite R S] [Module.Free S T] [Module.Finite S T] :
$ /bin/bash -lc "rg -n \"RingOfIntegers.rank|theorem rank\" Mathlib/NumberTheory/NumberField/Basic.lean | sed -n '1,140p'; sed -n '330,410p' Mathlib/NumberTheory/NumberField/Basic.lean"
413:theorem RingOfIntegers.rank : Module.finrank ℤ (𝓞 K) = Module.finrank ℚ K :=
`M → 𝓞 K`. -/
def restrict (f : M → K) (h : ∀ x, IsIntegral ℤ (f x)) (x : M) : 𝓞 K :=
⟨f x, h x⟩
/-- Given `f : M →+ K` such that `∀ x, IsIntegral ℤ (f x)`, the corresponding function
`M →+ 𝓞 K`. -/
def restrict_addMonoidHom [AddZeroClass M] (f : M →+ K) (h : ∀ x, IsIntegral ℤ (f x)) :
M →+ 𝓞 K where
toFun := restrict f h
map_zero' := by simp only [restrict, map_zero]; rfl
map_add' x y := by simp only [restrict, map_add]; rfl
/-- Given `f : M →* K` such that `∀ x, IsIntegral ℤ (f x)`, the corresponding function
`M →* 𝓞 K`. -/
def restrict_monoidHom [MulOneClass M] (f : M →* K) (h : ∀ x, IsIntegral ℤ (f x)) : M →* 𝓞 K where
toFun := restrict f h
map_one' := by simp only [restrict, map_one]; rfl
map_mul' x y := by simp only [restrict, map_mul]; rfl
section extension
variable (K L : Type*) [Field K] [Field L] [Algebra K L]
instance : IsScalarTower (𝓞 K) (𝓞 L) L :=
IsScalarTower.of_algebraMap_eq' rfl
instance : IsIntegralClosure (𝓞 L) (𝓞 K) L :=
IsIntegralClosure.tower_top (R := ℤ)
/-- The ring of integers of `L` is isomorphic to any integral closure of `𝓞 K` in `L` -/
protected noncomputable def algEquiv (R : Type*) [CommRing R] [Algebra (𝓞 K) R] [Algebra R L]
[IsScalarTower (𝓞 K) R L] [IsIntegralClosure R (𝓞 K) L] : 𝓞 L ≃ₐ[𝓞 K] R :=
(IsIntegralClosure.equiv (𝓞 K) R L _).symm
/-- Any extension between ring of integers is integral. -/
instance extension_algebra_isIntegral : Algebra.IsIntegral (𝓞 K) (𝓞 L) :=
IsIntegralClosure.isIntegral_algebra (𝓞 K) L
/-- Any extension between ring of integers of number fields is Noetherian. -/
instance extension_isNoetherian [NumberField K] [NumberField L] : IsNoetherian (𝓞 K) (𝓞 L) :=
IsIntegralClosure.isNoetherian (𝓞 K) K L (𝓞 L)
/-- The kernel of the algebraMap between ring of integers is `⊥`. -/
theorem ker_algebraMap_eq_bot : RingHom.ker (algebraMap (𝓞 K) (𝓞 L)) = ⊥ :=
(RingHom.ker_eq_bot_iff_eq_zero (algebr$ /bin/bash -lc "rg -n \"theorem trace_one|lemma trace_one|\\[simp\\].*trace.*1|trace.*one\" Mathlib/RingTheory/Trace Mathlib | rg \"Algebra|trace_one\" | sed -n '1,220p'"
Mathlib/RingTheory/DedekindDomain/Different.lean:792: simp only [Algebra.traceForm_apply, mul_one] at hz
Mathlib/LinearAlgebra/Trace.lean:190:theorem trace_one : trace R M 1 = (finrank R M : R) := by
Mathlib/LinearAlgebra/Trace.lean:194: rw [trace_eq_matrix_trace R b, toMatrix_one, finrank_eq_card_chooseBasisIndex]
Mathlib/LinearAlgebra/Trace.lean:199:theorem trace_id : trace R M id = (finrank R M : R) := by rw [← Module.End.one_eq_id, trace_one]
Mathlib/LinearAlgebra/Matrix/Kronecker.lean:227:/-- `trace` distributes over `Matrix.kroneckerMapBilinear`.
Mathlib/LinearAlgebra/Matrix/Kronecker.lean:229:This is primarily used with `R = ℕ` to prove `Matrix.trace_kronecker`. -/
Mathlib/LinearAlgebra/Matrix/Kronecker.lean:230:theorem trace_kroneckerMapBilinear [Semiring S] [Semiring R] [Fintype m] [Fintype n]
Mathlib/LinearAlgebra/Matrix/Kronecker.lean:235: trace (kroneckerMapBilinear f A B) = f (trace A) (trace B) := by
Mathlib/LinearAlgebra/Matrix/Kronecker.lean:236: simp_rw [Matrix.trace, Matrix.diag, kroneckerMapBilinear_apply_apply, LinearMap.map_sum₂,
Mathlib/LinearAlgebra/Matrix/Kronecker.lean:398:theorem trace_kronecker [Fintype m] [Fintype n] [Semiring α] (A : Matrix m m α) (B : Matrix n n α) :
Mathlib/LinearAlgebra/Matrix/Kronecker.lean:400: trace_kroneckerMapBilinear (Algebra.lmul ℕ α).toLinearMap _ _
Mathlib/LinearAlgebra/Matrix/Kronecker.lean:527:theorem trace_kroneckerTMul [Fintype m] [Fintype n] (A : Matrix m m α) (B : Matrix n n β) :
Mathlib/LinearAlgebra/Matrix/Kronecker.lean:529: trace_kroneckerMapBilinear (TensorProduct.mk R α β) _ _
Mathlib/LinearAlgebra/Matrix/Charpoly/Coeff.lean:139:theorem trace_eq_neg_charpoly_coeff [Nonempty n] (M : Matrix n n R) :
Mathlib/LinearAlgebra/Matrix/PosDef.lean:500:lemma trace_pos [Nontrivial R] [IsOrderedCancelAddMonoid R] [Nonempty n] {A : Matrix n n R}
Mathlib/LinearAlgebra/Matrix/Trace.lean:146:theorem trace_one : trace (1 : Matrix n n R) = Fintype.card n := by
Mathlib/LinearAlgebra/Matrix/Trace.lean:147:**Analyzing trace definition and bounding embeddings** **Defining coefficient boxes and counting cardinalities**
**Constructing coordinate scaling for embeddings** **Establishing embedding bounds using house norm**
**Analyzing house norm for linear combinations**
$ /bin/bash -lc "sed -n '1,90p' Mathlib/NumberTheory/NumberField/House.lean; rg -n \"house_(add|mul|neg|nsmul|smul|pow)|house.*add|house.*mul|house_nonneg|norm_house\" Mathlib/NumberTheory/NumberField/House.lean | sed -n '1,240p'"
/-
Copyright (c) 2024 Michail Karatarakis. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Michail Karatarakis
-/
module
public import Mathlib.NumberTheory.SiegelsLemma
public import Mathlib.NumberTheory.NumberField.CanonicalEmbedding.Basic
public import Mathlib.NumberTheory.NumberField.EquivReindex
/-!
# House of an algebraic number
This file defines the house of an algebraic number `α`, which is
the largest of the modulus of its conjugates.
## References
* [D. Marcus, *Number Fields*][marcus1977number]
* [Hua, L.-K., *Introduction to number theory*][hua1982house]
## Tags
number field, algebraic number, house
-/
@[expose] public section
variable {K : Type*} [Field K] [NumberField K]
namespace NumberField
noncomputable section
open Module.Free Module canonicalEmbedding Matrix Finset
attribute [local instance] Matrix.seminormedAddCommGroup
/-- The house of an algebraic number as the norm of its image by the canonical embedding. -/
def house (α : K) : ℝ := ‖canonicalEmbedding K α‖
/-- The house is the largest of the modulus of the conjugates of an algebraic number. -/
theorem house_eq_sup' (α : K) :
house α = univ.sup' univ_nonempty (fun φ : K →+* ℂ ↦ ‖φ α‖₊) := by
rw [house, ← coe_nnnorm, nnnorm_eq, ← sup'_eq_sup univ_nonempty]
theorem house_sum_le_sum_house {ι : Type*} (s : Finset ι) (α : ι → K) :
house (∑ i ∈ s, α i) ≤ ∑ i ∈ s, house (α i) := by
simp only [house, map_sum]; apply norm_sum_le_of_le; intros; rfl
theorem house_nonneg (α : K) : 0 ≤ house α := norm_nonneg _
theorem house_mul_le (α β : K) : house (α * β) ≤ house α * house β := by
simp only [house, map_mul]; apply norm_mul_le
lemma house_prod_le (s : Finset K) : house (∏ x ∈ s, x) ≤ ∏ x ∈ s, house x := by
simpa [house, map_prod] using Finset.norm_prod_le _ _
theorem house_add_le (α β : K) : house (α + β) ≤ house α + house β := by
simp only [house, map_add]; apply norm_add_le
theorem house_pow_le (α : K) (i : ℕ) : house ($ /bin/bash -lc "rg -n \"norm_norm_le_norm_mul_house_pow|one_le_house_of_isIntegral\" Mathlib/NumberTheory/NumberField/House.lean; rg -n \"norm_eq.*ofReal|ofReal.*norm|Complex.ofRealHom\" Mathlib/Data/Complex Mathlib/Analysis/Complex | sed -n '1,180p'"
88:lemma one_le_house_of_isIntegral {α : K} (hα : IsIntegral ℤ α) (hα0 : α ≠ 0) :
95:lemma norm_norm_le_norm_mul_house_pow (α : K) (σ : K →+* ℂ) :
Mathlib/Analysis/Complex/JensenFormula.lean:74: rw [← ofReal_inj, ← normSq_eq_norm_sq, normSq_sub ]
Mathlib/Analysis/Complex/Poisson.lean:115: simp only [Complex.norm_mul, norm_real, norm_eq_abs, norm_exp_ofReal_mul_I, mul_one, sq_abs,
Mathlib/Analysis/Complex/Poisson.lean:183: I_re, I_im, add_im, sub_im, mul_im, div_im, ofReal_im, normSq_apply]
Mathlib/Analysis/Complex/Trigonometric.lean:874: simpa [← ofReal_cos, ← norm_eq_abs, ← norm_real] using Complex.cos_bound (x := x) (by simpa)
Mathlib/Analysis/Complex/Trigonometric.lean:877: simpa [← ofReal_sin, ← norm_eq_abs, ← norm_real] using Complex.sin_bound (x := x) (by simpa)
Mathlib/Analysis/Complex/Trigonometric.lean:978: rw [add_neg_cancel, ofReal_zero, zero_mul, exp_zero, add_halves, ← neg_mul, Complex.norm_mul,
Mathlib/Analysis/Complex/Trigonometric.lean:980: show -(ofReal (x / 2)) = ofReal (-x / 2) by norm_cast; exact neg_div' 2 x,
Mathlib/Analysis/Complex/Trigonometric.lean:981: norm_exp_ofReal_mul_I, one_mul, ← norm_neg, neg_sub, mul_comm]
Mathlib/Analysis/Complex/Trigonometric.lean:984: rw [exp_eq_exp_re_mul_sin_add_cos, Complex.norm_mul, norm_exp_ofReal, norm_cos_add_sin_mul_I,
Mathlib/Analysis/Complex/PhragmenLindelof.lean:147: apply ((continuous_ofReal.mul continuous_const).cexp.smul continuous_const).norm.tendsto'
Mathlib/Analysis/Complex/Norm.lean:130: rw [← ofReal_intCast, norm_real, Real.norm_eq_abs]
Mathlib/Analysis/Complex/Norm.lean:281: simpa only [← ofReal_sub, norm_real, sub_re, sub_im] using (abs_im_le_norm _).trans_lt <| H _ ij
Mathlib/Analysis/Complex/AbelLimit.lean:70: simp only [Set.mem_ofPred_eq, stolzSet, ← ofReal_one, ← ofReal_sub, norm_real,
Mathlib/Analysis/Complex/Hadamard.lean:403: simp only [norm_mul, ← ofReal_add, norm_cpow_eq_rpow_re_of_pos (sSupNormIm_eps_pos f hε _) _,
Mathlib/Analysis/Complex/OperatorNorm.lean$ /bin/bash -lc "rg -n \"card_fun|Fintype.card.*→|card_pi|card_congr.*fun|card_fin\" Mathlib/Data/Fintype Mathlib | sed -n '1,220p'"
Mathlib/Data/Fintype/Card.lean:386:theorem Fintype.card_subtype_le [Fintype α] (p : α → Prop) [Fintype {a // p a}] :
Mathlib/Data/Fintype/Card.lean:390:lemma Fintype.card_subtype_lt [Fintype α] {p : α → Prop} [Fintype {a // p a}] {x : α} (hx : ¬p x) :
Mathlib/Data/Fintype/Card.lean:395:theorem Fintype.card_subtype [Fintype α] (p : α → Prop) [Fintype {a // p a}] [DecidablePred p] :
Mathlib/Data/Fintype/Card.lean:401:theorem Fintype.card_subtype_compl [Fintype α] (p : α → Prop) [Fintype { x // p x }]
Mathlib/Data/Fintype/Card.lean:410:theorem Fintype.card_subtype_mono (p q : α → Prop) (h : p ≤ q) [Fintype { x // p x }]
Mathlib/Data/Fintype/Card.lean:415:theorem Fintype.card_compl_eq_card_compl [Finite α] (p q : α → Prop) [Fintype { x // p x }]
Mathlib/Data/Fintype/Card.lean:483: (∀ (β) [Fintype β], Fintype.card β < Fintype.card α → P β) → P α) :
Mathlib/Data/Fintype/Card.lean:497:theorem Fintype.card_fin (n : ℕ) : Fintype.card (Fin n) = n :=
Mathlib/Data/Fintype/Card.lean:500:theorem Fintype.card_fin_lt_of_le {m n : ℕ} (h : m ≤ n) :
Mathlib/Data/Fintype/Card.lean:502: conv_rhs => rw [← Fintype.card_fin m]
Mathlib/Data/Fintype/Card.lean:507:theorem Finset.card_fin (n : ℕ) : #(univ : Finset (Fin n)) = n := by simp
Mathlib/Data/Fintype/Card.lean:512: (Fintype.card_fin m).symm.trans <| (Fintype.card_congr <| Equiv.cast h).trans (Fintype.card_fin n)
Mathlib/Data/Fintype/Card.lean:524:theorem card_finset_fin_le {n : ℕ} (s : Finset (Fin n)) : #s ≤ n := by
Mathlib/Data/Fintype/Card.lean:525: simpa only [Fintype.card_fin] using s.card_le_univ
Mathlib/Data/Fintype/BigOperators.lean:116:@[simp] lemma Finset.card_pi (s : Finset ι) (t : ∀ i, Finset (α i)) :
Mathlib/Data/Fintype/BigOperators.lean:117: #(s.pi t) = ∏ i ∈ s, #(t i) := Multiset.card_pi _ _
Mathlib/Data/Fintype/BigOperators.lean:123:@[simp] lemma card_piFinset (s : ∀ i, Finset (α i)) :
Mathlib/Data/Fintype/BigOperators.lean:128:`Fintype.card_piFinset`. -/
Mathlib/Data/Fintype/BigOperators.lean:129:lemma card_**Starting formal geometry definitions** **Planning distance infimum lemma proof**
$ /bin/bash -lc "rg -n \"theorem infDist_eq_iInf|lemma infDist_eq_iInf|infDist_le_dist_of_mem|le_infDist|infDist.*lower\" Mathlib/Topology/MetricSpace | sed -n '1,240p'"
Mathlib/Topology/MetricSpace/Closeds.lean:362: exact infDist_le_infDist_add_hausdorffDist (edist_ne_top t s)
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:576:theorem infDist_eq_iInf : infDist x s = ⨅ y : s, dist x y := by
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:617:theorem infDist_le_dist_of_mem (h : y ∈ s) : infDist x s ≤ dist x y := by
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:622:theorem infDist_le_infDist_of_subset (h : s ⊆ t) (hs : s.Nonempty) : infDist x t ≤ infDist x s :=
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:625:lemma le_infDist {r : ℝ} (hs : s.Nonempty) : r ≤ infDist x s ↔ ∀ ⦃y⦄, y ∈ s → r ≤ dist x y := by
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:631: simp [← not_le, le_infDist hs]
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:635:theorem infDist_le_infDist_add_dist : infDist x s ≤ infDist y s + dist x y := by
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:641: h.not_ge <| infDist_le_dist_of_mem hy
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:656:theorem dist_le_infDist_add_diam (hs : IsBounded s) (hy : y ∈ s) :
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:665: LipschitzWith.of_le_add fun _ _ => infDist_le_infDist_add_dist
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:719: refine le_antisymm ?_ (infDist_le_infDist_of_subset inter_subset_left ⟨y, h⟩)
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:723: · exact hz.not_ge (infDist_le_dist_of_mem ⟨hzs, hle⟩)
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:725: exact (hlt.trans hz).not_ge (infDist_le_dist_of_mem h)
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:758: LipschitzWith.of_le_add fun _ _ => infDist_le_infDist_add_dist
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:847: exact le_trans (infDist_le_dist_of_mem yt) hy
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:850: exact le_trans (infDist_le_dist_of_mem ys) hy
Mathlib/Topology/MetricSpace/HausdorffDistance.lean:890:theorem infDi$ /bin/bash -lc "rg -n \"abs_inner_le_norm|abs.*inner.*norm|real_inner_comm|inner_smul|norm_smul\" Mathlib/Analysis/InnerProductSpace/Basic.lean | sed -n '1,220p'" 59:theorem real_inner_comm (x y : F) : ⟪y, x⟫_ℝ = ⟪x, y⟫_ℝ := 87:/-- See `inner_smul_left` for the common special when `𝕜 = 𝕝`. -/ 88:lemma inner_smul_left_eq_star_smul (x y : E) (r : 𝕝) : ⟪r • x, y⟫ = r† • ⟪x, y⟫ := by 92:/-- Special case of `inner_smul_left_eq_star_smul` when the acting ring has a trivial star 94:lemma inner_smul_left_eq_smul [TrivialStar 𝕝] (x y : E) (r : 𝕝) : ⟪r • x, y⟫ = r • ⟪x, y⟫ := by 95: rw [inner_smul_left_eq_star_smul, starRingEnd_apply, star_trivial] 97:/-- See `inner_smul_right` for the common special when `𝕜 = 𝕝`. -/ 98:lemma inner_smul_right_eq_smul (x y : E) (r : 𝕝) : ⟪x, r • y⟫ = r • ⟪x, y⟫ := by 99: rw [← inner_conj_symm, inner_smul_left_eq_star_smul, starRingEnd_apply, starRingEnd_apply, 104:/-- See `inner_smul_left_eq_star_smul` for the case of a general algebra action. -/ 105:theorem inner_smul_left (x y : E) (r : 𝕜) : ⟪r • x, y⟫ = r† * ⟪x, y⟫ := 106: inner_smul_left_eq_star_smul .. 108:theorem real_inner_smul_left (x y : F) (r : ℝ) : ⟪r • x, y⟫_ℝ = r * ⟪x, y⟫_ℝ := 109: inner_smul_left _ _ _ 111:theorem inner_smul_real_left (x y : E) (r : ℝ) : ⟪(r : 𝕜) • x, y⟫ = r • ⟪x, y⟫ := by 112: rw [inner_smul_left, conj_ofReal, Algebra.smul_def] 114:/-- See `inner_smul_right_eq_smul` for the case of a general algebra action. -/ 115:theorem inner_smul_right (x y : E) (r : 𝕜) : ⟪x, r • y⟫ = r * ⟪x, y⟫ := 116: inner_smul_right_eq_smul .. 118:theorem real_inner_smul_right (x y : F) (r : ℝ) : ⟪x, r • y⟫_ℝ = r * ⟪x, y⟫_ℝ := 119: inner_smul_right _ _ _ 121:theorem inner_smul_real_right (x y : E) (r : ℝ) : ⟪x, (r : 𝕜) • y⟫ = r • ⟪x, y⟫ := by 122: rw [inner_smul_right, Algebra.smul_def] 131: LinearMap.mk₂'ₛₗ _ _ (fun v w => ⟪v, w⟫) inner_add_left (fun _ _ _ => inner_smul_left _ _ _) 132: inner_add_right fun _ _ _ => inner_smul_right _ _ _ 148: exact real_inner_comm v w 188: rw [← zero_smul 𝕜 (0 : E), inner_smul_left, map_zero, zero_mul] 229: rw [← neg_one_smul 𝕜 x, inner_smul_left] 287: rw [real_inner_comm y, ← norm_mul] 358:
$ /bin/bash -lc "rg -n \"EuclideanSpace.norm_eq|norm_eq_sqrt_sum|dist_eq.*EuclideanSpace|EuclideanSpace.*dist|real_inner.*Fin|inner_apply\" Mathlib/Analysis/InnerProductSpace Mathlib/Geometry/Euclidean | sed -n '1,260p'"
Mathlib/Analysis/InnerProductSpace/ProdL2.lean:47:theorem prod_inner_apply (x y : WithLp 2 (E × F)) :
Mathlib/Analysis/InnerProductSpace/ProdL2.lean:67: WithLp.prod_inner_apply, Sum.forall, Sum.elim_inl, Function.comp_apply, inner_zero_right,
Mathlib/Analysis/InnerProductSpace/Calculus.lean:128:theorem fderiv_inner_apply (hf : DifferentiableAt ℝ f x) (hg : DifferentiableAt ℝ g x) (y : G) :
Mathlib/Analysis/InnerProductSpace/Calculus.lean:132:theorem deriv_inner_apply {f g : ℝ → E} {x : ℝ} (hf : DifferentiableAt ℝ f x)
Mathlib/Analysis/InnerProductSpace/Symmetric.lean:147:theorem IsSymmetric.im_inner_apply_self {T : E →ₗ[𝕜] E} (hT : T.IsSymmetric) (x : E) :
Mathlib/Analysis/InnerProductSpace/Symmetric.lean:157:theorem IsSymmetric.coe_re_inner_apply_self {T : E →ₗ[𝕜] E} (hT : T.IsSymmetric) (x : E) :
Mathlib/Analysis/InnerProductSpace/WeakOperatorTopology.lean:22:+ `ContinuousLinearMapWOT.tendsto_iff_forall_inner_apply_tendsto`: a function `f : α → E →WOT[𝕜] F`
Mathlib/Analysis/InnerProductSpace/WeakOperatorTopology.lean:48:lemma tendsto_iff_forall_inner_apply_tendsto {α : Type*} {l : Filter α}
Mathlib/Analysis/InnerProductSpace/WeakOperatorTopology.lean:55:lemma le_nhds_iff_forall_inner_apply_le_nhds {l : Filter (E →WOT[𝕜] F)}
Mathlib/Analysis/InnerProductSpace/WeakOperatorTopology.lean:57: tendsto_iff_forall_inner_apply_tendsto (f := id)
Mathlib/Analysis/InnerProductSpace/WeakOperatorTopology.lean:62: tendsto_iff_forall_inner_apply_tendsto
Mathlib/Analysis/InnerProductSpace/WeakOperatorTopology.lean:66: tendsto_iff_forall_inner_apply_tendsto
Mathlib/Analysis/InnerProductSpace/WeakOperatorTopology.lean:77:@[fun_prop] alias ⟨continuousWithinAt_inner_apply, continuousWithinAt⟩ := continuousWithinAt_iff
Mathlib/Analysis/InnerProductSpace/WeakOperatorTopology.lean:78:@[fun_prop] alias ⟨continuousOn_inner_apply, continuousOn⟩ := continuousOn_iff
Mathlib/Analysis/InnerProductSpace/WeakOperatorTopology.lean:79:@[fun_prop] alias ⟨continuousAt_inner_apply, continuou**Deriving scaled line direction** **Formulating line distance lower bound**
**Establishing norm and bounding constants** **Bounding norm lower using trace arguments**
**Planning theta bound using cyclotomic fields** **Verifying number field structure for maximal real subfield**
**Developing trace positivity lemma proof** **Formalizing real embedding rewrite for trace lemma**
Mathlib already provides the two hardest quantitative bridges: field trace as a sum over embeddings, and the “house” inequality bounding the algebraic norm by one chosen embedding times the other conjugates. This means the development can follow the paper’s argument without importing another project. I’m now proving the total-real trace-square lemma and the Euclidean `infDist` lower bound as reusable foundations.
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:21:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.coe_realEmbedding`: [NumberField K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [NumberField K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:29:12: error(lean.unknownIdentifier): Unknown constant `Algebra.trace_eq_sum_embeddings` SharpDistanceScratch.lean:28:48: error: unsolved goals K : Type u_1 inst✝² : Field K inst✝¹ : NumberField K inst✝ : IsTotallyReal K z : K ⊢ ↑((Algebra.trace ℚ K) (z ^ 2)) = ∑ φ, (realEmbedding φ) z ^ 2 SharpDistanceScratch.lean:43:6: error: Type mismatch (Finset.sum_eq_zero_iff_of_nonneg fun x x_1 => sq_nonneg ((realEmbedding x) z)).mp hs has type ∀ i ∈ Finset.univ, (realEmbedding i) z ^ 2 = 0 but is expected to have type ∀ (φ : K →+* ℂ), (realEmbedding φ) z ^ 2 = 0 SharpDistanceScratch.lean:46:38: error: Application type mismatch: The argument this has type (realEmbedding φ) z = 0 but is expected to have type (realEmbedding φ) z = (realEmbedding φ) 0 in the application RingHom.injective (realEmbedding φ) this
**Fixing theorem namespace and injection proof**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:21:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.coe_realEmbedding`: [NumberField K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [NumberField K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:29:12: error: typeclass instance problem is stuck Algebra.IsSeparable ?m.52 K Note: Lean will not try to resolve this typeclass instance problem because the first, third, and fifth type arguments to `Algebra.IsSeparable` contain metavariables. These arguments must be fully determined before Lean will try to resolve the typeclass. Hint: Adding type annotations and supplying implicit arguments to functions can give Lean more information for typeclass resolution. For example, if you have a variable `x` that you intend to be a `Nat`, but Lean reports it as having an unresolved type like `?m`, replacing `x` with `(x : Nat)` can get typeclass resolution un-stuck.
**Specifying implicit type parameters**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:21:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.coe_realEmbedding`: [NumberField K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [NumberField K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:31:36: error(lean.unknownIdentifier): Unknown constant `Complex.sum_re` SharpDistanceScratch.lean:31:2: error: Type mismatch: After simplification, term hre has type (realEmbedding (algebraMap ℚ ℂ)) ((Algebra.trace ℚ K) (z * z)) = (∑ x, x (z * z)).re but is expected to have type ↑((Algebra.trace ℚ K) (z * z)) = ∑ x, (realEmbedding x) z * (realEmbedding x) z
**Refining algebraMap simplification using realEmbedding**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean'
SharpDistanceScratch.lean:21:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.coe_realEmbedding`:
[NumberField K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [NumberField K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistanceScratch.lean:35:38: error: Type mismatch
h
has type
(algebraMap ℚ ℂ) ((Algebra.trace ℚ K) (z ^ 2)) =
∑ σ ∈ @Finset.univ (K →ₐ[ℚ] ℂ) (minpoly.AlgHom.fintype ℚ K ℂ), σ (z ^ 2)
but is expected to have type
(algebraMap ℚ ℂ) ((Algebra.trace ℚ K) (z ^ 2)) =
∑ φ ∈ @Finset.univ (K →+* ℂ) (Embeddings.instFintypeRingHom K ℂ), φ (z ^ 2)**Refactoring algebra homomorphism definitions**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:54:43: error(lean.synthInstanceFailed): failed to synthesize instance of type class Nonempty (K →ₐ[ℚ] ℂ) Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
**Confirming nonempty ring hom instance**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean'
**Defining vector notation and proving distance lemma**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:20:31: error: Type mismatch ![x, y] has type Fin (Nat.succ 0).succ → ℝ but is expected to have type Point SharpDistanceScratch.lean:22:0: error: Not a definitional equality: the left-hand side (point x y).ofLp 0 is not definitionally equal to the right-hand side x SharpDistanceScratch.lean:22:56: error: Type mismatch rfl has type ?m.6 = ?m.6 but is expected to have type (point x y).ofLp 0 = x SharpDistanceScratch.lean:23:0: error: Not a definitional equality: the left-hand side (point x y).ofLp 1 is not definitionally equal to the right-hand side y SharpDistanceScratch.lean:23:55: error: Type mismatch rfl has type ?m.6 = ?m.6 but is expected to have type (point x y).ofLp 1 = y SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:43:36: error: expected token
**Examining EuclideanSpace point syntax**
$ /bin/bash -lc "sed -n '120,170p' Mathlib/Analysis/InnerProductSpace/PiL2.lean; nl -ba SharpDistanceScratch.lean | sed -n '14,52p'"
/-- Notation for vectors in Lp space. `!₂[x, y, ...]` is a shorthand for
`WithLp.toLp 2 ![x, y, ...]`, of type `EuclideanSpace _ (Fin _)`.
This also works for other subscripts. -/
syntax (name := PiLp.vecNotation) "!" noWs subscriptTerm noWs "[" term,* "]" : term
macro_rules | `(!$p:subscript[$e:term,*]) => do
-- override the `Fin n.succ` to a literal
let n := e.getElems.size
`(WithLp.toLp $p (V := ∀ _ : Fin $(quote n), _) ![$e,*])
/-- Unexpander for the `!₂[x, y, ...]` notation. -/
@[app_delab WithLp.toLp]
meta def EuclideanSpace.delabVecNotation : Delab :=
whenNotPPOption getPPExplicit <| whenPPOption getPPNotation <| withOverApp 3 do
-- check that the `WithLp.toLp _` is present
let p : Term ← withNaryArg 0 <| delab
-- to be conservative, only allow subscripts which are numerals
guard <| p matches `($_:num)
let `(![$elems,*]) ← withNaryArg 2 delab | failure
`(!$p[$elems,*])
end Notation
theorem EuclideanSpace.nnnorm_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖₊ = NNReal.sqrt (∑ i, ‖x i‖₊ ^ 2) :=
PiLp.nnnorm_eq_of_L2 x
theorem EuclideanSpace.norm_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖ = √(∑ i, ‖x i‖ ^ 2) := by
simpa only [Real.coe_sqrt, NNReal.coe_sum] using! congr_arg ((↑) : ℝ≥0 → ℝ) x.nnnorm_eq
theorem EuclideanSpace.norm_sq_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
(x : EuclideanSpace 𝕜 n) : ‖x‖ ^ 2 = ∑ i, ‖x i‖ ^ 2 :=
PiLp.norm_sq_eq_of_L2 _ x
theorem EuclideanSpace.real_norm_sq_eq {n : Type*} [Fintype n] (x : EuclideanSpace ℝ n) :
‖x‖ ^ 2 = ∑ i, (x i) ^ 2 := by
simp [EuclideanSpace.norm_sq_eq]
@[wikidata Q847073]
theorem EuclideanSpace.dist_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : dist x y = √(∑ i, dist (x i) (y i) ^ 2) :=
PiLp.dist_eq_of_L2 x y
theorem EuclideanSpace.dist_sq_eq {𝕜 : Type*} [RCLike 𝕜] {n : Type*} [Fintype n]
(x y : EuclideanSpace 𝕜 n) : dist x y ^ **Debugging inner notation parsing error**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:43:36: error: expected token
**Inspecting delimiter position**
$ /bin/bash -lc "sed -n '42,44p' SharpDistanceScratch.lean | od -An -tx1c"
6c 65 6d 6d 61 20 70 6f 69 6e 74 4c 69 6e 65 44
l e m m a p o i n t L i n e D
69 73 74 5f 67 65 5f 69 6e 6e 65 72 5f 64 69 76
i s t _ g e _ i n n e r _ d i v
5f 6e 6f 72 6d 20 28 70 20 3a 20 50 6f 69 6e 74
_ n o r m ( p : P o i n t
29 20 28 e2 84 93 20 3a 20 52 65 61 6c 4c 69 6e
) ( 342 204 223 : R e a l L i n
65 29 20 28 6e 6f 72 6d 61 6c 20 3a 20 50 6f 69
e ) ( n o r m a l : P o i
6e 74 29 0a 20 20 20 20 28 68 6e 6f 72 6d 61 6c
n t ) \n ( h n o r m a l
20 3a 20 6e 6f 72 6d 61 6c 20 e2 89 a0 20 30 29
: n o r m a l 342 211 240 0 )
20 28 68 6f 72 74 68 20 3a 20 e2 9f aa 28 e2 84
( h o r t h : 342 237 252 ( 342 204
93 2e 64 69 72 65 63 74 69 6f 6e 29 2c 20 6e 6f
223 . d i r e c t i o n ) , n o
72 6d 61 6c e2 9f ab 5f e2 84 9d 20 3d 20 30 29
r m a l 342 237 253 _ 342 204 235 = 0 )
20 3a 0a 20 20 20 20 7c e2 9f aa 70 20 2d 20 e2
: \n | 342 237 252 p - 342
84 93 2e 62 61 73 65 2c 20 6e 6f 72 6d 61 6c e2
204 223 . b a s e , n o r m a l 342
9f ab 5f e2 84 9d 7c 20 2f 20 e2 80 96 6e 6f 72
237 253 _ 342 204 235 | / 342 200 226 n o r
6d 61 6c e2 80 96 20 e2 89 a4 20 70 6f 69 6e 74
m a l 342 200 226 342 211 244 p o i n t
4c 69 6e 65 44 69 73 74 20 70 20 e2 84 93 20 3a
L i n e D i s t p 342 204 223 :
3d 20 62 79 0a
= b y \n**Verifying inner product notation parsing**
$ /bin/bash -lc "python3 - <<'PY'
s=open('SharpDistanceScratch.lean').read().splitlines()[42]
for i,c in enumerate(s,1): print(i,repr(c))
PY"
1 ' '
2 ' '
3 ' '
4 ' '
5 '('
6 'h'
7 'n'
8 'o'
9 'r'
10 'm'
11 'a'
12 'l'
13 ' '
14 ':'
15 ' '
16 'n'
17 'o'
18 'r'
19 'm'
20 'a'
21 'l'
22 ' '
23 '≠'
24 ' '
25 '0'
26 ')'
27 ' '
28 '('
29 'h'
30 'o'
31 'r'
32 't'
33 'h'
34 ' '
35 ':'
36 ' '
37 '⟪'
38 '('
39 'ℓ'
40 '.'
41 'd'
42 'i'
43 'r'
44 'e'
45 'c'
46 't'
47 'i'
48 'o'
49 'n'
50 ')'
51 ','
52 ' '
53 'n'
54 'o'
55 'r'
56 'm'
57 'a'
58 'l'
59 '⟫'
60 '_'
61 'ℝ'
62 ' '
63 '='
64 ' '
65 '0'
66 ')'
67 ' '
68 ':'**Investigating notation recognition error**
$ /bin/bash -lc "rg -n 'notation.*⟪|scoped.*⟪|⟫_ℝ' Mathlib/Analysis/InnerProductSpace/Basic.lean Mathlib | sed -n '1,100p'"
Mathlib/Analysis/InnerProductSpace/Basic.lean:49:local notation "⟪" x ", " y "⟫" => inner 𝕜 x y
Mathlib/Analysis/InnerProductSpace/Basic.lean:59:theorem real_inner_comm (x y : F) : ⟪y, x⟫_ℝ = ⟪x, y⟫_ℝ :=
Mathlib/Analysis/InnerProductSpace/Basic.lean:108:theorem real_inner_smul_left (x y : F) (r : ℝ) : ⟪r • x, y⟫_ℝ = r * ⟪x, y⟫_ℝ :=
Mathlib/Analysis/InnerProductSpace/Basic.lean:118:theorem real_inner_smul_right (x y : F) (r : ℝ) : ⟪x, r • y⟫_ℝ = r * ⟪x, y⟫_ℝ :=
Mathlib/Analysis/InnerProductSpace/Basic.lean:152:@[simp] lemma innerₗ_apply_apply (v w : F) : innerₗ F v w = ⟪v, w⟫_ℝ := rfl
Mathlib/Analysis/InnerProductSpace/Basic.lean:203:theorem real_inner_self_nonneg {x : F} : 0 ≤ ⟪x, x⟫_ℝ :=
Mathlib/Analysis/InnerProductSpace/Basic.lean:222:theorem real_inner_self_abs (x : F) : |⟪x, x⟫_ℝ| = ⟪x, x⟫_ℝ :=
Mathlib/Analysis/InnerProductSpace/Basic.lean:254:/-- Expand `⟪x + y, x + y⟫_ℝ` -/
Mathlib/Analysis/InnerProductSpace/Basic.lean:256: ⟪x + y, x + y⟫_ℝ = ⟪x, x⟫_ℝ + 2 * ⟪x, y⟫_ℝ + ⟪y, y⟫_ℝ := by
Mathlib/Analysis/InnerProductSpace/Basic.lean:257: have : ⟪y, x⟫_ℝ = ⟪x, y⟫_ℝ := by rw [← inner_conj_symm]; rfl
Mathlib/Analysis/InnerProductSpace/Basic.lean:265:/-- Expand `⟪x - y, x - y⟫_ℝ` -/
Mathlib/Analysis/InnerProductSpace/Basic.lean:267: ⟪x - y, x - y⟫_ℝ = ⟪x, x⟫_ℝ - 2 * ⟪x, y⟫_ℝ + ⟪y, y⟫_ℝ := by
Mathlib/Analysis/InnerProductSpace/Basic.lean:268: have : ⟪y, x⟫_ℝ = ⟪x, y⟫_ℝ := by rw [← inner_conj_symm]; rfl
Mathlib/Analysis/InnerProductSpace/Basic.lean:284:theorem real_inner_mul_inner_self_le (x y : F) : ⟪x, y⟫_ℝ * ⟪x, y⟫_ℝ ≤ ⟪x, x⟫_ℝ * ⟪y, y⟫_ℝ :=
Mathlib/Analysis/InnerProductSpace/Basic.lean:286: ⟪x, y⟫_ℝ * ⟪x, y⟫_ℝ ≤ ‖⟪x, y⟫_ℝ‖ * ‖⟪y, x⟫_ℝ‖ := by
Mathlib/Analysis/InnerProductSpace/Basic.lean:289: _ ≤ ⟪x, x⟫_ℝ * ⟪y, y⟫_ℝ := @inner_mul_inner_self_le ℝ _ _ _ _ x y
Mathlib/Analysis/InnerProductSpace/Basic.lean:294:theorem inner_eq_norm_sq_left_iff {v w : F} : ⟪v, w⟫_ℝ = ‖v‖ ^ 2 ↔ ⟪v, v - w⟫_ℝ = 0 :=
Mathlib/Analysis/InnerProductSpace/Basic.lean:300:theorem inne**Locating inner product space notation**
$ /bin/bash -lc "rg -n 'scoped.*notation.*⟪|notation.*⟪.*_ℝ|syntax.*⟪' Mathlib/Analysis/InnerProductSpace Mathlib | head -40" Mathlib/Analysis/InnerProductSpace/Defs.lean:86:scoped[InnerProductSpace] notation:max "⟪" x ", " y "⟫_" 𝕜:max => inner 𝕜 x y Mathlib/Analysis/InnerProductSpace/Defs.lean:91:scoped[RealInnerProductSpace] notation "⟪" x ", " y "⟫" => inner ℝ x y Mathlib/Analysis/InnerProductSpace/Defs.lean:94:scoped[ComplexInnerProductSpace] notation "⟪" x ", " y "⟫" => inner ℂ x y Mathlib/Topology/Sheaves/Presheaf.lean:117:scoped[AlgebraicGeometry] notation:80 x " |_ₗ " U " ⟪" e "⟫ " => Mathlib/Analysis/InnerProductSpace/Defs.lean:86:scoped[InnerProductSpace] notation:max "⟪" x ", " y "⟫_" 𝕜:max => inner 𝕜 x y Mathlib/Analysis/InnerProductSpace/Defs.lean:91:scoped[RealInnerProductSpace] notation "⟪" x ", " y "⟫" => inner ℝ x y Mathlib/Analysis/InnerProductSpace/Defs.lean:94:scoped[ComplexInnerProductSpace] notation "⟪" x ", " y "⟫" => inner ℂ x y
**Adding open scoped InnerProductSpace**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false`
**Planning kernel basis construction over integers** **Establishing nonzero trace basis existence**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:122:38: error: unsolved goals K : Type u_1 inst✝² : Field K inst✝¹ : NumberField K inst✝ : IsTotallyReal K hd : 0 < Module.finrank ℚ K h : ∀ (j : IntegerIndex K), (Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) j) = 0 ht : Algebra.trace ℤ (𝓞 K) = 0 h1 : (Algebra.trace ℤ (𝓞 K)) 1 = 0 1 hrank : 0 < Module.finrank ℤ (𝓞 K) ⊢ (LinearMap.trace ℤ (𝓞 K)) ((LinearMap.mul ℤ (𝓞 K)) 1) = ↑(Module.finrank ℤ (𝓞 K)) SharpDistanceScratch.lean:125:2: error: Type mismatch: After simplification, term h1 has type Module.finrank ℤ (𝓞 K) = 0 but is expected to have type False
**Verifying lmul as linear map and trace_one**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:127:8: error: Tactic `rewrite` failed: Did not find an occurrence of the pattern (Algebra.lmul ℤ (𝓞 K)) 1 in the target expression (LinearMap.trace ℤ (𝓞 K) ∘ₗ (Algebra.lmul ℤ (𝓞 K)).toLinearMap) 1 = ↑(Module.finrank ℤ (𝓞 K)) K : Type u_1 inst✝² : Field K inst✝¹ : NumberField K inst✝ : IsTotallyReal K hd : 0 < Module.finrank ℚ K h : ∀ (j : IntegerIndex K), (Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) j) = 0 ht : Algebra.trace ℤ (𝓞 K) = 0 h1 : (Algebra.trace ℤ (𝓞 K)) 1 = 0 1 hrank : 0 < Module.finrank ℤ (𝓞 K) hlmul : (Algebra.lmul ℤ (𝓞 K)) 1 = 1 ⊢ (LinearMap.trace ℤ (𝓞 K) ∘ₗ (Algebra.lmul ℤ (𝓞 K)).toLinearMap) 1 = ↑(Module.finrank ℤ (𝓞 K)) SharpDistanceScratch.lean:129:2: error: omega could not prove the goal: a possible counterexample may satisfy the constraints b ≥ 1 a ≥ 1 where a := ↑(Module.finrank ℚ K) b := (Algebra.trace ℤ (𝓞 K)) 1
**Applying simp with composition lemmas**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:131:2: error: omega could not prove the goal: a possible counterexample may satisfy the constraints b ≥ 1 a ≥ 1 where a := ↑(Module.finrank ℚ K) b := (Algebra.trace ℤ (𝓞 K)) 1
**Refining hypothesis simplification with targeted simp**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
**Defining trace generator and planning linear independence proof** **Implementing combo injectivity lemma using basis coordinates**
**Testing implicit C types inference**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean'
SharpDistanceScratch.lean:37:15: warning: This simp argument is unused:
RealLine.carrier
Hint: Omit it from the simp argument list.
[apply] simp
Note: This linter can be disabled with `set_option linter.unusedSimpArgs false`
SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead.
If you'd rather continue using `push_neg` in your project, you can implement it as follows:
```
open Lean.Parser.Tactic in
macro "push_neg" cfg:optConfig loc:(location)? : tactic =>
`(tactic| push $cfg:optConfig Not $[$loc]?)
```
SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistanceScratch.lean:152:54: error: unsolved goals
K : Type u_1
inst✝² : Field K
inst✝¹ : NumberField K
inst✝ : IsTotallyReal K
B : TraceBasisData K
i : TraceIndex B
⊢ (Algebra.trace ℤ (𝓞 K))
(↑((Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) B.pivot)) * (RingOfIntegers.basis K) ↑i) -
(Algebra.trace ℤ (𝓞 K))
(↑((Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) ↑i)) * (RingOfIntegers.basis K) B.pivot) =
0
SharpDistanceScratch.lean:165:2: error: Type mismatch: After simplification, term
hi
has type
∑ c_1, ((RingOfIntegers.basis K).repr (↑(c c_1) * (RingOfIntegers.basis K) c_1)) i =
∑ c, ((RingOfIntegers.basis K).repr (↑(c' c) * (RingOfIntegers.basis K) c)) i
but is expected to have type
c i = c' i
SharpDistanceScratch.lean:174:35: error(lean.unknownIdentifier): Unknown constant `LinearEquiv.map_nsmul`
SharpDistanceScratch.lean:175:4: error(lean.unknownIdentifier): Unknown constant `LinearEquiv.map_sub`
SharpDistanceScratch.lean:175:25: error(lean.unknownIdenti**Refining integer scalar multiplication handling** **Defining explicit integer scalar action**
**Assessing module usage in mathlib**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:2: error: ring failed, ring expressions not equal K : Type u_1 inst✝² : Field K inst✝¹ : NumberField K inst✝ : IsTotallyReal K B : TraceBasisData K i : TraceIndex B ⊢ (Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) B.pivot) = 0 SharpDistanceScratch.lean:168:2: error: Type mismatch: After simplification, term hi has type ∑ c_1, (Finsupp.single c_1 ↑(c c_1)) i = ∑ c, (Finsupp.single c ↑(c' c)) i but is expected to have type c i = c' i SharpDistanceScratch.lean:167:52: warning: This simp argument is unused: Finsupp.single_apply Hint: Omit it from the simp argument list. [apply] simp only [linearCombo, map_sum, map_nsmul, (NumberField.RingOfIntegers.basis K).repr_self] at hi Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:180:2: error: `simp` made no progress SharpDistanceScratch.lean:179:4: warning: This simp argument is unused: Finsupp.single_apply Hint: Omit it from the simp argument list. [apply
**Analyzing scalar multiplication simplification issue** **Planning simplification using map_zsmul and classical logic**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean'
SharpDistanceScratch.lean:37:15: warning: This simp argument is unused:
RealLine.carrier
Hint: Omit it from the simp argument list.
[apply] simp
Note: This linter can be disabled with `set_option linter.unusedSimpArgs false`
SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead.
If you'd rather continue using `push_neg` in your project, you can implement it as follows:
```
open Lean.Parser.Tactic in
macro "push_neg" cfg:optConfig loc:(location)? : tactic =>
`(tactic| push $cfg:optConfig Not $[$loc]?)
```
SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistanceScratch.lean:154:2: error: ring failed, ring expressions not equal
K : Type u_1
inst✝² : Field K
inst✝¹ : NumberField K
inst✝ : IsTotallyReal K
B : TraceBasisData K
i : TraceIndex B
⊢ (Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) B.pivot) = 0
SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistanceScratch.lean:184:11: error(lean.unknownIdentifier): Unknown identifier `smul_left_cancel₀`
SharpDistanceScratch.lean:181:4: warning: This simp argument is unused:
Finsupp.single_apply
Hint: Omit it from the simp argument list.
[apply] simp only [linearCombo, map_sum, map_nsmul, traceGenerator, map_sub, map_smul,
(Numb**Investigating trace_state behavior**
$ /bin/bash -lc "lake env lean SharpDistanceScratch.lean 2>&1 | sed -n '1,220p'"
SharpDistanceScratch.lean:37:15: warning: This simp argument is unused:
RealLine.carrier
Hint: Omit it from the simp argument list.
[apply] simp
Note: This linter can be disabled with `set_option linter.unusedSimpArgs false`
SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead.
If you'd rather continue using `push_neg` in your project, you can implement it as follows:
```
open Lean.Parser.Tactic in
macro "push_neg" cfg:optConfig loc:(location)? : tactic =>
`(tactic| push $cfg:optConfig Not $[$loc]?)
```
SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
K : Type u_1
inst✝² : Field K
inst✝¹ : NumberField K
inst✝ : IsTotallyReal K
B : TraceBasisData K
i : TraceIndex B
⊢ (Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) B.pivot) • (Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) ↑i) -
(Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) ↑i) •
(Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) B.pivot) =
0
SharpDistanceScratch.lean:151:6: warning: declaration uses `sorry`
SharpDistanceScratch.lean:160:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistanceScratch.lean:185:11: error(lean.unknownIdentifier): Unknown identifier `smul_left_cancel₀`
SharpDistanceScratch.lean:182:4: warning: This simp argumen**Refining simplification with smul_eq_mul and mul_comm**
$ /bin/bash -lc "lake env lean SharpDistanceScratch.lean 2>&1 | sed -n '1,260p'" SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Fixing simplification with subtype injection and cancellation**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Inspecting subtype coercion simplification**
$ /bin/bash -lc "nl -ba SharpDistanceScratch.lean | sed -n '174,188p'" 174 intro c c' h 175 funext i 176 have hi := congrArg (fun z : 𝓞 K ↦ 177 (NumberField.RingOfIntegers.basis K).repr z i.1) h 178 have ht := B.pivot_trace_ne_zero 179 simp only [linearCombo, map_sum, map_nsmul, traceGenerator, 180 map_sub, map_smul, (NumberField.RingOfIntegers.basis K).repr_self, 181 Finsupp.single_apply] at hi 182 simp only [Subtype.coe_inj] at hi 183 simp [Finsupp.single_apply, i.2] at hi 184 have hcast : (c i : ℤ) = c' i := by 185 exact mul_right_cancel₀ ht hi 186 exact_mod_cast hcast 187 188 end
**Exploring sum_eq_single application** **Defining TraceIndex to exclude pivot**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Refining simplification approach with hcoe lemma**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Applying symmetry to ext_iff equivalence**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Reviewing code around line 184**
$ /bin/bash -lc "nl -ba SharpDistanceScratch.lean | sed -n '178,188p'" 178 have ht := B.pivot_trace_ne_zero 179 simp only [linearCombo, map_sum, map_nsmul, traceGenerator, 180 map_sub, map_smul, (NumberField.RingOfIntegers.basis K).repr_self, 181 Finsupp.single_apply] at hi 182 have hcoe (x : TraceIndex B) : (x.1 = i.1) = (x = i) := 183 propext Subtype.ext_iff.symm 184 simp_rw [hcoe] at hi 185 simp [Finsupp.single_apply, i.2] at hi 186 have hcast : (c i : ℤ) = c' i := by 187 exact mul_right_cancel₀ ht hi 188 exact_mod_cast hcast
**Investigating simplification rewriting behavior**
$ /bin/bash -lc "lake env lean SharpDistanceScratch.lean 2>&1 | sed -n '45,180p'"
B : TraceBasisData K
c c' : TraceIndex B → ℕ
h : linearCombo (traceGenerator B) c = linearCombo (traceGenerator B) c'
i : TraceIndex B
ht : (Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) B.pivot) ≠ 0
hi :
(∑ x,
c x •
((Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) B.pivot) • Finsupp.single (↑x) 1 -
(Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) ↑x) • Finsupp.single B.pivot 1))
↑i =
(∑ x,
c' x •
((Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) B.pivot) • Finsupp.single (↑x) 1 -
(Algebra.trace ℤ (𝓞 K)) ((RingOfIntegers.basis K) ↑x) • Finsupp.single B.pivot 1))
↑i
hcoe : ∀ (x : TraceIndex B), (↑x = ↑i) = (x = i)
⊢ c i = c' i
SharpDistanceScratch.lean:181:4: warning: This simp argument is unused:
Finsupp.single_apply
Hint: Omit it from the simp argument list.
[apply] simp only [linearCombo, map_sum, map_nsmul, traceGenerator, map_sub, map_smul,
(NumberField.RingOfIntegers.basis K).repr_self] at hi
Note: This linter can be disabled with `set_option linter.unusedSimpArgs false`**Simplifying Finsupp sum evaluation**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Refining exact resolution approach**
$ /bin/bash -lc "nl -ba SharpDistanceScratch.lean | sed -n '180,192p'" 180 map_sub, map_smul, (NumberField.RingOfIntegers.basis K).repr_self, 181 Finsupp.single_apply] at hi 182 have hcoe (x : TraceIndex B) : (x.1 = i.1) = (x = i) := 183 propext Subtype.ext_iff.symm 184 simp [Finset.sum_apply, Finsupp.single_apply, i.2, hcoe] at hi 185 have hcast : (c i : ℤ) = c' i := by 186 exact mul_right_cancel₀ ht hi 187 exact_mod_cast hcast 188 have hcast : (c i : ℤ) = c' i := by 189 exact mul_right_cancel₀ ht hi 190 exact_mod_cast hcast 191 192 end
**Replacing duplicate block with hi.resolve_right**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Defining coefficients and source structure** **Establishing field trace properties and house bounds**
**Compiling codebase**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Applying function extensionality to Fin coercions**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Defining and analyzing sourceD function** **Deriving field equation and proving δ equals zero**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Refining coercion handling in ring homomorphism** **Applying scalar multiplication rewrite in trace proof**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Fixing norm_num proof with rw and norm_num**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Defining and bounding house constants** **Implementing house subtraction bound lemma**
The arithmetic core now compiles: the trace-zero family has exactly \(d-1\) free integer parameters, the unrestricted family has \(d\), and the induced \((x,y)\) map is injective. The crucial off-diagonal quantity \(D\) is also formally proved nonzero using positivity of \(\operatorname{Tr}(z^2)\). Next I’m attaching explicit house bounds and then the Euclidean scaling; after that only the exponent bookkeeping and cyclotomic instantiation remain.**Identifying common compile errors**
$ /bin/bash -lc 'lake env lean SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Fixing coefficient ordering and cast simplifications** **Adding explicit cast normalization and simp lemmas**
$ /bin/bash -lc "nl -ba SharpDistanceScratch.lean | sed -n '356,455p'"
356 congr 1
357 simp [linearCombo]
358 _ ≤ ∑ i, NumberField.house ((c i) * (g i : K)) := by
359 simpa using NumberField.house_sum_le_sum_house Finset.univ
360 (fun i ↦ (c i) * (g i : K))
361 _ = ∑ i, (c i : ℝ) * NumberField.house (g i : K) := by
362 apply Finset.sum_congr rfl
363 intro i _
364 simpa using NumberField.house_nat_mul (g i : K) (c i)
365 _ ≤ ∑ i, (q : ℝ) * NumberField.house (g i : K) := by
366 gcongr with i hi
367 · exact_mod_cast hc i
368 · exact NumberField.house_nonneg _
369 _ = q * ∑ i, NumberField.house (g i : K) := by
370 rw [Finset.mul_sum]
371
372 lemma house_aZero_le (B : TraceBasisData K) {m : ℕ} (c : ACoeff B m) :
373 NumberField.house (aZero B c : K) ≤ (m : ℝ) ^ 2 * aConstant B := by
374 calc
375 NumberField.house (aZero B c : K) ≤
376 (m ^ 2 : ℕ) * ∑ i, NumberField.house (traceGenerator B i : K) := by
377 apply house_linearCombo_le
378 intro i
379 omega
380 _ ≤ (m : ℝ) ^ 2 * aConstant B := by
381 gcongr
382 exact le_max_right _ _
383
384 lemma house_yHalf_le {m : ℕ} (c : YCoeff K m) :
385 NumberField.house (yHalf c : K) ≤ (m : ℝ) * yConstant K := by
386 calc
387 NumberField.house (yHalf c : K) ≤
388 m * ∑ i, NumberField.house (NumberField.RingOfIntegers.basis K i : K) := by
389 apply house_linearCombo_le
390 intro i
391 omega
392 _ ≤ (m : ℝ) * yConstant K := by
393 gcongr
394 exact le_max_right _ _
395
396 lemma house_sourceY_le (B : TraceBasisData K) {m : ℕ} (s : ArithmeticSource B m) :
397 NumberField.house (sourceY s : K) ≤
398 2 * yConstant K * m := by
399 calc
400 NumberField.house (sourceY s : K) =
401 NumberField.house (2 * (yHalf s.2 : K)) := by
402 simp [sourceY]
403 **Applying nlinarith for nonnegativity proof**
**Considering implicit map_ofNat usage**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=500000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Planning normalization and simplification steps** **Simplifying bounding constants and adjusting proof**
**Applying add_le_add with bounds**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=800000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Marking positivity lines as constants**
$ /bin/bash -lc "nl -ba SharpDistanceScratch.lean | sed -n '446,475p'" 446 let CX : ℝ := aConstant B + 2 * yConstant K ^ 2 447 let CY : ℝ := 2 * yConstant K 448 have hXs := house_sourceX_le B s 449 have hXt := house_sourceX_le B t 450 have hYs := house_sourceY_le B s 451 have hYt := house_sourceY_le B t 452 have hCY : 0 ≤ CY := by 453 dsimp [CY] 454 positivity 455 have hCX : 0 ≤ CX := by 456 dsimp [CX] 457 positivity 458 have hYdiff : 459 NumberField.house ((sourceY t : K) - (sourceY s : K)) ≤ 2 * CY * m := by 460 calc 461 _ ≤ NumberField.house (sourceY t : K) + 462 NumberField.house (sourceY s : K) := house_sub_le _ _ 463 _ ≤ CY * m + CY * m := by 464 dsimp [CY] 465 constructor 466 · exact hYt 467 · exact hYs 468 _ = 2 * CY * m := by ring 469 change NumberField.house 470 ((sourceX B s : K) - (sourceX B t : K) + 471 (sourceY s : K) * ((sourceY t : K) - (sourceY s : K))) ≤ _ 472 calc 473 _ ≤ NumberField.house ((sourceX B s : K) - (sourceX B t : K)) + 474 NumberField.house ((sourceY s : K) * 475 ((sourceY t : K) - (sourceY s : K))) :=
**Refining inequality proofs with exact additions**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=800000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Defining complexified embedding σ**
$ /bin/bash -lc "rg -n \"def ofReal.*RingHom|ofRealHom|ofReal.*comp.*RingHom|ofRealAm\" Mathlib/Data/Complex Mathlib/Analysis/Complex | sed -n '1,160p'"
Mathlib/Data/Complex/BigOperators.lean:26: map_prod ofRealHom _ _
Mathlib/Data/Complex/BigOperators.lean:30: map_sum ofRealHom _ _
Mathlib/Data/Complex/BigOperators.lean:34: map_expect ofRealHom ..
Mathlib/Data/Complex/Basic.lean:593:def ofRealHom : ℝ →+* ℂ where
Mathlib/Data/Complex/Basic.lean:600:@[simp] lemma ofRealHom_eq_coe (r : ℝ) : ofRealHom r = r := rfl
Mathlib/Data/Complex/Basic.lean:605: map_comp_add ofRealHom ..
Mathlib/Data/Complex/Basic.lean:608: map_comp_sub ofRealHom ..
Mathlib/Data/Complex/Basic.lean:611: map_comp_neg ofRealHom _
Mathlib/Data/Complex/Basic.lean:614: map_comp_nsmul ofRealHom ..
Mathlib/Data/Complex/Basic.lean:617: map_comp_zsmul ofRealHom ..
Mathlib/Data/Complex/Basic.lean:620: map_comp_mul ofRealHom ..
Mathlib/Data/Complex/Basic.lean:623: map_comp_pow ofRealHom ..
Mathlib/Data/Complex/Basic.lean:719:theorem ofReal_div (r s : ℝ) : ((r / s : ℝ) : ℂ) = r / s := map_div₀ ofRealHom r s
Mathlib/Data/Complex/Basic.lean:722:theorem ofReal_zpow (r : ℝ) (n : ℤ) : ((r ^ n : ℝ) : ℂ) = (r : ℂ) ^ n := map_zpow₀ ofRealHom r n
Mathlib/Analysis/Complex/Basic.lean:282: ⟨ofRealAm.toLinearMap, norm_real⟩
Mathlib/Analysis/Complex/Basic.lean:315:theorem ringHom_eq_ofReal_of_continuous {f : ℝ →+* ℂ} (h : Continuous f) : f = ofRealHom := by
Mathlib/Analysis/Complex/Basic.lean:325:theorem ofRealCLM_coe : (ofRealCLM : ℝ →ₗ[ℝ] ℂ) = ofRealAm.toLinearMap :=$ /bin/bash -lc "rg -n \"norm_embedding_le_house.*ofReal|abs.*le_house|embedding_le_house\" Mathlib/NumberTheory/NumberField/House.lean Mathlib | sed -n '1,160p'" Mathlib/NumberTheory/NumberField/House.lean:83:lemma norm_embedding_le_house (α : K) (σ : K →+* ℂ) : ‖σ α‖ ≤ house α := by Mathlib/NumberTheory/NumberField/House.lean:93: apply hσ.trans (norm_embedding_le_house α σ) Mathlib/NumberTheory/NumberField/House.lean:102: _ ≤ ‖σ' α‖ * ∏ τ ∈ univ.erase σ', house α := by gcongr; apply norm_embedding_le_house Mathlib/NumberTheory/NumberField/House.lean:83:lemma norm_embedding_le_house (α : K) (σ : K →+* ℂ) : ‖σ α‖ ≤ house α := by Mathlib/NumberTheory/NumberField/House.lean:93: apply hσ.trans (norm_embedding_le_house α σ) Mathlib/NumberTheory/NumberField/House.lean:102: _ ≤ ‖σ' α‖ * ∏ τ ∈ univ.erase σ', house α := by gcongr; apply norm_embedding_le_house
$ /bin/bash -lc 'rg -n "norm_point|norm.*!₂|EuclideanSpace.*vecNotation|PiLp.inner_apply.*Fin 2" Mathlib | sed -n '"'1,100p'"
**Deriving reciprocal norm lower bound** **Implementing norm bounds and geometry scaling constants**
**Defining unit square coordinates** **Proving inner product simplifications**
**Proving norm decomposition lemma**
**Fixing div_nonneg for scaled lemma**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=800000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Fixing rational norm casting**
$ /bin/bash -lc "rg -n \"Rat.*norm|norm.*Rat|norm_eq_abs\" Mathlib/Data/Rat Mathlib/Analysis/Normed | sed -n '1,180p'" Mathlib/Data/Rat/Init.lean:75:@[norm_cast] lemma cast_id (n : ℚ≥0) : NNRat.cast n = n := rfl Mathlib/Data/Rat/Init.lean:82:@[norm_cast] lemma cast_id (n : ℚ) : Rat.cast n = n := rfl Mathlib/Data/Rat/Defs.lean:109: rw [mul_def, normalize_eq_mkRat] Mathlib/Data/Rat/Defs.lean:133:@[simp] lemma divInt_one (n : ℤ) : n /. 1 = n := by simp [divInt, mkRat, normalize] Mathlib/Analysis/Normed/Group/AddCircle.lean:50: simp only [norm_eq_infDist, ← Real.norm_eq_abs, ← infDist_smul₀ ht, smul_zero] Mathlib/Analysis/Normed/Group/AddCircle.lean:77: simp only [le_antisymm_iff, le_norm_iff, Real.norm_eq_abs] Mathlib/Analysis/Normed/Group/AddCircle.lean:146: simp only [dist_eq_norm, mem_preimage, mem_closedBall, zsmul_eq_mul, mem_iUnion, Real.norm_eq_abs, Mathlib/Analysis/Normed/Group/Real.lean:56:theorem norm_eq_abs (r : ℝ) : ‖r‖ = |r| := Mathlib/Analysis/Normed/Group/Real.lean:60: ⟨fun _r _y => by rw [Real.dist_eq, ← abs_neg, neg_sub, add_comm, sub_eq_add_neg, norm_eq_abs]⟩ Mathlib/Analysis/Normed/Group/Real.lean:116: rw [Real.norm_eq_abs r, abs_of_nonneg hr] Mathlib/Analysis/Normed/Group/Rat.lean:30: rw [← Rat.norm_cast_real, ← Int.norm_cast_real]; congr 1 Mathlib/Analysis/Normed/Field/Lemmas.lean:274: norm_mul a b := by simp only [norm, Rat.cast_mul, abs_mul] Mathlib/Analysis/Normed/Field/Lemmas.lean:279: ⟨q, by rwa [← Rat.norm_cast_real, Real.norm_eq_abs, abs_of_pos (h₀.trans_lt h.1)]⟩ Mathlib/Analysis/Normed/Field/Basic.lean:30: IsOfFinOrder Isometry.norm_map_of_map_one NNReal.isOpen_Ico_zero Rat.norm_cast_real Mathlib/Analysis/Normed/Field/Basic.lean:308: ⟨x, by rwa [Real.norm_eq_abs, abs_of_nonneg (h₀.trans h.1.le)]⟩ Mathlib/Analysis/Normed/Algebra/QuaternionExponential.lean:141: Real.norm_eq_abs] Mathlib/Analysis/Normed/Group/Int.lean:30:theorem norm_eq_abs (n : ℤ) : ‖n‖ = |(n : ℝ)| := Mathlib/Analysis/Normed/Group/Int.lean:33:theorem norm_natCast (n : ℕ) : ‖(n : ℤ)‖ = n := by simp [Int.norm_eq_abs] Mathlib/Analysis/Normed/Group/Int.lean:40: _ = ‖n‖ :=
**Verifying norm_cast_real usage**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=800000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Verifying norm equality for rational numbers** **Adjusting norm inequality with exact coercion**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=800000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Checking abs_eq_norm lemma validity**
$ /bin/bash -lc "lake env lean -DmaxHeartbeats=800000 SharpDistanceScratch.lean 2>&1 | sed -n '1,20p'" SharpDistanceScratch.lean:12:7: error(lean.unknownIdentifier): Unknown identifier `abs_eq_norm` SharpDistanceScratch.lean:13:7: error(lean.unknownIdentifier): Unknown identifier `norm_eq_abs` Rat.norm_cast_real (r : ℚ) : ‖↑r‖ = ‖r‖ SharpDistanceScratch.lean:41:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:117:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:113:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
**Inspecting norm_ratCast definition**
$ /bin/bash -lc "sed -n '1,48p' Mathlib/Analysis/Normed/Group/Rat.lean; rg -n \"instance.*Norm ℚ|def norm.*ℚ|Rat.instNorm\" Mathlib/Analysis/Normed Mathlib/Data/Rat | head -50"
/-
Copyright (c) 2018 Patrick Massot. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Massot, Johannes Hölzl, Yaël Dillies
-/
module
public import Mathlib.Analysis.Normed.Group.Int
public import Mathlib.Topology.Instances.Rat
/-! # ℚ as a normed group -/
public section
namespace Rat
instance instNormedAddCommGroup : NormedAddCommGroup ℚ where
norm r := ‖(r : ℝ)‖
dist_eq r₁ r₂ := by
simp only [dist_eq, norm, cast_add, cast_neg]
rw [← abs_neg, neg_sub]
abel_nf
@[norm_cast, simp high] -- increase priority to prevent the left-hand side from simplifying
theorem norm_cast_real (r : ℚ) : ‖(r : ℝ)‖ = ‖r‖ :=
rfl
@[norm_cast, simp]
theorem _root_.Int.norm_cast_rat (m : ℤ) : ‖(m : ℚ)‖ = ‖m‖ := by
rw [← Rat.norm_cast_real, ← Int.norm_cast_real]; congr 1
end Rat
Mathlib/Analysis/Normed/Order/Lattice.lean:62:instance : HasSolidNorm ℚ := ⟨fun _ _ _ => by simpa only [norm, ← Rat.cast_abs, Rat.cast_le]⟩
Mathlib/Analysis/Normed/Field/Lemmas.lean:271:instance Rat.instNormedField : NormedField ℚ where**Refining norm rewriting with cast real** **Simplifying norm proof with rewrite**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=800000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Applying lemma patch for cast_abs**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=800000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Refining scaling definitions and positivity proofs** **Adjusting scaling with m+1 and defining inner product lemma**
**Simplifying field and point operations** **Proving distance reciprocal lower bound**
**Exploring nonlinear inequality proof** **Deriving asymptotic distance bound**
**Compiling to identify errors**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1200000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Inspecting positivity lines around 580-700**
$ /bin/bash -lc "nl -ba SharpDistanceScratch.lean | sed -n '580,705p'"
580 ext i
581 fin_cases i <;> simp
582
583 def yScale (m : ℕ) : ℝ :=
584 2 * yConstant K * (m + 1)
585
586 def xScale (B : TraceBasisData K) (m : ℕ) : ℝ :=
587 (aConstant B + 2 * yConstant K ^ 2) * (m + 1) ^ 2
588
589 lemma yScale_pos (m : ℕ) : 0 < yScale (K := K) m := by
590 unfold yScale
591 positivity
592
593 lemma xScale_pos (B : TraceBasisData K) (m : ℕ) : 0 < xScale B m := by
594 unfold xScale
595 apply mul_pos
596 · exact add_pos_of_pos_of_nonneg (aConstant_pos B)
597 (mul_nonneg (by norm_num) (sq_nonneg _))
598 · positivity
599
600 def scaledPoint (σ : K →+* ℝ) (B : TraceBasisData K) {m : ℕ}
601 (s : ArithmeticSource B m) : Point :=
602 point
603 ((σ (sourceY s : K) + yScale (K := K) m) / (2 * yScale (K := K) m))
604 ((σ (sourceX B s : K) + xScale B m) / (2 * xScale B m))
605
606 def scaledDirection (σ : K →+* ℝ) (B : TraceBasisData K) {m : ℕ}
607 (s : ArithmeticSource B m) : Point :=
608 point (xScale B m) (yScale (K := K) m * σ (sourceY s : K))
609
610 def scaledNormal (σ : K →+* ℝ) (B : TraceBasisData K) {m : ℕ}
611 (s : ArithmeticSource B m) : Point :=
612 point (-(yScale (K := K) m * σ (sourceY s : K))) (xScale B m)
613
614 def scaledLine (σ : K →+* ℝ) (B : TraceBasisData K) {m : ℕ}
615 (s : ArithmeticSource B m) : RealLine where
616 base := scaledPoint σ B s
617 direction := scaledDirection σ B s
618 direction_ne_zero := by
619 intro h
620 have h0 := congrArg (fun p : Point ↦ p 0) h
621 simp [scaledDirection] at h0
622 exact (xScale_pos B m).ne' h0
623
624 lemma scaledPoint_mem_unitSquare (σ : K →+* ℝ) (B : TraceBasisData K)
625 {m : ℕ} (s : ArithmeticSource B m) :
626 InUnitSquare (scaledPoint σ B s) := by
627 have hy0 : |σ (sourceY s : K)| ≤ yScale (K := K) m := by
628 calc
629 _ ≤ NumberField.house (**Refining numeric cast and simplification tactics** **Fixing gcongr goals and simplifying inequalities**
**Compiling codebase**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1200000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Refining inequality proof application**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1200000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Fixing addition order in theorem application**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1200000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Defining geometry configurations and embeddings** **Searching embedding cardinality lemma**
$ /bin/bash -lc "rg -n \"Nat.ceil.*rpow|ceil.*rpow|Nat.ceil_le|Nat.le_ceil|ceil_lt_add_one|Nat.ceil_lt\" Mathlib/Algebra/Order Mathlib/Data/Nat Mathlib/Analysis | sed -n '1,260p'" Mathlib/Algebra/Order/Archimedean/Real/Basic.lean:87: replace ij := le_trans (Nat.le_ceil _) (Nat.cast_le.2 ij) Mathlib/Algebra/Order/Archimedean/Real/Basic.lean:88: replace ik := le_trans (Nat.le_ceil _) (Nat.cast_le.2 ik) Mathlib/Algebra/Order/Archimedean/Basic.lean:341: let ⟨q, h⟩ := H x; ⟨⌈q⌉₊, lt_of_lt_of_le h <| mod_cast Nat.le_ceil _⟩ Mathlib/Algebra/Order/Floor/Semiring.lean:357:theorem ceil_lt_add_one (ha : 0 ≤ a) : (⌈a⌉₊ : R) < a + 1 := Mathlib/Algebra/Order/Floor/Semiring.lean:369: · rwa [ceil_eq_zero.2 (tsub_nonpos_of_le han), eq_comm, tsub_eq_zero_iff_le, Nat.ceil_le] Mathlib/Algebra/Order/Floor/Semiring.lean:405: · simpa using (ceil_lt_add_one ha).le Mathlib/Algebra/Order/Floor/Semifield.lean:71: ⌈a⌉₊ < a + 1 := ceil_lt_add_one <| hba.trans' <| by positivity Mathlib/Algebra/Order/Floor/Ring.lean:681:theorem ceil_lt_add_one (a : R) : (⌈a⌉ : R) < a + 1 := by Mathlib/Algebra/Order/Floor/Ring.lean:693: refine (ceil_lt_add_one _).le.trans ?_ Mathlib/Algebra/Order/Floor/Ring.lean:766: convert ceil_lt_add_one (R := k) _ Mathlib/Algebra/Order/Floor/Ring.lean:776: ⌈a⌉ < a + 1 := ceil_lt_add_one _ Mathlib/Algebra/Order/Floor/Ring.lean:868:/-- a variant of `Nat.ceil_lt_add_one` with its condition `0 ≤ a` generalized to `-1 < a` -/ Mathlib/Algebra/Order/Floor/Ring.lean:870:lemma ceil_lt_add_one_of_gt_neg_one (ha : -1 < a) : ⌈a⌉₊ < a + 1 := by Mathlib/Algebra/Order/Floor/Ring.lean:872: · exact ceil_lt_add_one h Mathlib/Algebra/Order/Floor/Extended.lean:137: | (r : ℝ≥0) => by simpa using mod_cast Nat.ceil_le_floor_add_one r Mathlib/Algebra/Order/Floor/Extended.lean:211:lemma ceil_lt_add_one (hr : r ≠ ∞) : (⌈r⌉ₑ : ℝ≥0∞) < r + 1 := by Mathlib/Algebra/Order/Floor/Extended.lean:212: lift r to ℝ≥0 using hr; simpa using mod_cast Nat.ceil_lt_add_one zero_le Mathlib/Analysis/BoxIntegral/Integrability.lean:140: exact hJ.2 ▸ Nat.le_ceil _ Mathlib/Analysis/BoxIntegral/UnitPartition.lean:86: le_trans (Metric.ball_subset_ball (Nat.le_ceil R)) this
$ /bin/bash -lc "rg -n \"card_le_iff.*Embedding|Fintype.card_le_iff|exists_embedding.*card|Embedding.*card_le\" Mathlib/Data/Fintype Mathlib | sed -n '1,200p'" Mathlib/Data/Set/Card.lean:513:theorem _root_.Function.Embedding.encard_le (e : s ↪ t) : s.encard ≤ t.encard := Mathlib/Data/Set/Card.lean:542: (Function.Embedding.subtype _).encard_le Mathlib/Data/Set/Card.lean:547: Function.Embedding.encard_le ⟨fun ⟨⟨x, _⟩, hx⟩ ↦ ⟨x, hx⟩, fun _ _ h ↦ by Mathlib/GroupTheory/GroupAction/Jordan.lean:325: rwa [← not_nonempty_iff, Function.Embedding.nonempty_iff_card_le, Fintype.card_fin, Mathlib/Combinatorics/SimpleGraph/CompleteMultipartite.lean:320: rw [Embedding.nonempty_iff_card_le, Fintype.card_fin] Mathlib/Combinatorics/SimpleGraph/CompleteMultipartite.lean:396: rw [Embedding.nonempty_iff_card_le, Mathlib/Combinatorics/SimpleGraph/CompleteMultipartite.lean:400: rw [Embedding.nonempty_iff_card_le, Fintype.card_fin, card_coe, K.card_mem_parts p.prop] Mathlib/Combinatorics/SimpleGraph/VertexCover.lean:191: exact Function.Embedding.encard_le <| Function.Embedding.mk f hf |>.subtypeMap (by simp) Mathlib/Combinatorics/SimpleGraph/Bipartite.lean:334: exact Function.Embedding.nonempty_of_card_le card_left.symm.le Mathlib/Combinatorics/SimpleGraph/Bipartite.lean:338: exact Function.Embedding.nonempty_of_card_le card_right.symm.le Mathlib/Combinatorics/SimpleGraph/Bipartite.lean:509: grw [hG.edgeSetEmbeddingCompleteBipartiteGraph.encard_le] Mathlib/Combinatorics/SimpleGraph/Coloring/Vertex.lean:275: G.recolorOfEmbedding <| (Function.Embedding.nonempty_of_card_le hn).some Mathlib/Combinatorics/SimpleGraph/Coloring/Vertex.lean:280: (Embedding.completeGraph (Embedding.nonempty_of_card_le hαβ).some).toHom.comp := rfl Mathlib/Combinatorics/SimpleGraph/Copy.lean:299: fun h ↦ ⟨Copy.bot (Function.Embedding.nonempty_of_card_le h).some⟩⟩ Mathlib/SetTheory/Cardinal/Embedding.lean:17:* `Fin.Embedding.exists_embedding_disjoint_range_of_add_le_ENat_card` Mathlib/SetTheory/Cardinal/Embedding.lean:22:* `Fin.Embedding.exists_embedding_disjoint_range_of_add_le_Nat_card` Mathlib/SetTheory/Cardinal/Embedding.lean:44:theor
$ /bin/bash -lc "rg -n \"rpow_nat_inv_pow|rpow_inv_natCast|rpow_one_div_nat|rpow_mul|rpow_natCast|Nat.cast.*ceil\" Mathlib/Analysis/SpecialFunctions/Pow Mathlib | sed -n '1,260p'" Mathlib/NumberTheory/Transcendental/Liouville/LiouvilleWith.lean:329: rwa [rpow_natCast] Mathlib/NumberTheory/SiegelsLemma.lean:169: rw [← rpow_mul (mul_nonneg (Nat.cast_nonneg' n) (le_trans zero_le_one (le_max_left ..))), Mathlib/NumberTheory/SiegelsLemma.lean:170: ← Real.rpow_natCast, div_mul_cancel₀] Mathlib/NumberTheory/SiegelsLemma.lean:177: rw [← rpow_natCast, ← rpow_add (Nat.cast_add_one_pos B), ← rpow_natCast, sub_add_cancel] Mathlib/NumberTheory/NumberField/Discriminant/Basic.lean:155: rw [convexBodySum_volume, ← ENNReal.ofReal_pow (by positivity), ← Real.rpow_natCast, Mathlib/NumberTheory/NumberField/Discriminant/Basic.lean:156: ← Real.rpow_mul toReal_nonneg, div_mul_cancel₀, Real.rpow_one, ofReal_toReal, mul_comm, Mathlib/NumberTheory/NumberField/Discriminant/Basic.lean:162: rw [div_pow B, ← Real.rpow_natCast B, ← Real.rpow_mul (by positivity), div_mul_cancel₀ _ Mathlib/NumberTheory/NumberField/Discriminant/Basic.lean:235: (by positivity) (by positivity), ← Real.rpow_mul (by positivity), inv_mul_cancel₀ h.ne', Mathlib/NumberTheory/NumberField/Discriminant/Basic.lean:236: Real.rpow_one, Real.mul_rpow (by positivity) (by positivity), Real.rpow_natCast, Mathlib/NumberTheory/NumberField/Discriminant/Basic.lean:237: Real.rpow_natCast, ← pow_mul, ← Real.rpow_mul (by positivity), Mathlib/NumberTheory/NumberField/Discriminant/Basic.lean:357: rw [← Real.rpow_natCast] Mathlib/NumberTheory/NumberField/CanonicalEmbedding/ConvexBody.lean:129: ← NNReal.rpow_natCast, ← NNReal.rpow_mul, inv_mul_cancel₀, NNReal.rpow_one, mul_assoc, Mathlib/NumberTheory/NumberField/CanonicalEmbedding/ConvexBody.lean:600: rw [← rpow_natCast, ← rpow_le_rpow_iff (by simp only [Rat.cast_abs, abs_nonneg]) Mathlib/NumberTheory/NumberField/CanonicalEmbedding/ConvexBody.lean:601: (rpow_nonneg h2 _) h1, ← rpow_mul h2, mul_inv_cancel₀ (Nat.cast_ne_zero.mpr Mathlib/NumberTheory/NumberField/CanonicalEmbedding/ConvexBody.lean:607: · simp_rw [←
**Defining configuration structures and separation properties** **Formalizing exponent arithmetic and embedding construction**
The full finite construction now compiles all the way through the Euclidean metric: points are in the unit square, assigned incidences hold by the line carrier definition, and every off-diagonal `Metric.infDist` has the number-field lower bound. I’m moving to the last two layers: selecting exactly \(n\) pairs from the coefficient box, and converting the \(m\)-parameter bound to the eventual \(n^{-2/3-\varepsilon}\) statement.$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1200000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Patching missing symmetry for injectivity**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1200000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Formalizing construction distance lower bound** **Deriving asymptotic distance bound**
**Formalizing eventual power domination lemma** **Defining construction constant and bounding denominator**
**Adding denominator lemma for iteration**
**Verifying signature direction and compiling**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1500000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Inspecting constant usage in lines**
$ /bin/bash -lc "nl -ba SharpDistanceScratch.lean | sed -n '804,860p'"
804 def constructionConstant (B : TraceBasisData K) : ℝ :=
805 8 * (aConstant B + 6 * yConstant K ^ 2) *
806 (2 * aConstant B + 12 * yConstant K ^ 2) ^
807 (Module.finrank ℚ K - 1)
808
809 lemma constructionConstant_pos (B : TraceBasisData K) :
810 0 < constructionConstant B := by
811 unfold constructionConstant
812 positivity
813
814 lemma construction_denominator_le (B : TraceBasisData K) {m : ℕ}
815 (hm : 0 < m) (hd : 0 < Module.finrank ℚ K) :
816 2 * ((aConstant B + 6 * yConstant K ^ 2) * (m + 1) ^ 2) *
817 (((2 * aConstant B + 12 * yConstant K ^ 2) * m ^ 2) ^
818 (Module.finrank ℚ K - 1)) ≤
819 constructionConstant B * (m : ℝ) ^ (2 * Module.finrank ℚ K) := by
820 let d := Module.finrank ℚ K
821 let G := aConstant B + 6 * yConstant K ^ 2
822 let H := 2 * aConstant B + 12 * yConstant K ^ 2
823 have hG : 0 ≤ G := by
824 dsimp [G]
825 positivity
826 have hH : 0 ≤ H := by
827 dsimp [H]
828 positivity
829 have hm1 : ((m + 1 : ℕ) : ℝ) ≤ 2 * m := by
830 norm_num
831 exact_mod_cast (show m + 1 ≤ 2 * m by omega)
832 calc
833 2 * (G * (m + 1) ^ 2) * (H * m ^ 2) ^ (d - 1) ≤
834 2 * (G * (2 * m) ^ 2) * (H * m ^ 2) ^ (d - 1) := by
835 gcongr
836 _ = constructionConstant B * (m : ℝ) ^ (2 * d) := by
837 have hexp : 2 + 2 * (d - 1) = 2 * d := by omega
838 simp only [mul_pow]
839 rw [show (m : ℝ) ^ 2 * (m ^ 2) ^ (d - 1) =
840 m ^ (2 * d) by
841 rw [← pow_mul, ← pow_add, hexp]]
842 simp [constructionConstant, G, H]
843 ring
844
845 lemma selectedConfiguration_simple_separated (σ : K →+* ℝ)
846 (B : TraceBasisData K) {m n : ℕ} (hm : 0 < m)
847 (hd : 0 < Module.finrank ℚ K)
848 (hcard : n ≤ Fintype.card (ArithmeticSource B m)) :
849 (selectedConfiguration σ B m n hcard).Sep**Refining norm_num and linarith proofs** **Combining powers and applying ring simplifications**
**Calculating positive raw factors**
**Verifying third bullet application**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1500000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Inspecting compile state**
The finite construction is now in place: it selects any prescribed number of source pairs, maps them to incident point–line pairs in the unit square, and proves a uniform off-diagonal distance bound. I’m tightening that bound into the exponent form needed for the asymptotic theorem, then I’ll instantiate the abstract totally real field with an explicit cyclotomic family.
$ /bin/bash -lc "sed -n '800,900p' SharpDistanceScratch.lean && lake env lean -DmaxHeartbeats=1500000 SharpDistanceScratch.lean" SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1500000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Refining exact match handling**
**Identifying usage of hm1 in gcongr compilation**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1500000 SharpDistanceScratch.lean >/tmp/sharp.log 2>&1; code=$?; tail -20 /tmp/sharp.log; exit $code'
Note: This linter can be disabled with `set_option linter.unreachableTactic false`
SharpDistanceScratch.lean:791:13: warning: Variable name `i` is not explicitly referenced.
Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning:
[apply] _i
Note: This linter can be disabled with `set_option linter.unusedVariables false`
SharpDistanceScratch.lean:792:11: warning: Variable name `i` is not explicitly referenced.
Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning:
[apply] _i
Note: This linter can be disabled with `set_option linter.unusedVariables false`
Try this:
[apply] ring_nf
The `ring` tactic failed to close the goal. Use `ring_nf` to obtain a normal form.
Note that `ring` works primarily in *commutative* rings. If you have a noncommutative ring, abelian group or module, consider using `noncomm_ring`, `abel` or `module` instead.**Planning library investigation**
$ /bin/bash -lc 'rg "tendsto_rpow_atTop|ceil_lt_add_one|rpow_inv_natCast|rpow_nat_inv_pow|natCast.*rpow|pow_rpow_inv" Mathlib | head -80' Mathlib/NumberTheory/Transcendental/Liouville/LiouvilleWith.lean: ((tendsto_rpow_atTop (sub_pos.2 hlt)).comp tendsto_natCast_atTop_atTop).eventually Mathlib/NumberTheory/Transcendental/Liouville/Measure.lean: rw [Real.volume_ball, mul_one_div, ← NNReal.coe_two, ← NNReal.coe_natCast, ← NNReal.coe_rpow, Mathlib/NumberTheory/SiegelsLemma.lean: rw [← rpow_natCast, ← rpow_add (Nat.cast_add_one_pos B), ← rpow_natCast, sub_add_cancel] Mathlib/NumberTheory/NumberField/Discriminant/Basic.lean: rw [div_pow B, ← Real.rpow_natCast B, ← Real.rpow_mul (by positivity), div_mul_cancel₀ _ Mathlib/NumberTheory/NumberField/Discriminant/Basic.lean: Real.rpow_natCast, ← pow_mul, ← Real.rpow_mul (by positivity), Mathlib/NumberTheory/ClassNumber/AdmissibleCardPowDegree.lean: log_mul (pow_ne_zero _ q_pos'.ne') hε.ne', ← rpow_natCast, ← rpow_natCast, log_rpow q_pos', Mathlib/NumberTheory/NumberField/CanonicalEmbedding/ConvexBody.lean: ← NNReal.rpow_natCast, ← NNReal.rpow_mul, inv_mul_cancel₀, NNReal.rpow_one, mul_assoc, Mathlib/NumberTheory/NumberField/CanonicalEmbedding/ConvexBody.lean: rw [← rpow_natCast, ← rpow_le_rpow_iff (by simp only [Rat.cast_abs, abs_nonneg]) Mathlib/NumberTheory/Harmonic/EulerMascheroni.lean: ← Nat.cast_ofNat, rpow_natCast, Nat.cast_ofNat, ← Nat.cast_ofNat (n := 60), rpow_natCast] Mathlib/NumberTheory/Harmonic/ZetaAsymp.lean: refine tendsto_const_nhds.div_atTop <| (tendsto_rpow_atTop (by linarith)).comp ?_ Mathlib/NumberTheory/EulerProduct/DirichletLSeries.lean: rw [← ofReal_natCast n, norm_cpow_eq_rpow_re_of_nonneg (by simp) (by simp; grind)] Mathlib/NumberTheory/Ostrowski.lean: simp only [← rpow_natCast, p.cast_nonneg, ← rpow_mul, neg_mul, mul_one, ← rpow_neg, hpm, Mathlib/NumberTheory/Ostrowski.lean: rw [Nat.cast_pow, map_pow, ← rpow_natCast, rpow_rpow_inv (by positivity) (by positivity)] Mathlib/NumberTheory/Ostrowski.lean: · rw [← rpow_natCast, rpow_le_rpow_left_iff (one_lt_of_not_bounded notbdd hm)]
**Developing general theorem for exponent choice**
$ /bin/bash -lc "cat > Query.lean <<'EOF' import SharpDistanceScratch #check tendsto_rpow_atTop #check Filter.eventually_atTop.1 #check Filter.eventually_atTop.2 #check Metric.tendsto_atTop #check Nat.le_ceil #check Nat.ceil_lt_add_one #check Real.rpow_le_rpow #check Real.rpow_le_rpow_of_exponent_nonneg #check Real.rpow_natCast #check Real.rpow_mul #check Real.rpow_add #check Real.rpow_inv_rpow #check Real.rpow_rpow_inv #check Real.rpow_sub #check Real.rpow_neg #check Real.one_le_rpow #check Real.rpow_le_rpow_of_exponent_le #check Real.strictMono_rpow_of_base_gt_one #check Real.rpow_pos_of_pos #check Nat.cast_pow #check Nat.cast_le #check pow_le_pow_left₀ #check Real.rpow_nat_inv_pow_nat #check Real.pow_rpow_inv_natCast #check pow_rpow_inv_natCast #check Real.rpow_inv_natCast_pow #check Real.rpow_natCast #check Real.rpow_mul_natCast #check Real.rpow_one #check Real.rpow_nonneg #check Real.rpow_pos_of_pos #check Real.rpow_mul #check Nat.one_le_ceil #check Nat.ceil_pos #check Nat.ceil_le EOF lake env lean Query.lean 2>/dev/null" Query.lean:1:0: error: unknown module prefix 'SharpDistanceScratch' No directory 'SharpDistanceScratch' or file 'SharpDistanceScratch.olean' in the search path entries: /work/repro/.lake/packages/Cli/.lake/build/lib/lean /work/repro/.lake/packages/batteries/.lake/build/lib/lean /work/repro/.lake/packages/Qq/.lake/build/lib/lean /work/repro/.lake/packages/aesop/.lake/build/lib/lean /work/repro/.lake/packages/proofwidgets/.lake/build/lib/lean /work/repro/.lake/packages/importGraph/.lake/build/lib/lean /work/repro/.lake/packages/LeanSearchClient/.lake/build/lib/lean /work/repro/.lake/packages/plausible/.lake/build/lib/lean /work/repro/.lake/build/lib/lean /opt/elan/toolchains/leanprover--lean4---v4.33.0-rc1/lib/lean /opt/elan/toolchains/leanprover--lean4---v4.33.0-rc1/lib/lean
$ /bin/bash -lc 'lake env lean Query.lean 2>/dev/null'
tendsto_rpow_atTop {y : ℝ} (hy : 0 < y) : Filter.Tendsto (fun x => x ^ y) Filter.atTop Filter.atTop
Filter.eventually_atTop.mp : (∀ᶠ (x : ?m.1) in Filter.atTop, ?m.4 x) → ∃ a, ∀ (b : ?m.1), a ≤ b → ?m.4 b
Filter.eventually_atTop.mpr : (∃ a, ∀ (b : ?m.1), a ≤ b → ?m.4 b) → ∀ᶠ (x : ?m.1) in Filter.atTop, ?m.4 x
Metric.tendsto_atTop.{u, v} {α : Type u} {β : Type v} [PseudoMetricSpace α] [Nonempty β] [SemilatticeSup β] {u : β → α}
{a : α} : Filter.Tendsto u Filter.atTop (nhds a) ↔ ∀ ε > 0, ∃ N, ∀ n ≥ N, dist (u n) a < ε
Nat.le_ceil.{u_1} {R : Type u_1} [Semiring R] [LinearOrder R] [FloorSemiring R] (a : R) : a ≤ ↑⌈a⌉₊
Nat.ceil_lt_add_one.{u_1} {R : Type u_1} [Semiring R] [LinearOrder R] [FloorSemiring R] {a : R} [IsStrictOrderedRing R]
(ha : 0 ≤ a) : ↑⌈a⌉₊ < a + 1
Real.rpow_le_rpow {x y z : ℝ} (h : 0 ≤ x) (h₁ : x ≤ y) (h₂ : 0 ≤ z) : x ^ z ≤ y ^ z
Query.lean:14:7: error(lean.unknownIdentifier): Unknown constant `Real.rpow_le_rpow_of_exponent_nonneg`
Real.rpow_natCast (x : ℝ) (n : ℕ) : x ^ ↑n = x ^ n
Real.rpow_mul {x : ℝ} (hx : 0 ≤ x) (y z : ℝ) : x ^ (y * z) = (x ^ y) ^ z
Real.rpow_add {x : ℝ} (hx : 0 < x) (y z : ℝ) : x ^ (y + z) = x ^ y * x ^ z
Real.rpow_inv_rpow {x y : ℝ} (hx : 0 ≤ x) (hy : y ≠ 0) : (x ^ y⁻¹) ^ y = x
Real.rpow_rpow_inv {x y : ℝ} (hx : 0 ≤ x) (hy : y ≠ 0) : (x ^ y) ^ y⁻¹ = x
Real.rpow_sub {x : ℝ} (hx : 0 < x) (y z : ℝ) : x ^ (y - z) = x ^ y / x ^ z
Real.rpow_neg {x : ℝ} (hx : 0 ≤ x) (y : ℝ) : x ^ (-y) = (x ^ y)⁻¹
Real.one_le_rpow {x z : ℝ} (hx : 1 ≤ x) (hz : 0 ≤ z) : 1 ≤ x ^ z
Real.rpow_le_rpow_of_exponent_le {x y z : ℝ} (hx : 1 ≤ x) (hyz : y ≤ z) : x ^ y ≤ x ^ z
Real.strictMono_rpow_of_base_gt_one {b : ℝ} (hb : 1 < b) : StrictMono fun x => b ^ x
Real.rpow_pos_of_pos {x : ℝ} (hx : 0 < x) (y : ℝ) : 0 < x ^ y
Nat.cast_pow.{u_1} {α : Type u_1} [Semiring α] (m n : ℕ) : ↑(m ^ n) = ↑m ^ n
Nat.cast_le.{u_1} {α : Type u_1} [AddMonoidWithOne α] [PartialOrder α] [AddLeftMono α] [ZeroLEOneClass α] [CharZero α]
{m n : ℕ} : ↑m ≤ ↑n ↔ m ≤ n
pow_le_pow_left₀.{u_2**Designing theorem for exponent configuration** **Verifying tendsto behavior for nat cast**
$ /bin/bash -lc "cat > Query2.lean <<'EOF'
import Mathlib.Analysis.SpecialFunctions.Pow.Asymptotics
#check Filter.tendsto_atTop
#check Filter.tendsto_atTop.1
#check Filter.tendsto_atTop.2
#check tendsto_natCast_atTop_atTop
#check Nat.ceil_le
#check Nat.le_ceil
#check Nat.cast_le
#check Nat.cast_pos
#check Real.rpow_mul_natCast
#check Real.rpow_natCast
#check Real.rpow_add
#check Real.rpow_sub
#check Real.rpow_neg
#check inv_le_inv₀
#check Real.rpow_le_rpow_of_exponent_le
#check Real.rpow_inv_natCast_pow
EOF
lake env lean Query2.lean 2>/dev/null"
Filter.tendsto_atTop.{u_3, u_4} {α : Type u_3} {β : Type u_4} [Preorder β] {m : α → β} {f : Filter α} :
Filter.Tendsto m f Filter.atTop ↔ ∀ (b : β), ∀ᶠ (a : α) in f, b ≤ m a
Filter.tendsto_atTop.mp : Filter.Tendsto ?m.4 ?m.5 Filter.atTop → ∀ (b : ?m.2), ∀ᶠ (a : ?m.1) in ?m.5, b ≤ ?m.4 a
Filter.tendsto_atTop.mpr : (∀ (b : ?m.2), ∀ᶠ (a : ?m.1) in ?m.5, b ≤ ?m.4 a) → Filter.Tendsto ?m.4 ?m.5 Filter.atTop
tendsto_natCast_atTop_atTop.{u_2} {R : Type u_2} [Semiring R] [PartialOrder R] [IsOrderedRing R] [Archimedean R] :
Filter.Tendsto Nat.cast Filter.atTop Filter.atTop
Nat.ceil_le.{u_2} {α : Type u_2} [Semiring α] [PartialOrder α] [FloorSemiring α] {a : α} {n : ℕ} : ⌈a⌉₊ ≤ n ↔ a ≤ ↑n
Nat.le_ceil.{u_1} {R : Type u_1} [Semiring R] [LinearOrder R] [FloorSemiring R] (a : R) : a ≤ ↑⌈a⌉₊
Nat.cast_le.{u_1} {α : Type u_1} [AddMonoidWithOne α] [PartialOrder α] [AddLeftMono α] [ZeroLEOneClass α] [CharZero α]
{m n : ℕ} : ↑m ≤ ↑n ↔ m ≤ n
Nat.cast_pos.{u_3} {α : Type u_3} [Semiring α] [PartialOrder α] [IsOrderedRing α] [Nontrivial α] {n : ℕ} :
0 < ↑n ↔ 0 < n
Real.rpow_mul_natCast {x : ℝ} (hx : 0 ≤ x) (y : ℝ) (n : ℕ) : x ^ (y * ↑n) = (x ^ y) ^ n
Real.rpow_natCast (x : ℝ) (n : ℕ) : x ^ ↑n = x ^ n
Real.rpow_add {x : ℝ} (hx : 0 < x) (y z : ℝ) : x ^ (y + z) = x ^ y * x ^ z
Real.rpow_sub {x : ℝ} (hx : 0 < x) (y z : ℝ) : x ^ (y - z) = x ^ y / x ^ z
Real.rpow_neg {x : ℝ} (hx : 0 ≤ x) (y : ℝ) : x ^ (-y) = (x ^ y)⁻¹
inv_le_inv₀.{u_3} {G₀ : Type u_3} [GroupWithZero G₀] [PartialOrder G₀] [PosMulReflectLT G₀] [MulPosReflectLT G₀]
{a b : G₀} (ha : 0 < a) (hb : 0 < b) : a⁻¹ ≤ b⁻¹ ↔ b ≤ a
Real.rpow_le_rpow_of_exponent_le {x y z : ℝ} (hx : 1 ≤ x) (hyz : y ≤ z) : x ^ y ≤ x ^ z
Real.rpow_inv_natCast_pow {x : ℝ} {n : ℕ} (hx : 0 ≤ x) (hn : n ≠ 0) : (x ^ (↑n)⁻¹) ^ n = x**Inspecting lemma near position 760**
$ /bin/bash -lc "sed -n '730,815p' SharpDistanceScratch.lean"
have hP : 0 < P := pow_pos hH _
have hNG : N ≤ G := scaledNormal_norm_le σ B s
have hprod : 1 ≤ A * P := sourceD_norm_product_lower σ B hst
have hPinvA : 1 / P ≤ A := by
apply (div_le_iff₀ hP).2
simpa [A, P, H, mul_comm] using hprod
have hgeom :
A / (2 * N) ≤ pointLineDist (scaledPoint σ B t) (scaledLine σ B s) := by
have h := pointLineDist_ge_inner_div_norm
(scaledPoint σ B t) (scaledLine σ B s) (scaledNormal σ B s)
(scaledNormal_ne_zero σ B s) (scaled_orthogonal σ B s)
change
|⟪scaledPoint σ B t - scaledPoint σ B s, scaledNormal σ B s⟫_ℝ| /
‖scaledNormal σ B s‖ ≤
pointLineDist (scaledPoint σ B t) (scaledLine σ B s) at h
rw [scaled_inner_eq] at h
simpa [A, N, abs_div, div_div] using h
calc
(2 * G * P)⁻¹ = (1 / P) / (2 * G) := by
field_simp [hG.ne', hP.ne']
<;> ring
_ ≤ A / (2 * G) := by
exact div_le_div_of_nonneg_right hPinvA (by positivity)
_ ≤ A / (2 * N) := by
exact div_le_div_of_nonneg_left hA (by positivity) (by linarith)
_ ≤ pointLineDist (scaledPoint σ B t) (scaledLine σ B s) := hgeom
structure PLConfiguration (n : ℕ) where
points : Fin n → Point
lines : Fin n → RealLine
points_mem : ∀ i, InUnitSquare (points i)
incident : ∀ i, points i ∈ (lines i).carrier
def PLConfiguration.Separated {n : ℕ} (C : PLConfiguration n) (δ : ℝ) : Prop :=
∀ i j, i ≠ j → δ ≤ pointLineDist (C.points i) (C.lines j)
lemma card_arithmeticSource_lower (B : TraceBasisData K) (m : ℕ)
(hd : 0 < Module.finrank ℚ K) :
m ^ (3 * Module.finrank ℚ K - 2) ≤
Fintype.card (ArithmeticSource B m) := by
let d := Module.finrank ℚ K
rw [card_arithmeticSource]
calc
m ^ (3 * d - 2) = (m ^ 2) ^ (d - 1) * m ^ d := by
rw [← pow_mul, ← pow_add]
congr 1
omega
_ ≤ (m ^ 2 + 1) ^ (d - 1) * (m + 1) ^ d := by
gcongr <;> omega
def sourceEmbedding (B : TraceBasisData K) (m n : ℕ)
(hcard : n ≤ Fintype.card (ArithmeticSource B m)) :
**Defining constants for theorem proof** **Constructing bounds for cardinality and denominator**
**Simplifying exponent expression** **Verifying exponent addition for inequality**
**Compiling the project**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1500000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Exploring CMField for unbounded degree**
$ /bin/bash -lc 'rg -n "maximalRealSubfield|isCMField|finrank.*maximal|finrank.*two|Cyclotomic.*finrank|finrank.*totient|isTotallyReal" Mathlib/NumberTheory/NumberField/CMField.lean Mathlib/NumberTheory/NumberField/Cyclotomic | head -160' Mathlib/NumberTheory/NumberField/Cyclotomic/Ideal.lean:383: rw [finrank m, finrank (p ^ (k + 1)), finrank n, hn, mul_comm, Nat.totient_mul] Mathlib/NumberTheory/NumberField/CMField.lean:44:* `IsCyclotomicExtension.Rat.isCMField`: A nontrivial cyclotomic extension of `ℚ` is CM. Mathlib/NumberTheory/NumberField/CMField.lean:65:section maximalRealSubfield Mathlib/NumberTheory/NumberField/CMField.lean:73: [is_quadratic : IsQuadraticExtension (maximalRealSubfield K) K] Mathlib/NumberTheory/NumberField/CMField.lean:81:local notation3 "K⁺" => maximalRealSubfield K Mathlib/NumberTheory/NumberField/CMField.lean:93: add_zero, ← IsTotallyReal.finrank, ← Nat.mul_left_cancel_iff zero_lt_two, Mathlib/NumberTheory/NumberField/CMField.lean:95: IsQuadraticExtension.finrank_eq_two _ K] Mathlib/NumberTheory/NumberField/CMField.lean:132: (IsQuadraticExtension.finrank_eq_two K⁺ K) ▸ IsGalois.card_aut_eq_finrank K⁺ K Mathlib/NumberTheory/NumberField/CMField.lean:193: IsQuadraticExtension.finrank_eq_two] Mathlib/NumberTheory/NumberField/CMField.lean:451:end maximalRealSubfield Mathlib/NumberTheory/NumberField/CMField.lean:458:theorem eq_maximalRealSubfield (E : Subfield K) [IsTotallyReal E] [IsQuadraticExtension E K] : Mathlib/NumberTheory/NumberField/CMField.lean:459: E = maximalRealSubfield K := by Mathlib/NumberTheory/NumberField/CMField.lean:460: refine le_antisymm (IsTotallyReal.le_maximalRealSubfield E) ?_ Mathlib/NumberTheory/NumberField/CMField.lean:462: have h' : E ⊔ (maximalRealSubfield K) = ⊤ := by Mathlib/NumberTheory/NumberField/CMField.lean:463: let L : IntermediateField E K := (E ⊔ (maximalRealSubfield K)).toIntermediateField Mathlib/NumberTheory/NumberField/CMField.lean:466: (IsQuadraticExtension.finrank_eq_two E K ▸ Nat.prime_two)).eq_bot_or_eq_top L).resolve_left ?_ Mathlib/NumberTheory/NumberField/CMField.lean:472: have : Algebra.IsAlgebraic (maximalRealSubfield K) K := Mathlib/NumberTheory/NumberField/CMField.lean:473: Algebra.IsAlgebra
$ /bin/bash -lc "sed -n '60,110p' Mathlib/NumberTheory/NumberField/CMField.lean; sed -n '540,590p' Mathlib/NumberTheory/NumberField/CMField.lean; sed -n '1,60p' Mathlib/NumberTheory/NumberField/Cyclotomic/Basic.lean"
open scoped ComplexConjugate
namespace NumberField
section maximalRealSubfield
/--
A field `K` is `CM` if `K` is a totally complex quadratic extension of its maximal
real subfield `K⁺`.
-/
class IsCMField (K : Type*) [Field K] [CharZero K] : Prop where
[to_isTotallyComplex : IsTotallyComplex K]
[is_quadratic : IsQuadraticExtension (maximalRealSubfield K) K]
namespace IsCMField
open ComplexEmbedding
variable (K : Type*) [Field K] [CharZero K] [IsCMField K]
local notation3 "K⁺" => maximalRealSubfield K
instance isQuadraticExtension : IsQuadraticExtension K⁺ K :=
IsCMField.is_quadratic
instance isTotallyComplex : IsTotallyComplex K :=
IsCMField.to_isTotallyComplex
theorem card_infinitePlace_eq_card_infinitePlace [NumberField K] :
Fintype.card (InfinitePlace K⁺) = Fintype.card (InfinitePlace K) := by
rw [card_eq_nrRealPlaces_add_nrComplexPlaces, card_eq_nrRealPlaces_add_nrComplexPlaces,
IsTotallyComplex.nrRealPlaces_eq_zero K, IsTotallyReal.nrComplexPlaces_eq_zero, zero_add,
add_zero, ← IsTotallyReal.finrank, ← Nat.mul_left_cancel_iff zero_lt_two,
← IsTotallyComplex.finrank, ← Module.finrank_mul_finrank ℚ K⁺ K, mul_comm,
IsQuadraticExtension.finrank_eq_two _ K]
/--
The equiv between the infinite places of `K` and the infinite places of `K⁺` induced by the
restriction to `K⁺`, see `equivInfinitePlace_apply`.
-/
noncomputable def equivInfinitePlace [NumberField K] : InfinitePlace K ≃ InfinitePlace K⁺ :=
Equiv.ofBijective (fun w ↦ w.comap (algebraMap K⁺ K)) <|
(Fintype.bijective_iff_surjective_and_card _).mpr
⟨comap_surjective, (card_infinitePlace_eq_card_infinitePlace K).symm⟩
@[simp]
theorem equivInfinitePlace_apply [NumberField K] (w : InfinitePlace K) :
equivInfinitePlace K w = w.comap (algebraMap K⁺ K) := rfl
@[simp]
open scoped IsMulCommutative in
/--
A totally complex abelian extension of `ℚ` is CM.
-/
instance of_isAbelianGalois [IsAbelianGalois ℚ K] :
IsCMField K := by
let φ : K →+* ℂ := Classical.ch**Searching for maximalRealSubfield definitions**
$ /bin/bash -lc "rg -n \"maximalRealSubfield\" Mathlib/NumberTheory/NumberField/Basic.lean Mathlib/NumberTheory/NumberField/Embeddings.lean Mathlib/NumberTheory/NumberField/*.lean | head -100; rg -n \"instance.*NumberField.*IntermediateField|NumberField.*Subfield|numberField\" Mathlib/NumberTheory/NumberField -g '*.lean' | head -100" rg: Mathlib/NumberTheory/NumberField/Embeddings.lean: No such file or directory (os error 2) Mathlib/NumberTheory/NumberField/CMField.lean:65:section maximalRealSubfield Mathlib/NumberTheory/NumberField/CMField.lean:73: [is_quadratic : IsQuadraticExtension (maximalRealSubfield K) K] Mathlib/NumberTheory/NumberField/CMField.lean:81:local notation3 "K⁺" => maximalRealSubfield K Mathlib/NumberTheory/NumberField/CMField.lean:451:end maximalRealSubfield Mathlib/NumberTheory/NumberField/CMField.lean:458:theorem eq_maximalRealSubfield (E : Subfield K) [IsTotallyReal E] [IsQuadraticExtension E K] : Mathlib/NumberTheory/NumberField/CMField.lean:459: E = maximalRealSubfield K := by Mathlib/NumberTheory/NumberField/CMField.lean:460: refine le_antisymm (IsTotallyReal.le_maximalRealSubfield E) ?_ Mathlib/NumberTheory/NumberField/CMField.lean:462: have h' : E ⊔ (maximalRealSubfield K) = ⊤ := by Mathlib/NumberTheory/NumberField/CMField.lean:463: let L : IntermediateField E K := (E ⊔ (maximalRealSubfield K)).toIntermediateField Mathlib/NumberTheory/NumberField/CMField.lean:472: have : Algebra.IsAlgebraic (maximalRealSubfield K) K := Mathlib/NumberTheory/NumberField/CMField.lean:473: Algebra.IsAlgebraic.tower_top (K := ℚ) (maximalRealSubfield K) Mathlib/NumberTheory/NumberField/CMField.lean:482: F ≃+* maximalRealSubfield K := Mathlib/NumberTheory/NumberField/CMField.lean:489: exact eq_maximalRealSubfield K (algebraMap F K).fieldRange)) Mathlib/NumberTheory/NumberField/CMField.lean:496:theorem algebraMap_equivMaximalRealSubfield_symm_apply (x : maximalRealSubfield K) : Mathlib/NumberTheory/NumberField/CMField.lean:498: algebraMap (maximalRealSubfield K) K x := by Mathlib/NumberTheory/NumberField/CMField.lean:26:* `NumberField.CMExtension.equivMaximalRealSubfield`: Any field `F` such that `K/F` is a Mathlib/NumberTheory/NumberField/Discriminant/Defs.lean:75:theorem numberField_discr : discr ℚ = 1 := by Mathlib/NumberTheory/NumberField/Discriminant/Defs.lean:89:
$ /bin/bash -lc "sed -n '110,160p' Mathlib/NumberTheory/NumberField/InfinitePlace/TotallyRealComplex.lean; sed -n '250,290p' Mathlib/NumberTheory/NumberField/Cyclotomic/Basic.lean; sed -n '335,385p' Mathlib/NumberTheory/NumberField/Cyclotomic/Basic.lean"
instance _root_.Subfield.isTotallyReal_bot [CharZero K] :
IsTotallyReal (⊥ : Subfield K) := by
rw [Subfield.bot_eq_of_charZero]
exact IsTotallyReal.ofRingEquiv (algebraMap ℚ K).rangeRestrictFieldEquiv
section maximalRealSubfield
open ComplexEmbedding
/--
The maximal real subfield of `K`. It is totally real,
see `NumberField.isTotallyReal_maximalRealSubfield`, and contains all the other totally real
subfields of `K`, see `NumberField.IsTotallyReal.le_maximalRealSubfield`.
-/
def maximalRealSubfield : Subfield K where
carrier := {x | ∀ φ : K →+* ℂ, star (φ x) = φ x}
mul_mem' hx hy _ := by rw [map_mul, star_mul, hx, hy, mul_comm]
one_mem' := by simp
add_mem' hx hy _ := by rw [map_add, star_add, hx, hy]
zero_mem' := by simp
neg_mem' := by simp
inv_mem' := by simp
variable {K}
theorem mem_maximalRealSubfield_iff (x : K) :
x ∈ maximalRealSubfield K ↔ ∀ φ : K →+* ℂ, star (φ x) = φ x := .rfl
theorem IsTotallyReal.le_maximalRealSubfield (E : Subfield K) [IsTotallyReal E] :
E ≤ maximalRealSubfield K := by
intro x hx φ
rw [show φ x = (φ.comp E.subtype) ⟨x, hx⟩ by simp, RCLike.star_def, ← conjugate_coe_eq]
refine RingHom.congr_fun ?_ _
exact ComplexEmbedding.isReal_iff.mp <| isReal_mk_iff.mp <| isReal _
@[simp]
theorem IsTotallyReal.maximalRealSubfield_eq_top [IsTotallyReal K] :
maximalRealSubfield K = ⊤ :=
top_unique <| NumberField.IsTotallyReal.le_maximalRealSubfield _
variable [CharZero K] [Algebra.IsAlgebraic ℚ K]
local instance (k : Subfield K) : Algebra.IsAlgebraic k K :=
Algebra.IsAlgebraic.tower_top k (K := ℚ) (A := K)
instance isTotallyReal_maximalRealSubfield :
IsTotallyReal (maximalRealSubfield K) where
isReal w := by
rw [InfinitePlace.isReal_iff, ComplexEmbedding.isReal_iff]
ext x
(hζ : IsPrimitiveRoot ζ (p ^ k)) :
hζ.subOneIntegralPowerBasisOfPrimePow.gen =
⟨ζ - 1, Subalgebra.sub_mem _ (hζ.isIntegral (NeZero.pos _)) (Subalgebra.one_mem _)⟩ := by
simp [subOneIntegralPowerBasisOfPri**Inspecting CyclotomicField definition**
$ /bin/bash -lc "rg -n \"def CyclotomicField|instance.*CyclotomicField|CyclotomicField.*IsCyclotomic|isCyclotomicExtension\" Mathlib/RingTheory/Polynomial/Cyclotomic -g '*.lean' Mathlib/NumberTheory -g '*.lean' | head -120; rg -n \"totient_two_pow|totient.*pow.*two|totient_prime_pow|totient_pow\" Mathlib | head -100"
Mathlib/NumberTheory/Cyclotomic/PrimitiveRoots.lean:200: have := IsPrimitiveRoot.adjoin_isCyclotomicExtension K this
Mathlib/NumberTheory/Cyclotomic/PrimitiveRoots.lean:220:theorem dvd_of_isCyclotomicExtension [IsCyclotomicExtension {n} ℚ K] {ζ : K}
Mathlib/NumberTheory/Cyclotomic/PrimitiveRoots.lean:258: obtain ⟨a, ha⟩ := hlroot.dvd_of_isCyclotomicExtension n hlzero.1
Mathlib/NumberTheory/Cyclotomic/PrimitiveRoots.lean:417: convert! hη'.adjoin_isCyclotomicExtension K using 1
Mathlib/NumberTheory/Cyclotomic/Basic.lean:105: simp [isCyclotomicExtension_iff, NeZero.ne]
Mathlib/NumberTheory/Cyclotomic/Basic.lean:108: subsingleton_of_bot_eq_top <| by simpa [Algebra.eq_top_iff, isCyclotomicExtension_iff] using h
Mathlib/NumberTheory/Cyclotomic/Basic.lean:112: simp [isCyclotomicExtension_iff, and_assoc]
Mathlib/NumberTheory/Cyclotomic/Basic.lean:117: simpa [adjoin_singleton_one] using ((isCyclotomicExtension_iff _ _ _).1 h).2 x
Mathlib/NumberTheory/Cyclotomic/Basic.lean:126:theorem isCyclotomicExtension_zero_iff :
Mathlib/NumberTheory/Cyclotomic/Basic.lean:142: · obtain ⟨b, hb⟩ := ((isCyclotomicExtension_iff _ _ _).1 hS).1 hn hn'
Mathlib/NumberTheory/Cyclotomic/Basic.lean:145: · exact ((isCyclotomicExtension_iff _ _ _).1 hT).1 hn hn'
Mathlib/NumberTheory/Cyclotomic/Basic.lean:146: · refine adjoin_induction (hx := ((isCyclotomicExtension_iff T B _).1 hT).2 x)
Mathlib/NumberTheory/Cyclotomic/Basic.lean:152: ⟨b, ((isCyclotomicExtension_iff _ _ _).1 hS).2 b, rfl⟩
Mathlib/NumberTheory/Cyclotomic/Basic.lean:185: refine ⟨fun hn => ((isCyclotomicExtension_iff _ A _).1 h).1 (mem_union_right S hn), fun b => ?_⟩
Mathlib/NumberTheory/Cyclotomic/Basic.lean:186: replace h := ((isCyclotomicExtension_iff _ _ _).1 h).2 b
Mathlib/NumberTheory/Cyclotomic/Basic.lean:195: · obtain ⟨b, hb⟩ := ((isCyclotomicExtension_iff _ _ _).1 h).1 (hS hn) hn'
Mathlib/NumberTheory/Cyclotomic/Basic.lean:320:theorem _root_.Algebra.isCyclotomicExtension_adjoin_of_exists_isPrimitiveRoot
**Defining maximal real subfield K**
$ /bin/bash -lc "cat > Query3.lean <<'EOF'
import Mathlib.NumberTheory.NumberField.CMField
import Mathlib.NumberTheory.NumberField.Cyclotomic.Basic
#check CyclotomicField
#check CyclotomicField.isCyclotomicExtension
#check IsCyclotomicExtension.Rat.finrank
#check IsCyclotomicExtension.Rat.isCMField
#check NumberField.IsCMField.isQuadraticExtension
#check IsQuadraticExtension.finrank_eq_two
#check Module.finrank_mul_finrank
#check Nat.totient_prime_pow
#check Nat.prime_two
#check NumberField.isTotallyReal_maximalRealSubfield
#check NumberField.maximalRealSubfield
#check NumberField.of_subfield
#check Module.finrank_pos
#check NumberField.IsTotallyReal.finrank
#check NumberField.IsTotallyReal.nrComplexPlaces_eq_zero
#check NumberField.ComplexEmbedding.isReal_iff
#check NumberField.IsTotallyReal.isReal
#check NumberField.IsTotallyReal.realAlgHom
#check NumberField.IsTotallyReal.toReal
#check NumberField.IsTotallyReal.embedding
EOF
lake env lean Query3.lean 2>/dev/null"
CyclotomicField.{w} (n : ℕ) (K : Type w) [Field K] : Type w
CyclotomicField.isCyclotomicExtension.{w} (n : ℕ) [NeZero n] (K : Type w) [Field K] [NeZero ↑n] :
IsCyclotomicExtension {n} K (CyclotomicField n K)
IsCyclotomicExtension.Rat.finrank.{u} (k : ℕ) (K : Type u) [Field K] [CharZero K] [NeZero k]
[IsCyclotomicExtension {k} ℚ K] : Module.finrank ℚ K = k.totient
IsCyclotomicExtension.Rat.isCMField.{u_1} (K : Type u_1) [Field K] [CharZero K] {S : Set ℕ} (hS : ∃ n ∈ S, 2 < n)
[IsCyclotomicExtension S ℚ K] : NumberField.IsCMField K
NumberField.IsCMField.isQuadraticExtension.{u_1} (K : Type u_1) [Field K] [CharZero K] [NumberField.IsCMField K] :
Algebra.IsQuadraticExtension (↥(NumberField.maximalRealSubfield K)) K
Query3.lean:8:7: error(lean.unknownIdentifier): Unknown identifier `IsQuadraticExtension.finrank_eq_two`
Module.finrank_mul_finrank.{u, v, w} (F : Type u) (K : Type v) (A : Type w) [Semiring F] [Semiring K] [AddCommMonoid A]
[Module F K] [Module K A] [Module F A] [IsScalarTower F K A] [StrongRankCondition F] [StrongRankCondition K]
[Module.Free F K] [Module.Free K A] : Module.finrank F K * Module.finrank K A = Module.finrank F A
Nat.totient_prime_pow {p : ℕ} (hp : Nat.Prime p) {n : ℕ} (hn : 0 < n) : (p ^ n).totient = p ^ (n - 1) * (p - 1)
Nat.prime_two : Nat.Prime 2
NumberField.isTotallyReal_maximalRealSubfield.{u_2} {K : Type u_2} [Field K] [CharZero K] [Algebra.IsAlgebraic ℚ K] :
NumberField.IsTotallyReal ↥(NumberField.maximalRealSubfield K)
NumberField.maximalRealSubfield.{u_2} (K : Type u_2) [Field K] : Subfield K
NumberField.of_subfield.{u_1} {K : Type u_1} [Field K] [NumberField K] (E : Subfield K) : NumberField ↥E
Module.finrank_pos.{u_1, u_2} {R : Type u_1} {M : Type u_2} [Ring R] [AddCommGroup M] [Module R M]
[StrongRankCondition R] [Module.Finite R M] [IsDomain R] [Module.IsTorsionFree R M] [h : Nontrivial M] :
0 < Module.finrank R M
NumberField.IsTotallyReal.finrank.{u_2} (K : Type u_2) [Field K] [NumberField K] [h : NumberField.I**Checking Algebra.IsQuadraticExtension namespace**
$ /bin/bash -lc "rg -n \"theorem finrank_eq_two|finrank_eq_two\" Mathlib | head -40; sed -n '650,715p' Mathlib/NumberTheory/Cyclotomic/Basic.lean"
Mathlib/NumberTheory/NumberField/Completion/Ramification.lean:48:theorem IsRamified.finrank_eq_two [w.LiesOver v] (h : w.IsRamified K) :
Mathlib/NumberTheory/NumberField/Completion/Ramification.lean:80:@[deprecated (since := "2026-07-10")] alias Completion.finrank_eq_two_of_isRamified :=
Mathlib/NumberTheory/NumberField/Completion/Ramification.lean:81: IsRamified.finrank_eq_two
Mathlib/NumberTheory/NumberField/Completion/Ramification.lean:92: · rw [h.finrank_eq_two v, hv, h.isReal.mult_eq_one, h.isComplex.mult_eq_two, one_mul]
Mathlib/NumberTheory/NumberField/Completion/Ramification.lean:119: have := (Set.mem_ofPred.1 hw).1; hw.2.finrank_eq_two v ▸ inertiaDeg_eq_finrank v w
Mathlib/NumberTheory/NumberField/CMField.lean:95: IsQuadraticExtension.finrank_eq_two _ K]
Mathlib/NumberTheory/NumberField/CMField.lean:132: (IsQuadraticExtension.finrank_eq_two K⁺ K) ▸ IsGalois.card_aut_eq_finrank K⁺ K
Mathlib/NumberTheory/NumberField/CMField.lean:193: IsQuadraticExtension.finrank_eq_two]
Mathlib/NumberTheory/NumberField/CMField.lean:466: (IsQuadraticExtension.finrank_eq_two E K ▸ Nat.prime_two)).eq_bot_or_eq_top L).resolve_left ?_
Mathlib/NumberTheory/NumberField/CMField.lean:486: { finrank_eq_two' :=
Mathlib/NumberTheory/NumberField/CMField.lean:487: (IsQuadraticExtension.finrank_eq_two F K) ▸ Algebra.finrank_eq_of_equiv_equiv
Mathlib/NumberTheory/NumberField/CMField.lean:514: is_quadratic := ⟨(IsQuadraticExtension.finrank_eq_two F K) ▸ finrank_eq_of_equiv_equiv
Mathlib/FieldTheory/IsAlgClosed/Basic.lean:359:theorem nonempty_algEquiv_or_of_finrank_eq_two {F F' : Type*} (E : Type*)
Mathlib/FieldTheory/Galois/Basic.lean:719: have := finrank_eq_two F K ▸ AlgEquiv.card_le
Mathlib/FieldTheory/Normal/Basic.lean:295: obtain h | h := le_iff_lt_or_eq.mp (finrank_eq_two F K ▸ minpoly.natDegree_le x)
Mathlib/LinearAlgebra/FiniteDimensional/Defs.lean:157:lemma of_fact_finrank_eq_two [Fact (finrank K V = 2)] : FiniteDimensional K V :=
Mathlib/Geometry/Eucli**Identifying Algebra.IsQuadraticExtension usage**
$ /bin/bash -lc "sed -i 's/#check IsQuadraticExtension.finrank_eq_two/#check Algebra.IsQuadraticExtension.finrank_eq_two/' Query3.lean; lake env lean Query3.lean 2>/dev/null | head -15"
CyclotomicField.{w} (n : ℕ) (K : Type w) [Field K] : Type w
CyclotomicField.isCyclotomicExtension.{w} (n : ℕ) [NeZero n] (K : Type w) [Field K] [NeZero ↑n] :
IsCyclotomicExtension {n} K (CyclotomicField n K)
IsCyclotomicExtension.Rat.finrank.{u} (k : ℕ) (K : Type u) [Field K] [CharZero K] [NeZero k]
[IsCyclotomicExtension {k} ℚ K] : Module.finrank ℚ K = k.totient
IsCyclotomicExtension.Rat.isCMField.{u_1} (K : Type u_1) [Field K] [CharZero K] {S : Set ℕ} (hS : ∃ n ∈ S, 2 < n)
[IsCyclotomicExtension S ℚ K] : NumberField.IsCMField K
NumberField.IsCMField.isQuadraticExtension.{u_1} (K : Type u_1) [Field K] [CharZero K] [NumberField.IsCMField K] :
Algebra.IsQuadraticExtension (↥(NumberField.maximalRealSubfield K)) K
Algebra.IsQuadraticExtension.finrank_eq_two.{u_2, u_3} (R : Type u_2) (S : Type u_3) [CommSemiring R]
[StrongRankCondition R] [Semiring S] [Algebra R S] [Algebra.IsQuadraticExtension R S] : Module.finrank R S = 2
Module.finrank_mul_finrank.{u, v, w} (F : Type u) (K : Type v) (A : Type w) [Semiring F] [Semiring K] [AddCommMonoid A]
[Module F K] [Module K A] [Module F A] [IsScalarTower F K A] [StrongRankCondition F] [StrongRankCondition K]
[Module.Free F K] [Module.Free K A] : Module.finrank F K * Module.finrank K A = Module.finrank F A
Nat.totient_prime_pow {p : ℕ} (hp : Nat.Prime p) {n : ℕ} (hn : 0 < n) : (p ^ n).totient = p ^ (n - 1) * (p - 1)**Designing finrank proof for cyclotomic fields**
$ /bin/bash -lc "cat > Query4.lean <<'EOF'
import Mathlib.NumberTheory.NumberField.CMField
import Mathlib.NumberTheory.NumberField.Cyclotomic.Basic
open scoped Cyclotomic
open NumberField
noncomputable section
theorem test (k : ℕ) :
let L := CyclotomicField (2 "'^ (k + 2)) ℚ
let K := maximalRealSubfield L
Module.finrank ℚ K = 2 ''^ k := by
let L := CyclotomicField (2 ''^ (k + 2)) ℚ
let N := 2 ''^ (k + 2)
letI : NumberField.IsCMField L :=
IsCyclotomicExtension.Rat.isCMField L (S := {N}) ⟨N, by simp, by
dsimp [N]
have : 4 ≤ 2 ''^ (k + 2) := by
calc 4 = 2 ''^ 2 := by norm_num
_ ≤ 2 ''^ (k + 2) := Nat.pow_le_pow_right (by omega) (by omega)
omega⟩
let K := maximalRealSubfield L
have htower := Module.finrank_mul_finrank ℚ K L
rw [Algebra.IsQuadraticExtension.finrank_eq_two] at htower
have hL : Module.finrank ℚ L = N.totient :=
IsCyclotomicExtension.Rat.finrank N L
rw [hL, Nat.totient_prime_pow Nat.prime_two (by positivity : 0 < k + 2)] at htower
dsimp [N] at htower
norm_num at htower ⊢
rw [pow_succ, pow_succ] at htower
omega
EOF
lake env lean Query4.lean'
Query4.lean:16:4: error(lean.synthInstanceFailed): failed to synthesize instance of type class
IsCyclotomicExtension {N} ℚ L
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
Query4.lean:24:6: error: failed to synthesize
Algebra.IsQuadraticExtension ℚ ↥K
Hint: Additional diagnostic information may be available using the `set_option diagnostics true` command.**Fixing quadratic extension rewrite errors**
$ /bin/bash -lc 'lake env lean Query4.lean'
Query4.lean:16:4: error(lean.synthInstanceFailed): failed to synthesize instance of type class
IsCyclotomicExtension {2 ^ (k + 2)} ℚ L
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
Query4.lean:25:4: error(lean.synthInstanceFailed): failed to synthesize instance of type class
IsCyclotomicExtension {N} ℚ L
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
Query4.lean:29:6: error: Tactic `rewrite` failed: motive is not type correct:
fun _a => Module.finrank ℚ ↥K * 2 = 2 ^ (k + 1)
Error: Application type mismatch: The argument
CyclotomicField.instField _a ℚ
has type
Field (CyclotomicField _a ℚ)
but is expected to have type
Field L
in the application
@Field.toDivisionRing L (CyclotomicField.instField _a ℚ)
Explanation: The rewrite tactic rewrites an expression 'e' using an equality 'a = b' by the following process. First, it looks for all 'a' in 'e'. Second, it tries to abstract these occurrences of 'a' to create a function 'm := fun _a => ...', called the *motive*, with the property that 'm a' is definitionally equal to 'e'. Third, we observe that 'congrArg' implies that 'm a = m b', which can be used with lemmas such as 'Eq.mpr' to change the goal. However, if 'e' depends on specific properties of 'a', then the motive 'm' might not typecheck.
Possible solutions: use rewrite's 'occs' configuration option to limit which occurrences are rewritten, or use 'simp' or 'conv' mode, which have strategies for certain kinds of dependencies (these tactics can handle proofs and 'Decidable' instances whose types depend on the rewritten term, and 'simp' can apply user-defined '@[congr]' theorems as well).
case refine_2
k : ℕ
L : Type := CyclotomicField (2 ^ (k + 2)) ℚ
N : ℕ := 2 ^ (k + 2)
this : IsCMField L :=
IsCyclotomicExtension.Rat.isCMField L
(Exists.intro (2 ^ (k + 2))
⟨of_eq_true (Eq.trans Set.mem**Fixing NeZero instance inference** **Patching finrank goal definition**
$ /bin/bash -lc 'lake env lean Query4.lean'
Query4.lean:16:4: error(lean.synthInstanceFailed): failed to synthesize instance of type class
IsCyclotomicExtension {2 ^ (k + 2)} ℚ L
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
Query4.lean:25:4: error(lean.synthInstanceFailed): failed to synthesize instance of type class
IsCyclotomicExtension {2 ^ (k + 2)} ℚ L
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.
Query4.lean:28:6: error: Tactic `rewrite` failed: motive is not type correct:
fun _a => Module.finrank ℚ ↥K * 2 = 2 ^ (k + 1)
Error: Application type mismatch: The argument
CyclotomicField.instField _a ℚ
has type
Field (CyclotomicField _a ℚ)
but is expected to have type
Field L
in the application
@Field.toDivisionRing L (CyclotomicField.instField _a ℚ)
Explanation: The rewrite tactic rewrites an expression 'e' using an equality 'a = b' by the following process. First, it looks for all 'a' in 'e'. Second, it tries to abstract these occurrences of 'a' to create a function 'm := fun _a => ...', called the *motive*, with the property that 'm a' is definitionally equal to 'e'. Third, we observe that 'congrArg' implies that 'm a = m b', which can be used with lemmas such as 'Eq.mpr' to change the goal. However, if 'e' depends on specific properties of 'a', then the motive 'm' might not typecheck.
Possible solutions: use rewrite's 'occs' configuration option to limit which occurrences are rewritten, or use 'simp' or 'conv' mode, which have strategies for certain kinds of dependencies (these tactics can handle proofs and 'Decidable' instances whose types depend on the rewritten term, and 'simp' can apply user-defined '@[congr]' theorems as well).
case refine_2
k : ℕ
L : Type := CyclotomicField (2 ^ (k + 2)) ℚ
this✝ : NeZero (2 ^ (k + 2)) :=
{
out :=
pow_ne_zero (k + 2)
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.**Resolving NeZero cast for cyclotomic instance** **Refactoring proof to avoid local aliases**
$ /bin/bash -lc 'lake env lean Query4.lean'
Query4.lean:18:4: error(lean.synthInstanceFailed): failed to synthesize instance of type class
IsCyclotomicExtension {2 ^ (k + 2)} ℚ (CyclotomicField (2 ^ (k + 2)) ℚ)
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.**Adding NeZero rationale**
$ /bin/bash -lc 'lake env lean Query4.lean'
Query4.lean:19:4: error(lean.synthInstanceFailed): failed to synthesize instance of type class
IsCyclotomicExtension {2 ^ (k + 2)} ℚ (CyclotomicField (2 ^ (k + 2)) ℚ)
Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command.**Checking CyclotomicField instance requirements**
$ /bin/bash -lc 'lake env lean Query4.lean'
**Constructing real embedding and choosing k** **Estimating k to satisfy epsilon inequality**
$ /bin/bash -lc "cat > Query5.lean <<'EOF'
import Mathlib.Analysis.SpecialFunctions.Pow.Asymptotics
#check tendsto_pow_atTop_atTop_of_one_lt
#check tendsto_pow_atTop_nhds_zero_of_lt_one
#check Nat.tendsto_pow_atTop_atTop_of_one_lt
#check Filter.tendsto_atTop
#check exists_nat_gt
#check exists_nat_one_div_lt
#check exists_pow_lt
#check Nat.le_two_pow
#check Nat.le_pow
#check Nat.lt_pow_self
#check Nat.pow_lt_pow_right
EOF
lake env lean Query5.lean 2>/dev/null"
tendsto_pow_atTop_atTop_of_one_lt.{u_1} {α : Type u_1} [Semiring α] [LinearOrder α] [IsStrictOrderedRing α]
[ExistsAddOfLE α] [Archimedean α] {r : α} (h : 1 < r) : Filter.Tendsto (fun n => r ^ n) Filter.atTop Filter.atTop
tendsto_pow_atTop_nhds_zero_of_lt_one.{u_4} {𝕜 : Type u_4} [Semifield 𝕜] [LinearOrder 𝕜] [IsStrictOrderedRing 𝕜]
[ExistsAddOfLE 𝕜] [Archimedean 𝕜] [TopologicalSpace 𝕜] [OrderTopology 𝕜] {r : 𝕜} (h₁ : 0 ≤ r) (h₂ : r < 1) :
Filter.Tendsto (fun n => r ^ n) Filter.atTop (nhds 0)
Query5.lean:4:7: error(lean.unknownIdentifier): Unknown constant `Nat.tendsto_pow_atTop_atTop_of_one_lt`
Filter.tendsto_atTop.{u_3, u_4} {α : Type u_3} {β : Type u_4} [Preorder β] {m : α → β} {f : Filter α} :
Filter.Tendsto m f Filter.atTop ↔ ∀ (b : β), ∀ᶠ (a : α) in f, b ≤ m a
exists_nat_gt.{u_1} {R : Type u_1} [Semiring R] [PartialOrder R] [IsStrictOrderedRing R] [Archimedean R] (x : R) :
∃ n, x < ↑n
exists_nat_one_div_lt.{u_4} {K : Type u_4} [Semifield K] [LinearOrder K] [IsStrictOrderedRing K] [Archimedean K] {ε : K}
(hε : 0 < ε) : ∃ n, 1 / (↑n + 1) < ε
exists_pow_lt.{u_1} {R : Type u_1} [CommGroup R] [LinearOrder R] [IsOrderedMonoid R] [MulArchimedean R] {a : R}
(ha : a < 1) (b : R) : ∃ n, a ^ n < b
Query5.lean:9:7: error(lean.unknownIdentifier): Unknown constant `Nat.le_two_pow`
Nat.le_pow {a b : ℕ} (h : 0 < b) : a ≤ a ^ b
Nat.lt_pow_self {n a : ℕ} (h : 1 < a) : n < a ^ n
Nat.pow_lt_pow_right {a m n : ℕ} (ha : 1 < a) (h : m < n) : a ^ m < a ^ n**Choosing field degree parameter** **Formulating and planning lemma proof**
**Verifying numeric lemma with nlinarith**
$ /bin/bash -lc "cat > Query6.lean <<'EOF'
import Mathlib.Analysis.SpecialFunctions.Pow.Asymptotics
lemma exponent_lt_of_large_degree {ε : ℝ} (hε : 0 < ε) {d : ℕ}
(hd : 1 < d) (hlarge : 4 / ε + 6 < 9 * (d : ℝ)) :
(2 * d : ℝ) / (3 * d - 2 : ℕ) < (2 : ℝ) / 3 + ε := by
have h3d : 2 ≤ 3 * d := by omega
have hcast : ((3 * d - 2 : ℕ) : ℝ) = 3 * (d : ℝ) - 2 := by
rw [Nat.cast_sub h3d]
norm_num
rw [hcast]
have hden : 0 < 3 * (d : ℝ) - 2 := by
exact_mod_cast (by omega : 0 < 3 * d - 2)
rw [div_lt_iff₀ hden]
have hfour : 4 < (9 * (d : ℝ) - 6) * ε := by
apply (div_lt_iff₀ hε).mp
linarith
nlinarith
lemma choose_degree (ε : ℝ) (hε : 0 < ε) :
∃ k : ℕ, 1 < 2 "'^ k ∧
(2 * (2 ''^ k) : ℝ) / (3 * (2 ''^ k) - 2 : ℕ) < (2 : ℝ) / 3 + ε := by
obtain ⟨q, hq⟩ := exists_nat_gt ((4 / ε + 6) / 9)
refine ⟨q + 2, by positivity, ?_⟩
apply exponent_lt_of_large_degree hε (by positivity)
have hqd : (q : ℝ) < (2 ''^ (q + 2) : ℕ) := by
exact_mod_cast (lt_trans (Nat.lt_pow_self (by omega : 1 < 2))
(Nat.pow_lt_pow_right (by omega : 1 < 2) (by omega : q < q + 2)))
have hq'"' : 4 / ε + 6 < 9 * (q : ℝ) := by linarith
nlinarith
EOF
lake env lean Query6.lean"
Query6.lean:23:20: error: not a positivity goal
Query6.lean:24:2: error: Tactic `apply` failed: could not unify the conclusion of `exponent_lt_of_large_degree hε ?m.126`
2 * ↑?m.125 / ↑(3 * ?m.125 - 2) < 2 / 3 + ε
with the goal
2 * 2 ^ (q + 2) / ↑(3 * 2 ^ (q + 2) - 2) < 2 / 3 + ε
Note: The full type of `exponent_lt_of_large_degree hε ?m.126` is
4 / ε + 6 < 9 * ↑?m.125 → 2 * ↑?m.125 / ↑(3 * ?m.125 - 2) < 2 / 3 + ε
ε : ℝ
hε : 0 < ε
q : ℕ
hq : (4 / ε + 6) / 9 < ↑q
⊢ 2 * 2 ^ (q + 2) / ↑(3 * 2 ^ (q + 2) - 2) < 2 / 3 + ε**Fixing numeric type coercion**
$ /bin/bash -lc 'lake env lean Query6.lean' Query6.lean:28:2: error: Tactic `apply` failed: could not unify the conclusion of `exponent_lt_of_large_degree hε ?m.207` 2 * ↑(2 ^ (q + 2)) / ↑(3 * 2 ^ (q + 2) - 2) < 2 / 3 + ε with the goal 2 * 2 ^ (q + 2) / ↑(3 * 2 ^ (q + 2) - 2) < 2 / 3 + ε Note: The full type of `exponent_lt_of_large_degree hε ?m.207` is 4 / ε + 6 < 9 * ↑(2 ^ (q + 2)) → 2 * ↑(2 ^ (q + 2)) / ↑(3 * 2 ^ (q + 2) - 2) < 2 / 3 + ε ε : ℝ hε : 0 < ε q : ℕ hq : (4 / ε + 6) / 9 < ↑q ⊢ 2 * 2 ^ (q + 2) / ↑(3 * 2 ^ (q + 2) - 2) < 2 / 3 + ε
**Fixing type coercion in exponentiation expression** **Patching exponentiation type annotation**
$ /bin/bash -lc 'lake env lean Query6.lean' Query6.lean:29:62: error: omega could not prove the goal: a possible counterexample may satisfy the constraints a ≤ 1 where a := ↑2 ^ (q + 2)
**Planning h degree construction after q**
$ /bin/bash -lc 'lake env lean Query6.lean'
**Planning number field instances for theorem integration** **Constructing theorem with numeric degree lemmas**
**Inspecting type coercion for embeddings**
$ /bin/bash -lc "sed -n '1,110p' SharpDistanceScratch.lean"
import Mathlib.NumberTheory.NumberField.CMField
import Mathlib.NumberTheory.NumberField.Cyclotomic.Basic
import Mathlib.NumberTheory.NumberField.Norm
import Mathlib.NumberTheory.NumberField.House
import Mathlib.Geometry.Euclidean.Projection
import Mathlib.Analysis.SpecialFunctions.Pow.Asymptotics
open scoped BigOperators ComplexConjugate InnerProductSpace
namespace SharpDistance
open NumberField
noncomputable section
/-! The paper's naïve Euclidean objects. -/
abbrev Point := EuclideanSpace ℝ (Fin 2)
def point (x y : ℝ) : Point := !₂[x, y]
@[simp] lemma point_zero (x y : ℝ) : point x y 0 = x := by simp [point]
@[simp] lemma point_one (x y : ℝ) : point x y 1 = y := by simp [point]
structure RealLine where
base : Point
direction : Point
direction_ne_zero : direction ≠ 0
def RealLine.carrier (ℓ : RealLine) : Set Point :=
Set.range fun t : ℝ ↦ ℓ.base + t • ℓ.direction
def pointLineDist (p : Point) (ℓ : RealLine) : ℝ :=
Metric.infDist p ℓ.carrier
lemma RealLine.base_mem (ℓ : RealLine) : ℓ.base ∈ ℓ.carrier :=
⟨0, by simp [RealLine.carrier]⟩
lemma RealLine.carrier_nonempty (ℓ : RealLine) : ℓ.carrier.Nonempty :=
⟨ℓ.base, ℓ.base_mem⟩
lemma pointLineDist_ge_inner_div_norm (p : Point) (ℓ : RealLine) (normal : Point)
(hnormal : normal ≠ 0) (horth : ⟪(ℓ.direction), normal⟫_ℝ = 0) :
|⟪p - ℓ.base, normal⟫_ℝ| / ‖normal‖ ≤ pointLineDist p ℓ := by
rw [pointLineDist, Metric.le_infDist ℓ.carrier_nonempty]
intro q hq
obtain ⟨t, rfl⟩ := hq
have hinner :
⟪p - (ℓ.base + t • ℓ.direction), normal⟫_ℝ =
⟪p - ℓ.base, normal⟫_ℝ := by
rw [sub_add_eq_sub_sub, inner_sub_left, real_inner_smul_left, horth, mul_zero, sub_zero]
rw [← hinner, dist_eq_norm]
exact (div_le_iff₀ (norm_pos_iff.mpr hnormal)).2
(abs_real_inner_le_norm (p - (ℓ.base + t • ℓ.direction)) normal)
lemma pointLineDist_self (ℓ : RealLine) : pointLineDist ℓ.base ℓ = 0 := by
apply le_antisymm
· exact Metric.infDist_le_dist_of_mem ℓ.base_mem |>.trans_eq (dist_self**Integrating Nonempty RingHom `.toRatAlgHom`**
The asymptotic “all sufficiently large \(n\)” step now compiles, including the ceiling argument that trims a larger coefficient box down to exactly \(n\) pairs. This closes a small quantifier/detail gap that is easy to miss in a paper proof: the construction is no longer restricted to a sparse sequence of cardinalities.
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1500000 SharpDistanceScratch.lean' SharpDistanceScratch.lean:37:15: warning: This simp argument is unused: RealLine.carrier Hint: Omit it from the simp argument list. [apply] simp Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:113:2: warning: `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` SharpDistanceScratch.lean:109:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.exists_integerBasis_trace_ne_zero`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:151:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.trace_traceGenerator`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:154:8: warning: This simp argument is unused: smul_eq_mul Hint: Omit it from the simp argument list. [apply] simp [mul_comm] Note: This linter can be disabled with `set_option linter.unusedSimpArgs false` SharpDistanceScratch.lean:159:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.linearCombo_integerBasis_injective`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_op
**Inspecting traceBasisData signature for hd implicit**
$ /bin/bash -lc 'rg -n "def traceBasisData" SharpDistanceScratch.lean -A6'
139:def traceBasisData (hd : 0 < Module.finrank ℚ K) : TraceBasisData K :=
140- ⟨(exists_integerBasis_trace_ne_zero hd).choose,
141- (exists_integerBasis_trace_ne_zero hd).choose_spec⟩
142-
143-abbrev TraceIndex (B : TraceBasisData K) := {i : IntegerIndex K // i ≠ B.pivot}
144-
145-def traceGenerator (B : TraceBasisData K) (i : TraceIndex B) : 𝓞 K :=**Patching traceBasisData with hdeg correction**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1500000 SharpDistanceScratch.lean >/tmp/sharp.log 2>&1; code=$?; tail -50 /tmp/sharp.log; exit $code' Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:348:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.house_linearCombo_le`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:492:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.abs_embedding_le_house`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:497:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.one_le_abs_norm_of_integer`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:653:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.scaled_orthogonal`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistanceScratch.lean:750:10: warning: 'ring' tactic does nothing Note: This linter can be disabled with `set_option linter.unusedTactic false` SharpDistanceScratch.lean:750:10: warning: this tactic is never executed Note: This linter can be disabled with `set_option linter.unreachableTactic false` Sh
**Planning deep audit of central theorem**
$ /bin/bash -lc "sed -n '1,220p' /work/paper.txt" THE SHARP EXPONENT FOR THE MINIMAL DISTANCE PROBLEM COSMIN POHOATA Abstract. We show that for every fixed ε > 0, there exist arbitrarily large families of point–line pairs ( x1 , ℓ1 ), . . . , ( xn , ℓn ) in [0, 1]2 , with xi ∈ ℓi for all i, and such that dist( xi , ℓ j ) ≥ n−2/3−ε ( i ̸ = j ). Combined with a previous result of Cohen, the author, and Zakharov, this solves the minimal distance problem. arXiv:2607.20422v1 [math.CO] 22 Jul 2026 1. Introduction Choose points x1 , . . . , xn ∈ [0, 1]2 and, for each i = 1, . . . , n, let ℓi be a line through xi . The minimal distance problem asks how far every point can be kept from every line to which it is not assigned. More precisely, we define ∆PL (n) := sup min dist( xi , ℓ j ), i̸= j (1) where the supremum is over all configurations of points x1 , . . . , xn ∈ [0, 1]2 and lines ℓ1 , . . . , ℓn ⊂ R2 such that xi ∈ ℓi . For convenience, let us call these point-line incidence configurations of size n. The quantity ∆PL (n) can therefore be regarded as the largest scale at which one can realize n prescribed point–line incidences while avoiding every nontrivial incidence. In [7], Cohen, the author, and Zakharov introduced the problem of determining the asymptotics of ∆PL (n) as n grows, in connection with the Heilbronn triangle problem. Trivially, taking xi = (i/n, 0) and ℓi = xi + (0, 1)R, for i = 1, . . . n, gives a point-line incidence configuration with dist( xi , ℓ j ) ≥ 1/n for all i ̸= j. Thus, ∆PL (n) ≥ 1/n. In the other direction, it is not difficult to see that in any point-line incidence configuration of size n, we must have dist( xi , ℓ j ) ≤ | xi − x j | ≲ n−1/2 for some i ̸= j. Hence ∆PL (n) ≲ n−1/2 . In [7], Cohen-Pohoata-Zakharov improved this upper bound to ∆PL (n) ≤ n−2/3+o(1) , (2) and used this estimate to establish the latest record for the Heilbronn triangle problem. For more history and context, see this recent survey by Zakharov [24]. The connection itself between the Heilbronn triangle pr
**Verifying geometric distinctness and scaling** **Planning file renaming and patch application**
**Verifying theorem restatement sanity** **Planning temporary axiom queries with clean-up**
**Verifying untracked file deletions**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1500000 SharpDistance.lean >/tmp/sharp-final.log 2>&1; code=$?; tail -25 /tmp/sharp-final.log; rg -n "'"\\bsorry\\b|\\badmit\\b|"'^axiom'"\\b|"'^constant'"\\b\" SharpDistance.lean README.md 2>/dev/null || true; git status --short; exit "'$code'
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistance.lean:752:10: warning: 'ring' tactic does nothing
Note: This linter can be disabled with `set_option linter.unusedTactic false`
SharpDistance.lean:752:10: warning: this tactic is never executed
Note: This linter can be disabled with `set_option linter.unreachableTactic false`
SharpDistance.lean:793:13: warning: Variable name `i` is not explicitly referenced.
Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning:
[apply] _i
Note: This linter can be disabled with `set_option linter.unusedVariables false`
SharpDistance.lean:794:11: warning: Variable name `i` is not explicitly referenced.
Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning:
[apply] _i
Note: This linter can be disabled with `set_option linter.unusedVariables false`
Try this:
[apply] ring_nf
The `ring` tactic failed to close the goal. Use `ring_nf` to obtain a normal form.
Note that `ring` works primarily in *commutative* rings. If you have a noncommutative ring, abelian group or module, consider using `noncomm_ring`, `abel` or `module` instead.
SharpDistance.lean:1060:cardinalities admit `n` incident point-line pairs in the unit square whose
?? SharpDistance.lean**Investigating regex mismatch causing warnings**
$ /bin/bash -lc "nl -ba SharpDistance.lean | sed -n '730,760p'; nl -ba SharpDistance.lean | sed -n '780,800p'; rg -n \"sorry|admit|axiom|constant\" SharpDistance.lean | tail -20" 730 (mul_nonneg (by norm_num) (sq_nonneg _)) 731 · positivity 732 have hP : 0 < P := pow_pos hH _ 733 have hNG : N ≤ G := scaledNormal_norm_le σ B s 734 have hprod : 1 ≤ A * P := sourceD_norm_product_lower σ B hst 735 have hPinvA : 1 / P ≤ A := by 736 apply (div_le_iff₀ hP).2 737 simpa [A, P, H, mul_comm] using hprod 738 have hgeom : 739 A / (2 * N) ≤ pointLineDist (scaledPoint σ B t) (scaledLine σ B s) := by 740 have h := pointLineDist_ge_inner_div_norm 741 (scaledPoint σ B t) (scaledLine σ B s) (scaledNormal σ B s) 742 (scaledNormal_ne_zero σ B s) (scaled_orthogonal σ B s) 743 change 744 |⟪scaledPoint σ B t - scaledPoint σ B s, scaledNormal σ B s⟫_ℝ| / 745 ‖scaledNormal σ B s‖ ≤ 746 pointLineDist (scaledPoint σ B t) (scaledLine σ B s) at h 747 rw [scaled_inner_eq] at h 748 simpa [A, N, abs_div, div_div] using h 749 calc 750 (2 * G * P)⁻¹ = (1 / P) / (2 * G) := by 751 field_simp [hG.ne', hP.ne'] 752 <;> ring 753 _ ≤ A / (2 * G) := by 754 exact div_le_div_of_nonneg_right hPinvA (by positivity) 755 _ ≤ A / (2 * N) := by 756 exact div_le_div_of_nonneg_left hA (by positivity) (by linarith) 757 _ ≤ pointLineDist (scaledPoint σ B t) (scaledLine σ B s) := hgeom 758 759 structure PLConfiguration (n : ℕ) where 760 points : Fin n → Point 780 gcongr <;> omega 781 782 def sourceEmbedding (B : TraceBasisData K) (m n : ℕ) 783 (hcard : n ≤ Fintype.card (ArithmeticSource B m)) : 784 Fin n ↪ ArithmeticSource B m := 785 Classical.choice <| Function.Embedding.nonempty_of_card_le <| by 786 simpa using hcard 787 788 def selectedConfiguration (σ : K →+* ℝ) (B : TraceBasisData K) 789 (m n : ℕ) (hcard : n ≤ Fintype.card (ArithmeticSource B m)) : 790 PLConfiguration n where 791 points i := scaledPoint σ
**Refining field_simp usage**
**Planning README and Source Audit**
$ /bin/bash -lc "sed -n '105,330p' SharpDistance.lean; sed -n '330,570p' SharpDistance.lean; sed -n '570,735p' SharpDistance.lean"
· rintro rfl
simp
abbrev IntegerIndex (K : Type*) [Field K] [NumberField K] :=
Module.Free.ChooseBasisIndex ℤ (𝓞 K)
lemma exists_integerBasis_trace_ne_zero (hd : 0 < Module.finrank ℚ K) :
∃ j : IntegerIndex K,
Algebra.trace ℤ (𝓞 K) (NumberField.RingOfIntegers.basis K j) ≠ 0 := by
by_contra h
push_neg at h
have ht : Algebra.trace ℤ (𝓞 K) = 0 := by
apply (NumberField.RingOfIntegers.basis K).ext
intro i
simp [h i]
have h1 := LinearMap.congr_fun ht (1 : 𝓞 K)
have hrank : 0 < Module.finrank ℤ (𝓞 K) := by
rwa [NumberField.RingOfIntegers.rank]
have hone : Algebra.trace ℤ (𝓞 K) (1 : 𝓞 K) =
(Module.finrank ℤ (𝓞 K) : ℤ) := by
rw [Algebra.trace]
have hlmul : (Algebra.lmul ℤ (𝓞 K)) 1 = 1 := by
ext x
simp
rw [LinearMap.comp_apply]
change LinearMap.trace ℤ (𝓞 K) ((Algebra.lmul ℤ (𝓞 K)) 1) = _
rw [hlmul, LinearMap.trace_one]
rw [hone] at h1
simp only [LinearMap.zero_apply] at h1
omega
structure TraceBasisData (K : Type*) [Field K] [NumberField K] where
pivot : IntegerIndex K
pivot_trace_ne_zero :
Algebra.trace ℤ (𝓞 K) (NumberField.RingOfIntegers.basis K pivot) ≠ 0
def traceBasisData (hd : 0 < Module.finrank ℚ K) : TraceBasisData K :=
⟨(exists_integerBasis_trace_ne_zero hd).choose,
(exists_integerBasis_trace_ne_zero hd).choose_spec⟩
abbrev TraceIndex (B : TraceBasisData K) := {i : IntegerIndex K // i ≠ B.pivot}
def traceGenerator (B : TraceBasisData K) (i : TraceIndex B) : 𝓞 K :=
(Algebra.trace ℤ (𝓞 K) (NumberField.RingOfIntegers.basis K B.pivot)) •
NumberField.RingOfIntegers.basis K i.1 -
(Algebra.trace ℤ (𝓞 K) (NumberField.RingOfIntegers.basis K i.1)) •
NumberField.RingOfIntegers.basis K B.pivot
lemma trace_traceGenerator (B : TraceBasisData K) (i : TraceIndex B) :
Algebra.trace ℤ (𝓞 K) (traceGenerator B i) = 0 := by
rw [traceGenerator, map_sub, map_zsmul, map_zsmul]
simp [smul_eq_mul, mul_comm]
def linearCombo {ι : Type*} [Fintype ι] (g : ι → 𝓞 **Identifying overlapping line duplicates** **Analyzing metric definitions and documentation needs**
$ /bin/bash -lc "ls -la | head -30; test -f README.md && sed -n '1,160p' README.md || true" total 640 drwxr-xr-x 17 root root 4096 Jul 23 22:22 . drwxr-xr-x 6 root root 4096 Jul 23 22:23 .. drwxr-xr-x 2 root root 4096 Jul 23 21:41 .devcontainer drwxr-xr-x 5 root root 4096 Jul 23 21:41 .docker drwxr-xr-x 8 root root 4096 Jul 23 22:23 .git -rw-r--r-- 1 root root 401 Jul 23 21:41 .git-blame-ignore-revs drwxr-xr-x 4 root root 4096 Jul 23 21:41 .github -rw-r--r-- 1 root root 440 Jul 23 21:41 .gitignore -rw-r--r-- 1 root root 155 Jul 23 21:41 .gitpod.yml drwxr-xr-x 5 root root 4096 Jul 23 21:41 .lake -rw-r--r-- 1 root root 419 Jul 23 21:41 .pre-commit-config.yaml drwxr-xr-x 2 root root 4096 Jul 23 21:41 .vscode drwxr-xr-x 7 root root 4096 Jul 23 21:41 Archive -rw-r--r-- 1 root root 2901 Jul 23 21:41 Archive.lean -rw-r--r-- 1 root root 677 Jul 23 21:41 CITATION.md -rw-r--r-- 1 root root 5319 Jul 23 21:41 CODE_OF_CONDUCT.md drwxr-xr-x 2 root root 4096 Jul 23 21:41 Cache drwxr-xr-x 2 root root 4096 Jul 23 21:41 Counterexamples -rw-r--r-- 1 root root 1261 Jul 23 21:41 Counterexamples.lean drwxr-xr-x 2 root root 4096 Jul 23 21:41 DownstreamTest -rw-r--r-- 1 root root 11357 Jul 23 21:41 LICENSE drwxr-xr-x 33 root root 4096 Jul 23 21:41 Mathlib -rw-r--r-- 1 root root 452322 Jul 23 21:41 Mathlib.lean drwxr-xr-x 23 root root 4096 Jul 23 21:41 MathlibTest -rw-r--r-- 1 root root 8936 Jul 23 21:41 README.md -rw-r--r-- 1 root root 43537 Jul 23 22:23 SharpDistance.lean -rw-r--r-- 1 root root 1857 Jul 23 21:41 bors.toml drwxr-xr-x 3 root root 4096 Jul 23 21:41 docs -rw-r--r-- 1 root root 53 Jul 23 21:41 docs.lean # mathlib4  [](https://mathlib-bors-ca18eefec4cb.herokuapp.com/repositories/16) [-power cyclotomic fields and proves their degrees are \(2^k\). The central theorem compiles with no declared mathematical hypotheses beyond \(\varepsilon>0\); I’m doing the final axiom and repository audit now and have written the construction dictionary and proof report into `repro/README.md`.
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1500000 SharpDistance.lean >/tmp/sharp-audit.log 2>&1; code=$?; tail -35 /tmp/sharp-audit.log; exit $code'
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistance.lean:499:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.one_le_abs_norm_of_integer`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistance.lean:655:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.scaled_orthogonal`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistance.lean:792:13: warning: Variable name `i` is not explicitly referenced.
Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning:
[apply] _i
Note: This linter can be disabled with `set_option linter.unusedVariables false`
SharpDistance.lean:793:11: warning: Variable name `i` is not explicitly referenced.
Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning:
[apply] _i
Note: This linter can be disabled with `set_option linter.unusedVariables false`
Try this:
[apply] ring_nf
The `ring` tactic failed to close the goal. Use `ring_nf` to obtain a normal form.
Note that `ring` works primarily in *commutative* rings. If you have a noncommutative ring, abelian group or module, consider using `noncomm_ring`, `abel` or `module` instead.
'SharpDistance.sharp**Removing debug print statements**
**Reviewing README hypothesis and line subset proof** **Auditing for hidden unsoundness and verifying changes**
$ /bin/bash -lc 'git diff --stat && git status --short && git diff --check && rg -n "(''^|[''^[:alpha:]])(sorry|admit)([''^[:alpha:]]|$)|''^[[:space:]]*(axiom|constant)[[:space:]]" SharpDistance.lean || true; tail -30 SharpDistance.lean; sed -n '"'1,60p' README.md"
README.md | 330 ++++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 193 insertions(+), 137 deletions(-)
M README.md
?? SharpDistance.lean
1059:cardinalities admit `n` incident point-line pairs in the unit square whose
apply exponent_lt_of_large_degree hε (d := 2 ^ (q + 2)) hdpow
have hqd : (q : ℝ) < (2 ^ (q + 2) : ℕ) := by
exact_mod_cast (lt_trans (Nat.lt_pow_self (by omega : 1 < 2))
(Nat.pow_lt_pow_right (by omega : 1 < 2) (by omega : q < q + 2)))
have hq' : 4 / ε + 6 < 9 * (q : ℝ) := by linarith
nlinarith
/-- The central result: for every loss `ε > 0`, all sufficiently large
cardinalities admit `n` incident point-line pairs in the unit square whose
off-diagonal point-to-line distances are at least `n ^ (-(2/3 + ε))`. -/
theorem sharp_exponent_for_minimal_distance (ε : ℝ) (hε : 0 < ε) :
∃ n₀ : ℕ, ∀ n ≥ n₀, ∃ C : PLConfiguration n,
C.Separated ((n : ℝ) ^ (-((2 : ℝ) / 3 + ε))) := by
obtain ⟨k, hkdeg, hkexp⟩ := exists_cyclotomic_degree_for_exponent ε hε
let L := CyclotomicField (2 ^ (k + 2)) ℚ
let K := maximalRealSubfield L
letI : NumberField K := NumberField.of_subfield K
letI : NumberField.IsTotallyReal K :=
NumberField.isTotallyReal_maximalRealSubfield
have hdeg : Module.finrank ℚ K = 2 ^ k := by
simpa [L, K] using realCyclotomicField_finrank k
let φ : K →ₐ[ℚ] ℂ :=
(Classical.choice (inferInstance : Nonempty (K →+* ℂ))).toRatAlgHom
let σ : K →+* ℝ := realEmbedding φ
let B : TraceBasisData K := traceBasisData (by rw [hdeg]; omega)
apply eventually_configuration_of_fixed_field σ B ((2 : ℝ) / 3 + ε)
· simpa [hdeg] using hkdeg
· simpa [hdeg] using hkexp
end SharpDistance
# Reproduction of “The sharp exponent for the minimal distance problem”
This directory contains a complete Lean 4/mathlib proof of Theorem 1.1 of
arXiv:2607.20422v1. The development is in `SharpDistance.lean`.
## Result and verification
The final theorem is:
```lean
theorem SharpDistance.sharp_exponent_fo**Replacing "admit" in source comments**
**Planning distinctness lemma proof** **Developing pointLineDist zero lemma**
**Verifying point-line incidence relations**
**Compiling codebase**
$ /bin/bash -lc 'lake env lean -DmaxHeartbeats=1500000 SharpDistance.lean >/tmp/sharp-final.log 2>&1; code=$?; tail -35 /tmp/sharp-final.log; exit $code'
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistance.lean:505:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.one_le_abs_norm_of_integer`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistance.lean:661:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.scaled_orthogonal`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistance.lean:820:13: warning: Variable name `i` is not explicitly referenced.
Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning:
[apply] _i
Note: This linter can be disabled with `set_option linter.unusedVariables false`
SharpDistance.lean:821:11: warning: Variable name `i` is not explicitly referenced.
Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning:
[apply] _i
Note: This linter can be disabled with `set_option linter.unusedVariables false`
Try this:
[apply] ring_nf
The `ring` tactic failed to close the goal. Use `ring_nf` to obtain a normal form.
Note that `ring` works primarily in *commutative* rings. If you have a noncommutative ring, abelian group or module, consider using `noncomm_ring`, `abel` or `module` instead.$ /bin/bash -lc 'grep -n -B8 -A4 "Try this" /tmp/sharp-final.log' 132- 133-Note: This linter can be disabled with `set_option linter.unusedVariables false` 134-SharpDistance.lean:821:11: warning: Variable name `i` is not explicitly referenced. 135- 136-Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning: 137- [apply] _i 138- 139-Note: This linter can be disabled with `set_option linter.unusedVariables false` 140:Try this: 141- [apply] ring_nf 142- 143- The `ring` tactic failed to close the goal. Use `ring_nf` to obtain a normal form. 144-
$ /bin/bash -lc "sed -n '100,155p' /tmp/sharp-final.log" consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistance.lean:356:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.house_linearCombo_le`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistance.lean:500:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.abs_embedding_le_house`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistance.lean:505:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.one_le_abs_norm_of_integer`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistance.lean:661:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.scaled_orthogonal`: [IsTotallyReal K] consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them: omit [IsTotallyReal K] in theorem ... Note: This linter can be disabled with `set_option linter.unusedSectionVars false` SharpDistance.lean:820:13: warning: Variable name `i` is not explicitly referenced. Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively,
**Planning README update for injectivity lemmas**
**Verifying theorem compilation without custom flags**
$ /bin/bash -lc 'lake env lean SharpDistance.lean >/tmp/sharp-default.log 2>&1; code=$?; tail -30 /tmp/sharp-default.log; exit $code'
SharpDistance.lean:505:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.one_le_abs_norm_of_integer`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistance.lean:661:0: warning: automatically included section variable(s) unused in theorem `SharpDistance.scaled_orthogonal`:
[IsTotallyReal K]
consider restructuring your `variable` declarations so that the variables are not in scope or explicitly omit them:
omit [IsTotallyReal K] in theorem ...
Note: This linter can be disabled with `set_option linter.unusedSectionVars false`
SharpDistance.lean:820:13: warning: Variable name `i` is not explicitly referenced.
Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning:
[apply] _i
Note: This linter can be disabled with `set_option linter.unusedVariables false`
SharpDistance.lean:821:11: warning: Variable name `i` is not explicitly referenced.
Hint: The binding can be removed (if unused) or named `_` (if used implicitly). Alternatively, prefix the name with `_` to silence this warning:
[apply] _i
Note: This linter can be disabled with `set_option linter.unusedVariables false`
Try this:
[apply] ring_nf
The `ring` tactic failed to close the goal. Use `ring_nf` to obtain a normal form.
Note that `ring` works primarily in *commutative* rings. If you have a noncommutative ring, abelian group or module, consider using `noncomm_ring`, `abel` or `module` instead.**Simplifying README command usage**
**Verifying theorem formalization and coordinate handling** **Confirming embedding properties and scaling correctness**
**Verifying numeric coercion in division** **Confirming real division coercion and elaboration** **Planning final JSON status note**
**Preparing final JSON format**
$ /bin/bash -lc 'git diff --check && if rg -n "(''^|[''^[:alpha:]])(sorry|admit)([''^[:alpha:]]|$)|''^[[:space:]]*(axiom|constant)[[:space:]]" SharpDistance.lean; then exit 1; else true; fi; wc -l SharpDistance.lean README.md; git status --short'
1108 SharpDistance.lean
226 README.md
1334 total
M README.md
?? SharpDistance.lean**Planning axiom audit documentation**
**Formatting final JSON output**
{"status":"reproduced","claim":"For every ε > 0, there exists n₀ such that every n ≥ n₀ admits n incident point–line pairs in [0,1]² with dist(pᵢ, ℓⱼ) ≥ n^(-(2/3+ε)) whenever i ≠ j. No additional hypotheses are declared.","note":"Complete proof in repro/SharpDistance.lean; documented in repro/README.md. `lake env lean SharpDistance.lean` succeeds with zero sorry, admit, or custom axioms; the axiom audit reports only propext, Classical.choice, and Quot.sound.","significance":"The paper proves that the minimal-distance construction attains separation $n^{-2/3-\\varepsilon}$ for every fixed $\\varepsilon>0$. Together with the known upper bound, this establishes $2/3$ as the sharp exponent."}