Restricted products of sets, groups and rings #
We define the restricted product of R : ι → Type* of types, relative to
a family of subsets A : (i : ι) → Set (R i) and a filter 𝓕 : Filter ι. This
is the set of all x : Π i, R i such that the set {j | x j ∈ A j} belongs to 𝓕.
We denote it by Πʳ i, [R i, A i]_[𝓕].
The main case of interest, which we shall refer to as the "classical restricted product",
is that of 𝓕 = cofinite. Recall that this is the filter of all subsets of ι, which are
cofinite in the sense that they have finite complement.
Hence, the associated restricted product is the set of all x : Π i, R i such that
x j ∈ A j for all but finitely many js. We denote it simply by Πʳ i, [R i, A i].
Another notable case is that of the principal filter 𝓕 = 𝓟 s corresponding to some subset s
of ι. The associated restricted product Πʳ i, [R i, A i]_[𝓟 s] is the set of all
x : Π i, R i such that x j ∈ A j for all j ∈ s. Put another way, this is just
(Π i ∈ s, A i) × (Π i ∉ s, R i), modulo the obvious isomorphism.
We endow these types with the obvious algebraic structures. We also show various compatibility results.
See also the file Mathlib/Topology/Algebra/RestrictedProduct/TopologicalSpace.lean, which
puts the structure of a topological space on a restricted product of topological spaces.
Main definitions #
RestrictedProduct: the restricted product of a familyRof types, relative to a familyAof subsets and a filter𝓕on the indexing set. This is denotedΠʳ i, [R i, A i]_[𝓕], or simplyΠʳ i, [R i, A i]when𝓕 = cofinite.RestrictedProduct.instDFunLike: interpret an element ofΠʳ i, [R i, A i]_[𝓕]as an element ofΠ i, R iusing theDFunLikemachinery.RestrictedProduct.structureMap: the inclusion map fromΠ i, A itoΠʳ i, [R i, A i]_[𝓕].
Notation #
Πʳ i, [R i, A i]_[𝓕]isRestrictedProduct R A 𝓕.Πʳ i, [R i, A i]isRestrictedProduct R A cofinite.
Tags #
restricted product, adeles, ideles
Definition and elementary maps #
The restricted product of a family R : ι → Type* of types, relative to subsets
A : (i : ι) → Set (R i) and the filter 𝓕 : Filter ι, is the set of all x : Π i, R i
such that the set {j | x j ∈ A j} belongs to 𝓕. We denote it by Πʳ i, [R i, A i]_[𝓕].
The most common use case is with 𝓕 = cofinite, in which case the restricted product is the set
of all x : Π i, R i such that x j ∈ A j for all but finitely many j. We denote it simply
by Πʳ i, [R i, A i].
Similarly, if S is a principal filter, the restricted product Πʳ i, [R i, A i]_[𝓟 s]
is the set of all x : Π i, R i such that ∀ j ∈ S, x j ∈ A j.
Instances For
Πʳ i, [R i, A i]_[𝓕] is RestrictedProduct R A 𝓕.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Πʳ i, [R i, A i] is RestrictedProduct R A cofinite.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- RestrictedProduct.instDFunLike R A = { coe := fun (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => A i) 𝓕) (i : ι) => ↑x i, coe_injective' := ⋯ }
Constructor for RestrictedProduct.
Equations
- RestrictedProduct.mk x hx = ⟨x, hx⟩
Instances For
The structure map of the restricted product is the obvious inclusion from Π i, A i
into Πʳ i, [R i, A i]_[𝓕].
Equations
- RestrictedProduct.structureMap R A 𝓕 x = ⟨fun (i : ι) => ↑(x i), ⋯⟩
Instances For
If 𝓕 ≤ 𝓖, the restricted product Πʳ i, [R i, A i]_[𝓖] is naturally included in
Πʳ i, [R i, A i]_[𝓕]. This is the corresponding map.
Equations
- RestrictedProduct.inclusion R A h x = ⟨⇑x, ⋯⟩
Instances For
Algebraic instances on restricted products #
In this section, we endow the restricted product with its algebraic instances.
To avoid any unnecessary coercions, we use subobject classes for the subset B i of each R i.
Equations
- RestrictedProduct.instInvCoeOfInvMemClass R = { inv := fun (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⟨fun (i : ι) => (x i)⁻¹, ⋯⟩ }
Equations
- RestrictedProduct.instNegCoeOfNegMemClass R = { neg := fun (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⟨fun (i : ι) => -x i, ⋯⟩ }
Equations
- RestrictedProduct.instMulCoeOfMulMemClass R = { mul := fun (x y : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⟨fun (i : ι) => x i * y i, ⋯⟩ }
Equations
- RestrictedProduct.instAddCoeOfAddMemClass R = { add := fun (x y : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⟨fun (i : ι) => x i + y i, ⋯⟩ }
Equations
- RestrictedProduct.instSMulCoeOfSMulMemClass R = { smul := fun (g : G) (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⟨fun (i : ι) => g • x i, ⋯⟩ }
Equations
- RestrictedProduct.instVAddCoeOfVAddMemClass R = { vadd := fun (g : G) (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⟨fun (i : ι) => g +ᵥ x i, ⋯⟩ }
Equations
- RestrictedProduct.instDivCoeOfSubgroupClass R = { div := fun (x y : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⟨fun (i : ι) => x i / y i, ⋯⟩ }
Equations
- RestrictedProduct.instSubCoeOfAddSubgroupClass R = { sub := fun (x y : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⟨fun (i : ι) => x i - y i, ⋯⟩ }
Equations
- RestrictedProduct.instNSMul R = { smul := fun (n : ℕ) (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⟨fun (i : ι) => n • x i, ⋯⟩ }
Equations
- RestrictedProduct.instPowCoeNatOfSubmonoidClass R = { pow := fun (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) (n : ℕ) => ⟨fun (i : ι) => x i ^ n, ⋯⟩ }
Equations
- RestrictedProduct.instMonoidCoeOfSubmonoidClass R = Function.Injective.monoid (fun (f : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⇑f) ⋯ ⋯ ⋯ ⋯
Equations
- RestrictedProduct.instAddMonoidCoeOfAddSubmonoidClass R = Function.Injective.addMonoid (fun (f : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⇑f) ⋯ ⋯ ⋯ ⋯
Equations
- RestrictedProduct.instCommMonoidCoeOfSubmonoidClass R = Function.Injective.commMonoid (fun (f : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⇑f) ⋯ ⋯ ⋯ ⋯
Equations
- RestrictedProduct.instAddCommMonoidCoeOfAddSubmonoidClass R = Function.Injective.addCommMonoid (fun (f : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⇑f) ⋯ ⋯ ⋯ ⋯
Equations
- RestrictedProduct.instZSMul R = { smul := fun (n : ℤ) (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⟨fun (i : ι) => n • x i, ⋯⟩ }
Equations
- RestrictedProduct.instPowCoeIntOfSubgroupClass R = { pow := fun (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) (n : ℤ) => ⟨fun (i : ι) => x i ^ n, ⋯⟩ }
Equations
- RestrictedProduct.instGroupCoeOfSubgroupClass R = Function.Injective.group (fun (f : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⇑f) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯
Equations
- RestrictedProduct.instAddGroupCoeOfAddSubgroupClass R = Function.Injective.addGroup (fun (f : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⇑f) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯
Equations
- RestrictedProduct.instCommGroupCoeOfSubgroupClass R = Function.Injective.commGroup (fun (f : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⇑f) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯
Equations
- RestrictedProduct.instAddCommGroupCoeOfAddSubgroupClass R = Function.Injective.addCommGroup (fun (f : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⇑f) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯
Equations
- RestrictedProduct.instRingCoeOfSubringClass R = Function.Injective.ring (fun (f : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => ⇑f) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯
Equations
- RestrictedProduct.instCommRingCoeOfSubringClass R = { toRing := RestrictedProduct.instRingCoeOfSubringClass R, mul_comm := ⋯ }
The coercion from the restricted product of monoids A i to the (normal) product
is a monoid homomorphism.
Equations
- RestrictedProduct.coeMonoidHom = { toFun := DFunLike.coe, map_one' := ⋯, map_mul' := ⋯ }
Instances For
The coercion from the restricted product of additive monoids A i to the
(normal) product is an additive monoid homomorphism.
Equations
- RestrictedProduct.coeAddMonoidHom = { toFun := DFunLike.coe, map_zero' := ⋯, map_add' := ⋯ }
Instances For
RestrictedProduct.evalMonoidHom j is the monoid homomorphism from the restricted
product Πʳ i, [R i, B i]_[𝓕] to the component R j.
Equations
- RestrictedProduct.evalMonoidHom R j = { toFun := fun (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => x j, map_one' := ⋯, map_mul' := ⋯ }
Instances For
RestrictedProduct.evalAddMonoidHom j is the monoid homomorphism from the
restricted product Πʳ i, [R i, B i]_[𝓕] to the component R j.
Equations
- RestrictedProduct.evalAddMonoidHom R j = { toFun := fun (x : RestrictedProduct (fun (i : ι) => R i) (fun (i : ι) => ↑(B i)) 𝓕) => x j, map_zero' := ⋯, map_add' := ⋯ }
Instances For
RestrictedProduct.evalRingHom j is the ring homomorphism from the restricted
product Πʳ i, [R i, B i]_[𝓕] to the component R j.
Equations
- RestrictedProduct.evalRingHom R j = { toMonoidHom := RestrictedProduct.evalMonoidHom R j, map_zero' := ⋯, map_add' := ⋯ }
Instances For
Given two restricted products Πʳ (i : ι₁), [R₁ i, A₁ i]_[𝓕₁] and Πʳ (j : ι₂), [R₂ j, A₂ j]_[𝓕₂],
RestrictedProduct.mapAlong gives a function between them. The data needed is a
function f : ι₂ → ι₁ such that 𝓕₂ tends to 𝓕₁ along f, and functions φ j : R₁ (f j) → R₂ j
sending A₁ (f j) into A₂ j for an 𝓕₂-large set of j's.
See also mapAlongMonoidHom, mapAlongAddMonoidHom and mapAlongRingHom for variants.
Equations
- RestrictedProduct.mapAlong R₁ R₂ f hf φ hφ x = ⟨fun (j : ι₂) => φ j (x (f j)), ⋯⟩
Instances For
The maps between restricted products over a fixed index type, given maps on the factors.
Equations
- RestrictedProduct.map φ hφ x = RestrictedProduct.mapAlong G H id ⋯ φ hφ x
Instances For
Given two restricted products Πʳ (i : ι₁), [R₁ i, B₁ i]_[𝓕₁] and Πʳ (j : ι₂), [R₂ j, B₂ j]_[𝓕₂]
of monoids, RestrictedProduct.mapAlongMonoidHom gives a monoid homomorphism between them.
The data needed is a function f : ι₂ → ι₁ such that 𝓕₂ tends to 𝓕₁ along f, and monoid
homomorphisms φ j : R₁ (f j) → R₂ j sending B₁ (f j) into B₂ j for an 𝓕₂-large set of j's.
Equations
- RestrictedProduct.mapAlongMonoidHom R₁ R₂ f hf φ hφ = { toFun := RestrictedProduct.mapAlong R₁ R₂ f hf (fun (j : ι₂) (r : R₁ (f j)) => (φ j) r) hφ, map_one' := ⋯, map_mul' := ⋯ }
Instances For
Given two restricted products Πʳ (i : ι₁), [R₁ i, B₁ i]_[𝓕₁] and
Πʳ (j : ι₂), [R₂ j, B₂ j]_[𝓕₂] of additive monoids, RestrictedProduct.mapAlongAddMonoidHom
gives a additive monoid homomorphism between them. The data needed is a function f : ι₂ → ι₁ such
that 𝓕₂ tends to 𝓕₁ along f, and additive monoid homomorphisms φ j : R₁ (f j) → R₂ j
sending B₁ (f j) into B₂ j for an 𝓕₂-large set of j's.
Equations
- RestrictedProduct.mapAlongAddMonoidHom R₁ R₂ f hf φ hφ = { toFun := RestrictedProduct.mapAlong R₁ R₂ f hf (fun (j : ι₂) (r : R₁ (f j)) => (φ j) r) hφ, map_zero' := ⋯, map_add' := ⋯ }
Instances For
Given two restricted products of rings Πʳ (i : ι₁), [R₁ i, B₁ i]_[𝓕₁] and
Πʳ (j : ι₂), [R₂ j, B₂ j]_[𝓕₂], RestrictedProduct.mapAlongRingHom gives a
ring homomorphism between them. The data needed is a
function f : ι₂ → ι₁ such that 𝓕₂ tends to 𝓕₁ along f, and ring homomorphisms
φ j : R₁ (f j) → R₂ j sending B₁ (f j) into B₂ j for an 𝓕₂-large set of j's.
Equations
- RestrictedProduct.mapAlongRingHom R₁ R₂ f hf φ hφ = { toMonoidHom := RestrictedProduct.mapAlongMonoidHom R₁ R₂ f hf (fun (j : ι₂) => ↑(φ j)) hφ, map_zero' := ⋯, map_add' := ⋯ }