Skip to main content
AlexKontorovich/PrimeNumberTheoremAnd
Source indexedtheorem · leanprover/lean4:v4.32.0

Sieve.prod_factors_sum_pow_compMult

PrimeNumberTheoremAnd.Mathlib.NumberTheory.Sieve.SelbergBounds · PrimeNumberTheoremAnd/Mathlib/NumberTheory/Sieve/SelbergBounds.lean:190 to 332

Mathematical statement

Exact Lean statement

theorem prod_factors_sum_pow_compMult (M : ℕ) (hM : M ≠ 0) (f : ArithmeticFunction ℝ)
    (hf : CompletelyMultiplicative f) (d : ℕ) (hd : Squarefree d) :
    ∏ p ∈ d.primeFactors, ∑ n ∈ Finset.Icc 1 M, f (p^n)
    = ∑ m ∈ (d^M).divisors.filter (d ∣ ·), f m

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
theorem prod_factors_sum_pow_compMult (M : ) (hM : M  0) (f : ArithmeticFunction )    (hf : CompletelyMultiplicative f) (d : ) (hd : Squarefree d) :    ∏ p  d.primeFactors, ∑ n  Finset.Icc 1 M, f (p^n)    = ∑ m  (d^M).divisors.filter (d ∣ ·), f m := by  rw [Finset.prod_sum]  let i : (a:_)  (ha : a  Finset.pi d.primeFactors fun p => Finset.Icc 1 M)   :=    fun a _ => ∏ p  d.primeFactors.attach, p.1 ^ (a p p.2)  have hfact_i :  a ha,       p , Nat.factorization (i a ha) p = if hp : p  d.primeFactors then a p hp else 0 := by    intro a ha p    by_cases hp : p  d.primeFactors    · rw [dif_pos hp, Nat.factorization_prod, Finset.sum_apply',        Finset.sum_eq_single p, hp, Nat.factorization_pow, Finsupp.smul_apply,        Nat.Prime.factorization_self (Nat.prime_of_mem_primeFactorsList <| List.mem_toFinset.mp hp)]      · ring      · intro q _ hq        rw [Nat.factorization_pow, Finsupp.smul_apply, smul_eq_zero]; right        apply Nat.factorization_eq_zero_of_not_dvd        rw [Nat.Prime.dvd_iff_eq,  exists_eq_subtype_mk_iff]        · push Not          exact fun _ => hq        · exact Nat.prime_of_mem_primeFactorsList <| List.mem_toFinset.mp q.2        · exact (Nat.prime_of_mem_primeFactorsList <| List.mem_toFinset.mp hp).ne_one      · intro h        exfalso        exact h (Finset.mem_attach _ _)      · exact fun q _ => pow_ne_zero _ (ne_of_gt (Nat.pos_of_mem_primeFactorsList          (List.mem_toFinset.mp q.2)))    · rw [dif_neg hp]      by_cases hpp : p.Prime      swap      · apply Nat.factorization_eq_zero_of_not_prime _ hpp      apply Nat.factorization_eq_zero_of_not_dvd      intro hp_dvd      obtain ⟨⟨q, hq, _, hp_dvd_pow := Prime.exists_mem_finset_dvd hpp.prime hp_dvd      apply hp      rw [Nat.mem_primeFactors]      constructor      · exact hpp      refine ?_, hd.ne_zero      trans q      · apply Nat.Prime.dvd_of_dvd_pow hpp hp_dvd_pow      · apply Nat.dvd_of_mem_primeFactorsList <| List.mem_toFinset.mp hq   have hi_ne_zero :  (a : _) (ha : a  Finset.pi d.primeFactors fun _p => Finset.Icc 1 M),      i a ha  0 := by    intro a ha    erw [Finset.prod_ne_zero_iff]    exact fun p _ => pow_ne_zero _ (ne_of_gt (Nat.pos_of_mem_primeFactorsList      (List.mem_toFinset.mp p.property)))  have hi :  (a : _) (ha : a  Finset.pi d.primeFactors fun _p => Finset.Icc 1 M),      i a ha  (d^M).divisors.filter (d ∣ ·) := by    intro a ha    rw [Finset.mem_filter, Nat.mem_divisors, Nat.factorization_le_iff_dvd hd.ne_zero      (hi_ne_zero a ha), Nat.factorization_le_iff_dvd (hi_ne_zero a ha) (pow_ne_zero _ hd.ne_zero)]    constructor; constructor    · rw [Finsupp.le_iff]; intro p _      rw [hfact_i a ha]      by_cases hp : p  d.primeFactors      · rw [dif_pos hp]        rw [Nat.factorization_pow, Finsupp.smul_apply]        simp_rw [Finset.mem_pi, Finset.mem_Icc] at ha        trans (M • 1)        · norm_num          exact (ha p hp).2        · gcongr          rw [Nat.mem_primeFactors_of_ne_zero hd.ne_zero] at hp          rw [Nat.Prime.dvd_iff_one_le_factorization hp.1 hd.ne_zero]          exact hp.2      · rw [dif_neg hp]; norm_num    · apply pow_ne_zero _ hd.ne_zero    · rw [Finsupp.le_iff]; intro p hp      rw [Nat.support_factorization] at hp      rw [hfact_i a ha]      rw [dif_pos hp]      trans 1      · exact hd.natFactorization_le_one p      simp_rw [Finset.mem_pi, Finset.mem_Icc] at ha      exact (ha p hp).1   have h :  (a : _) (ha : a  Finset.pi d.primeFactors fun _p => Finset.Icc 1 M),      ∏ p  d.primeFactors.attach, f (p.1 ^ (a p p.2)) = f (i a ha) := by    intro a ha    apply symm    apply hf.isMultiplicative.map_prod    intro x _ y _ hxy    simp_rw [Finset.mem_pi, Finset.mem_Icc, Nat.succ_le_iff] at ha    apply (Nat.coprime_pow_left_iff (ha x x.2).1 ..).mpr    apply (Nat.coprime_pow_right_iff (ha y y.2).1 ..).mpr    have hxp := Nat.prime_of_mem_primeFactorsList (List.mem_toFinset.mp x.2)    rw [Nat.Prime.coprime_iff_not_dvd hxp]    rw [Nat.prime_dvd_prime_iff_eq hxp <| Nat.prime_of_mem_primeFactorsList      (List.mem_toFinset.mp y.2)]    exact fun hc => hxy (Subtype.ext hc)   have i_inj :  a ha b hb, i a ha = i b hb  a = b := by    intro a ha b hb hiab    apply_fun Nat.factorization at hiab    ext p hp    obtain hiabp := DFunLike.ext_iff.mp hiab p    rw [hfact_i a ha, hfact_i b hb, dif_pos hp, dif_pos hp] at hiabp    exact hiabp   have i_surj :  (b : ), b  (d^M).divisors.filter (d ∣ ·)   a ha, i a ha = b := by    intro b hb    have h : (fun p _ => b.factorization p)  Finset.pi d.primeFactors fun p => Finset.Icc 1 M := by      rw [Finset.mem_pi]; intro p hp      rw [Finset.mem_Icc]      rw [Finset.mem_filter] at hb      have hb_ne_zero : b  0 := ne_of_gt <| Nat.pos_of_mem_divisors hb.1      have hpp : p.Prime := Nat.prime_of_mem_primeFactors hp      constructor      · rw [Nat.Prime.dvd_iff_one_le_factorization hpp hb_ne_zero]        · exact Trans.trans (Nat.dvd_of_mem_primeFactors hp) hb.2      · rw [Nat.mem_divisors] at hb        trans Nat.factorization (d^M) p        · exact (Nat.factorization_le_iff_dvd hb_ne_zero hb.left.right).mpr hb.left.left p        rw [Nat.factorization_pow, Finsupp.smul_apply, smul_eq_mul]        have : d.factorization p  1 := by          apply hd.natFactorization_le_one        exact (mul_le_iff_le_one_right (Nat.pos_of_ne_zero hM)).mpr this    use (fun p _ => Nat.factorization b p)    use h    apply Nat.eq_of_factorization_eq    · apply hi_ne_zero _ h    · exact ne_of_gt <| Nat.pos_of_mem_divisors (Finset.mem_filter.mp hb).1    intro p    rw [hfact_i (fun p _ => (Nat.factorization b) p) h p]    rw [Finset.mem_filter, Nat.mem_divisors] at hb    by_cases hp : p  d.primeFactors    · rw [dif_pos hp]    · rw [dif_neg hp, eq_comm, Nat.factorization_eq_zero_iff, or_assoc]      rw [Nat.mem_primeFactors] at hp      left      push Not at hp      by_cases hpp : p.Prime      · right; intro h        apply absurd (hp hpp)        push Not        exact hpp.dvd_of_dvd_pow (h.trans hb.1.1), hd.ne_zero      · left; exact hpp   exact Finset.sum_bij i hi i_inj i_surj h