English
For real q > 1 and n ≥ 2, (q − 1)^{totient(n)} < cyclotomic(n, Real).eval(q).
Русский
Для действительного q > 1 и n ≥ 2 верно (q − 1)^{φ(n)} < cyclotomic(n, Real).eval(q).
LaTeX
$$ (q - 1) ^ totient(n) < (cyclotomic(n, Real)).eval(q) $$
Lean4
theorem sub_one_pow_totient_lt_cyclotomic_eval {n : ℕ} {q : ℝ} (hn' : 2 ≤ n) (hq' : 1 < q) :
(q - 1) ^ totient n < (cyclotomic n ℝ).eval q :=
by
have hn : 0 < n := pos_of_gt hn'
have hq := zero_lt_one.trans hq'
have hfor : ∀ ζ' ∈ primitiveRoots n ℂ, q - 1 ≤ ‖↑q - ζ'‖ :=
by
intro ζ' hζ'
rw [mem_primitiveRoots hn] at hζ'
convert norm_sub_norm_le (↑q) ζ'
· rw [Complex.norm_real, Real.norm_of_nonneg 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 - 1 < ‖↑q - ζ'‖ :=
by
refine ⟨ζ, (mem_primitiveRoots hn).mpr hζ, ?_⟩
suffices ¬SameRay ℝ (q : ℂ) ζ by
convert lt_norm_sub_of_not_sameRay this <;>
simp only [hζ.norm'_eq_one hn.ne', Real.norm_of_nonneg hq.le, Complex.norm_real]
rw [Complex.sameRay_iff]
push_neg
refine ⟨mod_cast hq.ne', hζ.ne_zero hn.ne', ?_⟩
rw [Complex.arg_ofReal_of_nonneg hq.le, Ne, eq_comm, hζ.arg_eq_zero_iff hn.ne']
clear_value ζ
rintro rfl
linarith [hζ.unique IsPrimitiveRoot.one]
have : ¬eval (↑q) (cyclotomic n ℂ) = 0 := by simpa using (cyclotomic_pos' n hq').ne'
suffices
Units.mk0 (Real.toNNReal (q - 1)) (by simp [hq']) ^ totient n < Units.mk0 ‖(cyclotomic n ℂ).eval ↑q‖₊ (by simp_all)
by
simp [← Units.val_lt_val, Units.val_pow_eq_pow_val, Units.val_mk0, ← NNReal.coe_lt_coe, hq'.le, coe_nnnorm,
NNReal.coe_pow, Real.coe_toNNReal', sub_nonneg] at this
convert this
rw [eq_comm]
simp [cyclotomic_nonneg n hq'.le]
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 [hq'])
· simp only [Complex.card_primitiveRoots, prod_const, card_attach]
· simp only [Finset.mem_attach, forall_true_left, Subtype.forall, ← Units.val_le_val, ← NNReal.coe_le_coe,
norm_nonneg, Units.val_mk0, Real.coe_toNNReal', coe_nnnorm, max_le_iff, tsub_le_iff_right]
intro x hx
simpa only [and_true, tsub_le_iff_right] using hfor x hx
· simp only [Finset.mem_attach, Subtype.exists, ← NNReal.coe_lt_coe, ← Units.val_lt_val, Units.val_mk0 _, coe_nnnorm]
simpa [hq'.le, Real.coe_toNNReal', max_eq_left, sub_nonneg] using hex