English
For n ≥ 3 and q > 1, cyclotomic(n, Real).eval(q) < (q + 1)^{totient(n)}.
Русский
Для n ≥ 3 и q > 1 верно: cyclotomic(n)(q) < (q + 1)^{φ(n)}.
LaTeX
$$ (cyclotomic(n, Real)).eval(q) < (q + 1) ^ totient(n) $$
Lean4
theorem cyclotomic_eval_lt_add_one_pow_totient {n : ℕ} {q : ℝ} (hn' : 3 ≤ n) (hq' : 1 < q) :
(cyclotomic n ℝ).eval q < (q + 1) ^ totient n :=
by
have hn : 0 < n := pos_of_gt hn'
have hq := zero_lt_one.trans hq'
have hfor : ∀ ζ' ∈ primitiveRoots n ℂ, ‖↑q - ζ'‖ ≤ q + 1 :=
by
intro ζ' hζ'
rw [mem_primitiveRoots hn] at hζ'
convert norm_sub_le (↑q) ζ'
· rw [Complex.norm_real, Real.norm_of_nonneg (zero_le_one.trans_lt hq').le]
· rw [hζ'.norm'_eq_one hn.ne']
let ζ := Complex.exp (2 * ↑Real.pi * Complex.I / ↑n)
have hζ : IsPrimitiveRoot ζ n := Complex.isPrimitiveRoot_exp n hn.ne'
have hex : ∃ ζ' ∈ primitiveRoots n ℂ, ‖↑q - ζ'‖ < q + 1 :=
by
refine ⟨ζ, (mem_primitiveRoots hn).mpr hζ, ?_⟩
suffices ¬SameRay ℝ (q : ℂ) (-ζ) by
convert norm_add_lt_of_not_sameRay this using 2
· rw [Complex.norm_real]
symm
exact abs_eq_self.mpr hq.le
· simp [hζ.norm'_eq_one hn.ne']
rw [Complex.sameRay_iff]
push_neg
refine ⟨mod_cast hq.ne', neg_ne_zero.mpr <| hζ.ne_zero hn.ne', ?_⟩
rw [Complex.arg_ofReal_of_nonneg hq.le, Ne, eq_comm]
intro h
rw [Complex.arg_eq_zero_iff, Complex.neg_re, neg_nonneg, Complex.neg_im, neg_eq_zero] at h
have hζ₀ : ζ ≠ 0 := by
clear_value ζ
rintro rfl
exact hn.ne' (hζ.unique IsPrimitiveRoot.zero)
have : ζ.re < 0 ∧ ζ.im = 0 := ⟨h.1.lt_of_ne ?_, h.2⟩
· rw [← Complex.arg_eq_pi_iff, hζ.arg_eq_pi_iff hn.ne'] at this
rw [this] at hζ
linarith [hζ.unique <| IsPrimitiveRoot.neg_one 0 two_ne_zero.symm]
· contrapose! hζ₀
apply Complex.ext <;> simp [hζ₀, h.2]
have : ¬eval (↑q) (cyclotomic n ℂ) = 0 := by simpa using (cyclotomic_pos' n hq').ne.symm
suffices
Units.mk0 ‖(cyclotomic n ℂ).eval ↑q‖₊ (by simp_all) <
Units.mk0 (Real.toNNReal (q + 1)) (by simp; linarith) ^ totient n
by
simp only [← Units.val_lt_val, Units.val_pow_eq_pow_val, Units.val_mk0, ← NNReal.coe_lt_coe, coe_nnnorm,
NNReal.coe_pow, Real.coe_toNNReal'] at this
convert this using 2
· rw [eq_comm]
simp [cyclotomic_nonneg n hq'.le]
rw [eq_comm, max_eq_left_iff]
linarith
simp only [cyclotomic_eq_prod_X_sub_primitiveRoots hζ, eval_prod, eval_C, eval_X, eval_sub, nnnorm_prod,
Units.mk0_prod]
convert Finset.prod_lt_prod' (M := NNRealˣ) _ _
swap; · exact fun _ => Units.mk0 (Real.toNNReal (q + 1)) (by simp; linarith only [hq'])
· simp [Complex.card_primitiveRoots]
· simp only [Finset.mem_attach, forall_true_left, Subtype.forall, ← Units.val_le_val, ← NNReal.coe_le_coe,
Units.val_mk0, coe_nnnorm]
intro x hx
have : ‖_‖ ≤ _ := hfor x hx
simp [this]
· simp only [Finset.mem_attach, Subtype.exists, ← NNReal.coe_lt_coe, ← Units.val_lt_val, Units.val_mk0 _, coe_nnnorm]
obtain ⟨ζ, hζ, hhζ : ‖_‖ < _⟩ := hex
exact ⟨ζ, hζ, by simp [hhζ]⟩