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 : pt, 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 0n 0Nat.Coprime m nf (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 < nf n 0) (hg : ∀ (n : ), 0 < ng 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 nn sm 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 nn sm s) (hs₀ : 0s) :
                                            (ns, (Finset.sum (Nat.divisors n) fun (i : ) => f i) = g n) ns, (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 nn sm 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 nn sm 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 nn sm 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.