Documentation

Mathlib.NumberTheory.ArithmeticFunction

Arithmetic Functions and Dirichlet Convolution #

This file defines arithmetic functions, which are functions from ℕ to a specified type that map 0 to 0. In the literature, they are often instead defined as functions from ℕ+. These arithmetic functions are endowed with a multiplication, given by Dirichlet convolution, and pointwise addition, to form the Dirichlet ring.

Main Definitions #

Main Results #

Notation #

All notation is localized in the namespace ArithmeticFunction.

The arithmetic functions ζ, σ, ω, Ω and μ have Greek letter names.

The arithmetic function $$n \mapsto \prod_{p \mid n} f(p)$$ is given custom notation ∏ᵖ p ∣ n, f p when applied to n.

Tags #

arithmetic functions, dirichlet convolution, divisors

def ArithmeticFunction (R : Type u_1) [Zero R] :
Type u_1

An arithmetic function is a function from ℕ that maps 0 to 0. In the literature, they are often instead defined as functions from ℕ+. Multiplication on ArithmeticFunctions is by Dirichlet convolution.

Equations
Instances For
    Equations
    @[simp]
    theorem ArithmeticFunction.toFun_eq {R : Type u_1} [Zero R] (f : ArithmeticFunction R) :
    f.toFun = ⇑f
    @[simp]
    theorem ArithmeticFunction.coe_mk {R : Type u_1} [Zero R] (f : ℕ → R) (hf : f 0 = 0) :
    ⇑{ toFun := f, map_zero' := hf } = f
    @[simp]
    theorem ArithmeticFunction.map_zero {R : Type u_1} [Zero R] {f : ArithmeticFunction R} :
    f 0 = 0
    theorem ArithmeticFunction.coe_inj {R : Type u_1} [Zero R] {f : ArithmeticFunction R} {g : ArithmeticFunction R} :
    ⇑f = ⇑g ↔ f = g
    @[simp]
    theorem ArithmeticFunction.zero_apply {R : Type u_1} [Zero R] {x : ℕ} :
    0 x = 0
    theorem ArithmeticFunction.ext {R : Type u_1} [Zero R] ⦃f : ArithmeticFunction R⦄ ⦃g : ArithmeticFunction R⦄ (h : ∀ (x : ℕ), f x = g x) :
    f = g
    theorem ArithmeticFunction.ext_iff {R : Type u_1} [Zero R] {f : ArithmeticFunction R} {g : ArithmeticFunction R} :
    f = g ↔ ∀ (x : ℕ), f x = g x
    instance ArithmeticFunction.one {R : Type u_1} [Zero R] [One R] :
    Equations
    • One or more equations did not get rendered due to their size.
    theorem ArithmeticFunction.one_apply {R : Type u_1} [Zero R] [One R] {x : ℕ} :
    1 x = if x = 1 then 1 else 0
    @[simp]
    theorem ArithmeticFunction.one_one {R : Type u_1} [Zero R] [One R] :
    1 1 = 1
    @[simp]
    theorem ArithmeticFunction.one_apply_ne {R : Type u_1} [Zero R] [One R] {x : ℕ} (h : x ≠ 1) :
    1 x = 0

    Coerce an arithmetic function with values in ℕ to one with values in R. We cannot inline this in natCoe because it gets unfolded too much.

    Equations
    • ↑f = { toFun := fun (n : ℕ) => ↑(f n), map_zero' := (_ : ↑(f 0) = 0) }
    Instances For
      Equations
      • ArithmeticFunction.natCoe = { coe := ArithmeticFunction.natToArithmeticFunction }
      @[simp]
      theorem ArithmeticFunction.natCoe_apply {R : Type u_1} [AddMonoidWithOne R] {f : ArithmeticFunction ℕ} {x : ℕ} :
      ↑f x = ↑(f x)

      Coerce an arithmetic function with values in ℤ to one with values in R. We cannot inline this in intCoe because it gets unfolded too much.

      Equations
      • ↑f = { toFun := fun (n : ℕ) => ↑(f n), map_zero' := (_ : ↑(f 0) = 0) }
      Instances For
        Equations
        • ArithmeticFunction.intCoe = { coe := ArithmeticFunction.ofInt }
        @[simp]
        theorem ArithmeticFunction.intCoe_apply {R : Type u_1} [AddGroupWithOne R] {f : ArithmeticFunction ℤ} {x : ℕ} :
        ↑f x = ↑(f x)
        @[simp]
        theorem ArithmeticFunction.coe_coe {R : Type u_1} [AddGroupWithOne R] {f : ArithmeticFunction ℕ} :
        ↑↑f = ↑f
        @[simp]
        @[simp]
        theorem ArithmeticFunction.intCoe_one {R : Type u_1} [AddGroupWithOne R] :
        ↑1 = 1
        Equations
        • ArithmeticFunction.add = { add := fun (f g : ArithmeticFunction R) => { toFun := fun (n : ℕ) => f n + g n, map_zero' := (_ : f 0 + g 0 = 0) } }
        @[simp]
        theorem ArithmeticFunction.add_apply {R : Type u_1} [AddMonoid R] {f : ArithmeticFunction R} {g : ArithmeticFunction R} {n : ℕ} :
        (f + g) n = f n + g n
        Equations
        • One or more equations did not get rendered due to their size.
        Equations
        • ArithmeticFunction.instAddMonoidWithOne = let src := ArithmeticFunction.instAddMonoid; let src_1 := ArithmeticFunction.one; AddMonoidWithOne.mk
        Equations
        Equations
        • One or more equations did not get rendered due to their size.

        The Dirichlet convolution of two arithmetic functions f and g is another arithmetic function such that (f * g) n is the sum of f x * g y over all (x,y) such that x * y = n.

        Equations
        • One or more equations did not get rendered due to their size.
        @[simp]
        theorem ArithmeticFunction.smul_apply {R : Type u_1} {M : Type u_2} [Zero R] [AddCommMonoid M] [SMul R M] {f : ArithmeticFunction R} {g : ArithmeticFunction M} {n : ℕ} :
        (f • g) n = Finset.sum (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => f x.1 • g x.2

        The Dirichlet convolution of two arithmetic functions f and g is another arithmetic function such that (f * g) n is the sum of f x * g y over all (x,y) such that x * y = n.

        Equations
        • ArithmeticFunction.instMulArithmeticFunctionToZeroToMonoidWithZero = { mul := fun (x x_1 : ArithmeticFunction R) => x • x_1 }
        @[simp]
        theorem ArithmeticFunction.mul_apply {R : Type u_1} [Semiring R] {f : ArithmeticFunction R} {g : ArithmeticFunction R} {n : ℕ} :
        (f * g) n = Finset.sum (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => f x.1 * g x.2
        theorem ArithmeticFunction.mul_apply_one {R : Type u_1} [Semiring R] {f : ArithmeticFunction R} {g : ArithmeticFunction R} :
        (f * g) 1 = f 1 * g 1
        @[simp]
        theorem ArithmeticFunction.natCoe_mul {R : Type u_1} [Semiring R] {f : ArithmeticFunction ℕ} {g : ArithmeticFunction ℕ} :
        ↑(f * g) = ↑f * ↑g
        @[simp]
        theorem ArithmeticFunction.intCoe_mul {R : Type u_1} [Ring R] {f : ArithmeticFunction ℤ} {g : ArithmeticFunction ℤ} :
        ↑(f * g) = ↑f * ↑g
        theorem ArithmeticFunction.mul_smul' {R : Type u_1} {M : Type u_2} [Semiring R] [AddCommMonoid M] [Module R M] (f : ArithmeticFunction R) (g : ArithmeticFunction R) (h : ArithmeticFunction M) :
        (f * g) • h = f • g • h
        theorem ArithmeticFunction.one_smul' {R : Type u_1} {M : Type u_2} [Semiring R] [AddCommMonoid M] [Module R M] (b : ArithmeticFunction M) :
        1 • b = b
        Equations
        Equations
        • One or more equations did not get rendered due to their size.
        Equations
        • ArithmeticFunction.instCommSemiringArithmeticFunctionToZeroToCommMonoidWithZero = let src := ArithmeticFunction.instSemiring; CommSemiring.mk (_ : ∀ (f g : ArithmeticFunction R), f * g = g * f)
        Equations
        • One or more equations did not get rendered due to their size.

        ζ 0 = 0, otherwise ζ x = 1. The Dirichlet Series is the Riemann ζ.

        Equations
        Instances For

          ζ 0 = 0, otherwise ζ x = 1. The Dirichlet Series is the Riemann ζ.

          Equations
          Instances For
            @[simp]
            theorem ArithmeticFunction.zeta_apply {x : ℕ} :
            ArithmeticFunction.zeta x = if x = 0 then 0 else 1

            This is the pointwise product of ArithmeticFunctions.

            Equations
            Instances For
              @[simp]

              This is the pointwise power of ArithmeticFunctions.

              Equations
              Instances For
                @[simp]
                theorem ArithmeticFunction.ppow_apply {R : Type u_1} [Semiring R] {f : ArithmeticFunction R} {k : ℕ} {x : ℕ} (kpos : 0 < k) :

                This is the pointwise division of ArithmeticFunctions.

                Equations
                Instances For
                  @[simp]

                  This result only holds for DivisionSemirings instead of GroupWithZeros because zeta takes values in ℕ, and hence the coercion requires an AddMonoidWithOne. TODO: Generalise zeta

                  The map $n \mapsto \prod_{p \mid n} f(p)$ as an arithmetic function

                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For

                    ∏ᵖ p ∣ n, f p is custom notation for prodPrimeFactors f n

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      @[simp]
                      theorem ArithmeticFunction.prodPrimeFactors_apply {R : Type u_1} [CommMonoidWithZero R] {f : ℕ → R} {n : ℕ} (hn : n ≠ 0) :
                      (ArithmeticFunction.prodPrimeFactors fun (p : ℕ) => f p) n = Finset.prod n.primeFactors fun (p : ℕ) => f p

                      Multiplicative functions

                      Equations
                      Instances For
                        theorem ArithmeticFunction.IsMultiplicative.map_prod {R : Type u_1} {ι : Type u_2} [CommMonoidWithZero R] (g : ι → ℕ) {f : ArithmeticFunction R} (hf : ArithmeticFunction.IsMultiplicative f) (s : Finset ι) (hs : Set.Pairwise (↑s) (Nat.Coprime on g)) :
                        f (Finset.prod s fun (i : ι) => g i) = Finset.prod s fun (i : ι) => f (g i)
                        theorem ArithmeticFunction.IsMultiplicative.map_prod_of_prime {R : Type u_1} [CommSemiring R] {f : ArithmeticFunction R} (h_mult : ArithmeticFunction.IsMultiplicative f) (t : Finset ℕ) (ht : ∀ p ∈ t, Nat.Prime p) :
                        f (Finset.prod t fun (a : ℕ) => a) = Finset.prod t fun (a : ℕ) => f a
                        theorem ArithmeticFunction.IsMultiplicative.map_prod_of_subset_primeFactors {R : Type u_1} [CommSemiring R] {f : ArithmeticFunction R} (h_mult : ArithmeticFunction.IsMultiplicative f) (l : ℕ) (t : Finset ℕ) (ht : t ⊆ l.primeFactors) :
                        f (Finset.prod t fun (a : ℕ) => a) = Finset.prod t fun (a : ℕ) => f a

                        For any multiplicative function f and any n > 0, we can evaluate f n by evaluating f at p ^ k over the factorization of n

                        theorem ArithmeticFunction.IsMultiplicative.iff_ne_zero {R : Type u_1} [MonoidWithZero R] {f : ArithmeticFunction R} :
                        ArithmeticFunction.IsMultiplicative f ↔ f 1 = 1 ∧ ∀ {m n : ℕ}, m ≠ 0 → n ≠ 0 → Nat.Coprime m n → f (m * n) = f m * f n

                        A recapitulation of the definition of multiplicative that is simpler for proofs

                        Two multiplicative functions f and g are equal if and only if they agree on prime powers

                        The identity on ℕ as an ArithmeticFunction.

                        Equations
                        Instances For
                          @[simp]
                          theorem ArithmeticFunction.pow_apply {k : ℕ} {n : ℕ} :
                          (ArithmeticFunction.pow k) n = if k = 0 ∧ n = 0 then 0 else n ^ k

                          σ k n is the sum of the kth powers of the divisors of n

                          Equations
                          Instances For

                            σ k n is the sum of the kth powers of the divisors of n

                            Equations
                            Instances For

                              Ω n is the number of prime factors of n.

                              Equations
                              Instances For

                                Ω n is the number of prime factors of n.

                                Equations
                                Instances For

                                  ω n is the number of distinct prime factors of n.

                                  Equations
                                  Instances For

                                    ω n is the number of distinct prime factors of n.

                                    Equations
                                    Instances For

                                      μ is the Möbius function. If n is squarefree with an even number of distinct prime factors, μ n = 1. If n is squarefree with an odd number of distinct prime factors, μ n = -1. If n is not squarefree, μ n = 0.

                                      Equations
                                      Instances For

                                        μ is the Möbius function. If n is squarefree with an even number of distinct prime factors, μ n = 1. If n is squarefree with an odd number of distinct prime factors, μ n = -1. If n is not squarefree, μ n = 0.

                                        Equations
                                        Instances For
                                          theorem ArithmeticFunction.moebius_apply_prime_pow {p : ℕ} {k : ℕ} (hp : Nat.Prime p) (hk : k ≠ 0) :
                                          ArithmeticFunction.moebius (p ^ k) = if k = 1 then -1 else 0

                                          A unit in ArithmeticFunction R that evaluates to ζ, with inverse μ.

                                          Equations
                                          • One or more equations did not get rendered due to their size.
                                          Instances For
                                            @[simp]
                                            theorem ArithmeticFunction.coe_zetaUnit {R : Type u_1} [CommRing R] :
                                            ↑ArithmeticFunction.zetaUnit = ↑ArithmeticFunction.zeta
                                            @[simp]
                                            theorem ArithmeticFunction.inv_zetaUnit {R : Type u_1} [CommRing R] :
                                            ↑ArithmeticFunction.zetaUnit⁻¹ = ↑ArithmeticFunction.moebius
                                            theorem ArithmeticFunction.sum_eq_iff_sum_smul_moebius_eq {R : Type u_1} [AddCommGroup R] {f : ℕ → R} {g : ℕ → R} :
                                            (∀ n > 0, (Finset.sum (Nat.divisors n) fun (i : ℕ) => f i) = g n) ↔ ∀ n > 0, (Finset.sum (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => ArithmeticFunction.moebius x.1 • g x.2) = f n

                                            Möbius inversion for functions to an AddCommGroup.

                                            theorem ArithmeticFunction.sum_eq_iff_sum_mul_moebius_eq {R : Type u_1} [Ring R] {f : ℕ → R} {g : ℕ → R} :
                                            (∀ n > 0, (Finset.sum (Nat.divisors n) fun (i : ℕ) => f i) = g n) ↔ ∀ n > 0, (Finset.sum (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => ↑(ArithmeticFunction.moebius x.1) * g x.2) = f n

                                            Möbius inversion for functions to a Ring.

                                            theorem ArithmeticFunction.prod_eq_iff_prod_pow_moebius_eq {R : Type u_1} [CommGroup R] {f : ℕ → R} {g : ℕ → R} :
                                            (∀ n > 0, (Finset.prod (Nat.divisors n) fun (i : ℕ) => f i) = g n) ↔ ∀ n > 0, (Finset.prod (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => g x.2 ^ ArithmeticFunction.moebius x.1) = f n

                                            Möbius inversion for functions to a CommGroup.

                                            theorem ArithmeticFunction.prod_eq_iff_prod_pow_moebius_eq_of_nonzero {R : Type u_1} [CommGroupWithZero R] {f : ℕ → R} {g : ℕ → R} (hf : ∀ (n : ℕ), 0 < n → f n ≠ 0) (hg : ∀ (n : ℕ), 0 < n → g n ≠ 0) :
                                            (∀ n > 0, (Finset.prod (Nat.divisors n) fun (i : ℕ) => f i) = g n) ↔ ∀ n > 0, (Finset.prod (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => g x.2 ^ ArithmeticFunction.moebius x.1) = f n

                                            Möbius inversion for functions to a CommGroupWithZero.

                                            theorem ArithmeticFunction.sum_eq_iff_sum_smul_moebius_eq_on {R : Type u_1} [AddCommGroup R] {f : ℕ → R} {g : ℕ → R} (s : Set ℕ) (hs : ∀ (m n : ℕ), m ∣ n → n ∈ s → m ∈ s) :
                                            (∀ n > 0, n ∈ s → (Finset.sum (Nat.divisors n) fun (i : ℕ) => f i) = g n) ↔ ∀ n > 0, n ∈ s → (Finset.sum (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => ArithmeticFunction.moebius x.1 • g x.2) = f n

                                            Möbius inversion for functions to an AddCommGroup, where the equalities only hold on a well-behaved set.

                                            theorem ArithmeticFunction.sum_eq_iff_sum_smul_moebius_eq_on' {R : Type u_1} [AddCommGroup R] {f : ℕ → R} {g : ℕ → R} (s : Set ℕ) (hs : ∀ (m n : ℕ), m ∣ n → n ∈ s → m ∈ s) (hs₀ : 0 ∉ s) :
                                            (∀ n ∈ s, (Finset.sum (Nat.divisors n) fun (i : ℕ) => f i) = g n) ↔ ∀ n ∈ s, (Finset.sum (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => ArithmeticFunction.moebius x.1 • g x.2) = f n
                                            theorem ArithmeticFunction.sum_eq_iff_sum_mul_moebius_eq_on {R : Type u_1} [Ring R] {f : ℕ → R} {g : ℕ → R} (s : Set ℕ) (hs : ∀ (m n : ℕ), m ∣ n → n ∈ s → m ∈ s) :
                                            (∀ n > 0, n ∈ s → (Finset.sum (Nat.divisors n) fun (i : ℕ) => f i) = g n) ↔ ∀ n > 0, n ∈ s → (Finset.sum (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => ↑(ArithmeticFunction.moebius x.1) * g x.2) = f n

                                            Möbius inversion for functions to a Ring, where the equalities only hold on a well-behaved set.

                                            theorem ArithmeticFunction.prod_eq_iff_prod_pow_moebius_eq_on {R : Type u_1} [CommGroup R] {f : ℕ → R} {g : ℕ → R} (s : Set ℕ) (hs : ∀ (m n : ℕ), m ∣ n → n ∈ s → m ∈ s) :
                                            (∀ n > 0, n ∈ s → (Finset.prod (Nat.divisors n) fun (i : ℕ) => f i) = g n) ↔ ∀ n > 0, n ∈ s → (Finset.prod (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => g x.2 ^ ArithmeticFunction.moebius x.1) = f n

                                            Möbius inversion for functions to a CommGroup, where the equalities only hold on a well-behaved set.

                                            theorem ArithmeticFunction.prod_eq_iff_prod_pow_moebius_eq_on_of_nonzero {R : Type u_1} [CommGroupWithZero R] (s : Set ℕ) (hs : ∀ (m n : ℕ), m ∣ n → n ∈ s → m ∈ s) {f : ℕ → R} {g : ℕ → R} (hf : ∀ n > 0, f n ≠ 0) (hg : ∀ n > 0, g n ≠ 0) :
                                            (∀ n > 0, n ∈ s → (Finset.prod (Nat.divisors n) fun (i : ℕ) => f i) = g n) ↔ ∀ n > 0, n ∈ s → (Finset.prod (Nat.divisorsAntidiagonal n) fun (x : ℕ × ℕ) => g x.2 ^ ArithmeticFunction.moebius x.1) = f n

                                            Möbius inversion for functions to a CommGroupWithZero, where the equalities only hold on a well-behaved set.