Changes
60 changed files (+3248/-1535)
-
-
@@ -23,12 +23,14 @@ import MIL.C06_Structures.S03_Building_the_Gaussian_Integersimport MIL.C07_Hierarchies.S01_Basics import MIL.C07_Hierarchies.S02_Morphisms import MIL.C07_Hierarchies.S03_Subobjects import MIL.C08_Topology.S01_Filters import MIL.C08_Topology.S02_Metric_Spaces import MIL.C08_Topology.S03_Topological_Spaces import MIL.C09_Differential_Calculus.S01_Elementary_Differential_Calculus import MIL.C09_Differential_Calculus.S02_Differential_Calculus_in_Normed_Spaces import MIL.C10_Integration_and_Measure_Theory.S01_Elementary_Integration import MIL.C10_Integration_and_Measure_Theory.S02_Measure_Theory import MIL.C10_Integration_and_Measure_Theory.S03_Integration import MIL.C08_Groups_and_Rings.S01_Groups import MIL.C08_Groups_and_Rings.S02_Rings import MIL.C09_Topology.S01_Filters import MIL.C09_Topology.S02_Metric_Spaces import MIL.C09_Topology.S03_Topological_Spaces import MIL.C10_Differential_Calculus.S01_Elementary_Differential_Calculus import MIL.C10_Differential_Calculus.S02_Differential_Calculus_in_Normed_Spaces import MIL.C11_Integration_and_Measure_Theory.S01_Elementary_Integration import MIL.C11_Integration_and_Measure_Theory.S02_Measure_Theory import MIL.C11_Integration_and_Measure_Theory.S03_Integration import MIL.Common
-
-
-
@@ -2,16 +2,16 @@ import MIL.Commonimport Mathlib.Data.Nat.Factorization.Basic import Mathlib.Data.Nat.Prime #print Nat.coprime #print Nat.Coprime example (m n : Nat) (h : m.coprime n) : m.gcd n = 1 := example (m n : Nat) (h : m.Coprime n) : m.gcd n = 1 := h example (m n : Nat) (h : m.coprime n) : m.gcd n = 1 := by rw [Nat.coprime] at h example (m n : Nat) (h : m.Coprime n) : m.gcd n = 1 := by rw [Nat.Coprime] at h exact h example : Nat.coprime 12 7 := by norm_num example : Nat.Coprime 12 7 := by norm_num example : Nat.gcd 12 8 = 4 := by norm_num
-
@@ -49,7 +49,7 @@ example (a b c : Nat) (h : a * b = a * c) (h' : a ≠ 0) : b = c :=-- apply? suggests the following: (mul_right_inj' h').mp h example {m n : ℕ} (coprime_mn : m.coprime n) : m ^ 2 ≠ 2 * n ^ 2 := by example {m n : ℕ} (coprime_mn : m.Coprime n) : m ^ 2 ≠ 2 * n ^ 2 := by intro sqr_eq have : 2 ∣ m := by sorry
-
@@ -67,7 +67,7 @@ example {m n : ℕ} (coprime_mn : m.coprime n) : m ^ 2 ≠ 2 * n ^ 2 := bysorry norm_num at this example {m n p : ℕ} (coprime_mn : m.coprime n) (prime_p : p.Prime) : m ^ 2 ≠ p * n ^ 2 := by example {m n p : ℕ} (coprime_mn : m.Coprime n) (prime_p : p.Prime) : m ^ 2 ≠ p * n ^ 2 := by sorry #check Nat.factors #check Nat.prime_of_mem_factors
-
-
-
@@ -72,16 +72,16 @@ example : (range n).sum f = ∑ x in range n, f x :=example : (range n).prod f = ∏ x in range n, f x := rfl example (f : ℕ → ℕ) : (∑ x in range 0, f x) = 0 := example (f : ℕ → ℕ) : ∑ x in range 0, f x = 0 := Finset.sum_range_zero f example (f : ℕ → ℕ) (n : ℕ) : (∑ x in range n.succ, f x) = (∑ x in range n, f x) + f n := example (f : ℕ → ℕ) (n : ℕ) : ∑ x in range n.succ, f x = ∑ x in range n, f x + f n := Finset.sum_range_succ f n example (f : ℕ → ℕ) : (∏ x in range 0, f x) = 1 := example (f : ℕ → ℕ) : ∏ x in range 0, f x = 1 := Finset.prod_range_zero f example (f : ℕ → ℕ) (n : ℕ) : (∏ x in range n.succ, f x) = (∏ x in range n, f x) * f n := example (f : ℕ → ℕ) (n : ℕ) : ∏ x in range n.succ, f x = (∏ x in range n, f x) * f n := Finset.prod_range_succ f n example (n : ℕ) : fac n = ∏ i in range n, (i + 1) := by
-
@@ -92,14 +92,14 @@ example (n : ℕ) : fac n = ∏ i in range n, (i + 1) := byexample (a b c d e f : ℕ) : a * (b * c * f * (d * e)) = d * (a * f * e) * (c * b) := by simp [mul_assoc, mul_comm, mul_left_comm] theorem sum_id (n : ℕ) : (∑ i in range (n + 1), i) = n * (n + 1) / 2 := by theorem sum_id (n : ℕ) : ∑ i in range (n + 1), i = n * (n + 1) / 2 := by symm; apply Nat.div_eq_of_eq_mul_right (by norm_num : 0 < 2) induction' n with n ih · simp rw [Finset.sum_range_succ, mul_add 2, ← ih, Nat.succ_eq_add_one] ring theorem sum_sqr (n : ℕ) : (∑ i in range (n + 1), i ^ 2) = n * (n + 1) * (2 * n + 1) / 6 := by theorem sum_sqr (n : ℕ) : ∑ i in range (n + 1), i ^ 2 = n * (n + 1) * (2 * n + 1) / 6 := by sorry end
-
-
-
@@ -6,7 +6,7 @@ theorem even_of_even_sqr {m : ℕ} (h : 2 ∣ m ^ 2) : 2 ∣ m := byrw [pow_two, Nat.prime_two.dvd_mul] at h cases h <;> assumption example {m n : ℕ} (coprime_mn : m.coprime n) : m ^ 2 ≠ 2 * n ^ 2 := by example {m n : ℕ} (coprime_mn : m.Coprime n) : m ^ 2 ≠ 2 * n ^ 2 := by intro sqr_eq have : 2 ∣ m := by apply even_of_even_sqr
-
@@ -31,7 +31,7 @@ example {m n : ℕ} (coprime_mn : m.coprime n) : m ^ 2 ≠ 2 * n ^ 2 := byexact coprime_mn norm_num at this example {m n p : ℕ} (coprime_mn : m.coprime n) (prime_p : p.Prime) : m ^ 2 ≠ p * n ^ 2 := by example {m n p : ℕ} (coprime_mn : m.Coprime n) (prime_p : p.Prime) : m ^ 2 ≠ p * n ^ 2 := by intro sqr_eq have : p ∣ m := by apply prime_p.dvd_of_dvd_pow
-
-
-
@@ -24,7 +24,7 @@ variable {α : Type*} (s : Finset ℕ) (f : ℕ → ℕ) (n : ℕ)open BigOperators open Finset theorem sum_sqr (n : ℕ) : (∑ i in range (n + 1), i ^ 2) = n * (n + 1) * (2 * n + 1) / 6 := by theorem sum_sqr (n : ℕ) : ∑ i in range (n + 1), i ^ 2 = n * (n + 1) * (2 * n + 1) / 6 := by symm; apply Nat.div_eq_of_eq_mul_right (by norm_num : 0 < 6) induction' n with n ih
-
-
-
@@ -0,0 +1,291 @@import Mathlib.GroupTheory.Sylow import Mathlib.GroupTheory.Perm.Cycle.Concrete import Mathlib.GroupTheory.Perm.Subgroup import Mathlib.GroupTheory.PresentedGroup import MIL.Common example {M : Type*} [Monoid M] (x : M) : x*1 = x := mul_one x example {M : Type*} [AddCommMonoid M] (x y : M) : x + y = y + x := add_comm x y example {M N : Type*} [Monoid M] [Monoid N] (x y : M) (f : M →* N) : f (x * y) = f x * f y := f.map_mul x y example {M N : Type*} [AddMonoid M] [AddMonoid N] (f : M →+ N) : f 0 = 0 := f.map_zero example {M N P : Type*} [AddMonoid M] [AddMonoid N] [AddMonoid P] (f : M →+ N) (g : N →+ P) : M →+ P := g.comp f example {G : Type*} [Group G] (x : G) : x * x⁻¹ = 1 := mul_inv_self x example {G : Type*} [Group G] (x y z : G) : x * (y * z) * (x*z)⁻¹ * (x * y * x⁻¹)⁻¹ = 1 := by group example {G : Type*} [AddCommGroup G] (x y z : G) : z + x + (y - z - x) = y := by abel example {G H : Type*} [Group G] [Group H] (x y : G) (f : G →* H) : f (x * y) = f x * f y := f.map_mul x y example {G H : Type*} [Group G] [Group H] (x : G) (f : G →* H) : f (x⁻¹) = (f x)⁻¹ := f.map_inv x example {G H : Type*} [Group G] [Group H] (f : G → H) (h : ∀ x y, f (x * y) = f x * f y) : G →* H := MonoidHom.mk' f h example {G H : Type*} [Group G] [Group H] (f : G ≃* H) : f.trans f.symm = MulEquiv.refl G := f.self_trans_symm noncomputable example {G H : Type*} [Group G] [Group H] (f : G →* H) (h : Function.Bijective f) : G ≃* H := MulEquiv.ofBijective f h example {G : Type*} [Group G] (H : Subgroup G) {x y : G} (hx : x ∈ H) (hy : y ∈ H) : x * y ∈ H := H.mul_mem hx hy example {G : Type*} [Group G] (H : Subgroup G) {x : G} (hx : x ∈ H) : x⁻¹ ∈ H := H.inv_mem hx example : AddSubgroup ℚ where carrier := Set.range ((↑) : ℤ → ℚ) add_mem' := by rintro _ _ ⟨n, rfl⟩ ⟨m, rfl⟩ use n + m simp zero_mem' := by use 0 simp neg_mem' := by rintro _ ⟨n, rfl⟩ use -n simp example {G : Type*} [Group G] (H : Subgroup G) : Group H := inferInstance example {G : Type*} [Group G] (H : Subgroup G) : Group {x : G // x ∈ H} := inferInstance example {G : Type*} [Group G] (H H' : Subgroup G) : ((H ⊓ H' : Subgroup G) : Set G) = (H : Set G) ∩ (H' : Set G) := rfl example {G : Type*} [Group G] (H H' : Subgroup G) : ((H ⊔ H' : Subgroup G) : Set G) = Subgroup.closure ((H : Set G) ∪ (H' : Set G)) := by rw [Subgroup.sup_eq_closure] example {G : Type*} [Group G] (x : G) : x ∈ (⊤ : Subgroup G) := trivial example {G : Type*} [Group G] (x : G) : x ∈ (⊥ : Subgroup G) ↔ x = 1 := Subgroup.mem_bot def conjugate {G : Type*} [Group G] (x : G) (H : Subgroup G) : Subgroup G where carrier := {a : G | ∃ h, h ∈ H ∧ a = x * h * x⁻¹} one_mem' := by dsimp sorry inv_mem' := by dsimp sorry mul_mem' := by dsimp sorry example {G H : Type*} [Group G] [Group H] (G' : Subgroup G) (f : G →* H) : Subgroup H := Subgroup.map f G' example {G H : Type*} [Group G] [Group H] (H' : Subgroup H) (f : G →* H) : Subgroup G := Subgroup.comap f H' #check Subgroup.mem_map #check Subgroup.mem_comap example {G H : Type*} [Group G] [Group H] (f : G →* H) (g : G) : g ∈ MonoidHom.ker f ↔ f g = 1 := f.mem_ker example {G H : Type*} [Group G] [Group H] (f : G →* H) (h : H) : h ∈ MonoidHom.range f ↔ ∃ g : G, f g = h := f.mem_range section exercises variable {G H : Type*} [Group G] [Group H] open Subgroup example (φ : G →* H) (S T : Subgroup H) (hST : S ≤ T) : comap φ S ≤ comap φ T :=by sorry example (φ : G →* H) (S T : Subgroup G) (hST : S ≤ T) : map φ S ≤ map φ T :=by sorry variable {K : Type*} [Group K] -- Remember you can use the `ext` tactic to prove an equality of subgroups. example (φ : G →* H) (ψ : H →* K) (U : Subgroup K) : comap (ψ.comp φ) U = comap φ (comap ψ U) := by sorry -- Pushing a subgroup along one homomorphism and then another is equal to -- pushing it forward along the composite of the homomorphisms. example (φ : G →* H) (ψ : H →* K) (S : Subgroup G) : map (ψ.comp φ) S = map ψ (S.map φ) := by sorry end exercises attribute [local instance 10] setFintype Classical.propDecidable open Fintype example {G : Type*} [Group G] [Fintype G] (G' : Subgroup G) : card G' ∣ card G := ⟨G'.index, mul_comm G'.index _ ▸ G'.index_mul_card.symm⟩ open Subgroup example {G : Type*} [Group G] [Fintype G] (p : ℕ) {n : ℕ} [Fact p.Prime] (hdvd : p ^ n ∣ card G) : ∃ K : Subgroup G, card K = p ^ n := Sylow.exists_subgroup_card_pow_prime p hdvd lemma eq_bot_iff_card {G : Type*} [Group G] {H : Subgroup G} [Fintype H] : H = ⊥ ↔ card H = 1 := by suffices (∀ x ∈ H, x = 1) ↔ ∃ x ∈ H, ∀ a ∈ H, a = x by simpa [eq_bot_iff_forall, card_eq_one_iff] sorry #check card_dvd_of_le lemma inf_bot_of_coprime {G : Type*} [Group G] (H K : Subgroup G) [Fintype H] [Fintype K] (h : (card H).Coprime (card K)) : H ⊓ K = ⊥ := by sorry open Equiv example {X : Type*} [Finite X] : Subgroup.closure {σ : Perm X | Perm.IsCycle σ} = ⊤ := Perm.closure_isCycle #simp [mul_assoc] c[1, 2, 3] * c[2, 3, 4] section FreeGroup inductive S | a | b | c open S def myElement : FreeGroup S := (.of a) * (.of b)⁻¹ def myMorphism : FreeGroup S →* Perm (Fin 5) := FreeGroup.lift fun | .a => c[1, 2, 3] | .b => c[2, 3, 1] | .c => c[2, 3] def myGroup := PresentedGroup {.of () ^ 3} deriving Group def myMap : Unit → Perm (Fin 5) | () => c[1, 2, 3] lemma compat_myMap : ∀ r ∈ ({.of () ^ 3} : Set (FreeGroup Unit)), FreeGroup.lift myMap r = 1 := by rintro _ rfl simp def myNewMorphism : myGroup →* Perm (Fin 5) := PresentedGroup.toGroup compat_myMap end FreeGroup noncomputable section GroupActions example {G X : Type*} [Group G] [MulAction G X] (g g': G) (x : X) : g • (g' • x) = (g * g') • x := (mul_smul g g' x).symm example {G X : Type*} [AddGroup G] [AddAction G X] (g g' : G) (x : X) : g +ᵥ (g' +ᵥ x) = (g + g') +ᵥ x := (add_vadd g g' x).symm open MulAction example {G X : Type*} [Group G] [MulAction G X] : G →* Equiv.Perm X := toPermHom G X def CayleyIsoMorphism (G : Type*) [Group G] : G ≃* (toPermHom G G).range := Equiv.Perm.subgroupOfMulAction G G example {G X : Type*} [Group G] [MulAction G X] : X ≃ (ω : orbitRel.Quotient G X) × (orbit G (Quotient.out' ω)) := MulAction.selfEquivSigmaOrbits G X example {G X : Type*} [Group G] [MulAction G X] (x : X) : orbit G x ≃ G ⧸ stabilizer G x := MulAction.orbitEquivQuotientStabilizer G x example {G : Type*} [Group G] (H : Subgroup G) : G ≃ (G ⧸ H) × H := groupEquivQuotientProdSubgroup variable {G : Type*} [Group G] lemma conjugate_one (H : Subgroup G) : conjugate 1 H = H := by sorry instance : MulAction G (Subgroup G) where smul := conjugate one_smul := by sorry mul_smul := by sorry end GroupActions noncomputable section QuotientGroup example {G : Type*} [Group G] (H : Subgroup G) [H.Normal] : Group (G ⧸ H) := inferInstance example {G : Type*} [Group G] (H : Subgroup G) [H.Normal] : G →* G ⧸ H := QuotientGroup.mk' H example {G : Type*} [Group G] (N : Subgroup G) [N.Normal] {M : Type*} [Group M] (φ : G →* M) (h : N ≤ MonoidHom.ker φ) : G ⧸ N →* M := QuotientGroup.lift N φ h example {G : Type*} [Group G] {M : Type*} [Group M] (φ : G →* M) : G ⧸ MonoidHom.ker φ →* MonoidHom.range φ := QuotientGroup.quotientKerEquivRange φ example {G G': Type*} [Group G] [Group G'] {N : Subgroup G} [N.Normal] {N' : Subgroup G'} [N'.Normal] {φ : G →* G'} (h : N ≤ Subgroup.comap φ N') : G ⧸ N →* G' ⧸ N':= QuotientGroup.map N N' φ h example {G : Type*} [Group G] {M N : Subgroup G} [M.Normal] [N.Normal] (h : M = N) : G ⧸ M ≃* G ⧸ N := QuotientGroup.quotientMulEquivOfEq h section variable {G : Type*} [Group G] {H K : Subgroup G} open MonoidHom #check card_pos -- The nonempty argument will be automatically inferred for subgroups #check Subgroup.index_eq_card #check Subgroup.index_mul_card #check Nat.eq_of_mul_eq_mul_right lemma aux_card_eq [Fintype G] (h' : card G = card H * card K) : card (G⧸H) = card K := by sorry variable [H.Normal] [K.Normal] [Fintype G] (h : Disjoint H K) (h' : card G = card H * card K) #check bijective_iff_injective_and_card #check ker_eq_bot_iff #check restrict #check ker_restrict def iso₁ [Fintype G] (h : Disjoint H K) (h' : card G = card H * card K) : K ≃* G⧸H := by sorry def iso₂ : G ≃* (G⧸K) × (G⧸H) := by sorry #check MulEquiv.prodCongr def finalIso : G ≃* H × K := sorry
-
-
-
@@ -0,0 +1,223 @@import Mathlib.RingTheory.Ideal.QuotientOperations import Mathlib.RingTheory.Localization.Basic import Mathlib.RingTheory.DedekindDomain.Ideal import Mathlib.Analysis.Complex.Polynomial import Mathlib.Data.ZMod.Quotient import MIL.Common noncomputable section example {R : Type*} [CommRing R] (x y : R) : (x + y)^2 = x^2 + y^2 + 2*x*y := by ring example (x y : ℕ) : (x + y)^2 = x^2 + y^2 + 2*x*y := by ring example (x : ℤˣ) : x = 1 ∨ x = -1 := Int.units_eq_one_or x example {M : Type*} [Monoid M] (x : Mˣ) : (x : M)*x⁻¹ = 1 := Units.mul_inv x example {M : Type*} [Monoid M] : Group Mˣ := inferInstance example {R S : Type*} [Ring R] [Ring S] (f : R →+* S) (x y : R) : f (x + y) = f x + f y := f.map_add x y example {R S : Type*} [Ring R] [Ring S] (f : R →+* S) : Rˣ →* Sˣ := Units.map f example {R : Type*} [Ring R] (S : Subring R) : Ring S := inferInstance example {R : Type*} [CommRing R] (I : Ideal R) : R →+* R⧸I := Ideal.Quotient.mk I example {R : Type*} [CommRing R] {a : R} {I : Ideal R} : Ideal.Quotient.mk I a = 0 ↔ a ∈ I := Ideal.Quotient.eq_zero_iff_mem example {R S : Type*} [CommRing R] [CommRing S] (I : Ideal R) (f : R →+* S) (H : I ≤ RingHom.ker f) : R ⧸ I →+* S := Ideal.Quotient.lift I f H example {R S : Type*} [CommRing R] [CommRing S](f : R →+* S) : R ⧸ RingHom.ker f ≃+* f.range := RingHom.quotientKerEquivRange f section variable {R : Type*} [CommRing R] {I J : Ideal R} example : I + J = I ⊔ J := rfl example {x : R} : x ∈ I + J ↔ ∃ a ∈ I, ∃ b ∈ J, a + b = x := by simp [Submodule.mem_sup] example : I * J ≤ J := Ideal.mul_le_left example : I * J ≤ I := Ideal.mul_le_right example : I * J ≤ I ⊓ J := Ideal.mul_le_inf end example {R S : Type*} [CommRing R] [CommRing S] (I : Ideal R) (J : Ideal S) (f : R →+* S) (H : I ≤ Ideal.comap f J) : R ⧸ I →+* S ⧸ J := Ideal.quotientMap J f H example {R : Type*} [CommRing R] {I J : Ideal R} (h : I = J) : R ⧸ I ≃+* R ⧸ J := Ideal.quotEquivOfEq h example {R : Type*} [CommRing R] {ι : Type*} [Fintype ι] (f : ι → Ideal R) (hf : ∀ i j, i ≠ j → IsCoprime (f i) (f j)) : (R ⧸ ⨅ i, f i) ≃+* Π i, R ⧸ f i := Ideal.quotientInfRingEquivPiQuotient f hf open BigOperators PiNotation example {ι : Type*} [Fintype ι] (a : ι → ℕ) (coprime : ∀ i j, i ≠ j → (a i).Coprime (a j)) : ZMod (∏ i, a i) ≃+* ∀ i, ZMod (a i) := ZMod.prodEquivPi a coprime section variable {ι R : Type*} [CommRing R] open Ideal Quotient Function #check Pi.ringHom #check ker_Pi_Quotient_mk /-- The homomorphism from ``R ⧸ ⨅ i, I i`` to ``Π i, R ⧸ I i`` featured in the Chinese Remainder Theorem. -/ def chineseMap (I : ι → Ideal R) : (R ⧸ ⨅ i, I i) →+* Π i, R ⧸ I i := sorry lemma chineseMap_mk (I : ι → Ideal R) (x : R) : chineseMap I (Quotient.mk _ x) = fun i : ι ↦ Ideal.Quotient.mk (I i) x := sorry lemma chineseMap_mk' (I : ι → Ideal R) (x : R) (i : ι) : chineseMap I (mk _ x) i = mk (I i) x := sorry #check injective_lift_iff lemma chineseMap_inj (I : ι → Ideal R) : Injective (chineseMap I) := by sorry #check IsCoprime #check isCoprime_iff_add #check isCoprime_iff_exists #check isCoprime_iff_sup_eq #check isCoprime_iff_codisjoint #check Finset.mem_insert_of_mem #check Finset.mem_insert_self theorem isCoprime_Inf {I : Ideal R} {J : ι → Ideal R} {s : Finset ι} (hf : ∀ j ∈ s, IsCoprime I (J j)) : IsCoprime I (⨅ j ∈ s, J j) := by classical simp_rw [isCoprime_iff_add] at * induction s using Finset.induction with | empty => simp | @insert i s _ hs => rw [Finset.iInf_insert, inf_comm, one_eq_top, eq_top_iff, ← one_eq_top] set K := ⨅ j ∈ s, J j calc 1 = I + K := sorry _ = I + K*(I + J i) := sorry _ = (1+K)*I + K*J i := sorry _ ≤ I + K ⊓ J i := sorry lemma chineseMap_surj [Fintype ι] {I : ι → Ideal R} (hI : ∀ i j, i ≠ j → IsCoprime (I i) (I j)) : Surjective (chineseMap I) := by classical intro g choose f hf using fun i ↦ Ideal.Quotient.mk_surjective (g i) have key : ∀ i, ∃ e : R, mk (I i) e = 1 ∧ ∀ j, j ≠ i → mk (I j) e = 0 := by intro i have hI' : ∀ j ∈ ({i} : Finset ι)ᶜ, IsCoprime (I i) (I j) := by sorry sorry choose e he using key use mk _ (∑ i, f i*e i) sorry noncomputable def chineseIso [Fintype ι] (f : ι → Ideal R) (hf : ∀ i j, i ≠ j → IsCoprime (f i) (f j)) : (R ⧸ ⨅ i, f i) ≃+* ∀ i, R ⧸ f i := { Equiv.ofBijective _ ⟨chineseMap_inj f, chineseMap_surj hf⟩, chineseMap f with } end example {R A : Type*} [CommRing R] [Ring A] [Algebra R A] (r r' : R) (a : A) : (r + r') • a = r • a + r' • a := add_smul r r' a example {R A : Type*} [CommRing R] [Ring A] [Algebra R A] (r r' : R) (a : A) : (r * r') • a = r • r' • a := mul_smul r r' a section Polynomials open Polynomial example {R : Type*} [CommRing R] : R[X] := X example {R : Type*} [CommRing R] (r : R) := X - C r example {R : Type*} [CommRing R] (r : R) : (X + C r) * (X - C r) = X^2 - C (r ^ 2) := by rw [C.map_pow] ring example {R : Type*} [CommRing R](r:R) : (C r).coeff 0 = r := by simp example {R : Type*} [CommRing R] : (X^2 + 2*X + C 3 : R[X]).coeff 1 = 2 := by simp example {R : Type*} [Semiring R] [NoZeroDivisors R] {p q : R[X]} : degree (p * q) = degree p + degree q := Polynomial.degree_mul example {R : Type*} [Semiring R] [NoZeroDivisors R] {p q : R[X]} (hp : p ≠ 0) (hq : q ≠ 0) : natDegree (p * q) = natDegree p + natDegree q := Polynomial.natDegree_mul hp hq example {R : Type*} [Semiring R] [NoZeroDivisors R] {p q : R[X]} : natDegree (comp p q) = natDegree p * natDegree q := Polynomial.natDegree_comp example {R : Type*} [CommRing R] (P: R[X]) (x : R) := P.eval x example {R : Type*} [CommRing R] (r : R) : (X - C r).eval r = 0 := by simp example {R : Type*} [CommRing R] (P : R[X]) (r : R) : IsRoot P r ↔ P.eval r = 0 := Iff.rfl example {R : Type*} [CommRing R] [IsDomain R] (r : R) : (X - C r).roots = {r} := roots_X_sub_C r example {R : Type*} [CommRing R] [IsDomain R] (r : R) (n : ℕ): ((X - C r)^n).roots = n • {r} := by simp example : aeval Complex.I (X^2 + 1 : ℝ[X]) = 0 := by simp open Complex Polynomial example : aroots (X^2 + 1 : ℝ[X]) ℂ = {Complex.I, -I} := by suffices roots (X ^ 2 + 1 : ℂ[X]) = {I, -I} by simpa [aroots_def] have factored : (X ^ 2 + 1 : ℂ[X]) = (X - C I) * (X - C (-I)) := by rw [C_neg] linear_combination show (C I * C I : ℂ[X]) = -1 by simp [← C_mul] have p_ne_zero : (X - C I) * (X - C (-I)) ≠ 0 := by intro H apply_fun eval 0 at H simp [eval] at H simp only [factored, roots_mul p_ne_zero, roots_X_sub_C] rfl -- Mathlib knows about D'Alembert-Gauss theorem: ``ℂ`` is algebraically closed. example : IsAlgClosed ℂ := inferInstance #check (Complex.ofReal : ℝ →+* ℂ) example : (X^2 + 1 : ℝ[X]).eval₂ Complex.ofReal Complex.I = 0 := by simp open MvPolynomial def circleEquation : MvPolynomial (Fin 2) ℝ := X 0 ^ 2 + X 1 ^ 2 - 1 example : MvPolynomial.eval ![0, 1] circleEquation = 0 := by simp [circleEquation] end Polynomials
-
-
-
@@ -0,0 +1,166 @@import Mathlib.GroupTheory.Sylow import Mathlib.GroupTheory.Perm.Cycle.Concrete import Mathlib.GroupTheory.Perm.Subgroup import Mathlib.GroupTheory.PresentedGroup import MIL.Common def conjugate {G : Type*} [Group G] (x : G) (H : Subgroup G) : Subgroup G where carrier := {a : G | ∃ h, h ∈ H ∧ a = x * h * x⁻¹} one_mem' := by dsimp use 1 constructor exact H.one_mem group inv_mem' := by dsimp rintro - ⟨h, h_in, rfl⟩ use h⁻¹, H.inv_mem h_in group mul_mem' := by dsimp rintro - - ⟨h, h_in, rfl⟩ ⟨k, k_in, rfl⟩ use h*k, H.mul_mem h_in k_in group section exercises variable {G H : Type*} [Group G] [Group H] open Subgroup example (φ : G →* H) (S T : Subgroup H) (hST : S ≤ T) : comap φ S ≤ comap φ T :=by intro x hx rw [mem_comap] at * -- Lean does not need this line exact hST hx example (φ : G →* H) (S T : Subgroup G) (hST : S ≤ T) : map φ S ≤ map φ T :=by intro x hx rw [mem_map] at * -- Lean does not need this line rcases hx with ⟨y, hy, rfl⟩ use y, hST hy variable {K : Type*} [Group K] -- Remember you can use the `ext` tactic to prove an equality of subgroups. example (φ : G →* H) (ψ : H →* K) (U : Subgroup K) : comap (ψ.comp φ) U = comap φ (comap ψ U) := by -- The whole proof could be ``rfl``, but let's decompose it a bit. ext x simp only [mem_comap] rfl -- Pushing a subgroup along one homomorphism and then another is equal to -- pushing it forward along the composite of the homomorphisms. example (φ : G →* H) (ψ : H →* K) (S : Subgroup G) : map (ψ.comp φ) S = map ψ (S.map φ) := by ext x simp only [mem_map] constructor · rintro ⟨y, y_in, hy⟩ exact ⟨φ y, ⟨y, y_in, rfl⟩, hy⟩ · rintro ⟨y, ⟨z, z_in, hz⟩, hy⟩ use z, z_in calc ψ.comp φ z = ψ (φ z) := rfl _ = ψ y := by congr _ = x := hy end exercises attribute [local instance 10] setFintype Classical.propDecidable open Fintype open Subgroup lemma eq_bot_iff_card {G : Type*} [Group G] {H : Subgroup G} [Fintype H] : H = ⊥ ↔ card H = 1 := by suffices (∀ x ∈ H, x = 1) ↔ ∃ x ∈ H, ∀ a ∈ H, a = x by simpa [eq_bot_iff_forall, card_eq_one_iff] constructor · intro h use 1, H.one_mem · rintro ⟨y, -, hy'⟩ x hx calc x = y := hy' x hx _ = 1 := (hy' 1 H.one_mem).symm lemma inf_bot_of_coprime {G : Type*} [Group G] (H K : Subgroup G) [Fintype H] [Fintype K] (h : (card H).Coprime (card K)) : H ⊓ K = ⊥ := by have D₁ : card (H ⊓ K : Subgroup G) ∣ card H := card_dvd_of_le inf_le_left have D₂ : card (H ⊓ K : Subgroup G) ∣ card K := card_dvd_of_le inf_le_right exact eq_bot_iff_card.2 (Nat.eq_one_of_dvd_coprimes h D₁ D₂) noncomputable section GroupActions variable {G : Type*} [Group G] lemma conjugate_one (H : Subgroup G) : conjugate 1 H = H := by ext x simp [conjugate] instance : MulAction G (Subgroup G) where smul := conjugate one_smul := by exact conjugate_one mul_smul := by intro x y H ext z constructor · rintro ⟨h, h_in, rfl⟩ use y*h*y⁻¹ constructor · use h · group · rintro ⟨-, ⟨h, h_in, rfl⟩, rfl⟩ use h, h_in group end GroupActions noncomputable section QuotientGroup section variable {G : Type*} [Group G] {H K : Subgroup G} open MonoidHom #check card_pos -- The nonempty argument will be automatically inferred for subgroups #check Subgroup.index_eq_card #check Subgroup.index_mul_card #check Nat.eq_of_mul_eq_mul_right lemma aux_card_eq [Fintype G] (h' : card G = card H * card K) : card (G⧸H) = card K := by have := calc card (G ⧸ H) * card H = card G := by rw [← H.index_eq_card, H.index_mul_card] _ = card K * card H := by rw [h', mul_comm] exact Nat.eq_of_mul_eq_mul_right card_pos this variable [H.Normal] [K.Normal] [Fintype G] (h : Disjoint H K) (h' : card G = card H * card K) #check bijective_iff_injective_and_card #check ker_eq_bot_iff #check restrict #check ker_restrict def iso₁ [Fintype G] (h : Disjoint H K) (h' : card G = card H * card K) : K ≃* G⧸H := by apply MulEquiv.ofBijective ((QuotientGroup.mk' H).restrict K) rw [bijective_iff_injective_and_card] constructor · rw [← ker_eq_bot_iff, (QuotientGroup.mk' H).ker_restrict K] simp [h] · symm exact aux_card_eq h' def iso₂ : G ≃* (G⧸K) × (G⧸H) := by apply MulEquiv.ofBijective <| (QuotientGroup.mk' K).prod (QuotientGroup.mk' H) rw [bijective_iff_injective_and_card] constructor · rw [← ker_eq_bot_iff, ker_prod] simp [h.symm.eq_bot] · rw [card_prod, aux_card_eq h', aux_card_eq (mul_comm (card H) _▸ h'), h'] def finalIso : G ≃* H × K := (iso₂ h h').trans ((iso₁ h.symm (mul_comm (card H) _ ▸ h')).prodCongr (iso₁ h h')).symm end end QuotientGroup
-
-
-
@@ -0,0 +1,83 @@import Mathlib.RingTheory.Ideal.QuotientOperations import Mathlib.RingTheory.Localization.Basic import Mathlib.RingTheory.DedekindDomain.Ideal import Mathlib.Analysis.Complex.Polynomial import Mathlib.Data.ZMod.Quotient import MIL.Common noncomputable section open BigOperators PiNotation section variable {ι R : Type*} [CommRing R] open Ideal Quotient Function #check Pi.ringHom #check ker_Pi_Quotient_mk /-- The homomorphism from ``R ⧸ ⨅ i, I i`` to ``Π i, R ⧸ I i`` featured in the Chinese Remainder Theorem. -/ def chineseMap (I : ι → Ideal R) : (R ⧸ ⨅ i, I i) →+* Π i, R ⧸ I i := Ideal.Quotient.lift (⨅ i, I i) (Pi.ringHom fun i : ι ↦ Ideal.Quotient.mk (I i)) (by simp [← RingHom.mem_ker, ker_Pi_Quotient_mk]) lemma chineseMap_mk (I : ι → Ideal R) (x : R) : chineseMap I (Quotient.mk _ x) = fun i : ι ↦ Ideal.Quotient.mk (I i) x := rfl lemma chineseMap_mk' (I : ι → Ideal R) (x : R) (i : ι) : chineseMap I (mk _ x) i = mk (I i) x := rfl lemma chineseMap_inj (I : ι → Ideal R) : Injective (chineseMap I) := by rw [chineseMap, injective_lift_iff, ker_Pi_Quotient_mk] theorem isCoprime_Inf {I : Ideal R} {J : ι → Ideal R} {s : Finset ι} (hf : ∀ j ∈ s, IsCoprime I (J j)) : IsCoprime I (⨅ j ∈ s, J j) := by classical simp_rw [isCoprime_iff_add] at * induction s using Finset.induction with | empty => simp | @insert i s _ hs => rw [Finset.iInf_insert, inf_comm, one_eq_top, eq_top_iff, ← one_eq_top] set K := ⨅ j ∈ s, J j calc 1 = I + K := (hs fun j hj ↦ hf j (Finset.mem_insert_of_mem hj)).symm _ = I + K*(I + J i) := by rw [hf i (Finset.mem_insert_self i s), mul_one] _ = (1+K)*I + K*J i := by ring _ ≤ I + K ⊓ J i := by gcongr ; apply mul_le_left ; apply mul_le_inf lemma chineseMap_surj [Fintype ι] {I : ι → Ideal R} (hI : ∀ i j, i ≠ j → IsCoprime (I i) (I j)) : Surjective (chineseMap I) := by classical intro g choose f hf using fun i ↦ Ideal.Quotient.mk_surjective (g i) have key : ∀ i, ∃ e : R, mk (I i) e = 1 ∧ ∀ j, j ≠ i → mk (I j) e = 0 := by intro i have hI' : ∀ j ∈ ({i} : Finset ι)ᶜ, IsCoprime (I i) (I j) := by intros j hj exact hI _ _ (by simpa [ne_comm, isCoprime_iff_add] using hj) rcases isCoprime_iff_exists.mp (isCoprime_Inf hI') with ⟨u, hu, e, he, hue⟩ replace he : ∀ j, j ≠ i → e ∈ I j := by simpa using he refine ⟨e, ?_, ?_⟩ · simp [eq_sub_of_add_eq' hue, map_sub, eq_zero_iff_mem.mpr hu] rfl · exact fun j hj ↦ eq_zero_iff_mem.mpr (he j hj) choose e he using key use mk _ (∑ i, f i*e i) ext i rw [chineseMap_mk', map_sum, Fintype.sum_eq_single i] · simp [(he i).1, hf] · intros j hj simp [(he j).2 i hj.symm] noncomputable def chineseIso [Fintype ι] (f : ι → Ideal R) (hf : ∀ i j, i ≠ j → IsCoprime (f i) (f j)) : (R ⧸ ⨅ i, f i) ≃+* ∀ i, R ⧸ f i := { Equiv.ofBijective _ ⟨chineseMap_inj f, chineseMap_surj hf⟩, chineseMap f with } end
-
-
-
-
-
@@ -18,7 +18,7 @@ example {ι : Type*} {s : ι → Set X} (hs : ∀ i, IsOpen (s i)) : IsOpen (⋃example {ι : Type*} [Fintype ι] {s : ι → Set X} (hs : ∀ i, IsOpen (s i)) : IsOpen (⋂ i, s i) := isOpen_iInter hs isOpen_iInter_of_finite hs variable {Y : Type*} [TopologicalSpace Y]
-
-
MIL/C08_Topology/solutions/Solutions_S01_Filters.lean > MIL/C09_Topology/solutions/Solutions_S01_Filters.lean
-
MIL/C08_Topology/solutions/Solutions_S02_Metric_Spaces.lean > MIL/C09_Topology/solutions/Solutions_S02_Metric_Spaces.lean
-
MIL/C08_Topology/solutions/Solutions_S03_Topological_Spaces.lean > MIL/C09_Topology/solutions/Solutions_S03_Topological_Spaces.lean
-
@@ -18,7 +18,7 @@ example {ι : Type*} {s : ι → Set X} (hs : ∀ i, IsOpen (s i)) : IsOpen (⋃example {ι : Type*} [Fintype ι] {s : ι → Set X} (hs : ∀ i, IsOpen (s i)) : IsOpen (⋂ i, s i) := isOpen_iInter hs isOpen_iInter_of_finite hs variable {Y : Type*} [TopologicalSpace Y]
-
-
MIL/C09_Differential_Calculus/S01_Elementary_Differential_Calculus.lean > MIL/C10_Differential_Calculus/S01_Elementary_Differential_Calculus.lean
-
MIL/C09_Differential_Calculus/S02_Differential_Calculus_in_Normed_Spaces.lean > MIL/C10_Differential_Calculus/S02_Differential_Calculus_in_Normed_Spaces.lean
-
MIL/C09_Differential_Calculus/solutions/Solutions_S01_Elementary_Differential_Calculus.lean > MIL/C10_Differential_Calculus/solutions/Solutions_S01_Elementary_Differential_Calculus.lean
-
MIL/C09_Differential_Calculus/solutions/Solutions_S02_Differential_Calculus_in_Normed_Spaces.lean > MIL/C10_Differential_Calculus/solutions/Solutions_S02_Differential_Calculus_in_Normed_Spaces.lean
-
MIL/C10_Integration_and_Measure_Theory/S01_Elementary_Integration.lean > MIL/C11_Integration_and_Measure_Theory/S01_Elementary_Integration.lean
-
MIL/C10_Integration_and_Measure_Theory/S02_Measure_Theory.lean > MIL/C11_Integration_and_Measure_Theory/S02_Measure_Theory.lean
-
MIL/C10_Integration_and_Measure_Theory/S03_Integration.lean > MIL/C11_Integration_and_Measure_Theory/S03_Integration.lean
-
MIL/C10_Integration_and_Measure_Theory/solutions/Solutions_S01_Elementary_Integration.lean > MIL/C11_Integration_and_Measure_Theory/solutions/Solutions_S01_Elementary_Integration.lean
-
MIL/C10_Integration_and_Measure_Theory/solutions/Solutions_S02_Measure_Theory.lean > MIL/C11_Integration_and_Measure_Theory/solutions/Solutions_S02_Measure_Theory.lean
-
MIL/C10_Integration_and_Measure_Theory/solutions/Solutions_S03_Integration.lean > MIL/C11_Integration_and_Measure_Theory/solutions/Solutions_S03_Integration.lean
-
-
@@ -1,280 +1,4 @@import Mathlib.Tactic import Mathlib.Util.PiNotation set_option warningAsError false namespace PiNotation open Lean.Parser Term open Lean.PrettyPrinter.Delaborator /-- Dependent function type (a "pi type"). The notation `Π x : α, β x` can also be written as `(x : α) → β x`. -/ -- A direct copy of forall notation but with `Π`/`Pi` instead of `∀`/`Forall`. @[term_parser] def piNotation := leading_parser:leadPrec unicodeSymbol "Π" "Pi" >> many1 (ppSpace >> (binderIdent <|> bracketedBinder)) >> optType >> ", " >> termParser /-- Dependent function type (a "pi type"). The notation `Π x ∈ s, β x` is short for `Π x, x ∈ s → β x`. -/ -- A copy of forall notation from `Std.Util.ExtendedBinder` for pi notation syntax "Π " binderIdent binderPred ", " term : term macro_rules | `(Π $x:ident $pred:binderPred, $p) => `(Π $x:ident, satisfies_binder_pred% $x $pred → $p) | `(Π _ $pred:binderPred, $p) => `(Π x, satisfies_binder_pred% x $pred → $p) /-- Since pi notation and forall notation are interchangable, we can parse it by simply using the forall parser. -/ @[macro PiNotation.piNotation] def replacePiNotation : Lean.Macro | .node info _ args => return .node info ``Lean.Parser.Term.forall args | _ => Lean.Macro.throwUnsupported /-- Override the Lean 4 pi notation delaborator with one that uses `Π`. Note that this takes advantage of the fact that `(x : α) → p x` notation is never used for propositions, so we can match on this result and rewrite it. -/ @[delab forallE] def delabPi : Delab := whenPPOption Lean.getPPNotation do let stx ← delabForall -- Replacements let stx : Term ← match stx with | `($group:bracketedBinder → $body) => `(Π $group:bracketedBinder, $body) | _ => pure stx -- Cute binders let stx : Term ← match stx with | `(∀ ($i:ident : $_), $j:ident ∈ $s → $body) => if i == j then `(∀ $i:ident ∈ $s, $body) else pure stx | `(∀ ($x:ident : $_), $y:ident > $z → $body) => if x == y then `(∀ $x:ident > $z, $body) else pure stx | `(∀ ($x:ident : $_), $y:ident < $z → $body) => if x == y then `(∀ $x:ident < $z, $body) else pure stx | `(∀ ($x:ident : $_), $y:ident ≥ $z → $body) => if x == y then `(∀ $x:ident ≥ $z, $body) else pure stx | `(∀ ($x:ident : $_), $y:ident ≤ $z → $body) => if x == y then `(∀ $x:ident ≤ $z, $body) else pure stx | `(Π ($i:ident : $_), $j:ident ∈ $s → $body) => if i == j then `(Π $i:ident ∈ $s, $body) else pure stx | _ => pure stx -- Merging match stx with | `(Π $group, Π $groups*, $body) => `(Π $group $groups*, $body) | _ => pure stx -- the above delaborator and parser are still needed: -- #check Π (x : Nat), Vector Bool x end PiNotation section SupInfNotation open Lean Lean.PrettyPrinter.Delaborator /-! Improvements to the unexpanders in `Mathlib.Order.CompleteLattice`. These are implemented as delaborators directly. -/ @[delab app.iSup] def iSup_delab : Delab := whenPPOption Lean.getPPNotation do let #[_, _, ι, f] := (← SubExpr.getExpr).getAppArgs | failure unless f.isLambda do failure let prop ← Meta.isProp ι let dep := f.bindingBody!.hasLooseBVar 0 let ppTypes ← getPPOption getPPFunBinderTypes let stx ← SubExpr.withAppArg do let dom ← SubExpr.withBindingDomain delab withBindingBodyUnusedName $ fun x => do let x : TSyntax `ident := .mk x let body ← delab if prop && !dep then `(⨆ (_ : $dom), $body) else if prop || ppTypes then `(⨆ ($x:ident : $dom), $body) else `(⨆ $x:ident, $body) -- Cute binders let stx : Term ← match stx with | `(⨆ $x:ident, ⨆ (_ : $y:ident ∈ $s), $body) | `(⨆ ($x:ident : $_), ⨆ (_ : $y:ident ∈ $s), $body) => if x == y then `(⨆ $x:ident ∈ $s, $body) else pure stx | _ => pure stx return stx @[delab app.infᵢ] def infᵢ_delab : Delab := whenPPOption Lean.getPPNotation do let #[_, _, ι, f] := (← SubExpr.getExpr).getAppArgs | failure unless f.isLambda do failure let prop ← Meta.isProp ι let dep := f.bindingBody!.hasLooseBVar 0 let ppTypes ← getPPOption getPPFunBinderTypes let stx ← SubExpr.withAppArg do let dom ← SubExpr.withBindingDomain delab withBindingBodyUnusedName $ fun x => do let x : TSyntax `ident := .mk x let body ← delab if prop && !dep then `(⨅ (_ : $dom), $body) else if prop || ppTypes then `(⨅ ($x:ident : $dom), $body) else `(⨅ $x:ident, $body) -- Cute binders let stx : Term ← match stx with | `(⨅ $x:ident, ⨅ (_ : $y:ident ∈ $s), $body) | `(⨅ ($x:ident : $_), ⨅ (_ : $y:ident ∈ $s), $body) => if x == y then `(⨅ $x:ident ∈ $s, $body) else pure stx | _ => pure stx return stx /-- The Exists notation has similar considerations as sup/inf -/ @[delab app.Exists] def exists_delab : Delab := whenPPOption Lean.getPPNotation do let #[ι, f] := (← SubExpr.getExpr).getAppArgs | failure unless f.isLambda do failure let prop ← Meta.isProp ι let dep := f.bindingBody!.hasLooseBVar 0 let ppTypes ← getPPOption getPPFunBinderTypes let stx ← SubExpr.withAppArg do let dom ← SubExpr.withBindingDomain delab withBindingBodyUnusedName $ fun x => do let x : TSyntax `ident := .mk x let body ← delab if prop && !dep then `(∃ (_ : $dom), $body) else if prop || ppTypes then `(∃ ($x:ident : $dom), $body) else `(∃ $x:ident, $body) -- Cute binders let stx : Term ← match stx with | `(∃ $i:ident, $j:ident ∈ $s ∧ $body) | `(∃ ($i:ident : $_), $j:ident ∈ $s ∧ $body) => if i == j then `(∃ $i:ident ∈ $s, $body) else pure stx | `(∃ $x:ident, $y:ident > $z ∧ $body) | `(∃ ($x:ident : $_), $y:ident > $z ∧ $body) => if x == y then `(∃ $x:ident > $z, $body) else pure stx | `(∃ $x:ident, $y:ident < $z ∧ $body) | `(∃ ($x:ident : $_), $y:ident < $z ∧ $body) => if x == y then `(∃ $x:ident < $z, $body) else pure stx | `(∃ $x:ident, $y:ident ≥ $z ∧ $body) | `(∃ ($x:ident : $_), $y:ident ≥ $z ∧ $body) => if x == y then `(∃ $x:ident ≥ $z, $body) else pure stx | `(∃ $x:ident, $y:ident ≤ $z ∧ $body) | `(∃ ($x:ident : $_), $y:ident ≤ $z ∧ $body) => if x == y then `(∃ $x:ident ≤ $z, $body) else pure stx | _ => pure stx -- Merging match stx with | `(∃ $group:bracketedExplicitBinders, ∃ $groups*, $body) => `(∃ $group $groups*, $body) | _ => pure stx -- the above delaborators are still needed: -- #check ⨆ (i : Nat) (_ : i ∈ Set.univ), (i = i) -- #check ∃ (i : Nat), i ≥ 3 ∧ i = i end SupInfNotation section UnionInterNotation open Lean Lean.PrettyPrinter.Delaborator /-! Improvements to the unexpanders in `Mathlib.Data.Set.Lattice`. These are implemented as delaborators directly. -/ @[delab app.Set.unionᵢ] def unionᵢ_delab : Delab := whenPPOption Lean.getPPNotation do let #[_, ι, f] := (← SubExpr.getExpr).getAppArgs | failure unless f.isLambda do failure let prop ← Meta.isProp ι let dep := f.bindingBody!.hasLooseBVar 0 let ppTypes ← getPPOption getPPFunBinderTypes let stx ← SubExpr.withAppArg do let dom ← SubExpr.withBindingDomain delab withBindingBodyUnusedName $ fun x => do let x : TSyntax `ident := .mk x let body ← delab if prop && !dep then `(⋃ (_ : $dom), $body) else if prop || ppTypes then `(⋃ ($x:ident : $dom), $body) else `(⋃ $x:ident, $body) -- Cute binders let stx : Term ← match stx with | `(⋃ $x:ident, ⋃ (_ : $y:ident ∈ $s), $body) | `(⋃ ($x:ident : $_), ⋃ (_ : $y:ident ∈ $s), $body) => if x == y then `(⋃ $x:ident ∈ $s, $body) else pure stx | _ => pure stx return stx @[delab app.Set.interᵢ] def interᵢ_delab : Delab := whenPPOption Lean.getPPNotation do let #[_, ι, f] := (← SubExpr.getExpr).getAppArgs | failure unless f.isLambda do failure let prop ← Meta.isProp ι let dep := f.bindingBody!.hasLooseBVar 0 let ppTypes ← getPPOption getPPFunBinderTypes let stx ← SubExpr.withAppArg do let dom ← SubExpr.withBindingDomain delab withBindingBodyUnusedName $ fun x => do let x : TSyntax `ident := .mk x let body ← delab if prop && !dep then `(⋂ (_ : $dom), $body) else if prop || ppTypes then `(⋂ ($x:ident : $dom), $body) else `(⋂ $x:ident, $body) -- Cute binders let stx : Term ← match stx with | `(⋂ $x:ident, ⋂ (_ : $y:ident ∈ $s), $body) | `(⋂ ($x:ident : $_), ⋂ (_ : $y:ident ∈ $s), $body) => if x == y then `(⋂ $x:ident ∈ $s, $body) else pure stx | _ => pure stx return stx -- the above delaborators might not work correctly -- #check ⋃ (s : Set ℕ) (_ : s ∈ Set.univ), s end UnionInterNotation namespace ProdProjNotation open Lean Lean.PrettyPrinter.Delaborator @[delab app.Prod.fst, delab app.Prod.snd] def delabProdProjs : Delab := do let #[_, _, _] := (← SubExpr.getExpr).getAppArgs | failure let stx ← delabProjectionApp match stx with | `($(x).fst) => `($(x).1) | `($(x).snd) => `($(x).2) | _ => failure /-! That works when the projection is a simple term, but we need another approach when the projections are functions with applied arguments. -/ @[app_unexpander Prod.fst] def unexpandProdFst : Lean.PrettyPrinter.Unexpander | `($(_) $p $xs*) => `($p.1 $xs*) | _ => throw () @[app_unexpander Prod.snd] def unexpandProdSnd : Lean.PrettyPrinter.Unexpander | `($(_) $p $xs*) => `($p.2 $xs*) | _ => throw () example (p : Nat × Nat) : p.1 = p.2 → True := by simp example (p : (Nat → Nat) × (Nat → Nat)) : p.1 22 = p.2 37 → True := by simp end ProdProjNotation
-
-
-
@@ -1,4 +1,4 @@# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: 803b947a09f3db5a52c6c529e3761a53 config: 9821478498fa33697c987b601aae688f tags: 645f666f9bcd5a90fca523b33c5a78b7
-
-
-
@@ -1,7 +1,8 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>1. Introduction — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-
@@ -15,6 +16,7 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" />
-
@@ -50,9 +52,10 @@<li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
@@ -82,10 +85,10 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <div class="section" id="introduction"> <span id="id1"></span><h1><span class="section-number">1. </span>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h1> <div class="section" id="getting-started"> <h2><span class="section-number">1.1. </span>Getting Started<a class="headerlink" href="#getting-started" title="Permalink to this headline"></a></h2> <section id="introduction"> <span id="id1"></span><h1><span class="section-number">1. </span>Introduction<a class="headerlink" href="#introduction" title="Permalink to this heading"></a></h1> <section id="getting-started"> <h2><span class="section-number">1.1. </span>Getting Started<a class="headerlink" href="#getting-started" title="Permalink to this heading"></a></h2> <p>The goal of this book is to teach you to formalize mathematics using the Lean 4 interactive proof assistant. It assumes that you know some mathematics, but it does not require much.
-
@@ -170,9 +173,9 @@ You don’t have to do all of them; when you feel comfortable that you havethe relevant skills, feel free to move on. You can always compare your solutions to the ones in the <code class="docutils literal notranslate"><span class="pre">solutions</span></code> folder associated with each section.</p> </div> <div class="section" id="overview"> <h2><span class="section-number">1.2. </span>Overview<a class="headerlink" href="#overview" title="Permalink to this headline"></a></h2> </section> <section id="overview"> <h2><span class="section-number">1.2. </span>Overview<a class="headerlink" href="#overview" title="Permalink to this heading"></a></h2> <p>Put simply, Lean is a tool for building complex expressions in a formal language known as <em>dependent type theory</em>.</p> <p id="index-0">Every expression has a <em>type</em>, and you can use the <cite>#check</cite> command to
-
@@ -344,8 +347,8 @@ Giovanni Mascellani, Isaiah Mindich, Hunter Monroe, Pietro Monticone, Oliver NasBartosz Piotrowski, Nicolas Rolland, Guilherme Silva, Floris van Doorn, and Eric Wieser. Our work has been partially supported by the Hoskinson Center for Formal Mathematics.</p> </div> </div> </section> </section> </div>
-
-
-
@@ -1,7 +1,8 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>2. Basics — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-
@@ -15,6 +16,7 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -54,9 +56,10 @@<li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
@@ -86,14 +89,14 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <div class="section" id="basics"> <span id="id1"></span><h1><span class="section-number">2. </span>Basics<a class="headerlink" href="#basics" title="Permalink to this headline"></a></h1> <section id="basics"> <span id="id1"></span><h1><span class="section-number">2. </span>Basics<a class="headerlink" href="#basics" title="Permalink to this heading"></a></h1> <p>This chapter is designed to introduce you to the nuts and bolts of mathematical reasoning in Lean: calculating, applying lemmas and theorems, and reasoning about generic structures.</p> <div class="section" id="calculating"> <h2><span class="section-number">2.1. </span>Calculating<a class="headerlink" href="#calculating" title="Permalink to this headline"></a></h2> <section id="calculating"> <h2><span class="section-number">2.1. </span>Calculating<a class="headerlink" href="#calculating" title="Permalink to this heading"></a></h2> <p>We generally learn to carry out mathematical calculations without thinking of them as proofs. But when we justify each step in a calculation,
-
@@ -382,9 +385,9 @@ occurrence of <code class="docutils literal notranslate"><span class="pre">a</sp<span class="n">rw</span> <span class="o">[</span><span class="n">add_mul</span><span class="o">]</span> </pre></div> </div> </div> <div class="section" id="proving-identities-in-algebraic-structures"> <span id="id2"></span><h2><span class="section-number">2.2. </span>Proving Identities in Algebraic Structures<a class="headerlink" href="#proving-identities-in-algebraic-structures" title="Permalink to this headline"></a></h2> </section> <section id="proving-identities-in-algebraic-structures"> <span id="id2"></span><h2><span class="section-number">2.2. </span>Proving Identities in Algebraic Structures<a class="headerlink" href="#proving-identities-in-algebraic-structures" title="Permalink to this heading"></a></h2> <p id="index-7">Mathematically, a ring consists of a collection of objects, <span class="math notranslate nohighlight">\(R\)</span>, operations <span class="math notranslate nohighlight">\(+\)</span> <span class="math notranslate nohighlight">\(\times\)</span>, and constants <span class="math notranslate nohighlight">\(0\)</span> and <span class="math notranslate nohighlight">\(1\)</span>, and an operation <span class="math notranslate nohighlight">\(x \mapsto -x\)</span> such that:</p>
-
@@ -702,9 +705,9 @@ It may seem odd that the algebraic structures are called<cite>noncomm_ring</cite> and <cite>ring</cite>. This is partly for historical reasons, but also for the convenience of using a shorter name for the tactic that deals with commutative rings, since it is used more often.</p> </div> <div class="section" id="using-theorems-and-lemmas"> <span id="id3"></span><h2><span class="section-number">2.3. </span>Using Theorems and Lemmas<a class="headerlink" href="#using-theorems-and-lemmas" title="Permalink to this headline"></a></h2> </section> <section id="using-theorems-and-lemmas"> <span id="id3"></span><h2><span class="section-number">2.3. </span>Using Theorems and Lemmas<a class="headerlink" href="#using-theorems-and-lemmas" title="Permalink to this heading"></a></h2> <p id="index-16">Rewriting is great for proving equations, but what about other sorts of theorems? For example, how can we prove an inequality,
-
@@ -960,7 +963,9 @@ linear arithmetic, and <code class="docutils literal notranslate"><span class="p</pre></div> </div> <p>How nice! We challenge you to use these ideas to prove the following theorem. You can use the theorem <code class="docutils literal notranslate"><span class="pre">abs_le'.mpr</span></code>.</p> following theorem. You can use the theorem <code class="docutils literal notranslate"><span class="pre">abs_le'.mpr</span></code>. You will also need the <code class="docutils literal notranslate"><span class="pre">constructor</span></code> tactic to split a conjunction to two goals; see <a class="reference internal" href="C03_Logic.html#conjunction-and-biimplication"><span class="std std-numref">Section 3.4</span></a>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">|</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="bp">|</span> <span class="bp">≤</span> <span class="o">(</span><span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span>
-
@@ -969,9 +974,9 @@ following theorem. You can use the theorem <code class="docutils literal notrans</div> <p>If you managed to solve this, congratulations! You are well on your way to becoming a master formalizer.</p> </div> <div class="section" id="more-examples-using-apply-and-rw"> <span id="more-on-order-and-divisibility"></span><h2><span class="section-number">2.4. </span>More examples using apply and rw<a class="headerlink" href="#more-examples-using-apply-and-rw" title="Permalink to this headline"></a></h2> </section> <section id="more-examples-using-apply-and-rw"> <span id="more-on-order-and-divisibility"></span><h2><span class="section-number">2.4. </span>More examples using apply and rw<a class="headerlink" href="#more-examples-using-apply-and-rw" title="Permalink to this heading"></a></h2> <p id="index-21">The <code class="docutils literal notranslate"><span class="pre">min</span></code> function on the real numbers is uniquely characterized by the following three facts:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">min_le_left</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">a</span><span class="o">)</span>
-
@@ -1171,9 +1176,9 @@ theorem and the version <code class="docutils literal notranslate"><span class="the one specifically for the natural numbers. You can use <code class="docutils literal notranslate"><span class="pre">_root_.dvd_antisymm</span></code> to specify the generic one; either one will work.</p> </div> <div class="section" id="proving-facts-about-algebraic-structures"> <span id="id4"></span><h2><span class="section-number">2.5. </span>Proving Facts about Algebraic Structures<a class="headerlink" href="#proving-facts-about-algebraic-structures" title="Permalink to this headline"></a></h2> </section> <section id="proving-facts-about-algebraic-structures"> <span id="id4"></span><h2><span class="section-number">2.5. </span>Proving Facts about Algebraic Structures<a class="headerlink" href="#proving-facts-about-algebraic-structures" title="Permalink to this heading"></a></h2> <p id="index-27">In <a class="reference internal" href="#proving-identities-in-algebraic-structures"><span class="std std-numref">Section 2.2</span></a>, we saw that many common identities governing the real numbers hold in more general classes of algebraic structures,
-
@@ -1386,8 +1391,8 @@ always nonnegative:</p></div> <p>We recommend making use of the theorem <code class="docutils literal notranslate"><span class="pre">nonneg_of_mul_nonneg_left</span></code>. As you may have guessed, this theorem is called <code class="docutils literal notranslate"><span class="pre">dist_nonneg</span></code> in Mathlib.</p> </div> </div> </section> </section> </div>
-
-
-
@@ -1,7 +1,8 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>3. Logic — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-
@@ -15,6 +16,7 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -55,9 +57,10 @@<li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
@@ -87,8 +90,8 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <div class="section" id="logic"> <span id="id1"></span><h1><span class="section-number">3. </span>Logic<a class="headerlink" href="#logic" title="Permalink to this headline"></a></h1> <section id="logic"> <span id="id1"></span><h1><span class="section-number">3. </span>Logic<a class="headerlink" href="#logic" title="Permalink to this heading"></a></h1> <p>In the last chapter, we dealt with equations, inequalities, and basic mathematical statements like “<span class="math notranslate nohighlight">\(x\)</span> divides <span class="math notranslate nohighlight">\(y\)</span>.”
-
@@ -98,8 +101,8 @@ using logical terms like “and,” “or,” “not,”“if … then,” “every,” and “some.” In this chapter, we show you how to work with statements that are built up in this way.</p> <div class="section" id="implication-and-the-universal-quantifier"> <span id="id2"></span><h2><span class="section-number">3.1. </span>Implication and the Universal Quantifier<a class="headerlink" href="#implication-and-the-universal-quantifier" title="Permalink to this headline"></a></h2> <section id="implication-and-the-universal-quantifier"> <span id="id2"></span><h2><span class="section-number">3.1. </span>Implication and the Universal Quantifier<a class="headerlink" href="#implication-and-the-universal-quantifier" title="Permalink to this heading"></a></h2> <p>Consider the statement after the <code class="docutils literal notranslate"><span class="pre">#check</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">x</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp">=</span> <span class="n">x</span> </pre></div>
-
@@ -487,9 +490,9 @@ a lemma name.</p><span class="gr">sorry</span> </pre></div> </div> </div> <div class="section" id="the-existential-quantifier"> <span id="id3"></span><h2><span class="section-number">3.2. </span>The Existential Quantifier<a class="headerlink" href="#the-existential-quantifier" title="Permalink to this headline"></a></h2> </section> <section id="the-existential-quantifier"> <span id="id3"></span><h2><span class="section-number">3.2. </span>The Existential Quantifier<a class="headerlink" href="#the-existential-quantifier" title="Permalink to this heading"></a></h2> <p>The existential quantifier, which can be entered as <code class="docutils literal notranslate"><span class="pre">\ex</span></code> in VS Code, is used to represent the phrase “there exists.” The formal expression <code class="docutils literal notranslate"><span class="pre">∃</span> <span class="pre">x</span> <span class="pre">:</span> <span class="pre">ℝ,</span> <span class="pre">2</span> <span class="pre"><</span> <span class="pre">x</span> <span class="pre">∧</span> <span class="pre">x</span> <span class="pre"><</span> <span class="pre">3</span></code> in Lean says
-
@@ -808,9 +811,9 @@ the composition of surjective functions is surjective.</p><span class="gr">sorry</span> </pre></div> </div> </div> <div class="section" id="negation"> <span id="id4"></span><h2><span class="section-number">3.3. </span>Negation<a class="headerlink" href="#negation" title="Permalink to this headline"></a></h2> </section> <section id="negation"> <span id="id4"></span><h2><span class="section-number">3.3. </span>Negation<a class="headerlink" href="#negation" title="Permalink to this heading"></a></h2> <p>The symbol <code class="docutils literal notranslate"><span class="pre">¬</span></code> is meant to express negation, so <code class="docutils literal notranslate"><span class="pre">¬</span> <span class="pre">x</span> <span class="pre"><</span> <span class="pre">y</span></code> says that <code class="docutils literal notranslate"><span class="pre">x</span></code> is not less than <code class="docutils literal notranslate"><span class="pre">y</span></code>, <code class="docutils literal notranslate"><span class="pre">¬</span> <span class="pre">x</span> <span class="pre">=</span> <span class="pre">y</span></code> (or, equivalently, <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">≠</span> <span class="pre">y</span></code>) says that
-
@@ -1073,9 +1076,9 @@ Finally, the <code class="docutils literal notranslate"><span class="pre">contraby finding a contradiction in the hypotheses, such as a pair of the form <code class="docutils literal notranslate"><span class="pre">h</span> <span class="pre">:</span> <span class="pre">P</span></code> and <code class="docutils literal notranslate"><span class="pre">h'</span> <span class="pre">:</span> <span class="pre">¬</span> <span class="pre">P</span></code>. Of course, in this example, <code class="docutils literal notranslate"><span class="pre">linarith</span></code> also works.</p> </div> <div class="section" id="conjunction-and-iff"> <span id="conjunction-and-biimplication"></span><h2><span class="section-number">3.4. </span>Conjunction and Iff<a class="headerlink" href="#conjunction-and-iff" title="Permalink to this headline"></a></h2> </section> <section id="conjunction-and-iff"> <span id="conjunction-and-biimplication"></span><h2><span class="section-number">3.4. </span>Conjunction and Iff<a class="headerlink" href="#conjunction-and-iff" title="Permalink to this heading"></a></h2> <p id="index-18">You have already seen that the conjunction symbol, <code class="docutils literal notranslate"><span class="pre">∧</span></code>, is used to express “and.” The <code class="docutils literal notranslate"><span class="pre">constructor</span></code> tactic allows you to prove a statement of
-
@@ -1333,9 +1336,9 @@ to be instantiated to different values.</p><span class="gr">sorry</span> </pre></div> </div> </div> <div class="section" id="disjunction"> <span id="id5"></span><h2><span class="section-number">3.5. </span>Disjunction<a class="headerlink" href="#disjunction" title="Permalink to this headline"></a></h2> </section> <section id="disjunction"> <span id="id5"></span><h2><span class="section-number">3.5. </span>Disjunction<a class="headerlink" href="#disjunction" title="Permalink to this heading"></a></h2> <p id="index-21">The canonical way to prove a disjunction <code class="docutils literal notranslate"><span class="pre">A</span> <span class="pre">∨</span> <span class="pre">B</span></code> is to prove <code class="docutils literal notranslate"><span class="pre">A</span></code> or to prove <code class="docutils literal notranslate"><span class="pre">B</span></code>. The <code class="docutils literal notranslate"><span class="pre">left</span></code> tactic chooses <code class="docutils literal notranslate"><span class="pre">A</span></code>,
-
@@ -1368,7 +1371,7 @@ Here, <code class="docutils literal notranslate"><span class="pre">inl</span></c</div> <p>It may seem strange to prove a disjunction by proving one side or the other. In practice, which case holds usually depends a case distinction In practice, which case holds usually depends on a case distinction that is implicit or explicit in the assumptions and the data. The <code class="docutils literal notranslate"><span class="pre">rcases</span></code> tactic allows us to make use of a hypothesis of the form <code class="docutils literal notranslate"><span class="pre">A</span> <span class="pre">∨</span> <span class="pre">B</span></code>.
-
@@ -1576,9 +1579,9 @@ using <code class="docutils literal notranslate"><span class="pre">by_cases</spa<span class="gr">sorry</span> </pre></div> </div> </div> <div class="section" id="sequences-and-convergence"> <span id="id6"></span><h2><span class="section-number">3.6. </span>Sequences and Convergence<a class="headerlink" href="#sequences-and-convergence" title="Permalink to this headline"></a></h2> </section> <section id="sequences-and-convergence"> <span id="id6"></span><h2><span class="section-number">3.6. </span>Sequences and Convergence<a class="headerlink" href="#sequences-and-convergence" title="Permalink to this heading"></a></h2> <p>We now have enough skills at our disposal to do some real mathematics. In Lean, we can represent a sequence <span class="math notranslate nohighlight">\(s_0, s_1, s_2, \ldots\)</span> of real numbers as a function <code class="docutils literal notranslate"><span class="pre">s</span> <span class="pre">:</span> <span class="pre">ℕ</span> <span class="pre">→</span> <span class="pre">ℝ</span></code>.
-
@@ -1808,13 +1811,13 @@ everywhere by any linear order <code class="docutils literal notranslate"><span<span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">N</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">n</span> <span class="bp">≥</span> <span class="n">N</span><span class="o">,</span> <span class="bp">|</span><span class="n">s</span> <span class="n">n</span> <span class="bp">-</span> <span class="n">a</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> </pre></div> </div> <p>In <a class="reference internal" href="C08_Topology.html#filters"><span class="std std-numref">Section 8.1</span></a>, we will see that Mathlib has mechanisms <p>In <a class="reference internal" href="C09_Topology.html#filters"><span class="std std-numref">Section 9.1</span></a>, we will see that Mathlib has mechanisms for dealing with convergence in vastly more general terms, not only abstracting away particular features of the domain and codomain, but also abstracting over different types of convergence.</p> </div> </div> </section> </section> </div>
-
-
-
@@ -1,7 +1,8 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>4. Sets and Functions — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-
@@ -15,6 +16,7 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -52,9 +54,10 @@<li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
@@ -84,8 +87,8 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <div class="section" id="sets-and-functions"> <span id="id1"></span><h1><span class="section-number">4. </span>Sets and Functions<a class="headerlink" href="#sets-and-functions" title="Permalink to this headline"></a></h1> <section id="sets-and-functions"> <span id="id1"></span><h1><span class="section-number">4. </span>Sets and Functions<a class="headerlink" href="#sets-and-functions" title="Permalink to this heading"></a></h1> <p>The vocabulary of sets, relations, and functions provides a uniform language for carrying out constructions in all the branches of mathematics.
-
@@ -117,8 +120,8 @@ such as a set of natural numbers or a set of functionsfrom real numbers to real numbers. The distinction between types and sets takes some getting used to, but this chapter will take you through the essentials.</p> <div class="section" id="sets"> <span id="id2"></span><h2><span class="section-number">4.1. </span>Sets<a class="headerlink" href="#sets" title="Permalink to this headline"></a></h2> <section id="sets"> <span id="id2"></span><h2><span class="section-number">4.1. </span>Sets<a class="headerlink" href="#sets" title="Permalink to this heading"></a></h2> <p id="index-0">If <code class="docutils literal notranslate"><span class="pre">α</span></code> is any type, the type <code class="docutils literal notranslate"><span class="pre">Set</span> <span class="pre">α</span></code> consists of sets of elements of <code class="docutils literal notranslate"><span class="pre">α</span></code>. This type supports the usual set-theoretic operations and relations.
-
@@ -554,9 +557,9 @@ and intersection.</p></div> <p>In the library, these identities are called <code class="docutils literal notranslate"><span class="pre">sUnion_eq_biUnion</span></code> and <code class="docutils literal notranslate"><span class="pre">sInter_eq_biInter</span></code>.</p> </div> <div class="section" id="functions"> <span id="id3"></span><h2><span class="section-number">4.2. </span>Functions<a class="headerlink" href="#functions" title="Permalink to this headline"></a></h2> </section> <section id="functions"> <span id="id3"></span><h2><span class="section-number">4.2. </span>Functions<a class="headerlink" href="#functions" title="Permalink to this heading"></a></h2> <p>If <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">α</span> <span class="pre">→</span> <span class="pre">β</span></code> is a function and <code class="docutils literal notranslate"><span class="pre">p</span></code> is a set of elements of type <code class="docutils literal notranslate"><span class="pre">β</span></code>, the library defines <code class="docutils literal notranslate"><span class="pre">preimage</span> <span class="pre">f</span> <span class="pre">p</span></code>, written <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">⁻¹'</span> <span class="pre">p</span></code>,
-
@@ -880,9 +883,9 @@ and then fill in the two lines that are missing.</p><span class="n">contradiction</span> </pre></div> </div> </div> <div class="section" id="the-schroder-bernstein-theorem"> <span id="the-schroeder-bernstein-theorem"></span><h2><span class="section-number">4.3. </span>The Schröder-Bernstein Theorem<a class="headerlink" href="#the-schroder-bernstein-theorem" title="Permalink to this headline"></a></h2> </section> <section id="the-schroder-bernstein-theorem"> <span id="the-schroeder-bernstein-theorem"></span><h2><span class="section-number">4.3. </span>The Schröder-Bernstein Theorem<a class="headerlink" href="#the-schroder-bernstein-theorem" title="Permalink to this heading"></a></h2> <p>We close this chapter with an elementary but nontrivial theorem of set theory. Let <span class="math notranslate nohighlight">\(\alpha\)</span> and <span class="math notranslate nohighlight">\(\beta\)</span> be sets. (In our formalization, they will actually be types.)
-
@@ -1141,8 +1144,8 @@ and the proof uses the fact that <code class="docutils literal notranslate"><spa<span class="o">⟨</span><span class="n">sbFun</span> <span class="n">f</span> <span class="n">g</span><span class="o">,</span> <span class="n">sb_injective</span> <span class="n">f</span> <span class="n">g</span> <span class="n">hf</span> <span class="n">hg</span><span class="o">,</span> <span class="n">sb_surjective</span> <span class="n">f</span> <span class="n">g</span> <span class="n">hf</span> <span class="n">hg</span><span class="o">⟩</span> </pre></div> </div> </div> </div> </section> </section> </div>
-
-
-
@@ -1,7 +1,8 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>5. Elementary Number Theory — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-
@@ -15,6 +16,7 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -52,9 +54,10 @@</li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
@@ -84,15 +87,15 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <div class="section" id="elementary-number-theory"> <span id="number-theory"></span><h1><span class="section-number">5. </span>Elementary Number Theory<a class="headerlink" href="#elementary-number-theory" title="Permalink to this headline"></a></h1> <section id="elementary-number-theory"> <span id="number-theory"></span><h1><span class="section-number">5. </span>Elementary Number Theory<a class="headerlink" href="#elementary-number-theory" title="Permalink to this heading"></a></h1> <p>In this chapter, we show you how to formalize some elementary results in number theory. As we deal with more substantive mathematical content, the proofs will get longer and more involved, building on the skills you have already mastered.</p> <div class="section" id="irrational-roots"> <span id="section-irrational-roots"></span><h2><span class="section-number">5.1. </span>Irrational Roots<a class="headerlink" href="#irrational-roots" title="Permalink to this headline"></a></h2> <section id="irrational-roots"> <span id="section-irrational-roots"></span><h2><span class="section-number">5.1. </span>Irrational Roots<a class="headerlink" href="#irrational-roots" title="Permalink to this heading"></a></h2> <p>Let’s start with a fact known to the ancient greeks, namely, that the square root of 2 is irrational. If we suppose otherwise,
-
@@ -107,25 +110,25 @@ reduced to lowest terms.</p><p>Saying that <span class="math notranslate nohighlight">\(a / b\)</span> is a fraction in lowest terms means that <span class="math notranslate nohighlight">\(a\)</span> and <span class="math notranslate nohighlight">\(b\)</span> do not have any factors in common, which is to say, they are <em>coprime</em>. Mathlib defines the predicate <code class="docutils literal notranslate"><span class="pre">Nat.coprime</span> <span class="pre">m</span> <span class="pre">n</span></code> to be <code class="docutils literal notranslate"><span class="pre">Nat.gcd</span> <span class="pre">m</span> <span class="pre">n</span> <span class="pre">=</span> <span class="pre">1</span></code>. Mathlib defines the predicate <code class="docutils literal notranslate"><span class="pre">Nat.Coprime</span> <span class="pre">m</span> <span class="pre">n</span></code> to be <code class="docutils literal notranslate"><span class="pre">Nat.gcd</span> <span class="pre">m</span> <span class="pre">n</span> <span class="pre">=</span> <span class="pre">1</span></code>. Using Lean’s anonymous projection notation, if <code class="docutils literal notranslate"><span class="pre">s</span></code> and <code class="docutils literal notranslate"><span class="pre">t</span></code> are expressions of type <code class="docutils literal notranslate"><span class="pre">Nat</span></code>, we can write <code class="docutils literal notranslate"><span class="pre">s.coprime</span> <span class="pre">t</span></code> instead of <code class="docutils literal notranslate"><span class="pre">Nat.coprime</span> <span class="pre">s</span> <span class="pre">t</span></code>, and similarly for <code class="docutils literal notranslate"><span class="pre">Nat.gcd</span></code>. As usual, Lean will often unfold the definition of <code class="docutils literal notranslate"><span class="pre">Nat.coprime</span></code> automatically expressions of type <code class="docutils literal notranslate"><span class="pre">Nat</span></code>, we can write <code class="docutils literal notranslate"><span class="pre">s.Coprime</span> <span class="pre">t</span></code> instead of <code class="docutils literal notranslate"><span class="pre">Nat.Coprime</span> <span class="pre">s</span> <span class="pre">t</span></code>, and similarly for <code class="docutils literal notranslate"><span class="pre">Nat.gcd</span></code>. As usual, Lean will often unfold the definition of <code class="docutils literal notranslate"><span class="pre">Nat.Coprime</span></code> automatically when necessary, but we can also do it manually by rewriting or simplifying with the identifier <code class="docutils literal notranslate"><span class="pre">Nat.coprime</span></code>. the identifier <code class="docutils literal notranslate"><span class="pre">Nat.Coprime</span></code>. The <code class="docutils literal notranslate"><span class="pre">norm_num</span></code> tactic is smart enough to compute concrete values.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#print</span> <span class="n">Nat.coprime</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#print</span> <span class="n">Nat.Coprime</span> <span class="kd">example</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m.coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m.gcd</span> <span class="n">n</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">example</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m.Coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m.gcd</span> <span class="n">n</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">h</span> <span class="kd">example</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m.coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m.gcd</span> <span class="n">n</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Nat.coprime</span><span class="o">]</span> <span class="n">at</span> <span class="n">h</span> <span class="kd">example</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m.Coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m.gcd</span> <span class="n">n</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Nat.Coprime</span><span class="o">]</span> <span class="n">at</span> <span class="n">h</span> <span class="n">exact</span> <span class="n">h</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Nat.coprime</span> <span class="mi">12</span> <span class="mi">7</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Nat.Coprime</span> <span class="mi">12</span> <span class="mi">7</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Nat.gcd</span> <span class="mi">12</span> <span class="mi">8</span> <span class="bp">=</span> <span class="mi">4</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> </pre></div>
-
@@ -136,7 +139,7 @@ There is also a version of <code class="docutils literal notranslate"><span claswe will return to a discussion of the relationship between different number systems below. There are even a generic <code class="docutils literal notranslate"><span class="pre">gcd</span></code> function and generic notions of <code class="docutils literal notranslate"><span class="pre">Prime</span></code> and <code class="docutils literal notranslate"><span class="pre">coprime</span></code> notions of <code class="docutils literal notranslate"><span class="pre">Prime</span></code> and <code class="docutils literal notranslate"><span class="pre">Coprime</span></code> that make sense in general classes of algebraic structures. We will come to understand how Lean manages this generality in the next chapter.
-
@@ -215,7 +218,7 @@ don’t hesitate to ask onis contained in the following theorem. See if you can fill out the proof sketch, using <code class="docutils literal notranslate"><span class="pre">even_of_even_sqr</span></code> and the theorem <code class="docutils literal notranslate"><span class="pre">Nat.dvd_gcd</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">coprime_mn</span> <span class="o">:</span> <span class="n">m.coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">≠</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">coprime_mn</span> <span class="o">:</span> <span class="n">m.Coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">≠</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">sqr_eq</span> <span class="k">have</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">m</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span>
-
@@ -241,7 +244,7 @@ At the end of the proof, you’ll need to derive a contradiction fromYou can use <code class="docutils literal notranslate"><span class="pre">Nat.Prime.two_le</span></code>, which says that any prime number is greater than or equal to two, and <code class="docutils literal notranslate"><span class="pre">Nat.le_of_dvd</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">coprime_mn</span> <span class="o">:</span> <span class="n">m.coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">prime_p</span> <span class="o">:</span> <span class="n">p.Prime</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">≠</span> <span class="n">p</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">coprime_mn</span> <span class="o">:</span> <span class="n">m.Coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">prime_p</span> <span class="o">:</span> <span class="n">p.Prime</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">≠</span> <span class="n">p</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> </pre></div> </div>
-
@@ -391,9 +394,9 @@ and that it takes values in the extended natural numbers <code class="docutils lwhich adds the value infinity to the natural numbers. In the next chapter, we will begin to develop the means to appreciate the way that Lean supports this sort of generality.</p> </div> <div class="section" id="induction-and-recursion"> <span id="section-induction-and-recursion"></span><h2><span class="section-number">5.2. </span>Induction and Recursion<a class="headerlink" href="#induction-and-recursion" title="Permalink to this headline"></a></h2> </section> <section id="induction-and-recursion"> <span id="section-induction-and-recursion"></span><h2><span class="section-number">5.2. </span>Induction and Recursion<a class="headerlink" href="#induction-and-recursion" title="Permalink to this heading"></a></h2> <p>The set of natural numbers <span class="math notranslate nohighlight">\(\mathbb{N} = \{ 0, 1, 2, \ldots \}\)</span> is not only fundamentally important in its own right, but also a plays a central role in the construction of new mathematical objects.
-
@@ -554,16 +557,16 @@ less than <code class="docutils literal notranslate"><span class="pre">n</span><<p>The facts <code class="docutils literal notranslate"><span class="pre">Finset.sum_range_zero</span></code> and <code class="docutils literal notranslate"><span class="pre">Finset.sum_range_succ</span></code> provide a recursive description summation up to <span class="math notranslate nohighlight">\(n\)</span>, and similarly for products.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="mi">0</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="mi">0</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">Finset.sum_range_zero</span> <span class="n">f</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n.succ</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">+</span> <span class="n">f</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n.succ</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">f</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">Finset.sum_range_succ</span> <span class="n">f</span> <span class="n">n</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="mi">0</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="mi">0</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">Finset.prod_range_zero</span> <span class="n">f</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n.succ</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n.succ</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="o">(</span><span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">Finset.prod_range_succ</span> <span class="n">f</span> <span class="n">n</span> </pre></div> </div>
-
@@ -602,7 +605,7 @@ The first step of the proof clears the denominator.This is generally useful when formalizing identities, because calculations with division generally have side conditions. (It is similarly useful to avoid using subtraction on the natural numbers when possible.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sum_id</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∑</span> <span class="n">i</span> <span class="k">in</span> <span class="n">range</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">),</span> <span class="n">i</span><span class="o">)</span> <span class="bp">=</span> <span class="n">n</span> <span class="bp">*</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sum_id</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∑</span> <span class="n">i</span> <span class="k">in</span> <span class="n">range</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">),</span> <span class="n">i</span> <span class="bp">=</span> <span class="n">n</span> <span class="bp">*</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">symm</span><span class="bp">;</span> <span class="n">apply</span> <span class="n">Nat.div_eq_of_eq_mul_right</span> <span class="o">(</span><span class="kd">by</span> <span class="n">norm_num</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="mi">2</span><span class="o">)</span> <span class="n">induction'</span> <span class="n">n</span> <span class="k">with</span> <span class="n">n</span> <span class="n">ih</span> <span class="bp">·</span> <span class="n">simp</span>
-
@@ -612,7 +615,7 @@ because calculations with division generally have side conditions.</div> <p>We encourage you to prove the analogous identity for sums of squares, and other identities you can find on the web.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sum_sqr</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∑</span> <span class="n">i</span> <span class="k">in</span> <span class="n">range</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">),</span> <span class="n">i</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">=</span> <span class="n">n</span> <span class="bp">*</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="mi">2</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">6</span> <span class="o">:=</span> <span class="kd">by</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sum_sqr</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∑</span> <span class="n">i</span> <span class="k">in</span> <span class="n">range</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">),</span> <span class="n">i</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="n">n</span> <span class="bp">*</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="mi">2</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">6</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> </pre></div> </div>
-
@@ -696,9 +699,9 @@ The function <code class="docutils literal notranslate"><span class="pre">pred</<span class="kd">end</span> <span class="n">MyNat</span> </pre></div> </div> </div> <div class="section" id="infinitely-many-primes"> <span id="section-infinitely-many-primes"></span><h2><span class="section-number">5.3. </span>Infinitely Many Primes<a class="headerlink" href="#infinitely-many-primes" title="Permalink to this headline"></a></h2> </section> <section id="infinitely-many-primes"> <span id="section-infinitely-many-primes"></span><h2><span class="section-number">5.3. </span>Infinitely Many Primes<a class="headerlink" href="#infinitely-many-primes" title="Permalink to this heading"></a></h2> <p>Let us continue our exploration of induction and recursion with another mathematical standard: a proof that there are infinitely many primes. One way to formulate this is as the statement that
-
@@ -1134,8 +1137,8 @@ along the way.</p></div> <p>If you managed to complete the proof, congratulations! This has been a serious feat of formalization.</p> </div> </div> </section> </section> </div>
-
-
-
@@ -1,7 +1,8 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>6. Structures — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-
@@ -15,6 +16,7 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -52,9 +54,10 @@</ul> </li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
@@ -84,8 +87,8 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <div class="section" id="structures"> <span id="id1"></span><h1><span class="section-number">6. </span>Structures<a class="headerlink" href="#structures" title="Permalink to this headline"></a></h1> <section id="structures"> <span id="id1"></span><h1><span class="section-number">6. </span>Structures<a class="headerlink" href="#structures" title="Permalink to this heading"></a></h1> <p>Modern mathematics makes essential use of algebraic structures, which encapsulate patterns that can be instantiated in
-
@@ -104,8 +107,8 @@ It will also show you how to define and usealgebraic structures on your own.</p> <p>For more technical detail, you can consult <a class="reference external" href="https://leanprover.github.io/theorem_proving_in_lean/">Theorem Proving in Lean</a>, and a paper by Anne Baanen, <a class="reference external" href="https://arxiv.org/abs/2202.01629">Use and abuse of instance parameters in the Lean mathematical library</a>.</p> <div class="section" id="defining-structures"> <span id="section-structures"></span><h2><span class="section-number">6.1. </span>Defining structures<a class="headerlink" href="#defining-structures" title="Permalink to this headline"></a></h2> <section id="defining-structures"> <span id="section-structures"></span><h2><span class="section-number">6.1. </span>Defining structures<a class="headerlink" href="#defining-structures" title="Permalink to this heading"></a></h2> <p>In the broadest sense of the term, a <em>structure</em> is a specification of a collection of data, possibly with constraints that the data is required to satisfy.
-
@@ -464,9 +467,9 @@ as long as we redefine the old accessors in terms of the new definition.Moreover, as we are about to see, Lean provides support for weaving structures together into a rich, interconnected hierarchy, and for managing the interactions between them.</p> </div> <div class="section" id="algebraic-structures"> <span id="section-algebraic-structures"></span><h2><span class="section-number">6.2. </span>Algebraic Structures<a class="headerlink" href="#algebraic-structures" title="Permalink to this headline"></a></h2> </section> <section id="algebraic-structures"> <span id="section-algebraic-structures"></span><h2><span class="section-number">6.2. </span>Algebraic Structures<a class="headerlink" href="#algebraic-structures" title="Permalink to this heading"></a></h2> <p>To clarify what we mean by the phrase <em>algebraic structure</em>, it will help to consider some examples.</p> <ol class="arabic simple">
-
@@ -983,7 +986,7 @@ Also, there is another way to tell Lean that one structure is aninstance of another, using the <code class="docutils literal notranslate"><span class="pre">extends</span></code> keyword. This is how Mathlib specifies that, for example, every commutative ring is a ring. You can find more information in a You can find more information in <a class="reference internal" href="C07_Hierarchies.html#hierarchies"><span class="std std-numref">Section 7</span></a> and in a <a class="reference external" href="https://leanprover.github.io/theorem_proving_in_lean4/type_classes.html#managing-type-class-inference">section on class inference</a> in <em>Theorem Proving in Lean</em>.</p> <p>In general, it is a bad idea to specify a value of <code class="docutils literal notranslate"><span class="pre">*</span></code> for an instance of an algebraic structure that already has
-
@@ -1013,9 +1016,9 @@ because it configures automation that invisibly governs the interpretation ofthe expressions we type. When used wisely, however, class inference is a powerful tool. It is what makes algebraic reasoning possible in Lean.</p> </div> <div class="section" id="building-the-gaussian-integers"> <span id="section-building-the-gaussian-integers"></span><h2><span class="section-number">6.3. </span>Building the Gaussian Integers<a class="headerlink" href="#building-the-gaussian-integers" title="Permalink to this headline"></a></h2> </section> <section id="building-the-gaussian-integers"> <span id="section-building-the-gaussian-integers"></span><h2><span class="section-number">6.3. </span>Building the Gaussian Integers<a class="headerlink" href="#building-the-gaussian-integers" title="Permalink to this heading"></a></h2> <p>We will now illustrate the use of the algebraic hierarchy in Lean by building an important mathematical object, the <em>Gaussian integers</em>, and showing that it is a Euclidean domain. In other words, according to
-
@@ -1509,8 +1512,8 @@ the notions of being prime and being irreducible coincide.</p><span class="n">PrincipalIdealRing.irreducible_iff_prime</span> </pre></div> </div> </div> </div> </section> </section> </div>
-
-
-
@@ -1,7 +1,8 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>7. Hierarchies — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-
@@ -15,11 +16,12 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="8. Topology" href="C08_Topology.html" /> <link rel="next" title="8. Groups and Rings" href="C08_Groups_and_Rings.html" /> <link rel="prev" title="6. Structures" href="C06_Structures.html" /> </head>
-
@@ -51,9 +53,10 @@<li class="toctree-l2"><a class="reference internal" href="#sub-objects">7.3. Sub-objects</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
@@ -83,8 +86,8 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <div class="section" id="hierarchies"> <span id="id1"></span><h1><span class="section-number">7. </span>Hierarchies<a class="headerlink" href="#hierarchies" title="Permalink to this headline"></a></h1> <section id="hierarchies"> <span id="id1"></span><h1><span class="section-number">7. </span>Hierarchies<a class="headerlink" href="#hierarchies" title="Permalink to this heading"></a></h1> <p>We have seen in <a class="reference internal" href="C06_Structures.html#structures"><span class="std std-numref">Chapter 6</span></a> how to define the class of groups and build instances of this class, and then how to build an instance of the commutative ring class. But of course there is a hierarchy here: a
-
@@ -100,8 +103,8 @@ the following chapters and come back here for a second reading.</p>so we will used indices to distinguish our version. For instance we will have <code class="docutils literal notranslate"><span class="pre">Ring₁</span></code> as our version of <code class="docutils literal notranslate"><span class="pre">Ring</span></code>. Since we will gradually explain more powerful ways of formalizing structures, those indices will sometimes grow beyond one.</p> <div class="section" id="basics"> <span id="section-hierarchies-basics"></span><h2><span class="section-number">7.1. </span>Basics<a class="headerlink" href="#basics" title="Permalink to this headline"></a></h2> <section id="basics"> <span id="section-hierarchies-basics"></span><h2><span class="section-number">7.1. </span>Basics<a class="headerlink" href="#basics" title="Permalink to this heading"></a></h2> <p>At the very bottom of all hierarchies in Lean, we find data-carrying classes. The following class records that the given type <code class="docutils literal notranslate"><span class="pre">α</span></code> is endowed with a distinguished element called <code class="docutils literal notranslate"><span class="pre">one</span></code>. At this stage, it has no property at all.</p>
-
@@ -626,9 +629,9 @@ to incorporate a type class <code class="docutils literal notranslate"><span clathat every preorder comes with a <code class="docutils literal notranslate"><span class="pre"><₁</span></code> which has a default value built from <code class="docutils literal notranslate"><span class="pre">≤₁</span></code> and a <code class="docutils literal notranslate"><span class="pre">Prop</span></code>-valued field asserting the natural relation between those two comparison operators. -/</p> </div> <div class="section" id="morphisms"> <span id="section-hierarchies-morphisms"></span><h2><span class="section-number">7.2. </span>Morphisms<a class="headerlink" href="#morphisms" title="Permalink to this headline"></a></h2> </section> <section id="morphisms"> <span id="section-hierarchies-morphisms"></span><h2><span class="section-number">7.2. </span>Morphisms<a class="headerlink" href="#morphisms" title="Permalink to this heading"></a></h2> <p>So far in this chapter, we discussed how to create a hierarchy of mathematical structures. But defining structures is not really completed until we have morphisms. There are two main approaches here. The most obvious one is to define a predicate on functions.</p>
-
@@ -830,9 +833,9 @@ definitions below.</p><span class="o">:=</span> <span class="gr">sorry</span> </pre></div> </div> </div> <div class="section" id="sub-objects"> <span id="section-hierarchies-subobjects"></span><h2><span class="section-number">7.3. </span>Sub-objects<a class="headerlink" href="#sub-objects" title="Permalink to this headline"></a></h2> </section> <section id="sub-objects"> <span id="section-hierarchies-subobjects"></span><h2><span class="section-number">7.3. </span>Sub-objects<a class="headerlink" href="#sub-objects" title="Permalink to this heading"></a></h2> <p>After defining some algebraic structure and its morphisms, the next step is to consider sets that inherit this algebraic structure, for instance subgroups or subrings. This largely overlaps our previous topic. Indeed a set in <code class="docutils literal notranslate"><span class="pre">X</span></code> is implemented as a function from
-
@@ -968,15 +971,15 @@ the <code class="docutils literal notranslate"><span class="pre">@</span></c<span class="gr">sorry</span> </pre></div> </div> </div> </div> </section> </section> </div> </div> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <a href="C06_Structures.html" class="btn btn-neutral float-left" title="6. Structures" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="C08_Topology.html" class="btn btn-neutral float-right" title="8. Topology" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> <a href="C08_Groups_and_Rings.html" class="btn btn-neutral float-right" title="8. Groups and Rings" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> </div> <hr/>
-
-
-
@@ -0,0 +1,1139 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>8. Groups and Rings — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" /> <link rel="shortcut icon" href="_static/favicon.ico"/> <!--[if lt IE 9]> <script src="_static/js/html5shiv.min.js"></script> <![endif]--> <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="9. Topology" href="C09_Topology.html" /> <link rel="prev" title="7. Hierarchies" href="C07_Hierarchies.html" /> </head> <body class="wy-body-for-nav"> <div class="wy-grid-for-nav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side"> <div class="wy-side-scroll"> <div class="wy-side-nav-search" > <a href="index.html" class="icon icon-home"> Mathematics in Lean </a> <div role="search"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <input type="text" name="q" placeholder="Search docs" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> <ul class="current"> <li class="toctree-l1"><a class="reference internal" href="C01_Introduction.html">1. Introduction</a></li> <li class="toctree-l1"><a class="reference internal" href="C02_Basics.html">2. Basics</a></li> <li class="toctree-l1"><a class="reference internal" href="C03_Logic.html">3. Logic</a></li> <li class="toctree-l1"><a class="reference internal" href="C04_Sets_and_Functions.html">4. Sets and Functions</a></li> <li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">8. Groups and Rings</a><ul> <li class="toctree-l2"><a class="reference internal" href="#monoids-and-groups">8.1. Monoids and Groups</a><ul> <li class="toctree-l3"><a class="reference internal" href="#monoids-and-their-morphisms">8.1.1. Monoids and their morphisms</a></li> <li class="toctree-l3"><a class="reference internal" href="#groups-and-their-morphisms">8.1.2. Groups and their morphisms</a></li> <li class="toctree-l3"><a class="reference internal" href="#subgroups">8.1.3. Subgroups</a></li> <li class="toctree-l3"><a class="reference internal" href="#concrete-groups">8.1.4. Concrete groups</a></li> <li class="toctree-l3"><a class="reference internal" href="#group-actions">8.1.5. Group actions</a></li> <li class="toctree-l3"><a class="reference internal" href="#quotient-groups">8.1.6. Quotient groups</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="#rings">8.2. Rings</a><ul> <li class="toctree-l3"><a class="reference internal" href="#rings-their-units-morphisms-and-subrings">8.2.1. Rings, their units, morphisms and subrings</a></li> <li class="toctree-l3"><a class="reference internal" href="#ideals-and-quotients">8.2.2. Ideals and quotients</a></li> <li class="toctree-l3"><a class="reference internal" href="#algebras-and-polynomials">8.2.3. Algebras and polynomials</a></li> </ul> </li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li> </ul> </div> </div> </nav> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" > <i data-toggle="wy-nav-top" class="fa fa-bars"></i> <a href="index.html">Mathematics in Lean</a> </nav> <div class="wy-nav-content"> <div class="rst-content"> <div role="navigation" aria-label="Page navigation"> <ul class="wy-breadcrumbs"> <li><a href="index.html" class="icon icon-home"></a> »</li> <li><span class="section-number">8. </span>Groups and Rings</li> <li class="wy-breadcrumbs-aside"> <a href="_sources/C08_Groups_and_Rings.rst.txt" rel="nofollow"> View page source</a> </li> </ul> <hr/> </div> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <section id="groups-and-rings"> <span id="groups-and-ring"></span><h1><span class="section-number">8. </span>Groups and Rings<a class="headerlink" href="#groups-and-rings" title="Permalink to this heading"></a></h1> <p>We saw in <a class="reference internal" href="C02_Basics.html#proving-identities-in-algebraic-structures"><span class="std std-numref">Section 2.2</span></a> how to reason about operations in groups and rings. Later, in <a class="reference internal" href="C06_Structures.html#section-algebraic-structures"><span class="std std-numref">Section 6.2</span></a>, we saw how to define abstract algebraic structures, such as group structures, as well as concrete instances such as the ring structure on the Gaussian integers. <a class="reference internal" href="C07_Hierarchies.html#hierarchies"><span class="std std-numref">Chapter 7</span></a> explained how hierarchies of abstract structures are handled in Mathlib.</p> <p>In this chapter we work with groups and rings in more detail. We won’t be able to cover every aspect of the treatment of these topics in Mathlib, especially since Mathlib is constantly growing. But we will provide entry points to the library and show how the essential concepts are used. There is some overlap with the discussion of <a class="reference internal" href="C07_Hierarchies.html#hierarchies"><span class="std std-numref">Chapter 7</span></a>, but here we will focus on how to use Mathlib instead of the design decisions behind the way the topics are treated. So making sense of some of the examples may require reviewing the background from <a class="reference internal" href="C07_Hierarchies.html#hierarchies"><span class="std std-numref">Chapter 7</span></a>.</p> <section id="monoids-and-groups"> <span id="groups"></span><h2><span class="section-number">8.1. </span>Monoids and Groups<a class="headerlink" href="#monoids-and-groups" title="Permalink to this heading"></a></h2> <span class="target" id="index-0"></span><section id="monoids-and-their-morphisms"> <span id="index-1"></span><h3><span class="section-number">8.1.1. </span>Monoids and their morphisms<a class="headerlink" href="#monoids-and-their-morphisms" title="Permalink to this heading"></a></h3> <p>Courses in abstract algebra often start with groups and then progress to rings, fields, and vector spaces. This involves some contortions when discussing multiplication on rings since the multiplication operation does not come from a group structure but many of the proofs carry over verbatim from group theory to this new setting. The most common fix, when doing mathematics with pen and paper, is to leave those proofs as exercises. A less efficient but safer and more formalization-friendly way of proceeding is to use monoids. A <em>monoid</em> structure on a type <cite>M</cite> is an internal composition law that is associative and has a neutral element. Monoids are used primarily to accommodate both groups and the multiplicative structure rings. But there are also a number of natural examples; for instance, the set of natural numbers equipped with addition forms a monoid.</p> <p>From a practical point of view, you can mostly ignore monoids when using Mathlib. But you need to know they exist when you are looking for a lemma by browsing Mathlib files. Otherwise, you might end up looking for a statement in the group theory files when it is actually in the found with monoids because it does not require elements to be invertible.</p> <p>The type of monoid structures on a type <code class="docutils literal notranslate"><span class="pre">M</span></code> is written <code class="docutils literal notranslate"><span class="pre">Monoid</span> <span class="pre">M</span></code>. The function <code class="docutils literal notranslate"><span class="pre">Monoid</span></code> is a type class so it will almost always appear as an instance implicit argument (in other words, in square brackets). By default, <code class="docutils literal notranslate"><span class="pre">Monoid</span></code> uses multiplicative notation for the operation; for additive notation use <code class="docutils literal notranslate"><span class="pre">AddMonoid</span></code> instead. The commutative versions of these structures add the prefix <code class="docutils literal notranslate"><span class="pre">Comm</span></code> before <code class="docutils literal notranslate"><span class="pre">Monoid</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span><span class="bp">*</span><span class="mi">1</span> <span class="bp">=</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">mul_one</span> <span class="n">x</span> <span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">AddCommMonoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">y</span> <span class="bp">+</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">add_comm</span> <span class="n">x</span> <span class="n">y</span> </pre></div> </div> <p>Note that although <code class="docutils literal notranslate"><span class="pre">AddMonoid</span></code> is found in the library, it is generally confusing to use additive notation with a non-commutative operation.</p> <p>The type of morphisms between monoids <code class="docutils literal notranslate"><span class="pre">M</span></code> and <code class="docutils literal notranslate"><span class="pre">N</span></code> is called <code class="docutils literal notranslate"><span class="pre">MonoidHom</span> <span class="pre">M</span> <span class="pre">N</span></code> and written <code class="docutils literal notranslate"><span class="pre">M</span> <span class="pre">→*</span> <span class="pre">N</span></code>. Lean will automatically see such a morphism as a function from <code class="docutils literal notranslate"><span class="pre">M</span></code> to <code class="docutils literal notranslate"><span class="pre">N</span></code> when we apply it to elements of <code class="docutils literal notranslate"><span class="pre">M</span></code>. The additive version is called <code class="docutils literal notranslate"><span class="pre">AddMonoidHom</span></code> and written <code class="docutils literal notranslate"><span class="pre">M</span> <span class="pre">→+</span> <span class="pre">N</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">M</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">→*</span> <span class="n">N</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">f.map_mul</span> <span class="n">x</span> <span class="n">y</span> <span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">→+</span> <span class="n">N</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="mi">0</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">f.map_zero</span> </pre></div> </div> <p>These morphisms are bundled maps, i.e. they package together a map and some of its properties. Remember that <a class="reference internal" href="C07_Hierarchies.html#section-hierarchies-morphisms"><span class="std std-numref">Section 7.2</span></a> explains bundled maps; here we simply note the slightly unfortunate consequence that we cannot use ordinary function composition to compose maps. Instead, we need to use <code class="docutils literal notranslate"><span class="pre">MonoidHom.comp</span></code> and <code class="docutils literal notranslate"><span class="pre">AddMonoidHom.comp</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="n">N</span> <span class="n">P</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">P</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">→+</span> <span class="n">N</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">N</span> <span class="bp">→+</span> <span class="n">P</span><span class="o">)</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">→+</span> <span class="n">P</span> <span class="o">:=</span> <span class="n">g.comp</span> <span class="n">f</span> </pre></div> </div> </section> <section id="groups-and-their-morphisms"> <h3><span class="section-number">8.1.2. </span>Groups and their morphisms<a class="headerlink" href="#groups-and-their-morphisms" title="Permalink to this heading"></a></h3> <p>We will have much more to say about groups, which are monoids with the extra property that every element has an inverse.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">x</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">mul_inv_self</span> <span class="n">x</span> </pre></div> </div> <p id="index-2">Similar to the <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic that we saw earlier, there is a <code class="docutils literal notranslate"><span class="pre">group</span></code> tactic that proves any identity that holds in any group. (Equivalently, it proves the identities that hold in free groups.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">*</span> <span class="o">(</span><span class="n">y</span> <span class="bp">*</span> <span class="n">z</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">x</span><span class="bp">*</span><span class="n">z</span><span class="o">)</span><span class="bp">⁻¹</span> <span class="bp">*</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span> <span class="bp">*</span> <span class="n">x</span><span class="bp">⁻¹</span><span class="o">)</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">group</span> </pre></div> </div> <p id="index-3">There is also a tactic for identities in commutative additive groups called <code class="docutils literal notranslate"><span class="pre">abel</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">AddCommGroup</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">z</span> <span class="bp">+</span> <span class="n">x</span> <span class="bp">+</span> <span class="o">(</span><span class="n">y</span> <span class="bp">-</span> <span class="n">z</span> <span class="bp">-</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">abel</span> </pre></div> </div> <p>Interestingly, a group morphism is nothing more than a monoid morphism between groups. So we can copy and paste one of our earlier examples, replacing <code class="docutils literal notranslate"><span class="pre">Monoid</span></code> with <code class="docutils literal notranslate"><span class="pre">Group</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">f.map_mul</span> <span class="n">x</span> <span class="n">y</span> </pre></div> </div> <p>Of course we do get some new properties, such as this one:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span><span class="bp">⁻¹</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span><span class="bp">⁻¹</span> <span class="o">:=</span> <span class="n">f.map_inv</span> <span class="n">x</span> </pre></div> </div> <p>You may be worried that constructing group morphisms will require us to do unnecessary work since the definition of monoid morphism enforces that neutral elements are sent to neutral elements while this is automatic in the case of group morphisms. In practice the extra work is not hard, but, to avoid it, there is a function building a group morphism from a function between groups that is compatible with the composition laws.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">MonoidHom.mk'</span> <span class="n">f</span> <span class="n">h</span> </pre></div> </div> <p>There is also a type <code class="docutils literal notranslate"><span class="pre">MulEquiv</span></code> of group (or monoid) isomorphisms denoted by <code class="docutils literal notranslate"><span class="pre">≃*</span></code> (and <code class="docutils literal notranslate"><span class="pre">AddEquiv</span></code> denoted by <code class="docutils literal notranslate"><span class="pre">≃+</span></code> in additive notation). The inverse of <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">G</span> <span class="pre">≃*</span> <span class="pre">H</span></code> is <code class="docutils literal notranslate"><span class="pre">MulEquiv.symm</span> <span class="pre">f</span> <span class="pre">:</span> <span class="pre">H</span> <span class="pre">≃*</span> <span class="pre">G</span></code>, composition of <code class="docutils literal notranslate"><span class="pre">f</span></code> and <code class="docutils literal notranslate"><span class="pre">g</span></code> is <code class="docutils literal notranslate"><span class="pre">MulEquiv.trans</span> <span class="pre">f</span> <span class="pre">g</span></code>, and the identity isomorphism of <code class="docutils literal notranslate"><span class="pre">G</span></code> is <code class="docutils literal notranslate"><span class="pre">M̀ulEquiv.refl</span> <span class="pre">G</span></code>. Using anonymous projector notation, the first two can be written <code class="docutils literal notranslate"><span class="pre">f.symm</span></code> and <code class="docutils literal notranslate"><span class="pre">f.trans</span> <span class="pre">g</span></code> respectively. Elements of this type are automatically coerced to morphisms and functions when necessary.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃*</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">f.trans</span> <span class="n">f.symm</span> <span class="bp">=</span> <span class="n">MulEquiv.refl</span> <span class="n">G</span> <span class="o">:=</span> <span class="n">f.self_trans_symm</span> </pre></div> </div> <p>One can use <code class="docutils literal notranslate"><span class="pre">MulEquiv.ofBijective</span></code> to build an isomorphism from a bijective morphism. Doing so makes the inverse function noncomputable.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Function.Bijective</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃*</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">MulEquiv.ofBijective</span> <span class="n">f</span> <span class="n">h</span> </pre></div> </div> </section> <section id="subgroups"> <h3><span class="section-number">8.1.3. </span>Subgroups<a class="headerlink" href="#subgroups" title="Permalink to this heading"></a></h3> <p>Just as group morphisms are bundled, a subgroup of <code class="docutils literal notranslate"><span class="pre">G</span></code> is also a bundled structure consisting of a set in <code class="docutils literal notranslate"><span class="pre">G</span></code> with the relevant closure properties.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">G</span><span class="o">}</span> <span class="o">(</span><span class="n">hx</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">hy</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">y</span> <span class="bp">∈</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">H.mul_mem</span> <span class="n">hx</span> <span class="n">hy</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">}</span> <span class="o">(</span><span class="n">hx</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span><span class="bp">⁻¹</span> <span class="bp">∈</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">H.inv_mem</span> <span class="n">hx</span> </pre></div> </div> <p>In the example above, it is important to understand that <code class="docutils literal notranslate"><span class="pre">Subgroup</span> <span class="pre">G</span></code> is the type of subgroups of <code class="docutils literal notranslate"><span class="pre">G</span></code>, rather than a predicate <code class="docutils literal notranslate"><span class="pre">IsSubgroup</span> <span class="pre">H</span></code> where <code class="docutils literal notranslate"><span class="pre">H</span></code> is an element of <code class="docutils literal notranslate"><span class="pre">Set</span> <span class="pre">G</span></code>. <code class="docutils literal notranslate"><span class="pre">Subgroup</span> <span class="pre">G</span></code> is endowed with a coercion to <code class="docutils literal notranslate"><span class="pre">Set</span> <span class="pre">G</span></code> and a membership predicate on <code class="docutils literal notranslate"><span class="pre">G</span></code>. See <a class="reference internal" href="C07_Hierarchies.html#section-hierarchies-subobjects"><span class="std std-numref">Section 7.3</span></a> for an explanation of how and why this is done.</p> <p>Of course, two subgroups are the same if and only if they have the same elements. This fact is registered for use with the <code class="docutils literal notranslate"><span class="pre">ext</span></code> tactic, which can be used to prove two subgroups are equal in the same way it is used to prove that two sets are equal.</p> <p>To state and prove, for example, that <code class="docutils literal notranslate"><span class="pre">ℤ</span></code> is an additive subgroup of <code class="docutils literal notranslate"><span class="pre">ℚ</span></code>, what we really want is to construct a term of type <code class="docutils literal notranslate"><span class="pre">AddSubgroup</span> <span class="pre">ℚ</span></code> whose projection to <code class="docutils literal notranslate"><span class="pre">Set</span> <span class="pre">ℚ</span></code> is <code class="docutils literal notranslate"><span class="pre">ℤ</span></code>, or, more precisely, the image of <code class="docutils literal notranslate"><span class="pre">ℤ</span></code> in <code class="docutils literal notranslate"><span class="pre">ℚ</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">AddSubgroup</span> <span class="n">ℚ</span> <span class="n">where</span> <span class="n">carrier</span> <span class="o">:=</span> <span class="n">Set.range</span> <span class="o">((</span><span class="bp">↑</span><span class="o">)</span> <span class="o">:</span> <span class="n">ℤ</span> <span class="bp">→</span> <span class="n">ℚ</span><span class="o">)</span> <span class="n">add_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="n">_</span> <span class="n">_</span> <span class="o">⟨</span><span class="n">n</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="o">⟨</span><span class="n">m</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">n</span> <span class="bp">+</span> <span class="n">m</span> <span class="n">simp</span> <span class="n">zero_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">use</span> <span class="mi">0</span> <span class="n">simp</span> <span class="n">neg_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="n">_</span> <span class="o">⟨</span><span class="n">n</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="n">use</span> <span class="bp">-</span><span class="n">n</span> <span class="n">simp</span> </pre></div> </div> <p>Using type classes, Mathlib knows that a subgroup of a group inherits a group structure.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Group</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">inferInstance</span> </pre></div> </div> <p>This example is subtle. The object <code class="docutils literal notranslate"><span class="pre">H</span></code> is not a type, but Lean automatically coerces it to a type by interpreting it as a subtype of <code class="docutils literal notranslate"><span class="pre">G</span></code>. So the above example can be restated more explicitly as:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Group</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">//</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">}</span> <span class="o">:=</span> <span class="n">inferInstance</span> </pre></div> </div> <p>An important benefit of having a type <code class="docutils literal notranslate"><span class="pre">Subgroup</span> <span class="pre">G</span></code> instead of a predicate <code class="docutils literal notranslate"><span class="pre">IsSubgroup</span> <span class="pre">:</span> <span class="pre">Set</span> <span class="pre">G</span> <span class="pre">→</span> <span class="pre">Prop</span></code> is that one can easily endow <code class="docutils literal notranslate"><span class="pre">Subgroup</span> <span class="pre">G</span></code> with additional structure. Importantly, it has the structure of a complete lattice structure with respect to inclusion. For instance, instead of having a lemma stating that an intersection of two subgroups of <code class="docutils literal notranslate"><span class="pre">G</span></code> if again a subgroup, we have use the lattice operation <code class="docutils literal notranslate"><span class="pre">⊓</span></code> to construct the intersection. We can then apply arbitrary lemmas about lattices to the construction.</p> <p>Let us check that the set underlying the infimum of two subgroups is indeed, by definition, their intersection.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="n">H'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="o">((</span><span class="n">H</span> <span class="bp">⊓</span> <span class="n">H'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">)</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">H'</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">)</span> <span class="o">:=</span> <span class="n">rfl</span> </pre></div> </div> <p>It may look strange to have a different notation for what amounts to the intersection of the underlying sets, but the correspondence does not carry over to the supremum operation and set union, since a union of subgroup is not a subgroup. Instead one needs to use the subgroup generated by the union, which is done using <code class="docutils literal notranslate"><span class="pre">Subgroup.closure</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="n">H'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="o">((</span><span class="n">H</span> <span class="bp">⊔</span> <span class="n">H'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">)</span> <span class="bp">=</span> <span class="n">Subgroup.closure</span> <span class="o">((</span><span class="n">H</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">)</span> <span class="bp">∪</span> <span class="o">(</span><span class="n">H'</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">))</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Subgroup.sup_eq_closure</span><span class="o">]</span> </pre></div> </div> <p>Another subtlety is that <code class="docutils literal notranslate"><span class="pre">G</span></code> itself does not have type <code class="docutils literal notranslate"><span class="pre">Subgroup</span> <span class="pre">G</span></code>, so we need a way to talk about <code class="docutils literal notranslate"><span class="pre">G</span></code> seen as a subgroup of <code class="docutils literal notranslate"><span class="pre">G</span></code>. This is also provided by the lattice structure: the full subgroup is the top element of this lattice.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="o">(</span><span class="bp">⊤</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:=</span> <span class="n">trivial</span> </pre></div> </div> <p>Similarly the bottom element of this lattice is the subgroup whose only element is the neutral element.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="o">(</span><span class="bp">⊥</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">Subgroup.mem_bot</span> </pre></div> </div> <p>As an exercise in manipulating groups and subgroups, you can define the conjugate of a subgroup by an element of the ambient group.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">conjugate</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span> <span class="n">where</span> <span class="n">carrier</span> <span class="o">:=</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">|</span> <span class="bp">∃</span> <span class="n">h</span><span class="o">,</span> <span class="n">h</span> <span class="bp">∈</span> <span class="n">H</span> <span class="bp">∧</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">h</span> <span class="bp">*</span> <span class="n">x</span><span class="bp">⁻¹</span><span class="o">}</span> <span class="n">one_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">dsimp</span> <span class="gr">sorry</span> <span class="n">inv_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">dsimp</span> <span class="gr">sorry</span> <span class="n">mul_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">dsimp</span> <span class="gr">sorry</span> </pre></div> </div> <p>Tying the previous two topics together, one can push forward and pull back subgroups using group morphisms. The naming convention in Mathlib is to call those operations <code class="docutils literal notranslate"><span class="pre">map</span></code> and <code class="docutils literal notranslate"><span class="pre">comap</span></code>. These are not the common mathematical terms, but they have the advantage of being shorter than “pushforward” and “direct image.””</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">G'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">Subgroup.map</span> <span class="n">f</span> <span class="n">G'</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">H'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span> <span class="o">:=</span> <span class="n">Subgroup.comap</span> <span class="n">f</span> <span class="n">H'</span> <span class="k">#check</span> <span class="n">Subgroup.mem_map</span> <span class="k">#check</span> <span class="n">Subgroup.mem_comap</span> </pre></div> </div> <p>In particular, the preimage of the bottom subgroup under a morphism <code class="docutils literal notranslate"><span class="pre">f</span></code> is a subgroup called the <em>kernel</em> of <code class="docutils literal notranslate"><span class="pre">f</span></code>, and the range of <code class="docutils literal notranslate"><span class="pre">f</span></code> is also a subgroup.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">g</span> <span class="bp">∈</span> <span class="n">MonoidHom.ker</span> <span class="n">f</span> <span class="bp">↔</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">f.mem_ker</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">h</span> <span class="bp">∈</span> <span class="n">MonoidHom.range</span> <span class="n">f</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">g</span> <span class="o">:</span> <span class="n">G</span><span class="o">,</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">=</span> <span class="n">h</span> <span class="o">:=</span> <span class="n">f.mem_range</span> </pre></div> </div> <p>As exercises in manipulating group morphisms and subgroups, let us prove some elementary properties. They are already proved in Mathlib, so do not use <code class="docutils literal notranslate"><span class="pre">exact?</span></code> too quickly if you want to benefit from these exercises.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="n">exercises</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="kn">open</span> <span class="n">Subgroup</span> <span class="kd">example</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">S</span> <span class="n">T</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">hST</span> <span class="o">:</span> <span class="n">S</span> <span class="bp">≤</span> <span class="n">T</span><span class="o">)</span> <span class="o">:</span> <span class="n">comap</span> <span class="n">φ</span> <span class="n">S</span> <span class="bp">≤</span> <span class="n">comap</span> <span class="n">φ</span> <span class="n">T</span> <span class="o">:=</span><span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">S</span> <span class="n">T</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">hST</span> <span class="o">:</span> <span class="n">S</span> <span class="bp">≤</span> <span class="n">T</span><span class="o">)</span> <span class="o">:</span> <span class="n">map</span> <span class="n">φ</span> <span class="n">S</span> <span class="bp">≤</span> <span class="n">map</span> <span class="n">φ</span> <span class="n">T</span> <span class="o">:=</span><span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">K</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">K</span><span class="o">]</span> <span class="c1">-- Remember you can use the `ext` tactic to prove an equality of subgroups.</span> <span class="kd">example</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">ψ</span> <span class="o">:</span> <span class="n">H</span> <span class="bp">→*</span> <span class="n">K</span><span class="o">)</span> <span class="o">(</span><span class="n">U</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">K</span><span class="o">)</span> <span class="o">:</span> <span class="n">comap</span> <span class="o">(</span><span class="n">ψ.comp</span> <span class="n">φ</span><span class="o">)</span> <span class="n">U</span> <span class="bp">=</span> <span class="n">comap</span> <span class="n">φ</span> <span class="o">(</span><span class="n">comap</span> <span class="n">ψ</span> <span class="n">U</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="c1">-- Pushing a subgroup along one homomorphism and then another is equal to</span> <span class="c1">-- pushing it forward along the composite of the homomorphisms.</span> <span class="kd">example</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">ψ</span> <span class="o">:</span> <span class="n">H</span> <span class="bp">→*</span> <span class="n">K</span><span class="o">)</span> <span class="o">(</span><span class="n">S</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">map</span> <span class="o">(</span><span class="n">ψ.comp</span> <span class="n">φ</span><span class="o">)</span> <span class="n">S</span> <span class="bp">=</span> <span class="n">map</span> <span class="n">ψ</span> <span class="o">(</span><span class="n">S.map</span> <span class="n">φ</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">end</span> <span class="n">exercises</span> </pre></div> </div> <p>Let us finish this introduction to subgroups in Mathlib with two very classical results. Lagrange theorem states the cardinality of a subgroup of a finite group divides the cardinality of the group. Sylow’s first theorem is a famous partial converse to Lagrange’s theorem.</p> <p>Since this corner of Mathlib is partly set up to allow computation, we need to tell Lean to use nonconstructive logic, using the following <code class="docutils literal notranslate"><span class="pre">attribute</span></code> command.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">attribute</span> <span class="o">[</span><span class="kn">local</span> <span class="kd">instance</span> <span class="mi">10</span><span class="o">]</span> <span class="n">setFintype</span> <span class="n">Classical.propDecidable</span> <span class="kn">open</span> <span class="n">Fintype</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">G'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">card</span> <span class="n">G'</span> <span class="bp">∣</span> <span class="n">card</span> <span class="n">G</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">G'.index</span><span class="o">,</span> <span class="n">mul_comm</span> <span class="n">G'.index</span> <span class="n">_</span> <span class="bp">▸</span> <span class="n">G'.index_mul_card.symm</span><span class="o">⟩</span> <span class="kn">open</span> <span class="n">Subgroup</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">{</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">[</span><span class="n">Fact</span> <span class="n">p.Prime</span><span class="o">]</span> <span class="o">(</span><span class="n">hdvd</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">^</span> <span class="n">n</span> <span class="bp">∣</span> <span class="n">card</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">K</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">,</span> <span class="n">card</span> <span class="n">K</span> <span class="bp">=</span> <span class="n">p</span> <span class="bp">^</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">Sylow.exists_subgroup_card_pow_prime</span> <span class="n">p</span> <span class="n">hdvd</span> </pre></div> </div> <p>The next two exercises derive a corollary of Lagrange’s lemma. (This is also already in Mathlib, so do not use <cite>exact?</cite> too quickly.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span> <span class="n">eq_bot_iff_card</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">}</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">H</span><span class="o">]</span> <span class="o">:</span> <span class="n">H</span> <span class="bp">=</span> <span class="bp">⊥</span> <span class="bp">↔</span> <span class="n">card</span> <span class="n">H</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">suffices</span> <span class="o">(</span><span class="bp">∀</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">,</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">,</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">x</span> <span class="kd">by</span> <span class="n">simpa</span> <span class="o">[</span><span class="n">eq_bot_iff_forall</span><span class="o">,</span> <span class="n">card_eq_one_iff</span><span class="o">]</span> <span class="gr">sorry</span> <span class="k">#check</span> <span class="n">card_dvd_of_le</span> <span class="kd">lemma</span> <span class="n">inf_bot_of_coprime</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="n">K</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">H</span><span class="o">]</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">K</span><span class="o">]</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="o">(</span><span class="n">card</span> <span class="n">H</span><span class="o">)</span><span class="bp">.</span><span class="n">Coprime</span> <span class="o">(</span><span class="n">card</span> <span class="n">K</span><span class="o">))</span> <span class="o">:</span> <span class="n">H</span> <span class="bp">⊓</span> <span class="n">K</span> <span class="bp">=</span> <span class="bp">⊥</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> </pre></div> </div> </section> <section id="concrete-groups"> <h3><span class="section-number">8.1.4. </span>Concrete groups<a class="headerlink" href="#concrete-groups" title="Permalink to this heading"></a></h3> <p>One can also manipulate concrete groups in Mathlib, although this is typically more complicated than working with the abstract theory. For instance, given any type <code class="docutils literal notranslate"><span class="pre">X</span></code>, the group of permutations of <code class="docutils literal notranslate"><span class="pre">X</span></code> is <code class="docutils literal notranslate"><span class="pre">Equiv.Perm</span> <span class="pre">X</span></code>. In particular the symmetric group <span class="math notranslate nohighlight">\(\mathfrak{S}_n\)</span> is <code class="docutils literal notranslate"><span class="pre">Equiv.Perm</span> <span class="pre">(Fin</span> <span class="pre">n)</span></code>. One can state abstract results about this group, for instance saying that <code class="docutils literal notranslate"><span class="pre">Equiv.Perm</span> <span class="pre">X</span></code> is generated by cycles if <code class="docutils literal notranslate"><span class="pre">X</span></code> is finite.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Equiv</span> <span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Finite</span> <span class="n">X</span><span class="o">]</span> <span class="o">:</span> <span class="n">Subgroup.closure</span> <span class="o">{</span><span class="n">σ</span> <span class="o">:</span> <span class="n">Perm</span> <span class="n">X</span> <span class="bp">|</span> <span class="n">Perm.IsCycle</span> <span class="n">σ</span><span class="o">}</span> <span class="bp">=</span> <span class="bp">⊤</span> <span class="o">:=</span> <span class="n">Perm.closure_isCycle</span> </pre></div> </div> <p>One can be fully concrete and compute actual products of cycles. Below we use the <code class="docutils literal notranslate"><span class="pre">#simp</span></code> command, which calls the <code class="docutils literal notranslate"><span class="pre">simp</span></code> tactic on a given expression. The notation <code class="docutils literal notranslate"><span class="pre">c[]</span></code> is used to define a cyclic permutation. In the example, the result is a permutation of <code class="docutils literal notranslate"><span class="pre">ℕ</span></code>. One could use a type ascription such as <code class="docutils literal notranslate"><span class="pre">(1</span> <span class="pre">:</span> <span class="pre">Fin</span> <span class="pre">5)</span></code> on the first number appearing to make it a computation in <code class="docutils literal notranslate"><span class="pre">Perm</span> <span class="pre">(Fin</span> <span class="pre">5)</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="bp">#</span><span class="n">simp</span> <span class="o">[</span><span class="n">mul_assoc</span><span class="o">]</span> <span class="n">c</span><span class="o">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">]</span> <span class="bp">*</span> <span class="n">c</span><span class="o">[</span><span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">4</span><span class="o">]</span> </pre></div> </div> <p>Another way to work with concrete groups is to use free groups and group presentations. The free group on a type <code class="docutils literal notranslate"><span class="pre">α</span></code> is <code class="docutils literal notranslate"><span class="pre">FreeGroup</span> <span class="pre">α</span></code> and the inclusion map is <code class="docutils literal notranslate"><span class="pre">FreeGroup.of</span> <span class="pre">:</span> <span class="pre">α</span> <span class="pre">→</span> <span class="pre">FreeGroup</span> <span class="pre">α</span></code>. For instance let us define a type <code class="docutils literal notranslate"><span class="pre">S</span></code> with three elements denoted by <code class="docutils literal notranslate"><span class="pre">a</span></code>, <code class="docutils literal notranslate"><span class="pre">b</span></code> and <code class="docutils literal notranslate"><span class="pre">c</span></code>, and the element <code class="docutils literal notranslate"><span class="pre">ab⁻¹</span></code> of the corresponding free group.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="n">FreeGroup</span> <span class="kd">inductive</span> <span class="n">S</span> <span class="bp">|</span> <span class="n">a</span> <span class="bp">|</span> <span class="n">b</span> <span class="bp">|</span> <span class="n">c</span> <span class="kn">open</span> <span class="n">S</span> <span class="kd">def</span> <span class="n">myElement</span> <span class="o">:</span> <span class="n">FreeGroup</span> <span class="n">S</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">.</span><span class="n">of</span> <span class="n">a</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="bp">.</span><span class="n">of</span> <span class="n">b</span><span class="o">)</span><span class="bp">⁻¹</span> </pre></div> </div> <p>Note that we gave the expected type of the definition so that Lean knows that <code class="docutils literal notranslate"><span class="pre">.of</span></code> means <code class="docutils literal notranslate"><span class="pre">FreeGroup.of</span></code>.</p> <p>The universal property of free groups is embodied as the equivalence <code class="docutils literal notranslate"><span class="pre">FreeGroup.lift</span></code>. For example, let us define the group morphism from <code class="docutils literal notranslate"><span class="pre">FreeGroup</span> <span class="pre">S</span></code> to <code class="docutils literal notranslate"><span class="pre">Perm</span> <span class="pre">(Fin</span> <span class="pre">5)</span></code> that sends <code class="docutils literal notranslate"><span class="pre">a</span></code> to <code class="docutils literal notranslate"><span class="pre">c[1,</span> <span class="pre">2,</span> <span class="pre">3]</span></code>, <code class="docutils literal notranslate"><span class="pre">b</span></code> to <code class="docutils literal notranslate"><span class="pre">c[2,</span> <span class="pre">3,</span> <span class="pre">1]</span></code>, and <code class="docutils literal notranslate"><span class="pre">c</span></code> to <code class="docutils literal notranslate"><span class="pre">c[2,</span> <span class="pre">3]</span></code>,</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">myMorphism</span> <span class="o">:</span> <span class="n">FreeGroup</span> <span class="n">S</span> <span class="bp">→*</span> <span class="n">Perm</span> <span class="o">(</span><span class="n">Fin</span> <span class="mi">5</span><span class="o">)</span> <span class="o">:=</span> <span class="n">FreeGroup.lift</span> <span class="k">fun</span> <span class="bp">|</span> <span class="bp">.</span><span class="n">a</span> <span class="bp">=></span> <span class="n">c</span><span class="o">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">]</span> <span class="bp">|</span> <span class="bp">.</span><span class="n">b</span> <span class="bp">=></span> <span class="n">c</span><span class="o">[</span><span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">1</span><span class="o">]</span> <span class="bp">|</span> <span class="bp">.</span><span class="n">c</span> <span class="bp">=></span> <span class="n">c</span><span class="o">[</span><span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">]</span> </pre></div> </div> <p>As a last concrete example, let us see how to define a group generated by a single element whose cube is one (so that group will be isomorphic to <span class="math notranslate nohighlight">\(\mathbb{Z}/3\)</span>) and build a morphism from that group to <code class="docutils literal notranslate"><span class="pre">Perm</span> <span class="pre">(Fin</span> <span class="pre">5)</span></code>.</p> <p>As a type with exactly one element, we will use <code class="docutils literal notranslate"><span class="pre">Unit</span></code> whose only element is denoted by <code class="docutils literal notranslate"><span class="pre">()</span></code>. The function <code class="docutils literal notranslate"><span class="pre">PresentedGroup</span></code> takes a set of relations, i.e. a set of elements of some free group, and returns a group that is this free group quotiented by a normal subgroup generated by relations. (We will see how to handle more general quotients in <a class="reference internal" href="#quotient-groups"><span class="std std-numref">Section 8.1.6</span></a>.) Since we somehow hide this behind a definition, we use <code class="docutils literal notranslate"><span class="pre">deriving</span> <span class="pre">Group</span></code> to force creation of a group instance on <code class="docutils literal notranslate"><span class="pre">myGroup</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">myGroup</span> <span class="o">:=</span> <span class="n">PresentedGroup</span> <span class="o">{</span><span class="bp">.</span><span class="n">of</span> <span class="o">()</span> <span class="bp">^</span> <span class="mi">3</span><span class="o">}</span> <span class="n">deriving</span> <span class="n">Group</span> </pre></div> </div> <p>The universal property of presented groups ensures that morphisms out of this group can be built from functions that send the relations to the neutral element of the target group. So we need such a function and a proof that the condition holds. Then we can feed this proof to <code class="docutils literal notranslate"><span class="pre">PresentedGroup.toGroup</span></code> to get the desired group morphism.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">myMap</span> <span class="o">:</span> <span class="n">Unit</span> <span class="bp">→</span> <span class="n">Perm</span> <span class="o">(</span><span class="n">Fin</span> <span class="mi">5</span><span class="o">)</span> <span class="bp">|</span> <span class="o">()</span> <span class="bp">=></span> <span class="n">c</span><span class="o">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">]</span> <span class="kd">lemma</span> <span class="n">compat_myMap</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">r</span> <span class="bp">∈</span> <span class="o">({</span><span class="bp">.</span><span class="n">of</span> <span class="o">()</span> <span class="bp">^</span> <span class="mi">3</span><span class="o">}</span> <span class="o">:</span> <span class="n">Set</span> <span class="o">(</span><span class="n">FreeGroup</span> <span class="n">Unit</span><span class="o">)),</span> <span class="n">FreeGroup.lift</span> <span class="n">myMap</span> <span class="n">r</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="n">_</span> <span class="n">rfl</span> <span class="n">simp</span> <span class="kd">def</span> <span class="n">myNewMorphism</span> <span class="o">:</span> <span class="n">myGroup</span> <span class="bp">→*</span> <span class="n">Perm</span> <span class="o">(</span><span class="n">Fin</span> <span class="mi">5</span><span class="o">)</span> <span class="o">:=</span> <span class="n">PresentedGroup.toGroup</span> <span class="n">compat_myMap</span> <span class="kd">end</span> <span class="n">FreeGroup</span> </pre></div> </div> </section> <section id="group-actions"> <h3><span class="section-number">8.1.5. </span>Group actions<a class="headerlink" href="#group-actions" title="Permalink to this heading"></a></h3> <p>One important way that group theory interacts with the rest of mathematics is through the use of group actions. An action of a group <code class="docutils literal notranslate"><span class="pre">G</span></code> on some type <code class="docutils literal notranslate"><span class="pre">X</span></code> is nothing more than a morphism from <code class="docutils literal notranslate"><span class="pre">G</span></code> to <code class="docutils literal notranslate"><span class="pre">Equiv.Perm</span> <span class="pre">X</span></code>. So in a sense group actions are already covered by the previous discussion. But we don’t want to carry this morphism around; instead, we want it to be inferred automatically by Lean as much as possible. So we have a type class for this, which is <code class="docutils literal notranslate"><span class="pre">MulAction</span> <span class="pre">G</span> <span class="pre">X</span></code>. The downside of this setup is that having multiple actions of the same group on the same type requires some contortions, such as defining type synonyms, each of which carries different type class instances.</p> <p>This allows us in particular to use <code class="docutils literal notranslate"><span class="pre">g</span> <span class="pre">•</span> <span class="pre">x</span></code> to denote the action of a group element <code class="docutils literal notranslate"><span class="pre">g</span></code> on a point <code class="docutils literal notranslate"><span class="pre">x</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kn">section</span> <span class="n">GroupActions</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">MulAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">(</span><span class="n">g</span> <span class="n">g'</span><span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">g</span> <span class="bp">•</span> <span class="o">(</span><span class="n">g'</span> <span class="bp">•</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">g</span> <span class="bp">*</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">•</span> <span class="n">x</span> <span class="o">:=</span> <span class="o">(</span><span class="n">mul_smul</span> <span class="n">g</span> <span class="n">g'</span> <span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">symm</span> </pre></div> </div> <p>There is also a version for additive group called <code class="docutils literal notranslate"><span class="pre">AddAction</span></code>, where the action is denoted by <code class="docutils literal notranslate"><span class="pre">+ᵥ</span></code>. This is used for instance in the definition of affine spaces.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">AddGroup</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">AddAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">(</span><span class="n">g</span> <span class="n">g'</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">g</span> <span class="bp">+ᵥ</span> <span class="o">(</span><span class="n">g'</span> <span class="bp">+ᵥ</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">g</span> <span class="bp">+</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">+ᵥ</span> <span class="n">x</span> <span class="o">:=</span> <span class="o">(</span><span class="n">add_vadd</span> <span class="n">g</span> <span class="n">g'</span> <span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">symm</span> </pre></div> </div> <p>The underlying group morphism is called <code class="docutils literal notranslate"><span class="pre">MulAction.toPermHom</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">MulAction</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">MulAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">Equiv.Perm</span> <span class="n">X</span> <span class="o">:=</span> <span class="n">toPermHom</span> <span class="n">G</span> <span class="n">X</span> </pre></div> </div> <p>As an illustration let us see how to define the Cayley isomorphism embedding of any group <code class="docutils literal notranslate"><span class="pre">G</span></code> into a permutation group, namely <code class="docutils literal notranslate"><span class="pre">Perm</span> <span class="pre">G</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">CayleyIsoMorphism</span> <span class="o">(</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃*</span> <span class="o">(</span><span class="n">toPermHom</span> <span class="n">G</span> <span class="n">G</span><span class="o">)</span><span class="bp">.</span><span class="n">range</span> <span class="o">:=</span> <span class="n">Equiv.Perm.subgroupOfMulAction</span> <span class="n">G</span> <span class="n">G</span> </pre></div> </div> <p>Note that nothing before the above definition required having a group rather than a monoid (or any type endowed with a multiplication operation really).</p> <p>The group condition really enters the picture when we will want to partition <code class="docutils literal notranslate"><span class="pre">X</span></code> into orbits. The corresponding equivalence relation on <code class="docutils literal notranslate"><span class="pre">X</span></code> is called <code class="docutils literal notranslate"><span class="pre">MulAction.orbitRel</span></code>. It is not declared as a global instance.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">MulAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">:</span> <span class="n">Setoid</span> <span class="n">X</span> <span class="o">:=</span> <span class="n">orbitRel</span> <span class="n">G</span> <span class="n">X</span> </pre></div> </div> <p>Using this we can state that <code class="docutils literal notranslate"><span class="pre">X</span></code> is partitioned into orbits under the action of <code class="docutils literal notranslate"><span class="pre">G</span></code>. More precisely, we get a bijection between <code class="docutils literal notranslate"><span class="pre">X</span></code> and the dependent product <code class="docutils literal notranslate"><span class="pre">(ω</span> <span class="pre">:</span> <span class="pre">orbitRel.Quotient</span> <span class="pre">G</span> <span class="pre">X)</span> <span class="pre">×</span> <span class="pre">(orbit</span> <span class="pre">G</span> <span class="pre">(Quotient.out'</span> <span class="pre">ω))</span></code> where <code class="docutils literal notranslate"><span class="pre">Quotient.out'</span> <span class="pre">ω</span></code> simply chooses an element that projects to <code class="docutils literal notranslate"><span class="pre">ω</span></code>. Recall that elements of this dependent product are pairs <code class="docutils literal notranslate"><span class="pre">⟨ω,</span> <span class="pre">x⟩</span></code> where the type <code class="docutils literal notranslate"><span class="pre">orbit</span> <span class="pre">G</span> <span class="pre">(Quotient.out'</span> <span class="pre">ω)</span></code> of <code class="docutils literal notranslate"><span class="pre">x</span></code> depends on <code class="docutils literal notranslate"><span class="pre">ω</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">MulAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">≃</span> <span class="o">(</span><span class="n">ω</span> <span class="o">:</span> <span class="n">orbitRel.Quotient</span> <span class="n">G</span> <span class="n">X</span><span class="o">)</span> <span class="bp">×</span> <span class="o">(</span><span class="n">orbit</span> <span class="n">G</span> <span class="o">(</span><span class="n">Quotient.out'</span> <span class="n">ω</span><span class="o">))</span> <span class="o">:=</span> <span class="n">MulAction.selfEquivSigmaOrbits</span> <span class="n">G</span> <span class="n">X</span> </pre></div> </div> <p>In particular, when X is finite, this can be combined with <code class="docutils literal notranslate"><span class="pre">Fintype.card_congr</span></code> and <code class="docutils literal notranslate"><span class="pre">Fintype.card_sigma</span></code> to deduce that the cardinality of <code class="docutils literal notranslate"><span class="pre">X</span></code> is the sum of the cardinalities of the orbits. Furthermore, the orbits are in bijection with the quotient of <code class="docutils literal notranslate"><span class="pre">G</span></code> under the action of the stabilizers by left translation. This action of a subgroup by left-translation is used to define quotients of a group by a subgroup with notation <cite>/</cite> so we can use the following concise statement.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">MulAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">orbit</span> <span class="n">G</span> <span class="n">x</span> <span class="bp">≃</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">stabilizer</span> <span class="n">G</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">MulAction.orbitEquivQuotientStabilizer</span> <span class="n">G</span> <span class="n">x</span> </pre></div> </div> <p>An important special case of combining the above two results is when <code class="docutils literal notranslate"><span class="pre">X</span></code> is a group <code class="docutils literal notranslate"><span class="pre">G</span></code> equipped with the action of a subgroup <code class="docutils literal notranslate"><span class="pre">H</span></code> by translation. In this case all stabilizers are trivial so every orbit is in bijection with <code class="docutils literal notranslate"><span class="pre">H</span></code> and we get:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃</span> <span class="o">(</span><span class="n">G</span> <span class="bp">⧸</span> <span class="n">H</span><span class="o">)</span> <span class="bp">×</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">groupEquivQuotientProdSubgroup</span> </pre></div> </div> <p>This is the conceptual variant of the version of Lagrange theorem that we saw above. Note this version makes no finiteness assumption.</p> <p>As an exercise for this section, let us build the action of a group on its subgroup by conjugation, using our definition of <code class="docutils literal notranslate"><span class="pre">conjugate</span></code> from a previous exercise.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="kd">lemma</span> <span class="n">conjugate_one</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">conjugate</span> <span class="mi">1</span> <span class="n">H</span> <span class="bp">=</span> <span class="n">H</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">instance</span> <span class="o">:</span> <span class="n">MulAction</span> <span class="n">G</span> <span class="o">(</span><span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="n">where</span> <span class="n">smul</span> <span class="o">:=</span> <span class="n">conjugate</span> <span class="n">one_smul</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">mul_smul</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">end</span> <span class="n">GroupActions</span> </pre></div> </div> </section> <section id="quotient-groups"> <span id="id1"></span><h3><span class="section-number">8.1.6. </span>Quotient groups<a class="headerlink" href="#quotient-groups" title="Permalink to this heading"></a></h3> <p>In the above discussion of subgroups acting on groups, we saw the quotient <code class="docutils literal notranslate"><span class="pre">G</span> <span class="pre">⧸</span> <span class="pre">H</span></code> appear. In general this is only a type. It can be endowed with a group structure such that the quotient map is a group morphism if and only if <code class="docutils literal notranslate"><span class="pre">H</span></code> is a normal subgroup (and this group structure is then unique).</p> <p>The normality assumption is a type class <code class="docutils literal notranslate"><span class="pre">Subgroup.Normal</span></code> so that type class inference can use to derive the group structure on the quotient.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kn">section</span> <span class="n">QuotientGroup</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">[</span><span class="n">H.Normal</span><span class="o">]</span> <span class="o">:</span> <span class="n">Group</span> <span class="o">(</span><span class="n">G</span> <span class="bp">⧸</span> <span class="n">H</span><span class="o">)</span> <span class="o">:=</span> <span class="n">inferInstance</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">[</span><span class="n">H.Normal</span><span class="o">]</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">QuotientGroup.mk'</span> <span class="n">H</span> </pre></div> </div> <p>The universal property of quotient groups is accessed through <code class="docutils literal notranslate"><span class="pre">QuotientGroup.lift</span></code>: a group morphism <code class="docutils literal notranslate"><span class="pre">φ</span></code> descends to <code class="docutils literal notranslate"><span class="pre">G</span> <span class="pre">⧸</span> <span class="pre">N</span></code> as soon as its kernel contains <code class="docutils literal notranslate"><span class="pre">N</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">[</span><span class="n">N.Normal</span><span class="o">]</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">M</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">N</span> <span class="bp">≤</span> <span class="n">MonoidHom.ker</span> <span class="n">φ</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">N</span> <span class="bp">→*</span> <span class="n">M</span> <span class="o">:=</span> <span class="n">QuotientGroup.lift</span> <span class="n">N</span> <span class="n">φ</span> <span class="n">h</span> </pre></div> </div> <p>The fact that the target group is called <code class="docutils literal notranslate"><span class="pre">M</span></code> is the above snippet is a clue that having a monoid structure on <code class="docutils literal notranslate"><span class="pre">M</span></code> would be enough.</p> <p>An important special case is when <code class="docutils literal notranslate"><span class="pre">N</span> <span class="pre">=</span> <span class="pre">ker</span> <span class="pre">φ</span></code> In that case the descended morphism is injective and we get a group isomorphism onto its image. This result is often called the first isomorphism theorem.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">MonoidHom.ker</span> <span class="n">φ</span> <span class="bp">→*</span> <span class="n">MonoidHom.range</span> <span class="n">φ</span> <span class="o">:=</span> <span class="n">QuotientGroup.quotientKerEquivRange</span> <span class="n">φ</span> </pre></div> </div> <p>Applying the universal property to a composition of a morphism <code class="docutils literal notranslate"><span class="pre">φ</span> <span class="pre">:</span> <span class="pre">G</span> <span class="pre">→*</span> <span class="pre">G'</span></code> with a quotient group projection <code class="docutils literal notranslate"><span class="pre">Quotient.mk'</span> <span class="pre">N'</span></code>, we can also aim for a morphism from <code class="docutils literal notranslate"><span class="pre">G</span> <span class="pre">⧸</span> <span class="pre">N</span></code> to <code class="docutils literal notranslate"><span class="pre">G'</span> <span class="pre">⧸</span> <span class="pre">N'</span></code>. The condition required on <code class="docutils literal notranslate"><span class="pre">φ</span></code> is usually formulated by saying “<code class="docutils literal notranslate"><span class="pre">φ</span></code> should send <code class="docutils literal notranslate"><span class="pre">N</span></code> inside <code class="docutils literal notranslate"><span class="pre">N'</span></code>.” But this is equivalent to asking that <code class="docutils literal notranslate"><span class="pre">φ</span></code> should pull <code class="docutils literal notranslate"><span class="pre">N'</span></code> back inside <code class="docutils literal notranslate"><span class="pre">N</span></code>, and the latter condition is nicer to work with since the definition of pullback does not involve an existential quantifier.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">G'</span><span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G'</span><span class="o">]</span> <span class="o">{</span><span class="n">N</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">}</span> <span class="o">[</span><span class="n">N.Normal</span><span class="o">]</span> <span class="o">{</span><span class="n">N'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G'</span><span class="o">}</span> <span class="o">[</span><span class="n">N'.Normal</span><span class="o">]</span> <span class="o">{</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">G'</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">N</span> <span class="bp">≤</span> <span class="n">Subgroup.comap</span> <span class="n">φ</span> <span class="n">N'</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">N</span> <span class="bp">→*</span> <span class="n">G'</span> <span class="bp">⧸</span> <span class="n">N'</span><span class="o">:=</span> <span class="n">QuotientGroup.map</span> <span class="n">N</span> <span class="n">N'</span> <span class="n">φ</span> <span class="n">h</span> </pre></div> </div> <p>One subtle point to keep in mind is that the type <code class="docutils literal notranslate"><span class="pre">G</span> <span class="pre">⧸</span> <span class="pre">N</span></code> really depends on <code class="docutils literal notranslate"><span class="pre">N</span></code> (up to definitional equality), so having a proof that two normal subgroups <code class="docutils literal notranslate"><span class="pre">N</span></code> and <code class="docutils literal notranslate"><span class="pre">M</span></code> are equal is not enough to make the corresponding quotients equal. However the universal properties does give an isomorphism in this case.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">}</span> <span class="o">[</span><span class="n">M.Normal</span><span class="o">]</span> <span class="o">[</span><span class="n">N.Normal</span><span class="o">]</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">=</span> <span class="n">N</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">M</span> <span class="bp">≃*</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">N</span> <span class="o">:=</span> <span class="n">QuotientGroup.quotientMulEquivOfEq</span> <span class="n">h</span> </pre></div> </div> <p>As a final series of exercises for this section, we will prove that if <code class="docutils literal notranslate"><span class="pre">H</span></code> and <code class="docutils literal notranslate"><span class="pre">K</span></code> are disjoint normal subgroups of a finite group <code class="docutils literal notranslate"><span class="pre">G</span></code> such that the product of their cardinalities is equal to the cardinality of <code class="docutils literal notranslate"><span class="pre">G</span></code> then <code class="docutils literal notranslate"><span class="pre">G</span></code> is isomorphic to <code class="docutils literal notranslate"><span class="pre">H</span> <span class="pre">×</span> <span class="pre">K</span></code>. Recall that disjoint in this context means <code class="docutils literal notranslate"><span class="pre">H</span> <span class="pre">⊓</span> <span class="pre">K</span> <span class="pre">=</span> <span class="pre">⊥</span></code>.</p> <p>We start with playing a bit with Lagrange’s lemma, without assuming the subgroups are normal or disjoint.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">H</span> <span class="n">K</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">}</span> <span class="kn">open</span> <span class="n">MonoidHom</span> <span class="k">#check</span> <span class="n">card_pos</span> <span class="c1">-- The nonempty argument will be automatically inferred for subgroups</span> <span class="k">#check</span> <span class="n">Subgroup.index_eq_card</span> <span class="k">#check</span> <span class="n">Subgroup.index_mul_card</span> <span class="k">#check</span> <span class="n">Nat.eq_of_mul_eq_mul_right</span> <span class="kd">lemma</span> <span class="n">aux_card_eq</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">card</span> <span class="n">G</span> <span class="bp">=</span> <span class="n">card</span> <span class="n">H</span> <span class="bp">*</span> <span class="n">card</span> <span class="n">K</span><span class="o">)</span> <span class="o">:</span> <span class="n">card</span> <span class="o">(</span><span class="n">G</span><span class="bp">⧸</span><span class="n">H</span><span class="o">)</span> <span class="bp">=</span> <span class="n">card</span> <span class="n">K</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> </pre></div> </div> <p>From now on, we assume that our subgroups are normal and disjoint, and we assume the cardinality condition. Now we construct the first building block of the desired isomorphism.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">[</span><span class="n">H.Normal</span><span class="o">]</span> <span class="o">[</span><span class="n">K.Normal</span><span class="o">]</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Disjoint</span> <span class="n">H</span> <span class="n">K</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">card</span> <span class="n">G</span> <span class="bp">=</span> <span class="n">card</span> <span class="n">H</span> <span class="bp">*</span> <span class="n">card</span> <span class="n">K</span><span class="o">)</span> <span class="k">#check</span> <span class="n">bijective_iff_injective_and_card</span> <span class="k">#check</span> <span class="n">ker_eq_bot_iff</span> <span class="k">#check</span> <span class="n">restrict</span> <span class="k">#check</span> <span class="n">ker_restrict</span> <span class="kd">def</span> <span class="n">iso₁</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Disjoint</span> <span class="n">H</span> <span class="n">K</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">card</span> <span class="n">G</span> <span class="bp">=</span> <span class="n">card</span> <span class="n">H</span> <span class="bp">*</span> <span class="n">card</span> <span class="n">K</span><span class="o">)</span> <span class="o">:</span> <span class="n">K</span> <span class="bp">≃*</span> <span class="n">G</span><span class="bp">⧸</span><span class="n">H</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> </pre></div> </div> <p>Now we can define our second building block. We will need <code class="docutils literal notranslate"><span class="pre">MonoidHom.prod</span></code>, which builds a morphism from <code class="docutils literal notranslate"><span class="pre">G₀</span></code> to <code class="docutils literal notranslate"><span class="pre">G₁</span> <span class="pre">×</span> <span class="pre">G₂</span></code> out of morphisms from <code class="docutils literal notranslate"><span class="pre">G₀</span></code> to <code class="docutils literal notranslate"><span class="pre">G₁</span></code> and <code class="docutils literal notranslate"><span class="pre">G₂</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">iso₂</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃*</span> <span class="o">(</span><span class="n">G</span><span class="bp">⧸</span><span class="n">K</span><span class="o">)</span> <span class="bp">×</span> <span class="o">(</span><span class="n">G</span><span class="bp">⧸</span><span class="n">H</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> </pre></div> </div> <p>We are ready to put all pieces together.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">MulEquiv.prodCongr</span> <span class="kd">def</span> <span class="n">finalIso</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃*</span> <span class="n">H</span> <span class="bp">×</span> <span class="n">K</span> <span class="o">:=</span> <span class="gr">sorry</span> </pre></div> </div> </section> </section> <section id="rings"> <span id="id2"></span><h2><span class="section-number">8.2. </span>Rings<a class="headerlink" href="#rings" title="Permalink to this heading"></a></h2> <section id="rings-their-units-morphisms-and-subrings"> <span id="index-4"></span><h3><span class="section-number">8.2.1. </span>Rings, their units, morphisms and subrings<a class="headerlink" href="#rings-their-units-morphisms-and-subrings" title="Permalink to this heading"></a></h3> <p>The type of ring structures on a type <code class="docutils literal notranslate"><span class="pre">R</span></code> is <code class="docutils literal notranslate"><span class="pre">Ring</span> <span class="pre">R</span></code>. The variant where multiplication is assumed to be commutative is <code class="docutils literal notranslate"><span class="pre">CommRing</span> <span class="pre">R</span></code>. We have already seen that the <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic will prove any equality that follows from the axioms of a commutative ring.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">=</span> <span class="n">x</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">+</span> <span class="n">y</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">+</span> <span class="mi">2</span><span class="bp">*</span><span class="n">x</span><span class="bp">*</span><span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> </pre></div> </div> <p>More exotic variants do not require that the addition on <code class="docutils literal notranslate"><span class="pre">R</span></code> forms a group but only an additive monoid. The corresponding type classes are <code class="docutils literal notranslate"><span class="pre">Semiring</span> <span class="pre">R</span></code> and <code class="docutils literal notranslate"><span class="pre">CommSemiring</span> <span class="pre">R</span></code>. The type of natural numbers is an important instance of <code class="docutils literal notranslate"><span class="pre">CommSemiring</span> <span class="pre">R</span></code>, as is any type of functions taking values in the natural numbers. Another important example is the type of ideals in a ring, which will be discussed below. The name of the <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic is doubly misleading, since it assumes commutativity but works in semirings as well. In other words, it applies to any <code class="docutils literal notranslate"><span class="pre">CommSemiring</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">=</span> <span class="n">x</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">+</span> <span class="n">y</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">+</span> <span class="mi">2</span><span class="bp">*</span><span class="n">x</span><span class="bp">*</span><span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> </pre></div> </div> <p>There are also versions of the ring and semiring classes that do not assume the existence of a multiplicative unit or the associativity of multiplication. We will not discuss those here.</p> <p>Some concepts that are traditionally taught in an introduction to ring theory are actually about the underlying multiplicative monoid. A prominent example is the definition of the units of a ring. Every (multiplicative) monoid <code class="docutils literal notranslate"><span class="pre">M</span></code> has a predicate <code class="docutils literal notranslate"><span class="pre">IsUnit</span> <span class="pre">:</span> <span class="pre">M</span> <span class="pre">→</span> <span class="pre">Prop</span></code> asserting existence of a two-sided inverse, a type <code class="docutils literal notranslate"><span class="pre">Units</span> <span class="pre">M</span></code> of units with notation <code class="docutils literal notranslate"><span class="pre">Mˣ</span></code>, and a coercion to <code class="docutils literal notranslate"><span class="pre">M</span></code>. The type <code class="docutils literal notranslate"><span class="pre">Units</span> <span class="pre">M</span></code> bundles an invertible element with its inverse as well as properties than ensure that each is indeed the inverse of the other. This implementation detail is relevant mainly when defining computable functions. In most situations one can use <code class="docutils literal notranslate"><span class="pre">IsUnit.unit</span> <span class="pre">{x</span> <span class="pre">:</span> <span class="pre">M}</span> <span class="pre">:</span> <span class="pre">IsUnit</span> <span class="pre">x</span> <span class="pre">→</span> <span class="pre">Mˣ</span></code> to build a unit. In the commutative case, one also has <code class="docutils literal notranslate"><span class="pre">Units.mkOfMulEqOne</span> <span class="pre">(x</span> <span class="pre">y</span> <span class="pre">:</span> <span class="pre">M)</span> <span class="pre">:</span> <span class="pre">x</span> <span class="pre">*</span> <span class="pre">y</span> <span class="pre">=</span> <span class="pre">1</span> <span class="pre">→</span> <span class="pre">Mˣ</span></code> which builds <code class="docutils literal notranslate"><span class="pre">x</span></code> seen as unit.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℤ</span><span class="bp">ˣ</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp">=</span> <span class="bp">-</span><span class="mi">1</span> <span class="o">:=</span> <span class="n">Int.units_eq_one_or</span> <span class="n">x</span> <span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">M</span><span class="bp">ˣ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">M</span><span class="o">)</span><span class="bp">*</span><span class="n">x</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">Units.mul_inv</span> <span class="n">x</span> <span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">:</span> <span class="n">Group</span> <span class="n">M</span><span class="bp">ˣ</span> <span class="o">:=</span> <span class="n">inferInstance</span> </pre></div> </div> <p>The type of ring morphisms between two (semi)-rings <code class="docutils literal notranslate"><span class="pre">R</span></code> and <code class="docutils literal notranslate"><span class="pre">S</span></code> is <code class="docutils literal notranslate"><span class="pre">RingHom</span> <span class="pre">R</span> <span class="pre">S</span></code>, with notation <code class="docutils literal notranslate"><span class="pre">R</span> <span class="pre">→+*</span> <span class="pre">S</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">S</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">S</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">f</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">f.map_add</span> <span class="n">x</span> <span class="n">y</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">S</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">S</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span><span class="bp">ˣ</span> <span class="bp">→*</span> <span class="n">S</span><span class="bp">ˣ</span> <span class="o">:=</span> <span class="n">Units.map</span> <span class="n">f</span> </pre></div> </div> <p>The isormophism variant is <code class="docutils literal notranslate"><span class="pre">RingEquiv</span></code>, with notation <code class="docutils literal notranslate"><span class="pre">≃+*</span></code>.</p> <p>As with submonoids and subgroups, there is a <code class="docutils literal notranslate"><span class="pre">Subring</span> <span class="pre">R</span></code> type for subrings of a ring <code class="docutils literal notranslate"><span class="pre">R</span></code>, but this type is a lot less useful than the type of subgroups since one cannot quotient a ring by a subring.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">S</span> <span class="o">:</span> <span class="n">Subring</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">Ring</span> <span class="n">S</span> <span class="o">:=</span> <span class="n">inferInstance</span> </pre></div> </div> <p>Also notice that <code class="docutils literal notranslate"><span class="pre">RingHom.range</span></code> produces a subring.</p> </section> <section id="ideals-and-quotients"> <h3><span class="section-number">8.2.2. </span>Ideals and quotients<a class="headerlink" href="#ideals-and-quotients" title="Permalink to this heading"></a></h3> <p>For historical reasons, Mathlib only has a theory of ideals for commutative rings. (The ring library was originally developed to make quick progress toward the foundations of modern algebraic geometry.) So in this section we will work with commutative (semi)rings. Ideals of <code class="docutils literal notranslate"><span class="pre">R</span></code> are defined as submodules of <code class="docutils literal notranslate"><span class="pre">R</span></code> seen as <code class="docutils literal notranslate"><span class="pre">R</span></code>-modules. Modules will be covered later in a chapter on linear algebra, but this implementation detail can mostly be safely ignored since most (but not all) relevant lemmas are restated in the special context of ideals. But anonymous projection notation won’t always work as expected. For instance, one cannot replace <code class="docutils literal notranslate"><span class="pre">Ideal.Quotient.mk</span> <span class="pre">I</span></code> by <code class="docutils literal notranslate"><span class="pre">I.Quotient.mk</span></code> in the snippet below because the parser immediately replaces <code class="docutils literal notranslate"><span class="pre">Ideal</span> <span class="pre">R</span></code> with <code class="docutils literal notranslate"><span class="pre">Submodule</span> <span class="pre">R</span> <span class="pre">R</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">R</span><span class="bp">⧸</span><span class="n">I</span> <span class="o">:=</span> <span class="n">Ideal.Quotient.mk</span> <span class="n">I</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">}</span> <span class="o">{</span><span class="n">I</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="o">:</span> <span class="n">Ideal.Quotient.mk</span> <span class="n">I</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">0</span> <span class="bp">↔</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">I</span> <span class="o">:=</span> <span class="n">Ideal.Quotient.eq_zero_iff_mem</span> </pre></div> </div> <p>The universal property of quotient rings is <code class="docutils literal notranslate"><span class="pre">Ideal.Quotient.lift</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">S</span><span class="o">]</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">S</span><span class="o">)</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">≤</span> <span class="n">RingHom.ker</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">I</span> <span class="bp">→+*</span> <span class="n">S</span> <span class="o">:=</span> <span class="n">Ideal.Quotient.lift</span> <span class="n">I</span> <span class="n">f</span> <span class="n">H</span> </pre></div> </div> <p>In particular it leads to the first isomorphism theorem for rings.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">S</span><span class="o">](</span><span class="n">f</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">S</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">RingHom.ker</span> <span class="n">f</span> <span class="bp">≃+*</span> <span class="n">f.range</span> <span class="o">:=</span> <span class="n">RingHom.quotientKerEquivRange</span> <span class="n">f</span> </pre></div> </div> <p>Ideals form a complete lattice structure with the inclusion relation, as well as a semiring structure. These two structures interact nicely.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">I</span> <span class="n">J</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">J</span> <span class="bp">=</span> <span class="n">I</span> <span class="bp">⊔</span> <span class="n">J</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">R</span><span class="o">}</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">J</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">I</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">b</span> <span class="bp">∈</span> <span class="n">J</span><span class="o">,</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">Submodule.mem_sup</span><span class="o">]</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">*</span> <span class="n">J</span> <span class="bp">≤</span> <span class="n">J</span> <span class="o">:=</span> <span class="n">Ideal.mul_le_left</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">*</span> <span class="n">J</span> <span class="bp">≤</span> <span class="n">I</span> <span class="o">:=</span> <span class="n">Ideal.mul_le_right</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">*</span> <span class="n">J</span> <span class="bp">≤</span> <span class="n">I</span> <span class="bp">⊓</span> <span class="n">J</span> <span class="o">:=</span> <span class="n">Ideal.mul_le_inf</span> </pre></div> </div> <p>One can use ring morphisms to push ideals forward and pull them back using <code class="docutils literal notranslate"><span class="pre">Ideal.map</span></code> and <code class="docutils literal notranslate"><span class="pre">Ideal.comap</span></code>, respectively. As usual, the latter is more convenient to use since it does not involve an existential quantifier. This explains why it is used to state the condition that allows us to build morphisms between quotient rings.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">S</span><span class="o">]</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">J</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">S</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">S</span><span class="o">)</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">≤</span> <span class="n">Ideal.comap</span> <span class="n">f</span> <span class="n">J</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">I</span> <span class="bp">→+*</span> <span class="n">S</span> <span class="bp">⧸</span> <span class="n">J</span> <span class="o">:=</span> <span class="n">Ideal.quotientMap</span> <span class="n">J</span> <span class="n">f</span> <span class="n">H</span> </pre></div> </div> <p>One subtle point is that the type <code class="docutils literal notranslate"><span class="pre">R</span> <span class="pre">⧸</span> <span class="pre">I</span></code> really depends on <code class="docutils literal notranslate"><span class="pre">I</span></code> (up to definitional equality), so having a proof that two ideals <code class="docutils literal notranslate"><span class="pre">I</span></code> and <code class="docutils literal notranslate"><span class="pre">J</span></code> are equal is not enough to make the corresponding quotients equal. However, the universal properties do provide an isomorphism in this case.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">I</span> <span class="n">J</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">=</span> <span class="n">J</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">I</span> <span class="bp">≃+*</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">J</span> <span class="o">:=</span> <span class="n">Ideal.quotEquivOfEq</span> <span class="n">h</span> </pre></div> </div> <p>We can now present the Chinese remainder isomorphism as an example. Pay attention to the difference between the indexed infimum symbol <code class="docutils literal notranslate"><span class="pre">⨅</span></code> and the big product of types symbol <code class="docutils literal notranslate"><span class="pre">Π</span></code>. Depending on your font, those can be pretty hard to distinguish.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">ι</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span> <span class="n">j</span><span class="o">,</span> <span class="n">i</span> <span class="bp">≠</span> <span class="n">j</span> <span class="bp">→</span> <span class="n">IsCoprime</span> <span class="o">(</span><span class="n">f</span> <span class="n">i</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">j</span><span class="o">))</span> <span class="o">:</span> <span class="o">(</span><span class="n">R</span> <span class="bp">⧸</span> <span class="bp">⨅</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="n">i</span><span class="o">)</span> <span class="bp">≃+*</span> <span class="bp">Π</span> <span class="n">i</span><span class="o">,</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">f</span> <span class="n">i</span> <span class="o">:=</span> <span class="n">Ideal.quotientInfRingEquivPiQuotient</span> <span class="n">f</span> <span class="n">hf</span> </pre></div> </div> <p>The elementary version of the Chinese remainder theorem, a statement about <code class="docutils literal notranslate"><span class="pre">Zmod</span></code>, can be easily deduced from the previous one:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">BigOperators</span> <span class="n">PiNotation</span> <span class="kd">example</span> <span class="o">{</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">ι</span><span class="o">]</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">coprime</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span> <span class="n">j</span><span class="o">,</span> <span class="n">i</span> <span class="bp">≠</span> <span class="n">j</span> <span class="bp">→</span> <span class="o">(</span><span class="n">a</span> <span class="n">i</span><span class="o">)</span><span class="bp">.</span><span class="n">Coprime</span> <span class="o">(</span><span class="n">a</span> <span class="n">j</span><span class="o">))</span> <span class="o">:</span> <span class="n">ZMod</span> <span class="o">(</span><span class="bp">∏</span> <span class="n">i</span><span class="o">,</span> <span class="n">a</span> <span class="n">i</span><span class="o">)</span> <span class="bp">≃+*</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="n">ZMod</span> <span class="o">(</span><span class="n">a</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="n">ZMod.prodEquivPi</span> <span class="n">a</span> <span class="n">coprime</span> </pre></div> </div> <p>As a series of exercises, we will reprove the Chinese remainder theorem in the general case.</p> <p>We first need to define the map appearing in the theorem, as a ring morphism, using the universal property of quotient rings.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">ι</span> <span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="kn">open</span> <span class="n">Ideal</span> <span class="n">Quotient</span> <span class="n">Function</span> <span class="k">#check</span> <span class="k">Pi</span><span class="bp">.</span><span class="n">ringHom</span> <span class="k">#check</span> <span class="n">ker_Pi_Quotient_mk</span> <span class="sd">/-- The homomorphism from ``R ⧸ ⨅ i, I i`` to ``Π i, R ⧸ I i`` featured in the Chinese</span> <span class="sd"> Remainder Theorem. -/</span> <span class="kd">def</span> <span class="n">chineseMap</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">R</span> <span class="bp">⧸</span> <span class="bp">⨅</span> <span class="n">i</span><span class="o">,</span> <span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="bp">→+*</span> <span class="bp">Π</span> <span class="n">i</span><span class="o">,</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">I</span> <span class="n">i</span> <span class="o">:=</span> <span class="gr">sorry</span> </pre></div> </div> <p>Make sure the following next two lemmas can be proven by <code class="docutils literal notranslate"><span class="pre">rfl</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span> <span class="n">chineseMap_mk</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">chineseMap</span> <span class="n">I</span> <span class="o">(</span><span class="n">Quotient.mk</span> <span class="n">_</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="k">fun</span> <span class="n">i</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">↦</span> <span class="n">Ideal.Quotient.mk</span> <span class="o">(</span><span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="n">x</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">lemma</span> <span class="n">chineseMap_mk'</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">i</span> <span class="o">:</span> <span class="n">ι</span><span class="o">)</span> <span class="o">:</span> <span class="n">chineseMap</span> <span class="n">I</span> <span class="o">(</span><span class="n">mk</span> <span class="n">_</span> <span class="n">x</span><span class="o">)</span> <span class="n">i</span> <span class="bp">=</span> <span class="n">mk</span> <span class="o">(</span><span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="n">x</span> <span class="o">:=</span> <span class="gr">sorry</span> </pre></div> </div> <p>The next lemma proves the easy half of the Chinese remainder theorem, without any assumption on the family of ideals. The proof is less than one line long.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">injective_lift_iff</span> <span class="kd">lemma</span> <span class="n">chineseMap_inj</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">Injective</span> <span class="o">(</span><span class="n">chineseMap</span> <span class="n">I</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> </pre></div> </div> <p>We are now ready for the heart of the theorem, which will show the surjectivity of our <code class="docutils literal notranslate"><span class="pre">chineseMap</span></code>. First we need to know the different ways one can express the coprimality (also called co-maximality assumption). Only the first two will be needed below.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">IsCoprime</span> <span class="k">#check</span> <span class="n">isCoprime_iff_add</span> <span class="k">#check</span> <span class="n">isCoprime_iff_exists</span> <span class="k">#check</span> <span class="n">isCoprime_iff_sup_eq</span> <span class="k">#check</span> <span class="n">isCoprime_iff_codisjoint</span> </pre></div> </div> <p>We take the opportunity to use induction on <code class="docutils literal notranslate"><span class="pre">Finset</span></code>. Relevant lemmas on <code class="docutils literal notranslate"><span class="pre">Finset</span></code> are given below. Remember that the <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic work for semirings and that the ideals of a ring form a semiring.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">Finset.mem_insert_of_mem</span> <span class="k">#check</span> <span class="n">Finset.mem_insert_self</span> <span class="kd">theorem</span> <span class="n">isCoprime_Inf</span> <span class="o">{</span><span class="n">I</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="o">{</span><span class="n">J</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ι</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">j</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">IsCoprime</span> <span class="n">I</span> <span class="o">(</span><span class="n">J</span> <span class="n">j</span><span class="o">))</span> <span class="o">:</span> <span class="n">IsCoprime</span> <span class="n">I</span> <span class="o">(</span><span class="bp">⨅</span> <span class="n">j</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">J</span> <span class="n">j</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">classical</span> <span class="n">simp_rw</span> <span class="o">[</span><span class="n">isCoprime_iff_add</span><span class="o">]</span> <span class="n">at</span> <span class="bp">*</span> <span class="n">induction</span> <span class="n">s</span> <span class="n">using</span> <span class="n">Finset.induction</span> <span class="k">with</span> <span class="bp">|</span> <span class="n">empty</span> <span class="bp">=></span> <span class="n">simp</span> <span class="bp">|</span> <span class="bp">@</span><span class="n">insert</span> <span class="n">i</span> <span class="n">s</span> <span class="n">_</span> <span class="n">hs</span> <span class="bp">=></span> <span class="n">rw</span> <span class="o">[</span><span class="n">Finset.iInf_insert</span><span class="o">,</span> <span class="n">inf_comm</span><span class="o">,</span> <span class="n">one_eq_top</span><span class="o">,</span> <span class="n">eq_top_iff</span><span class="o">,</span> <span class="bp">←</span> <span class="n">one_eq_top</span><span class="o">]</span> <span class="n">set</span> <span class="n">K</span> <span class="o">:=</span> <span class="bp">⨅</span> <span class="n">j</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">J</span> <span class="n">j</span> <span class="k">calc</span> <span class="mi">1</span> <span class="bp">=</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">K</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">K</span><span class="bp">*</span><span class="o">(</span><span class="n">I</span> <span class="bp">+</span> <span class="n">J</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">=</span> <span class="o">(</span><span class="mi">1</span><span class="bp">+</span><span class="n">K</span><span class="o">)</span><span class="bp">*</span><span class="n">I</span> <span class="bp">+</span> <span class="n">K</span><span class="bp">*</span><span class="n">J</span> <span class="n">i</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">≤</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">K</span> <span class="bp">⊓</span> <span class="n">J</span> <span class="n">i</span> <span class="o">:=</span> <span class="gr">sorry</span> </pre></div> </div> <p>We can now prove surjectivity of the map appearing in the Chinese remainder theorem.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span> <span class="n">chineseMap_surj</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">ι</span><span class="o">]</span> <span class="o">{</span><span class="n">I</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="o">(</span><span class="n">hI</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span> <span class="n">j</span><span class="o">,</span> <span class="n">i</span> <span class="bp">≠</span> <span class="n">j</span> <span class="bp">→</span> <span class="n">IsCoprime</span> <span class="o">(</span><span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="o">(</span><span class="n">I</span> <span class="n">j</span><span class="o">))</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="o">(</span><span class="n">chineseMap</span> <span class="n">I</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">classical</span> <span class="n">intro</span> <span class="n">g</span> <span class="n">choose</span> <span class="n">f</span> <span class="n">hf</span> <span class="n">using</span> <span class="k">fun</span> <span class="n">i</span> <span class="bp">↦</span> <span class="n">Ideal.Quotient.mk_surjective</span> <span class="o">(</span><span class="n">g</span> <span class="n">i</span><span class="o">)</span> <span class="k">have</span> <span class="n">key</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">e</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="n">mk</span> <span class="o">(</span><span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="n">e</span> <span class="bp">=</span> <span class="mi">1</span> <span class="bp">∧</span> <span class="bp">∀</span> <span class="n">j</span><span class="o">,</span> <span class="n">j</span> <span class="bp">≠</span> <span class="n">i</span> <span class="bp">→</span> <span class="n">mk</span> <span class="o">(</span><span class="n">I</span> <span class="n">j</span><span class="o">)</span> <span class="n">e</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">i</span> <span class="k">have</span> <span class="n">hI'</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">j</span> <span class="bp">∈</span> <span class="o">({</span><span class="n">i</span><span class="o">}</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ι</span><span class="o">)</span><span class="bp">ᶜ</span><span class="o">,</span> <span class="n">IsCoprime</span> <span class="o">(</span><span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="o">(</span><span class="n">I</span> <span class="n">j</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="gr">sorry</span> <span class="n">choose</span> <span class="n">e</span> <span class="n">he</span> <span class="n">using</span> <span class="n">key</span> <span class="n">use</span> <span class="n">mk</span> <span class="n">_</span> <span class="o">(</span><span class="bp">∑</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="n">i</span><span class="bp">*</span><span class="n">e</span> <span class="n">i</span><span class="o">)</span> <span class="gr">sorry</span> </pre></div> </div> <p>Now all the pieces come together in the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kd">def</span> <span class="n">chineseIso</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">ι</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span> <span class="n">j</span><span class="o">,</span> <span class="n">i</span> <span class="bp">≠</span> <span class="n">j</span> <span class="bp">→</span> <span class="n">IsCoprime</span> <span class="o">(</span><span class="n">f</span> <span class="n">i</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">j</span><span class="o">))</span> <span class="o">:</span> <span class="o">(</span><span class="n">R</span> <span class="bp">⧸</span> <span class="bp">⨅</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="n">i</span><span class="o">)</span> <span class="bp">≃+*</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">f</span> <span class="n">i</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">Equiv.ofBijective</span> <span class="n">_</span> <span class="o">⟨</span><span class="n">chineseMap_inj</span> <span class="n">f</span><span class="o">,</span> <span class="n">chineseMap_surj</span> <span class="n">hf</span><span class="o">⟩,</span> <span class="n">chineseMap</span> <span class="n">f</span> <span class="k">with</span> <span class="o">}</span> </pre></div> </div> </section> <section id="algebras-and-polynomials"> <h3><span class="section-number">8.2.3. </span>Algebras and polynomials<a class="headerlink" href="#algebras-and-polynomials" title="Permalink to this heading"></a></h3> <p>Given a commutative (semi)ring <code class="docutils literal notranslate"><span class="pre">R</span></code>, an <em>algebra over ``R``</em> is a semiring <code class="docutils literal notranslate"><span class="pre">A</span></code> equipped with a ring morphism whose image commutes with every element of <code class="docutils literal notranslate"><span class="pre">A</span></code>. This is encoded as a type class <code class="docutils literal notranslate"><span class="pre">Algebra</span> <span class="pre">R</span> <span class="pre">A</span></code>. The morphism from <code class="docutils literal notranslate"><span class="pre">R</span></code> to <code class="docutils literal notranslate"><span class="pre">A</span></code> is called the structure map and is denoted <code class="docutils literal notranslate"><span class="pre">algebraMap</span> <span class="pre">R</span> <span class="pre">A</span> <span class="pre">:</span> <span class="pre">R</span> <span class="pre">→*+</span> <span class="pre">A</span></code> in Lean. Multiplication of <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">:</span> <span class="pre">A</span></code> by <code class="docutils literal notranslate"><span class="pre">algebraMap</span> <span class="pre">R</span> <span class="pre">A</span> <span class="pre">r</span></code> for some <code class="docutils literal notranslate"><span class="pre">r</span> <span class="pre">:</span> <span class="pre">R</span></code> is called the scalar multiplication of <code class="docutils literal notranslate"><span class="pre">a</span></code> by <code class="docutils literal notranslate"><span class="pre">r</span></code> and denoted by <code class="docutils literal notranslate"><span class="pre">r</span> <span class="pre">•</span> <span class="pre">a</span></code>. Note that this notion of algebra is sometimes called an <em>associative unital algebra</em> to emphasize the existence of more general notions of algebra.</p> <p>The fact that <code class="docutils literal notranslate"><span class="pre">algebraMap</span> <span class="pre">R</span> <span class="pre">A</span></code> is ring morphism packages together a lot of properties of scalar multiplication, such as the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">A</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">A</span><span class="o">]</span> <span class="o">[</span><span class="n">Algebra</span> <span class="n">R</span> <span class="n">A</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="n">r'</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">A</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">r</span> <span class="bp">+</span> <span class="n">r'</span><span class="o">)</span> <span class="bp">•</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">r</span> <span class="bp">•</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">r'</span> <span class="bp">•</span> <span class="n">a</span> <span class="o">:=</span> <span class="n">add_smul</span> <span class="n">r</span> <span class="n">r'</span> <span class="n">a</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">A</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">A</span><span class="o">]</span> <span class="o">[</span><span class="n">Algebra</span> <span class="n">R</span> <span class="n">A</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="n">r'</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">A</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">r</span> <span class="bp">*</span> <span class="n">r'</span><span class="o">)</span> <span class="bp">•</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">r</span> <span class="bp">•</span> <span class="n">r'</span> <span class="bp">•</span> <span class="n">a</span> <span class="o">:=</span> <span class="n">mul_smul</span> <span class="n">r</span> <span class="n">r'</span> <span class="n">a</span> </pre></div> </div> <p>The morphisms between two <code class="docutils literal notranslate"><span class="pre">R</span></code>-algebras <code class="docutils literal notranslate"><span class="pre">A</span></code> and <code class="docutils literal notranslate"><span class="pre">B</span></code> are ring morphisms which commute with scalar multiplication by elements of <code class="docutils literal notranslate"><span class="pre">R</span></code>. They are bundled morphisms with type <code class="docutils literal notranslate"><span class="pre">AlgHom</span> <span class="pre">R</span> <span class="pre">A</span> <span class="pre">B</span></code>, which is denoted by <code class="docutils literal notranslate"><span class="pre">A</span> <span class="pre">→ₐ[R]</span> <span class="pre">B</span></code>.</p> <p>Important examples of non-commutative algebras include algebras of endomorphisms and algebras of square matrices, both of which will be covered in the chapter on linear algebra. In this chapter we will discuss one of the most important examples of a commutative algebra, namely, polynomial algebras.</p> <p>The algebra of univariate polynomials with coefficients in <code class="docutils literal notranslate"><span class="pre">R</span></code> is called <code class="docutils literal notranslate"><span class="pre">Polynomial</span> <span class="pre">R</span></code>, which can be written as <code class="docutils literal notranslate"><span class="pre">R[X]</span></code> as soon as one opens the <code class="docutils literal notranslate"><span class="pre">Polynomial</span></code> namespace. The algebra structure map from <code class="docutils literal notranslate"><span class="pre">R</span></code> to <code class="docutils literal notranslate"><span class="pre">R[X]</span></code> is denoted by <code class="docutils literal notranslate"><span class="pre">C</span></code>, which stands for “constant” since the corresponding polynomial functions are always constant. The indeterminate is denoted by <code class="docutils literal notranslate"><span class="pre">X</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Polynomial</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]</span> <span class="o">:=</span> <span class="n">X</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:=</span> <span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">r</span> </pre></div> </div> <p>In the first example above, it is crucial that we give Lean the expected type since it cannot be determined from the body of the definition. In the second example, the target polynomial algebra can be inferred from our use of <code class="docutils literal notranslate"><span class="pre">C</span> <span class="pre">r</span></code> since the type of <code class="docutils literal notranslate"><span class="pre">r</span></code> is known.</p> <p>Because <code class="docutils literal notranslate"><span class="pre">C</span></code> is a ring morphism from <code class="docutils literal notranslate"><span class="pre">R</span></code> to <code class="docutils literal notranslate"><span class="pre">R[X]</span></code>, we can use all ring morphisms lemmas such as <code class="docutils literal notranslate"><span class="pre">map_zero</span></code>, <code class="docutils literal notranslate"><span class="pre">map_one</span></code>, <code class="docutils literal notranslate"><span class="pre">map_mul</span></code>, and <code class="docutils literal notranslate"><span class="pre">map_pow</span></code> before computing in the ring <code class="docutils literal notranslate"><span class="pre">R[X]</span></code>. For example:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">+</span> <span class="n">C</span> <span class="n">r</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">r</span><span class="o">)</span> <span class="bp">=</span> <span class="n">X</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">-</span> <span class="n">C</span> <span class="o">(</span><span class="n">r</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">C.map_pow</span><span class="o">]</span> <span class="n">ring</span> </pre></div> </div> <p>You can access coefficients using <code class="docutils literal notranslate"><span class="pre">Polynomial.coeff</span></code></p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">](</span><span class="n">r</span><span class="o">:</span><span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">C</span> <span class="n">r</span><span class="o">)</span><span class="bp">.</span><span class="n">coeff</span> <span class="mi">0</span> <span class="bp">=</span> <span class="n">r</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">+</span> <span class="mi">2</span><span class="bp">*</span><span class="n">X</span> <span class="bp">+</span> <span class="n">C</span> <span class="mi">3</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="bp">.</span><span class="n">coeff</span> <span class="mi">1</span> <span class="bp">=</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> </pre></div> </div> <p>Defining the degree of a polynomial is always tricky because of the special case of the zero polynomial. Mathlib has two variants: <code class="docutils literal notranslate"><span class="pre">Polynomial.natDegree</span> <span class="pre">:</span> <span class="pre">R[X]</span> <span class="pre">→</span> <span class="pre">ℕ</span></code> assigns degree <code class="docutils literal notranslate"><span class="pre">0</span></code> to the zero polynomial, and <code class="docutils literal notranslate"><span class="pre">Polynomial.degree</span> <span class="pre">:</span> <span class="pre">R[X]</span> <span class="pre">→</span> <span class="pre">WithBot</span> <span class="pre">ℕ</span></code> assigns <code class="docutils literal notranslate"><span class="pre">⊥</span></code>. In the latter, <code class="docutils literal notranslate"><span class="pre">WithBot</span> <span class="pre">ℕ</span></code> can be seen as <code class="docutils literal notranslate"><span class="pre">ℕ</span> <span class="pre">∪</span> <span class="pre">{-∞}</span></code>, except that <code class="docutils literal notranslate"><span class="pre">-∞</span></code> is denoted <code class="docutils literal notranslate"><span class="pre">⊥</span></code>, the same symbol as the bottom element in a complete lattice. This special value is used as the degree of the zero polynomial, and it is absorbent for addition. (It is almost absorbent for multiplication, except that <code class="docutils literal notranslate"><span class="pre">⊥</span> <span class="pre">*</span> <span class="pre">0</span> <span class="pre">=</span> <span class="pre">0</span></code>.)</p> <p>Morally speaking, the <code class="docutils literal notranslate"><span class="pre">degree</span></code> version is the correct one. For instance, it allows us to state the expected formula for the degree of a product (assuming the base ring has no zero divisor).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Semiring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">NoZeroDivisors</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">p</span> <span class="n">q</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]}</span> <span class="o">:</span> <span class="n">degree</span> <span class="o">(</span><span class="n">p</span> <span class="bp">*</span> <span class="n">q</span><span class="o">)</span> <span class="bp">=</span> <span class="n">degree</span> <span class="n">p</span> <span class="bp">+</span> <span class="n">degree</span> <span class="n">q</span> <span class="o">:=</span> <span class="n">Polynomial.degree_mul</span> </pre></div> </div> <p>Whereas the version for <code class="docutils literal notranslate"><span class="pre">natDegree</span></code> needs to assume non-zero polynomials.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Semiring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">NoZeroDivisors</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">p</span> <span class="n">q</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]}</span> <span class="o">(</span><span class="n">hp</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">hq</span> <span class="o">:</span> <span class="n">q</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">natDegree</span> <span class="o">(</span><span class="n">p</span> <span class="bp">*</span> <span class="n">q</span><span class="o">)</span> <span class="bp">=</span> <span class="n">natDegree</span> <span class="n">p</span> <span class="bp">+</span> <span class="n">natDegree</span> <span class="n">q</span> <span class="o">:=</span> <span class="n">Polynomial.natDegree_mul</span> <span class="n">hp</span> <span class="n">hq</span> </pre></div> </div> <p>However, <code class="docutils literal notranslate"><span class="pre">ℕ</span></code> is much nicer to use than <code class="docutils literal notranslate"><span class="pre">WithBot</span> <span class="pre">ℕ</span></code>, so Mathlib makes both versions available and provides lemmas to convert between them. Also, <code class="docutils literal notranslate"><span class="pre">natDegree</span></code> is the more convenient definition to use when computing the degree of a composition. Composition of polynomial is <code class="docutils literal notranslate"><span class="pre">Polynomial.comp</span></code> and we have:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Semiring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">NoZeroDivisors</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">p</span> <span class="n">q</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]}</span> <span class="o">:</span> <span class="n">natDegree</span> <span class="o">(</span><span class="n">comp</span> <span class="n">p</span> <span class="n">q</span><span class="o">)</span> <span class="bp">=</span> <span class="n">natDegree</span> <span class="n">p</span> <span class="bp">*</span> <span class="n">natDegree</span> <span class="n">q</span> <span class="o">:=</span> <span class="n">Polynomial.natDegree_comp</span> </pre></div> </div> <p>Polynomials give rise to polynomial functions: any polynomial can be evaluated on <code class="docutils literal notranslate"><span class="pre">R</span></code> using <code class="docutils literal notranslate"><span class="pre">Polynomial.eval</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">P</span><span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:=</span> <span class="n">P.eval</span> <span class="n">x</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">r</span><span class="o">)</span><span class="bp">.</span><span class="n">eval</span> <span class="n">r</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> </pre></div> </div> <p>In particular, there is a predicate, <code class="docutils literal notranslate"><span class="pre">IsRoot</span></code>, that hold of elements <code class="docutils literal notranslate"><span class="pre">r</span></code> in <code class="docutils literal notranslate"><span class="pre">R</span></code> where a polynomial vanishes.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">P</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">IsRoot</span> <span class="n">P</span> <span class="n">r</span> <span class="bp">↔</span> <span class="n">P.eval</span> <span class="n">r</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">Iff.rfl</span> </pre></div> </div> <p>We would like to say that, assuming <code class="docutils literal notranslate"><span class="pre">R</span></code> has no zero divisor, a polynomial has at most as many roots as its degree, where the roots are counted with multiplicities. But once again the case of the zero polynomial is painful. So Mathlib defines <code class="docutils literal notranslate"><span class="pre">Polynomial.roots</span></code> to send a polynomial <code class="docutils literal notranslate"><span class="pre">P</span></code> to a multiset, i.e. the finite set that is defined to be empty if <code class="docutils literal notranslate"><span class="pre">P</span></code> is zero and the roots of <code class="docutils literal notranslate"><span class="pre">P</span></code>, with multiplicities, otherwise. This is defined only when the underlying ring is a domain since otherwise the definition does not have good properties.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">IsDomain</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">r</span><span class="o">)</span><span class="bp">.</span><span class="n">roots</span> <span class="bp">=</span> <span class="o">{</span><span class="n">r</span><span class="o">}</span> <span class="o">:=</span> <span class="n">roots_X_sub_C</span> <span class="n">r</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">IsDomain</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">):</span> <span class="o">((</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">r</span><span class="o">)</span><span class="bp">^</span><span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="n">roots</span> <span class="bp">=</span> <span class="n">n</span> <span class="bp">•</span> <span class="o">{</span><span class="n">r</span><span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> </pre></div> </div> <p>Both <cite>Polynomial.eval</cite> and <cite>Polynomial.roots</cite> consider only the coefficients ring. They do not allow us to say that <code class="docutils literal notranslate"><span class="pre">X^2</span> <span class="pre">-</span> <span class="pre">2</span> <span class="pre">:</span> <span class="pre">ℚ[X]</span></code> has a root in <code class="docutils literal notranslate"><span class="pre">ℝ</span></code> or that <code class="docutils literal notranslate"><span class="pre">X^2</span> <span class="pre">+</span> <span class="pre">1</span> <span class="pre">:</span> <span class="pre">ℝ[X]</span></code> has a root in <code class="docutils literal notranslate"><span class="pre">ℂ</span></code>. For this, we need <code class="docutils literal notranslate"><span class="pre">Polynomial.aeval</span></code>, which will evaluate <code class="docutils literal notranslate"><span class="pre">P</span> <span class="pre">:</span> <span class="pre">R[X]</span></code> in any <code class="docutils literal notranslate"><span class="pre">R</span></code>-algebra. More precisely, given a semiring <code class="docutils literal notranslate"><span class="pre">A</span></code> and an instance of <code class="docutils literal notranslate"><span class="pre">Algebra</span> <span class="pre">R</span> <span class="pre">A</span></code>, <code class="docutils literal notranslate"><span class="pre">Polynomial.aeval</span></code> sends every element of <code class="docutils literal notranslate"><span class="pre">a</span></code> along the <code class="docutils literal notranslate"><span class="pre">R</span></code>-algebra morphism of evaluation at <code class="docutils literal notranslate"><span class="pre">a</span></code>. Since <code class="docutils literal notranslate"><span class="pre">AlgHom</span></code> has a coercion to functions, one can apply it to a polynomial. But <code class="docutils literal notranslate"><span class="pre">aeval</span></code> does not have a polynomial as an argument, so one cannot use dot notation like in <code class="docutils literal notranslate"><span class="pre">P.eval</span></code> above.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">aeval</span> <span class="n">Complex.I</span> <span class="o">(</span><span class="n">X</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> </pre></div> </div> <p>The function corresponding to <code class="docutils literal notranslate"><span class="pre">roots</span></code> in this context is <code class="docutils literal notranslate"><span class="pre">aroots</span></code> which takes a polynomial and then an algebra and outputs a multiset (with the same caveat about the zero polynomial as for <code class="docutils literal notranslate"><span class="pre">roots</span></code>).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Complex</span> <span class="n">Polynomial</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">aroots</span> <span class="o">(</span><span class="n">X</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="n">ℂ</span> <span class="bp">=</span> <span class="o">{</span><span class="n">Complex.I</span><span class="o">,</span> <span class="bp">-</span><span class="n">I</span><span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">suffices</span> <span class="n">roots</span> <span class="o">(</span><span class="n">X</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℂ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="bp">=</span> <span class="o">{</span><span class="n">I</span><span class="o">,</span> <span class="bp">-</span><span class="n">I</span><span class="o">}</span> <span class="kd">by</span> <span class="n">simpa</span> <span class="o">[</span><span class="n">aroots_def</span><span class="o">]</span> <span class="k">have</span> <span class="n">factored</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℂ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="bp">=</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">I</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="o">(</span><span class="bp">-</span><span class="n">I</span><span class="o">))</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">C_neg</span><span class="o">]</span> <span class="n">linear_combination</span> <span class="k">show</span> <span class="o">(</span><span class="n">C</span> <span class="n">I</span> <span class="bp">*</span> <span class="n">C</span> <span class="n">I</span> <span class="o">:</span> <span class="n">ℂ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="bp">=</span> <span class="bp">-</span><span class="mi">1</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="bp">←</span> <span class="n">C_mul</span><span class="o">]</span> <span class="k">have</span> <span class="n">p_ne_zero</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">I</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="o">(</span><span class="bp">-</span><span class="n">I</span><span class="o">))</span> <span class="bp">≠</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">H</span> <span class="n">apply_fun</span> <span class="n">eval</span> <span class="mi">0</span> <span class="n">at</span> <span class="n">H</span> <span class="n">simp</span> <span class="o">[</span><span class="n">eval</span><span class="o">]</span> <span class="n">at</span> <span class="n">H</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">factored</span><span class="o">,</span> <span class="n">roots_mul</span> <span class="n">p_ne_zero</span><span class="o">,</span> <span class="n">roots_X_sub_C</span><span class="o">]</span> <span class="n">rfl</span> <span class="c1">-- Mathlib knows about D'Alembert-Gauss theorem: ``ℂ`` is algebraically closed.</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">IsAlgClosed</span> <span class="n">ℂ</span> <span class="o">:=</span> <span class="n">inferInstance</span> </pre></div> </div> <p>More generally, given an ring morphism <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">R</span> <span class="pre">→+*</span> <span class="pre">S</span></code> one can evaluate <code class="docutils literal notranslate"><span class="pre">P</span> <span class="pre">:</span> <span class="pre">R[X]</span></code> at a point in <code class="docutils literal notranslate"><span class="pre">S</span></code> using <code class="docutils literal notranslate"><span class="pre">Polynomial.eval₂</span></code>. This one produces an actual function from <code class="docutils literal notranslate"><span class="pre">R[X]</span></code> to <code class="docutils literal notranslate"><span class="pre">S</span></code> since it does not assume the existence of a <code class="docutils literal notranslate"><span class="pre">Algebra</span> <span class="pre">R</span> <span class="pre">S</span></code> instance, so dot notation works as you would expect.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">Complex.ofReal</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→+*</span> <span class="n">ℂ</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span><span class="bp">^</span><span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="bp">.</span><span class="n">eval₂</span> <span class="n">Complex.ofReal</span> <span class="n">Complex.I</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> </pre></div> </div> <p>Let us end by mentioning multivariate polynomials briefly. Given a commutative semiring <code class="docutils literal notranslate"><span class="pre">R</span></code>, the <code class="docutils literal notranslate"><span class="pre">R</span></code>-algebra of polynomials with coefficients in <code class="docutils literal notranslate"><span class="pre">R</span></code> and indeterminates indexed by a type <code class="docutils literal notranslate"><span class="pre">σ</span></code> is <code class="docutils literal notranslate"><span class="pre">MVPolynomial</span> <span class="pre">σ</span> <span class="pre">R</span></code>. Given <code class="docutils literal notranslate"><span class="pre">i</span> <span class="pre">:</span> <span class="pre">σ</span></code>, the corresponding polynomial is <code class="docutils literal notranslate"><span class="pre">MvPolynomial.X</span> <span class="pre">i</span></code>. (As usual, one can open the <code class="docutils literal notranslate"><span class="pre">MVPolynomial</span></code> namespace to shorten this to <code class="docutils literal notranslate"><span class="pre">X</span> <span class="pre">i</span></code>.) For instance, if we want two indeterminates we can use <code class="docutils literal notranslate"><span class="pre">Fin</span> <span class="pre">2</span></code> as <code class="docutils literal notranslate"><span class="pre">σ</span></code> and write the polynomial defining the unit circle in <span class="math notranslate nohighlight">\(\mathbb{R}^2\)</span> as:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">MvPolynomial</span> <span class="kd">def</span> <span class="n">circleEquation</span> <span class="o">:</span> <span class="n">MvPolynomial</span> <span class="o">(</span><span class="n">Fin</span> <span class="mi">2</span><span class="o">)</span> <span class="n">ℝ</span> <span class="o">:=</span> <span class="n">X</span> <span class="mi">0</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">X</span> <span class="mi">1</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="mi">1</span> </pre></div> </div> <p>Recall that function application has a very high precedence so the expression above is read as <code class="docutils literal notranslate"><span class="pre">(X</span> <span class="pre">0)</span> <span class="pre">^</span> <span class="pre">2</span> <span class="pre">+</span> <span class="pre">(X</span> <span class="pre">1)</span> <span class="pre">^</span> <span class="pre">2</span> <span class="pre">-</span> <span class="pre">1</span></code>. We can evaluate it to make sure the point with coordinates <span class="math notranslate nohighlight">\((1, 0)\)</span> is on the circle. Recall the <code class="docutils literal notranslate"><span class="pre">![...]</span></code> notation denotes elements of <code class="docutils literal notranslate"><span class="pre">Fin</span> <span class="pre">n</span> <span class="pre">→</span> <span class="pre">X</span></code> for some natural number <code class="docutils literal notranslate"><span class="pre">n</span></code> determined by the number of arguments and some type <code class="docutils literal notranslate"><span class="pre">X</span></code> determined by the type of arguments.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">MvPolynomial.eval</span> <span class="bp">!</span><span class="o">[</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">]</span> <span class="n">circleEquation</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">circleEquation</span><span class="o">]</span> </pre></div> </div> </section> </section> </section> </div> </div> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <a href="C07_Hierarchies.html" class="btn btn-neutral float-left" title="7. Hierarchies" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="C09_Topology.html" class="btn btn-neutral float-right" title="9. Topology" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> </div> <hr/> <div role="contentinfo"> <p>© Copyright 2020, Jeremy Avigad, Patrick Massot.</p> </div> Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. </footer> </div> </div> </section> </div> <script> jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); </script> </body> </html>
-
-
-
@@ -1,9 +1,10 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>8. Topology — Mathematics in Lean 0.1 documentation</title> <title>9. Topology — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
-
@@ -15,13 +16,14 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="9. Differential Calculus" href="C09_Differential_Calculus.html" /> <link rel="prev" title="7. Hierarchies" href="C07_Hierarchies.html" /> <link rel="next" title="10. Differential Calculus" href="C10_Differential_Calculus.html" /> <link rel="prev" title="8. Groups and Rings" href="C08_Groups_and_Rings.html" /> </head> <body class="wy-body-for-nav">
-
@@ -47,26 +49,27 @@<li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">8. Topology</a><ul> <li class="toctree-l2"><a class="reference internal" href="#filters">8.1. Filters</a></li> <li class="toctree-l2"><a class="reference internal" href="#metric-spaces">8.2. Metric spaces</a><ul> <li class="toctree-l3"><a class="reference internal" href="#convergence-and-continuity">8.2.1. Convergence and continuity</a></li> <li class="toctree-l3"><a class="reference internal" href="#balls-open-sets-and-closed-sets">8.2.2. Balls, open sets and closed sets</a></li> <li class="toctree-l3"><a class="reference internal" href="#compactness">8.2.3. Compactness</a></li> <li class="toctree-l3"><a class="reference internal" href="#uniformly-continuous-functions">8.2.4. Uniformly continuous functions</a></li> <li class="toctree-l3"><a class="reference internal" href="#completeness">8.2.5. Completeness</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">9. Topology</a><ul> <li class="toctree-l2"><a class="reference internal" href="#filters">9.1. Filters</a></li> <li class="toctree-l2"><a class="reference internal" href="#metric-spaces">9.2. Metric spaces</a><ul> <li class="toctree-l3"><a class="reference internal" href="#convergence-and-continuity">9.2.1. Convergence and continuity</a></li> <li class="toctree-l3"><a class="reference internal" href="#balls-open-sets-and-closed-sets">9.2.2. Balls, open sets and closed sets</a></li> <li class="toctree-l3"><a class="reference internal" href="#compactness">9.2.3. Compactness</a></li> <li class="toctree-l3"><a class="reference internal" href="#uniformly-continuous-functions">9.2.4. Uniformly continuous functions</a></li> <li class="toctree-l3"><a class="reference internal" href="#completeness">9.2.5. Completeness</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="#topological-spaces">8.3. Topological spaces</a><ul> <li class="toctree-l3"><a class="reference internal" href="#fundamentals">8.3.1. Fundamentals</a></li> <li class="toctree-l3"><a class="reference internal" href="#separation-and-countability">8.3.2. Separation and countability</a></li> <li class="toctree-l3"><a class="reference internal" href="#id5">8.3.3. Compactness</a></li> <li class="toctree-l2"><a class="reference internal" href="#topological-spaces">9.3. Topological spaces</a><ul> <li class="toctree-l3"><a class="reference internal" href="#fundamentals">9.3.1. Fundamentals</a></li> <li class="toctree-l3"><a class="reference internal" href="#separation-and-countability">9.3.2. Separation and countability</a></li> <li class="toctree-l3"><a class="reference internal" href="#id5">9.3.3. Compactness</a></li> </ul> </li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
@@ -86,9 +89,9 @@<div role="navigation" aria-label="Page navigation"> <ul class="wy-breadcrumbs"> <li><a href="index.html" class="icon icon-home"></a> »</li> <li><span class="section-number">8. </span>Topology</li> <li><span class="section-number">9. </span>Topology</li> <li class="wy-breadcrumbs-aside"> <a href="_sources/C08_Topology.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/C09_Topology.rst.txt" rel="nofollow"> View page source</a> </li> </ul> <hr/>
-
@@ -96,8 +99,8 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <span class="target" id="topology"></span><div class="section" id="index-0"> <span id="id1"></span><h1><span class="section-number">8. </span>Topology<a class="headerlink" href="#index-0" title="Permalink to this headline"></a></h1> <span class="target" id="topology"></span><section id="index-0"> <span id="id1"></span><h1><span class="section-number">9. </span>Topology<a class="headerlink" href="#index-0" title="Permalink to this heading"></a></h1> <p>Calculus is based on the concept of a function, which is used to model quantities that depend on one another. For example, it is common to study quantities that change over time.
-
@@ -119,7 +122,7 @@ and continuity in concrete instances.</p><p>Topological notions build on quite a few layers of mathematical structure. The first layer is naive set theory, as described in <a class="reference internal" href="C04_Sets_and_Functions.html#sets-and-functions"><span class="std std-numref">Chapter 4</span></a>. The next layer is the theory of <em>filters</em>, which we will describe in <a class="reference internal" href="#filters"><span class="std std-numref">Section 8.1</span></a>. The next layer is the theory of <em>filters</em>, which we will describe in <a class="reference internal" href="#filters"><span class="std std-numref">Section 9.1</span></a>. On top of that, we layer the theories of <em>topological spaces</em>, <em>metric spaces</em>, and a slightly more exotic intermediate notion called a <em>uniform space</em>.</p>
-
@@ -164,8 +167,8 @@ and simply note that the rest can be proved “in the same way.”Formalizing mathematics requires making the relevant notion of “sameness” fully explicit, and that is exactly what Bourbaki’s theory of filters manages to do.</p> <div class="section" id="filters"> <span id="index-1"></span><span id="id2"></span><h2><span class="section-number">8.1. </span>Filters<a class="headerlink" href="#filters" title="Permalink to this headline"></a></h2> <section id="filters"> <span id="index-1"></span><span id="id2"></span><h2><span class="section-number">9.1. </span>Filters<a class="headerlink" href="#filters" title="Permalink to this heading"></a></h2> <p>A <em>filter</em> on a type <code class="docutils literal notranslate"><span class="pre">X</span></code> is a collection of sets of <code class="docutils literal notranslate"><span class="pre">X</span></code> that satisfies three conditions that we will spell out below. The notion supports two related ideas:</p>
-
@@ -517,9 +520,9 @@ by definition, the assumption <code class="docutils literal notranslate"><span c<span class="gr">sorry</span> </pre></div> </div> </div> <div class="section" id="metric-spaces"> <span id="index-2"></span><span id="id3"></span><h2><span class="section-number">8.2. </span>Metric spaces<a class="headerlink" href="#metric-spaces" title="Permalink to this headline"></a></h2> </section> <section id="metric-spaces"> <span id="index-2"></span><span id="id3"></span><h2><span class="section-number">9.2. </span>Metric spaces<a class="headerlink" href="#metric-spaces" title="Permalink to this heading"></a></h2> <p>Examples in the previous section focus on sequences of real numbers. In this section we will go up a bit in generality and focus on metric spaces. A metric space is a type <code class="docutils literal notranslate"><span class="pre">X</span></code> equipped with a distance function <code class="docutils literal notranslate"><span class="pre">dist</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">ℝ</span></code> which is a generalization of the function <code class="docutils literal notranslate"><span class="pre">fun</span> <span class="pre">x</span> <span class="pre">y</span> <span class="pre">↦</span> <span class="pre">|x</span> <span class="pre">-</span> <span class="pre">y|</span></code> from the case where <code class="docutils literal notranslate"><span class="pre">X</span> <span class="pre">=</span> <span class="pre">ℝ</span></code>.</p>
-
@@ -537,8 +540,8 @@ the function <code class="docutils literal notranslate"><span class="pre">fun</sThey are called <code class="docutils literal notranslate"><span class="pre">EMetricSpace</span></code>, <code class="docutils literal notranslate"><span class="pre">PseudoMetricSpace</span></code> and <code class="docutils literal notranslate"><span class="pre">PseudoEMetricSpace</span></code> respectively (here “e” stands for “extended”).</p> <p>Note that our journey from <code class="docutils literal notranslate"><span class="pre">ℝ</span></code> to metric spaces jumped over the special case of normed spaces that also require linear algebra and will be explained as part of the calculus chapter.</p> <div class="section" id="convergence-and-continuity"> <h3><span class="section-number">8.2.1. </span>Convergence and continuity<a class="headerlink" href="#convergence-and-continuity" title="Permalink to this headline"></a></h3> <section id="convergence-and-continuity"> <h3><span class="section-number">9.2.1. </span>Convergence and continuity<a class="headerlink" href="#convergence-and-continuity" title="Permalink to this heading"></a></h3> <p>Using distance functions, we can already define convergent sequences and continuous functions between metric spaces. They are actually defined in a more general setting covered in the next section, but we have lemmas recasting the definition is terms of distances.</p>
-
@@ -625,9 +628,9 @@ and get our final proof, now bordering obfuscation.</p><span class="n">Metric.continuousAt_iff</span> </pre></div> </div> </div> <div class="section" id="balls-open-sets-and-closed-sets"> <h3><span class="section-number">8.2.2. </span>Balls, open sets and closed sets<a class="headerlink" href="#balls-open-sets-and-closed-sets" title="Permalink to this headline"></a></h3> </section> <section id="balls-open-sets-and-closed-sets"> <h3><span class="section-number">9.2.2. </span>Balls, open sets and closed sets<a class="headerlink" href="#balls-open-sets-and-closed-sets" title="Permalink to this heading"></a></h3> <p>Once we have a distance function, the most important geometric definitions are (open) balls and closed balls.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span>
-
@@ -682,9 +685,9 @@ argument so we can invoke <code class="docutils literal notranslate"><span class<span class="n">Metric.nhds_basis_closedBall.mem_iff</span> </pre></div> </div> </div> <div class="section" id="compactness"> <h3><span class="section-number">8.2.3. </span>Compactness<a class="headerlink" href="#compactness" title="Permalink to this headline"></a></h3> </section> <section id="compactness"> <h3><span class="section-number">9.2.3. </span>Compactness<a class="headerlink" href="#compactness" title="Permalink to this heading"></a></h3> <p>Compactness is an important topological notion. It distinguishes subsets of a metric space that enjoy the same kind of properties as segments in reals compared to other intervals:</p> <ul class="simple">
-
@@ -725,9 +728,9 @@ are deduced from more general versions, some of which will be discussed in later</pre></div> </div> <p>In a compact metric space any closed set is compact, this is <code class="docutils literal notranslate"><span class="pre">IsClosed.isCompact</span></code>.</p> </div> <div class="section" id="uniformly-continuous-functions"> <h3><span class="section-number">8.2.4. </span>Uniformly continuous functions<a class="headerlink" href="#uniformly-continuous-functions" title="Permalink to this headline"></a></h3> </section> <section id="uniformly-continuous-functions"> <h3><span class="section-number">9.2.4. </span>Uniformly continuous functions<a class="headerlink" href="#uniformly-continuous-functions" title="Permalink to this heading"></a></h3> <p>We now turn to uniformity notions on metric spaces : uniformly continuous functions, Cauchy sequences and completeness. Again those are defined in a more general context but we have lemmas in the metric name space to access their elementary definitions. We start with uniform continuity.</p>
-
@@ -756,9 +759,9 @@ of the distance function on <code class="docutils literal notranslate"><span cla<span class="gr">sorry</span> </pre></div> </div> </div> <div class="section" id="completeness"> <h3><span class="section-number">8.2.5. </span>Completeness<a class="headerlink" href="#completeness" title="Permalink to this headline"></a></h3> </section> <section id="completeness"> <h3><span class="section-number">9.2.5. </span>Completeness<a class="headerlink" href="#completeness" title="Permalink to this heading"></a></h3> <p>A Cauchy sequence in a metric space is a sequence whose terms get closer and closer to each other. There are a couple of equivalent ways to state that idea. In particular converging sequences are Cauchy. The converse is true only in so-called <em>complete</em>
-
@@ -847,12 +850,12 @@ define something inductively in the middle of a proof using <code class="docutil<span class="gr">sorry</span> </pre></div> </div> </div> </div> <div class="section" id="topological-spaces"> <span id="index-4"></span><span id="id4"></span><h2><span class="section-number">8.3. </span>Topological spaces<a class="headerlink" href="#topological-spaces" title="Permalink to this headline"></a></h2> <div class="section" id="fundamentals"> <h3><span class="section-number">8.3.1. </span>Fundamentals<a class="headerlink" href="#fundamentals" title="Permalink to this headline"></a></h3> </section> </section> <section id="topological-spaces"> <span id="index-4"></span><span id="id4"></span><h2><span class="section-number">9.3. </span>Topological spaces<a class="headerlink" href="#topological-spaces" title="Permalink to this heading"></a></h2> <section id="fundamentals"> <h3><span class="section-number">9.3.1. </span>Fundamentals<a class="headerlink" href="#fundamentals" title="Permalink to this heading"></a></h3> <p>We now go up in generality and introduce topological spaces. We will review the two main ways to define topological spaces and then explain how the category of topological spaces is much better behaved than the category of metric spaces. Note that we won’t be using Mathlib category theory here, only having
-
@@ -875,7 +878,7 @@ has to satisfy a number of axioms presented below (this collection is slightly r<span class="kd">example</span> <span class="o">{</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">ι</span><span class="o">]</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="n">s</span> <span class="n">i</span><span class="o">))</span> <span class="o">:</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">s</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="n">isOpen_iInter</span> <span class="n">hs</span> <span class="n">isOpen_iInter_of_finite</span> <span class="n">hs</span> </pre></div> </div> <p>Closed sets are then defined as sets whose complement is open. A function between topological spaces
-
@@ -894,12 +897,12 @@ be continuous in both direction if and only if the two structures have the sameon open sets. In Mathlib we frequently think of topological spaces as types equipped with a neighborhood filter <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">x</span></code> attached to each point <code class="docutils literal notranslate"><span class="pre">x</span></code> (the corresponding function <code class="docutils literal notranslate"><span class="pre">X</span> <span class="pre">→</span> <span class="pre">Filter</span> <span class="pre">X</span></code> satisfies certain conditions explained further down). Remember from the filters section that these gadget play two related roles. First <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">x</span></code> is seen as the generalized set of points of <code class="docutils literal notranslate"><span class="pre">X</span></code> these gadgets play two related roles. First <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">x</span></code> is seen as the generalized set of points of <code class="docutils literal notranslate"><span class="pre">X</span></code> that are close to <code class="docutils literal notranslate"><span class="pre">x</span></code>. And then it is seen as giving a way to say, for any predicate <code class="docutils literal notranslate"><span class="pre">P</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">Prop</span></code>, that this predicates holds for points that are close enough to <code class="docutils literal notranslate"><span class="pre">x</span></code>. Let us state that this predicate holds for points that are close enough to <code class="docutils literal notranslate"><span class="pre">x</span></code>. Let us state that <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">Y</span></code> is continuous at <code class="docutils literal notranslate"><span class="pre">x</span></code>. The purely filtery way is to say that the direct image under <code class="docutils literal notranslate"><span class="pre">f</span></code> of the generalized set of points that are close to <code class="docutils literal notranslate"><span class="pre">x</span></code> is contained in the generalized set of points that are close to <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">x</span></code>. Recall this spelled either <code class="docutils literal notranslate"><span class="pre">map</span> <span class="pre">f</span> <span class="pre">(𝓝</span> <span class="pre">x)</span> <span class="pre">≤</span> <span class="pre">𝓝</span> <span class="pre">(f</span> <span class="pre">x)</span></code> points that are close to <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">x</span></code>. Recall this is spelled either <code class="docutils literal notranslate"><span class="pre">map</span> <span class="pre">f</span> <span class="pre">(𝓝</span> <span class="pre">x)</span> <span class="pre">≤</span> <span class="pre">𝓝</span> <span class="pre">(f</span> <span class="pre">x)</span></code> or <code class="docutils literal notranslate"><span class="pre">Tendsto</span> <span class="pre">f</span> <span class="pre">(𝓝</span> <span class="pre">x)</span> <span class="pre">(𝓝</span> <span class="pre">(f</span> <span class="pre">x))</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">ContinuousAt</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">↔</span> <span class="n">map</span> <span class="n">f</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x</span><span class="o">)</span> <span class="bp">≤</span> <span class="bp">𝓝</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="n">Iff.rfl</span>
-
@@ -1040,9 +1043,9 @@ Let us explore that constraint “on paper” using notation <span class</div> <p>This ends our tour of how Mathlib thinks that topological spaces fix defects of the theory of metric spaces by being a more functorial theory and having a complete lattice structure for any fixed type.</p> </div> <div class="section" id="separation-and-countability"> <h3><span class="section-number">8.3.2. </span>Separation and countability<a class="headerlink" href="#separation-and-countability" title="Permalink to this headline"></a></h3> </section> <section id="separation-and-countability"> <h3><span class="section-number">9.3.2. </span>Separation and countability<a class="headerlink" href="#separation-and-countability" title="Permalink to this heading"></a></h3> <p>We saw that the category of topological spaces have very nice properties. The price to pay for this is existence of rather pathological topological spaces. There are a number of assumptions you can make on a topological space to ensure its behavior
-
@@ -1129,9 +1132,9 @@ of sets can be understood using sequences.</p><span class="n">mem_closure_iff_seq_limit</span> </pre></div> </div> </div> <div class="section" id="id5"> <h3><span class="section-number">8.3.3. </span>Compactness<a class="headerlink" href="#id5" title="Permalink to this headline"></a></h3> </section> <section id="id5"> <h3><span class="section-number">9.3.3. </span>Compactness<a class="headerlink" href="#id5" title="Permalink to this heading"></a></h3> <p>Let us now discuss how compactness is defined for topological spaces. As usual there are several ways to think about it and Mathlib goes for the filter version.</p> <p>We first need to define cluster points of filters. Given a filter <code class="docutils literal notranslate"><span class="pre">F</span></code> on a topological space <code class="docutils literal notranslate"><span class="pre">X</span></code>,
-
@@ -1187,16 +1190,16 @@ cover <code class="docutils literal notranslate"><span class="pre">s</span></cod<span class="n">hs.elim_finite_subcover</span> <span class="n">U</span> <span class="n">hUo</span> <span class="n">hsU</span> </pre></div> </div> </div> </div> </div> </section> </section> </section> </div> </div> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <a href="C07_Hierarchies.html" class="btn btn-neutral float-left" title="7. Hierarchies" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="C09_Differential_Calculus.html" class="btn btn-neutral float-right" title="9. Differential Calculus" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> <a href="C08_Groups_and_Rings.html" class="btn btn-neutral float-left" title="8. Groups and Rings" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="C10_Differential_Calculus.html" class="btn btn-neutral float-right" title="10. Differential Calculus" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> </div> <hr/>
-
-
-
@@ -1,9 +1,10 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>9. Differential Calculus — Mathematics in Lean 0.1 documentation</title> <title>10. Differential Calculus — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
-
@@ -15,13 +16,14 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="10. Integration and Measure Theory" href="C10_Integration_and_Measure_Theory.html" /> <link rel="prev" title="8. Topology" href="C08_Topology.html" /> <link rel="next" title="11. Integration and Measure Theory" href="C11_Integration_and_Measure_Theory.html" /> <link rel="prev" title="9. Topology" href="C09_Topology.html" /> </head> <body class="wy-body-for-nav">
-
@@ -47,19 +49,20 @@<li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">9. Differential Calculus</a><ul> <li class="toctree-l2"><a class="reference internal" href="#elementary-differential-calculus">9.1. Elementary Differential Calculus</a></li> <li class="toctree-l2"><a class="reference internal" href="#differential-calculus-in-normed-spaces">9.2. Differential Calculus in Normed Spaces</a><ul> <li class="toctree-l3"><a class="reference internal" href="#id3">9.2.1. Normed spaces</a></li> <li class="toctree-l3"><a class="reference internal" href="#continuous-linear-maps">9.2.2. Continuous linear maps</a></li> <li class="toctree-l3"><a class="reference internal" href="#asymptotic-comparisons">9.2.3. Asymptotic comparisons</a></li> <li class="toctree-l3"><a class="reference internal" href="#differentiability">9.2.4. Differentiability</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">10. Differential Calculus</a><ul> <li class="toctree-l2"><a class="reference internal" href="#elementary-differential-calculus">10.1. Elementary Differential Calculus</a></li> <li class="toctree-l2"><a class="reference internal" href="#differential-calculus-in-normed-spaces">10.2. Differential Calculus in Normed Spaces</a><ul> <li class="toctree-l3"><a class="reference internal" href="#id3">10.2.1. Normed spaces</a></li> <li class="toctree-l3"><a class="reference internal" href="#continuous-linear-maps">10.2.2. Continuous linear maps</a></li> <li class="toctree-l3"><a class="reference internal" href="#asymptotic-comparisons">10.2.3. Asymptotic comparisons</a></li> <li class="toctree-l3"><a class="reference internal" href="#differentiability">10.2.4. Differentiability</a></li> </ul> </li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
@@ -79,9 +82,9 @@<div role="navigation" aria-label="Page navigation"> <ul class="wy-breadcrumbs"> <li><a href="index.html" class="icon icon-home"></a> »</li> <li><span class="section-number">9. </span>Differential Calculus</li> <li><span class="section-number">10. </span>Differential Calculus</li> <li class="wy-breadcrumbs-aside"> <a href="_sources/C09_Differential_Calculus.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/C10_Differential_Calculus.rst.txt" rel="nofollow"> View page source</a> </li> </ul> <hr/>
-
@@ -89,18 +92,18 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <span class="target" id="differential-calculus"></span><div class="section" id="index-0"> <span id="id1"></span><h1><span class="section-number">9. </span>Differential Calculus<a class="headerlink" href="#index-0" title="Permalink to this headline"></a></h1> <span class="target" id="differential-calculus"></span><section id="index-0"> <span id="id1"></span><h1><span class="section-number">10. </span>Differential Calculus<a class="headerlink" href="#index-0" title="Permalink to this heading"></a></h1> <p>We now consider the formalization of notions from <em>analysis</em>, starting with differentiation in this chapter and turning integration and measure theory in the next. In <a class="reference internal" href="#elementary-differential-calculus"><span class="std std-numref">Section 9.1</span></a>, we stick with the In <a class="reference internal" href="#elementary-differential-calculus"><span class="std std-numref">Section 10.1</span></a>, we stick with the setting of functions from the real numbers to the real numbers, which is familiar from any introductory calculus class. In <a class="reference internal" href="#normed-spaces"><span class="std std-numref">Section 9.2</span></a>, we then consider the notion of a derivative in In <a class="reference internal" href="#normed-spaces"><span class="std std-numref">Section 10.2</span></a>, we then consider the notion of a derivative in a much broader setting.</p> <div class="section" id="elementary-differential-calculus"> <span id="index-1"></span><span id="id2"></span><h2><span class="section-number">9.1. </span>Elementary Differential Calculus<a class="headerlink" href="#elementary-differential-calculus" title="Permalink to this headline"></a></h2> <section id="elementary-differential-calculus"> <span id="index-1"></span><span id="id2"></span><h2><span class="section-number">10.1. </span>Elementary Differential Calculus<a class="headerlink" href="#elementary-differential-calculus" title="Permalink to this heading"></a></h2> <p>Let <code class="docutils literal notranslate"><span class="pre">f</span></code> be a function from the reals to the reals. There is a difference between talking about the derivative of <code class="docutils literal notranslate"><span class="pre">f</span></code> at a single point and talking about the derivative function.
-
@@ -173,11 +176,11 @@ seems even weirder.</p><span class="kd">example</span> <span class="o">:</span> <span class="n">deriv</span> <span class="n">sin</span> <span class="n">π</span> <span class="bp">=</span> <span class="bp">-</span><span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> </pre></div> </div> </div> <div class="section" id="differential-calculus-in-normed-spaces"> <span id="normed-spaces"></span><span id="index-2"></span><h2><span class="section-number">9.2. </span>Differential Calculus in Normed Spaces<a class="headerlink" href="#differential-calculus-in-normed-spaces" title="Permalink to this headline"></a></h2> <div class="section" id="id3"> <h3><span class="section-number">9.2.1. </span>Normed spaces<a class="headerlink" href="#id3" title="Permalink to this headline"></a></h3> </section> <section id="differential-calculus-in-normed-spaces"> <span id="normed-spaces"></span><span id="index-2"></span><h2><span class="section-number">10.2. </span>Differential Calculus in Normed Spaces<a class="headerlink" href="#differential-calculus-in-normed-spaces" title="Permalink to this heading"></a></h2> <section id="id3"> <h3><span class="section-number">10.2.1. </span>Normed spaces<a class="headerlink" href="#id3" title="Permalink to this heading"></a></h3> <p>Differentiation can be generalized beyond <code class="docutils literal notranslate"><span class="pre">ℝ</span></code> using the notion of a <em>normed vector space</em>, which encapsulates both direction and distance. We start with the notion of a <em>normed group</em>, which as an additive commutative
-
@@ -240,9 +243,9 @@ complete as long as the field itself is complete.</p><span class="n">FiniteDimensional.complete</span> <span class="bp">𝕜</span> <span class="n">E</span> </pre></div> </div> </div> <div class="section" id="continuous-linear-maps"> <h3><span class="section-number">9.2.2. </span>Continuous linear maps<a class="headerlink" href="#continuous-linear-maps" title="Permalink to this headline"></a></h3> </section> <section id="continuous-linear-maps"> <h3><span class="section-number">10.2.2. </span>Continuous linear maps<a class="headerlink" href="#continuous-linear-maps" title="Permalink to this heading"></a></h3> <p>We now turn to the morphisms in the category of normed spaces, namely, continuous linear maps. In Mathlib, the type of <code class="docutils literal notranslate"><span class="pre">𝕜</span></code>-linear continuous maps between normed spaces
-
@@ -322,9 +325,9 @@ Minor ingredients include <code class="docutils literal notranslate"><span class<span class="gr">sorry</span> </pre></div> </div> </div> <div class="section" id="asymptotic-comparisons"> <h3><span class="section-number">9.2.3. </span>Asymptotic comparisons<a class="headerlink" href="#asymptotic-comparisons" title="Permalink to this headline"></a></h3> </section> <section id="asymptotic-comparisons"> <h3><span class="section-number">10.2.3. </span>Asymptotic comparisons<a class="headerlink" href="#asymptotic-comparisons" title="Permalink to this heading"></a></h3> <p>Defining differentiability also requires asymptotic comparisons. Mathlib has an extensive library covering the big O and little o relations, whose definitions are shown below.
-
@@ -350,9 +353,9 @@ Here we will only use little o to define differentiability.</p><span class="n">Iff.rfl</span> </pre></div> </div> </div> <div class="section" id="differentiability"> <h3><span class="section-number">9.2.4. </span>Differentiability<a class="headerlink" href="#differentiability" title="Permalink to this headline"></a></h3> </section> <section id="differentiability"> <h3><span class="section-number">10.2.4. </span>Differentiability<a class="headerlink" href="#differentiability" title="Permalink to this heading"></a></h3> <p>We are now ready to discuss differentiable functions between normed spaces. In analogy the elementary one-dimensional, Mathlib defines a predicate <code class="docutils literal notranslate"><span class="pre">HasFDerivAt</span></code> and a function <code class="docutils literal notranslate"><span class="pre">fderiv</span></code>.
-
@@ -435,16 +438,16 @@ For example, you may want to use one-sided derivatives in theone-dimensional setting. The means to do so are found in Mathlib in a more general context; see <code class="docutils literal notranslate"><span class="pre">HasFDerivWithinAt</span></code> or the even more general <code class="docutils literal notranslate"><span class="pre">HasFDerivAtFilter</span></code>.</p> </div> </div> </div> </section> </section> </section> </div> </div> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <a href="C08_Topology.html" class="btn btn-neutral float-left" title="8. Topology" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="C10_Integration_and_Measure_Theory.html" class="btn btn-neutral float-right" title="10. Integration and Measure Theory" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> <a href="C09_Topology.html" class="btn btn-neutral float-left" title="9. Topology" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="C11_Integration_and_Measure_Theory.html" class="btn btn-neutral float-right" title="11. Integration and Measure Theory" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> </div> <hr/>
-
-
-
@@ -1,9 +1,10 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>10. Integration and Measure Theory — Mathematics in Lean 0.1 documentation</title> <title>11. Integration and Measure Theory — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/css/custom.css" type="text/css" />
-
@@ -15,13 +16,14 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Index" href="genindex.html" /> <link rel="prev" title="9. Differential Calculus" href="C09_Differential_Calculus.html" /> <link rel="prev" title="10. Differential Calculus" href="C10_Differential_Calculus.html" /> </head> <body class="wy-body-for-nav">
-
@@ -47,12 +49,13 @@<li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">10. Integration and Measure Theory</a><ul> <li class="toctree-l2"><a class="reference internal" href="#elementary-integration">10.1. Elementary Integration</a></li> <li class="toctree-l2"><a class="reference internal" href="#measure-theory">10.2. Measure Theory</a></li> <li class="toctree-l2"><a class="reference internal" href="#integration">10.3. Integration</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="#">11. Integration and Measure Theory</a><ul> <li class="toctree-l2"><a class="reference internal" href="#elementary-integration">11.1. Elementary Integration</a></li> <li class="toctree-l2"><a class="reference internal" href="#measure-theory">11.2. Measure Theory</a></li> <li class="toctree-l2"><a class="reference internal" href="#integration">11.3. Integration</a></li> </ul> </li> </ul>
-
@@ -74,9 +77,9 @@<div role="navigation" aria-label="Page navigation"> <ul class="wy-breadcrumbs"> <li><a href="index.html" class="icon icon-home"></a> »</li> <li><span class="section-number">10. </span>Integration and Measure Theory</li> <li><span class="section-number">11. </span>Integration and Measure Theory</li> <li class="wy-breadcrumbs-aside"> <a href="_sources/C10_Integration_and_Measure_Theory.rst.txt" rel="nofollow"> View page source</a> <a href="_sources/C11_Integration_and_Measure_Theory.rst.txt" rel="nofollow"> View page source</a> </li> </ul> <hr/>
-
@@ -84,10 +87,10 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <span class="target" id="integration-and-measure-theory"></span><div class="section" id="index-0"> <span id="id1"></span><h1><span class="section-number">10. </span>Integration and Measure Theory<a class="headerlink" href="#index-0" title="Permalink to this headline"></a></h1> <div class="section" id="elementary-integration"> <span id="index-1"></span><span id="id2"></span><h2><span class="section-number">10.1. </span>Elementary Integration<a class="headerlink" href="#elementary-integration" title="Permalink to this headline"></a></h2> <span class="target" id="integration-and-measure-theory"></span><section id="index-0"> <span id="id1"></span><h1><span class="section-number">11. </span>Integration and Measure Theory<a class="headerlink" href="#index-0" title="Permalink to this heading"></a></h1> <section id="elementary-integration"> <span id="index-1"></span><span id="id2"></span><h2><span class="section-number">11.1. </span>Elementary Integration<a class="headerlink" href="#elementary-integration" title="Permalink to this heading"></a></h2> <p>We first focus on integration of functions on finite intervals in <code class="docutils literal notranslate"><span class="pre">ℝ</span></code>. We can integrate elementary functions.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">MeasureTheory</span> <span class="n">intervalIntegral</span>
-
@@ -124,9 +127,9 @@ which are not shown here, are not equivalent.)</p><span class="n">rfl</span> </pre></div> </div> </div> <div class="section" id="measure-theory"> <span id="index-2"></span><span id="id3"></span><h2><span class="section-number">10.2. </span>Measure Theory<a class="headerlink" href="#measure-theory" title="Permalink to this headline"></a></h2> </section> <section id="measure-theory"> <span id="index-2"></span><span id="id3"></span><h2><span class="section-number">11.2. </span>Measure Theory<a class="headerlink" href="#measure-theory" title="Permalink to this heading"></a></h2> <p>The general context for integration in Mathlib is measure theory. Even the elementary integrals of the previous section are in fact Bochner integrals. Bochner integration is a generalization of Lebesgue integration where the target space can be any Banach space,
-
@@ -201,9 +204,9 @@ almost everywhere.</p><span class="n">Iff.rfl</span> </pre></div> </div> </div> <div class="section" id="integration"> <span id="id4"></span><h2><span class="section-number">10.3. </span>Integration<a class="headerlink" href="#integration" title="Permalink to this headline"></a></h2> </section> <section id="integration"> <span id="id4"></span><h2><span class="section-number">11.3. </span>Integration<a class="headerlink" href="#integration" title="Permalink to this heading"></a></h2> <p>Now that we have measurable spaces and measures we can consider integrals. As explained above, Mathlib uses a very general notion of integration that allows any Banach space as the target.
-
@@ -278,14 +281,14 @@ gives finite mass to compact sets, and give positive mass to open sets.</p><span class="n">integral_image_eq_integral_abs_det_fderiv_smul</span> <span class="n">μ</span> <span class="n">hs</span> <span class="n">hf</span> <span class="n">h_inj</span> <span class="n">g</span> </pre></div> </div> </div> </div> </section> </section> </div> </div> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <a href="C09_Differential_Calculus.html" class="btn btn-neutral float-left" title="9. Differential Calculus" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="C10_Differential_Calculus.html" class="btn btn-neutral float-left" title="10. Differential Calculus" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="genindex.html" class="btn btn-neutral float-right" title="Index" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> </div>
-
-
-
@@ -0,0 +1,22 @@.. _groups_and_ring: Groups and Rings ================ We saw in :numref:`proving_identities_in_algebraic_structures` how to reason about operations in groups and rings. Later, in :numref:`section_algebraic_structures`, we saw how to define abstract algebraic structures, such as group structures, as well as concrete instances such as the ring structure on the Gaussian integers. :numref:`Chapter %s <hierarchies>` explained how hierarchies of abstract structures are handled in Mathlib. In this chapter we work with groups and rings in more detail. We won't be able to cover every aspect of the treatment of these topics in Mathlib, especially since Mathlib is constantly growing. But we will provide entry points to the library and show how the essential concepts are used. There is some overlap with the discussion of :numref:`Chapter %s <hierarchies>`, but here we will focus on how to use Mathlib instead of the design decisions behind the way the topics are treated. So making sense of some of the examples may require reviewing the background from :numref:`Chapter %s <hierarchies>`. .. include:: C08_Groups_and_Rings/S01_Groups.inc .. include:: C08_Groups_and_Rings/S02_Rings.inc
-
-
-
@@ -77,6 +77,6 @@ Formalizing mathematics requires making the relevant notion of "sameness"fully explicit, and that is exactly what Bourbaki's theory of filters manages to do. .. include:: C08_Topology/S01_Filters.inc .. include:: C08_Topology/S02_Metric_Spaces.inc .. include:: C08_Topology/S03_Topological_Spaces.inc .. include:: C09_Topology/S01_Filters.inc .. include:: C09_Topology/S02_Metric_Spaces.inc .. include:: C09_Topology/S03_Topological_Spaces.inc
-
-
-
@@ -14,5 +14,5 @@ which is familiar from any introductory calculus class.In :numref:`normed_spaces`, we then consider the notion of a derivative in a much broader setting. .. include:: C09_Differential_Calculus/S01_Elementary_Differential_Calculus.inc .. include:: C09_Differential_Calculus/S02_Differential_Calculus_in_Normed_Spaces.inc .. include:: C10_Differential_Calculus/S01_Elementary_Differential_Calculus.inc .. include:: C10_Differential_Calculus/S02_Differential_Calculus_in_Normed_Spaces.inc
-
-
-
@@ -1,10 +0,0 @@.. _integration_and_measure_theory: .. index:: integration Integration and Measure Theory ============================== .. include:: C10_Integration_and_Measure_Theory/S01_Elementary_Integration.inc .. include:: C10_Integration_and_Measure_Theory/S02_Measure_Theory.inc .. include:: C10_Integration_and_Measure_Theory/S03_Integration.inc
-
-
-
@@ -0,0 +1,10 @@.. _integration_and_measure_theory: .. index:: integration Integration and Measure Theory ============================== .. include:: C11_Integration_and_Measure_Theory/S01_Elementary_Integration.inc .. include:: C11_Integration_and_Measure_Theory/S02_Measure_Theory.inc .. include:: C11_Integration_and_Measure_Theory/S03_Integration.inc
-
-
-
@@ -13,9 +13,10 @@ Mathematics in LeanC05_Elementary_Number_Theory C06_Structures C07_Hierarchies C08_Topology C09_Differential_Calculus C10_Integration_and_Measure_Theory C08_Groups_and_Rings C09_Topology C10_Differential_Calculus C11_Integration_and_Measure_Theory .. toctree:: :hidden:
-
-
-
@@ -0,0 +1,134 @@/* * _sphinx_javascript_frameworks_compat.js * ~~~~~~~~~~ * * Compatability shim for jQuery and underscores.js. * * WILL BE REMOVED IN Sphinx 6.0 * xref RemovedInSphinx60Warning * */ /** * select a different prefix for underscore */ $u = _.noConflict(); /** * small helper function to urldecode strings * * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL */ jQuery.urldecode = function(x) { if (!x) { return x } return decodeURIComponent(x.replace(/\+/g, ' ')); }; /** * small helper function to urlencode strings */ jQuery.urlencode = encodeURIComponent; /** * This function returns the parsed url parameters of the * current request. Multiple values per key are supported, * it will always return arrays of strings for the value parts. */ jQuery.getQueryParameters = function(s) { if (typeof s === 'undefined') s = document.location.search; var parts = s.substr(s.indexOf('?') + 1).split('&'); var result = {}; for (var i = 0; i < parts.length; i++) { var tmp = parts[i].split('=', 2); var key = jQuery.urldecode(tmp[0]); var value = jQuery.urldecode(tmp[1]); if (key in result) result[key].push(value); else result[key] = [value]; } return result; }; /** * highlight a given string on a jquery object by wrapping it in * span elements with the given class name. */ jQuery.fn.highlightText = function(text, className) { function highlight(node, addItems) { if (node.nodeType === 3) { var val = node.nodeValue; var pos = val.toLowerCase().indexOf(text); if (pos >= 0 && !jQuery(node.parentNode).hasClass(className) && !jQuery(node.parentNode).hasClass("nohighlight")) { var span; var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); if (isInSVG) { span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); } else { span = document.createElement("span"); span.className = className; } span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); if (isInSVG) { var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); var bbox = node.parentElement.getBBox(); rect.x.baseVal.value = bbox.x; rect.y.baseVal.value = bbox.y; rect.width.baseVal.value = bbox.width; rect.height.baseVal.value = bbox.height; rect.setAttribute('class', className); addItems.push({ "parent": node.parentNode, "target": rect}); } } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this, addItems); }); } } var addItems = []; var result = this.each(function() { highlight(this, addItems); }); for (var i = 0; i < addItems.length; ++i) { jQuery(addItems[i].parent).before(addItems[i].target); } return result; }; /* * backward compatibility for jQuery.browser * This will be supported until firefox bug is fixed. */ if (!jQuery.browser) { jQuery.uaMatch = function(ua) { ua = ua.toLowerCase(); var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || []; return { browser: match[ 1 ] || "", version: match[ 2 ] || "0" }; }; jQuery.browser = {}; jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; }
-
-
-
@@ -222,7 +222,7 @@ table.modindextable td {/* -- general body styles --------------------------------------------------- */ div.body { min-width: 450px; min-width: 360px; max-width: 800px; }
-
@@ -335,13 +335,13 @@ p.sidebar-title {font-weight: bold; } div.admonition, div.topic, blockquote { div.admonition, div.topic, aside.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ div.topic { div.topic, aside.topic { border: 1px solid #ccc; padding: 7px; margin: 10px 0 10px 0;
-
@@ -380,6 +380,7 @@ div.body p.centered {div.sidebar > :last-child, aside.sidebar > :last-child, div.topic > :last-child, aside.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; }
-
@@ -387,6 +388,7 @@ div.admonition > :last-child {div.sidebar::after, aside.sidebar::after, div.topic::after, aside.topic::after, div.admonition::after, blockquote::after { display: block;
-
@@ -428,10 +430,6 @@ table.docutils td, table.docutils th {border-bottom: 1px solid #aaa; } table.footnote td, table.footnote th { border: 0 !important; } th { text-align: left; padding-right: 5px;
-
@@ -615,6 +613,7 @@ ul.simple p {margin-bottom: 0; } /* Docutils 0.17 and older (footnotes & citations) */ dl.footnote > dt, dl.citation > dt { float: left;
-
@@ -632,6 +631,33 @@ dl.citation > dd:after {clear: both; } /* Docutils 0.18+ (footnotes & citations) */ aside.footnote > span, div.citation > span { float: left; } aside.footnote > span:last-of-type, div.citation > span:last-of-type { padding-right: 0.5em; } aside.footnote > p { margin-left: 2em; } div.citation > p { margin-left: 4em; } aside.footnote > p:last-of-type, div.citation > p:last-of-type { margin-bottom: 0em; } aside.footnote > p:last-of-type:after, div.citation > p:last-of-type:after { content: ""; clear: both; } /* Footnotes & citations ends */ dl.field-list { display: grid; grid-template-columns: fit-content(30%) auto;
-
-
-
@@ -2,325 +2,263 @@* doctools.js * ~~~~~~~~~~~ * * Sphinx JavaScript utilities for all documentation. * Base JavaScript utilities for all Sphinx HTML documentation. * * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ "use strict"; /** * select a different prefix for underscore */ $u = _.noConflict(); /** * make the code below compatible with browsers without * an installed firebug like debugger if (!window.console || !console.firebug) { var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; window.console = {}; for (var i = 0; i < names.length; ++i) window.console[names[i]] = function() {}; } */ /** * small helper function to urldecode strings * * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL */ jQuery.urldecode = function(x) { if (!x) { return x const _ready = (callback) => { if (document.readyState !== "loading") { callback(); } else { document.addEventListener("DOMContentLoaded", callback); } return decodeURIComponent(x.replace(/\+/g, ' ')); }; /** * small helper function to urlencode strings * highlight a given string on a node by wrapping it in * span elements with the given class name. */ jQuery.urlencode = encodeURIComponent; const _highlight = (node, addItems, text, className) => { if (node.nodeType === Node.TEXT_NODE) { const val = node.nodeValue; const parent = node.parentNode; const pos = val.toLowerCase().indexOf(text); if ( pos >= 0 && !parent.classList.contains(className) && !parent.classList.contains("nohighlight") ) { let span; /** * This function returns the parsed url parameters of the * current request. Multiple values per key are supported, * it will always return arrays of strings for the value parts. */ jQuery.getQueryParameters = function(s) { if (typeof s === 'undefined') s = document.location.search; var parts = s.substr(s.indexOf('?') + 1).split('&'); var result = {}; for (var i = 0; i < parts.length; i++) { var tmp = parts[i].split('=', 2); var key = jQuery.urldecode(tmp[0]); var value = jQuery.urldecode(tmp[1]); if (key in result) result[key].push(value); else result[key] = [value]; } return result; }; const closestNode = parent.closest("body, svg, foreignObject"); const isInSVG = closestNode && closestNode.matches("svg"); if (isInSVG) { span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); } else { span = document.createElement("span"); span.classList.add(className); } /** * highlight a given string on a jquery object by wrapping it in * span elements with the given class name. */ jQuery.fn.highlightText = function(text, className) { function highlight(node, addItems) { if (node.nodeType === 3) { var val = node.nodeValue; var pos = val.toLowerCase().indexOf(text); if (pos >= 0 && !jQuery(node.parentNode).hasClass(className) && !jQuery(node.parentNode).hasClass("nohighlight")) { var span; var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); if (isInSVG) { span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); } else { span = document.createElement("span"); span.className = className; } span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( span.appendChild(document.createTextNode(val.substr(pos, text.length))); parent.insertBefore( span, parent.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); if (isInSVG) { var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); var bbox = node.parentElement.getBBox(); rect.x.baseVal.value = bbox.x; rect.y.baseVal.value = bbox.y; rect.width.baseVal.value = bbox.width; rect.height.baseVal.value = bbox.height; rect.setAttribute('class', className); addItems.push({ "parent": node.parentNode, "target": rect}); } node.nextSibling ) ); node.nodeValue = val.substr(0, pos); if (isInSVG) { const rect = document.createElementNS( "http://www.w3.org/2000/svg", "rect" ); const bbox = parent.getBBox(); rect.x.baseVal.value = bbox.x; rect.y.baseVal.value = bbox.y; rect.width.baseVal.value = bbox.width; rect.height.baseVal.value = bbox.height; rect.setAttribute("class", className); addItems.push({ parent: parent, target: rect }); } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this, addItems); }); } } else if (node.matches && !node.matches("button, select, textarea")) { node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); } var addItems = []; var result = this.each(function() { highlight(this, addItems); }); for (var i = 0; i < addItems.length; ++i) { jQuery(addItems[i].parent).before(addItems[i].target); } return result; }; /* * backward compatibility for jQuery.browser * This will be supported until firefox bug is fixed. */ if (!jQuery.browser) { jQuery.uaMatch = function(ua) { ua = ua.toLowerCase(); var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || []; return { browser: match[ 1 ] || "", version: match[ 2 ] || "0" }; }; jQuery.browser = {}; jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; } const _highlightText = (thisNode, text, className) => { let addItems = []; _highlight(thisNode, addItems, text, className); addItems.forEach((obj) => obj.parent.insertAdjacentElement("beforebegin", obj.target) ); }; /** * Small JavaScript module for the documentation. */ var Documentation = { init : function() { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { this.initOnKeyListeners(); } const Documentation = { init: () => { Documentation.highlightSearchWords(); Documentation.initDomainIndexTable(); Documentation.initOnKeyListeners(); }, /** * i18n support */ TRANSLATIONS : {}, PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, LOCALE : 'unknown', TRANSLATIONS: {}, PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), LOCALE: "unknown", // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; if (typeof translated === 'undefined') return string; return (typeof translated === 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; if (typeof translated === 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, addTranslations : function(catalog) { for (var key in catalog.messages) this.TRANSLATIONS[key] = catalog.messages[key]; this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); this.LOCALE = catalog.locale; gettext: (string) => { const translated = Documentation.TRANSLATIONS[string]; switch (typeof translated) { case "undefined": return string; // no translation case "string": return translated; // translation exists default: return translated[0]; // (singular, plural) translation tuple exists } }, /** * add context elements like header anchor links */ addContextElements : function() { $('div[id] > :header:first').each(function() { $('<a class="headerlink">\u00B6</a>'). attr('href', '#' + this.id). attr('title', _('Permalink to this headline')). appendTo(this); }); $('dt[id]').each(function() { $('<a class="headerlink">\u00B6</a>'). attr('href', '#' + this.id). attr('title', _('Permalink to this definition')). appendTo(this); }); ngettext: (singular, plural, n) => { const translated = Documentation.TRANSLATIONS[singular]; if (typeof translated !== "undefined") return translated[Documentation.PLURAL_EXPR(n)]; return n === 1 ? singular : plural; }, /** * workaround a firefox stupidity * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 */ fixFirefoxAnchorBug : function() { if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); addTranslations: (catalog) => { Object.assign(Documentation.TRANSLATIONS, catalog.messages); Documentation.PLURAL_EXPR = new Function( "n", `return (${catalog.plural_expr})` ); Documentation.LOCALE = catalog.locale; }, /** * highlight the search words provided in the url in the text */ highlightSearchWords : function() { var params = $.getQueryParameters(); var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; if (terms.length) { var body = $('div.body'); if (!body.length) { body = $('body'); } window.setTimeout(function() { $.each(terms, function() { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); $('<p class="highlight-link"><a href="javascript:Documentation.' + 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>') .appendTo($('#searchbox')); } }, highlightSearchWords: () => { const highlight = new URLSearchParams(window.location.search).get("highlight") || ""; const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); if (terms.length === 0) return; // nothing to do /** * init the domain index toggle buttons */ initIndexTable : function() { var togglers = $('img.toggler').click(function() { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); if (src.substr(-9) === 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); }).css('display', ''); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { togglers.click(); } // There should never be more than one element matching "div.body" const divBody = document.querySelectorAll("div.body"); const body = divBody.length ? divBody[0] : document.querySelector("body"); window.setTimeout(() => { terms.forEach((term) => _highlightText(body, term, "highlighted")); }, 10); const searchBox = document.getElementById("searchbox"); if (searchBox === null) return; searchBox.appendChild( document .createRange() .createContextualFragment( '<p class="highlight-link">' + '<a href="javascript:Documentation.hideSearchWords()">' + Documentation.gettext("Hide Search Matches") + "</a></p>" ) ); }, /** * helper function to hide the search marks again */ hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); var url = new URL(window.location); url.searchParams.delete('highlight'); window.history.replaceState({}, '', url); hideSearchWords: () => { document .querySelectorAll("#searchbox .highlight-link") .forEach((el) => el.remove()); document .querySelectorAll("span.highlighted") .forEach((el) => el.classList.remove("highlighted")); const url = new URL(window.location); url.searchParams.delete("highlight"); window.history.replaceState({}, "", url); }, /** * make the url absolute * helper function to focus on search bar */ makeURL : function(relativeURL) { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; focusSearchBar: () => { document.querySelectorAll("input[name=q]")[0]?.focus(); }, /** * get the current relative url * Initialise the domain index toggle buttons */ getCurrentURL : function() { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { if (this === '..') parts.pop(); }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); initDomainIndexTable: () => { const toggler = (el) => { const idNumber = el.id.substr(7); const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); if (el.src.substr(-9) === "minus.png") { el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; toggledRows.forEach((el) => (el.style.display = "none")); } else { el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; toggledRows.forEach((el) => (el.style.display = "")); } }; const togglerElements = document.querySelectorAll("img.toggler"); togglerElements.forEach((el) => el.addEventListener("click", (event) => toggler(event.currentTarget)) ); togglerElements.forEach((el) => (el.style.display = "")); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); }, initOnKeyListeners: function() { $(document).keydown(function(event) { var activeElementType = document.activeElement.tagName; // don't navigate when in search box, textarea, dropdown or button if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) { switch (event.keyCode) { case 37: // left var prevHref = $('link[rel="prev"]').prop('href'); if (prevHref) { window.location.href = prevHref; return false; initOnKeyListeners: () => { // only install a listener if it is really needed if ( !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS ) return; const blacklistedElements = new Set([ "TEXTAREA", "INPUT", "SELECT", "BUTTON", ]); document.addEventListener("keydown", (event) => { if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys if (!event.shiftKey) { switch (event.key) { case "ArrowLeft": if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; const prevLink = document.querySelector('link[rel="prev"]'); if (prevLink && prevLink.href) { window.location.href = prevLink.href; event.preventDefault(); } break; case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; return false; case "ArrowRight": if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; const nextLink = document.querySelector('link[rel="next"]'); if (nextLink && nextLink.href) { window.location.href = nextLink.href; event.preventDefault(); } break; case "Escape": if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; Documentation.hideSearchWords(); event.preventDefault(); } } // some keyboard layouts may need Shift to get / switch (event.key) { case "/": if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; Documentation.focusSearchBar(); event.preventDefault(); } }); } }, }; // quick alias for translations _ = Documentation.gettext; const _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); }); _ready(Documentation.init);
-
-
-
@@ -1,12 +1,14 @@var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), VERSION: '0.1', LANGUAGE: 'None', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', FILE_SUFFIX: '.html', LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', NAVIGATION_WITH_KEYS: false NAVIGATION_WITH_KEYS: false, SHOW_SEARCH_SUMMARY: true, ENABLE_SEARCH_SHORTCUTS: false, };
-
-
-
@@ -1,15 +1,15 @@/*! * jQuery JavaScript Library v3.5.1 * jQuery JavaScript Library v3.6.0 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Copyright OpenJS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * * Date: 2020-05-04T22:49Z * Date: 2021-03-02T17:08Z */ ( function( global, factory ) {
-
@@ -76,12 +76,16 @@ var support = {};var isFunction = function isFunction( obj ) { // Support: Chrome <=57, Firefox <=52 // In some browsers, typeof returns "function" for HTML <object> elements // (i.e., `typeof document.createElement( "object" ) === "function"`). // We don't want to classify *any* DOM node as a function. return typeof obj === "function" && typeof obj.nodeType !== "number"; }; // Support: Chrome <=57, Firefox <=52 // In some browsers, typeof returns "function" for HTML <object> elements // (i.e., `typeof document.createElement( "object" ) === "function"`). // We don't want to classify *any* DOM node as a function. // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 // Plus for old WebKit, typeof returns "function" for HTML collections // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) return typeof obj === "function" && typeof obj.nodeType !== "number" && typeof obj.item !== "function"; }; var isWindow = function isWindow( obj ) {
-
@@ -147,7 +151,7 @@ function toType( obj ) {var version = "3.5.1", version = "3.6.0", // Define a local copy of jQuery jQuery = function( selector, context ) {
-
@@ -401,7 +405,7 @@ jQuery.extend( {if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr [ arr ] : arr ); } else { push.call( ret, arr );
-
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {// Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( _i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function( _i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function isArrayLike( obj ) {
-
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {} var Sizzle = /*! * Sizzle CSS Selector Engine v2.3.5 * Sizzle CSS Selector Engine v2.3.6 * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://js.foundation/ * * Date: 2020-03-14 * Date: 2021-02-16 */ ( function( window ) { var i,
-
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};* @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { var namespace = elem.namespaceURI, docElem = ( elem.ownerDocument || elem ).documentElement; var namespace = elem && elem.namespaceURI, docElem = elem && ( elem.ownerDocument || elem ).documentElement; // Support: IE <=8 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
-
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;function nodeName( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }; } var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
-
@@ -3997,8 +4001,8 @@ jQuery.extend( {resolveContexts = Array( i ), resolveValues = slice.call( arguments ), // the master Deferred master = jQuery.Deferred(), // the primary Deferred primary = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) {
-
@@ -4006,30 +4010,30 @@ jQuery.extend( {resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { master.resolveWith( resolveContexts, resolveValues ); primary.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || if ( primary.state() === "pending" || isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { return master.then(); return primary.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); } return master.promise(); return primary.promise(); } } );
-
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } }
-
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {} var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true;
-
@@ -5387,8 +5388,8 @@ jQuery.event = {event = jQuery.event.fix( nativeEvent ), handlers = ( dataPriv.get( this, "events" ) || Object.create( null ) )[ event.type ] || [], dataPriv.get( this, "events" ) || Object.create( null ) )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event
-
@@ -5512,12 +5513,12 @@ jQuery.event = {get: isFunction( hook ) ? function() { if ( this.originalEvent ) { return hook( this.originalEvent ); return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { return this.originalEvent[ name ]; return this.originalEvent[ name ]; } },
-
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {// Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); return result.value; // Support: Chrome 86+ // In Chrome, if an element having a focusout handler is blurred by // clicking outside of it, it invokes the handler synchronously. If // that handler calls `.remove()` on the element, the data is cleared, // leaving `result` undefined. We need to guard against this. return result && result.value; } // If this is an inner synthetic event for an event with a bubbling surrogate
-
@@ -5821,34 +5828,7 @@ jQuery.each( {targetTouches: true, toElement: true, touches: true, which: function( event ) { var button = event.button; // Add which for key events if ( event.which == null && rkeyEvent.test( event.type ) ) { return event.charCode != null ? event.charCode : event.keyCode; } // Add which for click: 1 === left; 2 === middle; 3 === right if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { if ( button & 1 ) { return 1; } if ( button & 2 ) { return 3; } if ( button & 4 ) { return 2; } return 0; } return event.which; } which: true }, jQuery.event.addProp ); jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
-
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTypreturn true; }, // Suppress native focus or blur as it's already being fired // in leverageNative. _default: function() { return true; }, delegateType: delegateType }; } );
-
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );// set in CSS while `offset*` properties report correct values. // Behavior in IE 9 is more subtle than in newer versions & it passes // some versions of this test; make sure not to make it pass there! // // Support: Firefox 70+ // Only Firefox includes border widths // in computed dimensions. (gh-4529) reliableTrDimensions: function() { var table, tr, trChild, trStyle; if ( reliableTrDimensionsVal == null ) {
-
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );tr = document.createElement( "tr" ); trChild = document.createElement( "div" ); table.style.cssText = "position:absolute;left:-11111px"; table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; tr.style.cssText = "border:1px solid"; // Support: Chrome 86+ // Height set through cssText does not get applied. // Computed height then comes back as 0. tr.style.height = "1px"; trChild.style.height = "9px"; // Support: Android 8 Chrome 86+ // In our bodyBackground.html iframe, // display for all div elements is set to "inline", // which causes a problem only in Android 8 Chrome 86. // Ensuring the div is display: block // gets around this issue. trChild.style.display = "block"; documentElement .appendChild( table ) .appendChild( tr ) .appendChild( trChild ); trStyle = window.getComputedStyle( tr ); reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + parseInt( trStyle.borderTopWidth, 10 ) + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; documentElement.removeChild( table ); }
-
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {// Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, dimension, extra ); } ) : getWidthOrHeight( elem, dimension, extra ); swap( elem, cssShow, function() { return getWidthOrHeight( elem, dimension, extra ); } ) : getWidthOrHeight( elem, dimension, extra ); } },
-
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) ) + "px"; ) + "px"; } } );
-
@@ -7223,7 +7228,7 @@ Tween.propHooks = {if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( jQuery.cssHooks[ tween.prop ] || jQuery.cssHooks[ tween.prop ] || tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else {
-
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {anim.done( function() { /* eslint-enable no-loop-func */ /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) {
-
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; },
-
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {anim.stop( true ); } }; doAnimation.finish = doAnimation; doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) :
-
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? "" : dataPriv.get( this, "__className__" ) || "" "" : dataPriv.get( this, "__className__" ) || "" ); } }
-
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { return true; return true; } }
-
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {special.bindType || type; // jQuery handler handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data );
-
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );// Cross-browser xml parsing jQuery.parseXML = function( data ) { var xml; var xml, parserErrorElem; if ( !data || typeof data !== "string" ) { return null; }
-
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {// IE throws on parseFromString with invalid input. try { xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); } catch ( e ) { xml = undefined; } } catch ( e ) {} if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; if ( !xml || parserErrorElem ) { jQuery.error( "Invalid XML: " + ( parserErrorElem ? jQuery.map( parserErrorElem.childNodes, function( el ) { return el.textContent; } ).join( "\n" ) : data ) ); } return xml; };
-
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {// Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; } ) .filter( function() { } ).filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); } ) .map( function( _i, elem ) { } ).map( function( _i, elem ) { var val = jQuery( this ).val(); if ( val == null ) {
-
@@ -9033,7 +9040,8 @@ var// Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); originAnchor.href = location.href; originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) {
-
@@ -9414,8 +9422,8 @@ jQuery.extend( {// Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? jQuery( callbackContext ) : jQuery.event, jQuery( callbackContext ) : jQuery.event, // Deferreds deferred = jQuery.Deferred(),
-
@@ -9727,8 +9735,10 @@ jQuery.extend( {response = ajaxHandleResponses( s, jqXHR, responses ); } // Use a noop converter for missing script if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { // Use a noop converter for missing script but not if jsonp if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 && jQuery.inArray( "json", s.dataTypes ) < 0 ) { s.converters[ "text script" ] = function() {}; }
-
@@ -10466,12 +10476,6 @@ jQuery.offset = {options.using.call( elem, props ); } else { if ( typeof props.top === "number" ) { props.top += "px"; } if ( typeof props.left === "number" ) { props.left += "px"; } curElem.css( props ); } }
-
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) { jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) { // Margin is only for outerHeight, outerWidth jQuery.fn[ funcName ] = function( margin, value ) {
-
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {} } ); jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu" ).split( " " ), function( _i, name ) {
-
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +this.on( name, null, data, fn ) : this.trigger( name ); }; } ); } );
-
-
-
@@ -1,2 +1,2 @@/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S}); /*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
-
-
-
@@ -10,7 +10,7 @@* */ var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; /* Non-minified version is copied as a separate JS file, is available */
-
@@ -197,101 +197,3 @@ var Stemmer = function() {} } var splitChars = (function() { var result = {}; var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702, 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971, 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345, 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761, 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823, 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125, 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695, 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587, 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141]; var i, j, start, end; for (i = 0; i < singles.length; i++) { result[singles[i]] = true; } var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709], [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161], [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568], [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807], [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047], [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383], [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450], [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547], [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673], [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820], [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946], [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023], [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173], [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332], [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481], [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718], [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791], [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095], [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205], [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687], [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968], [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869], [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102], [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271], [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592], [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822], [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167], [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959], [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143], [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318], [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483], [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101], [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567], [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292], [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444], [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783], [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311], [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511], [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774], [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071], [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263], [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519], [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647], [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967], [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295], [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274], [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007], [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381], [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]]; for (i = 0; i < ranges.length; i++) { start = ranges[i][0]; end = ranges[i][1]; for (j = start; j <= end; j++) { result[j] = true; } } return result; })(); function splitQuery(query) { var result = []; var start = -1; for (var i = 0; i < query.length; i++) { if (splitChars[query.charCodeAt(i)]) { if (start !== -1) { result.push(query.slice(start, i)); start = -1; } } else if (start === -1) { start = i; } } if (start !== -1) { result.push(query.slice(start)); } return result; }
-
-
-
@@ -8,18 +8,20 @@* :license: BSD, see LICENSE for details. * */ "use strict"; if (!Scorer) { /** * Simple result scoring code. */ /** * Simple result scoring code. */ if (typeof Scorer === "undefined") { var Scorer = { // Implement the following function to further tweak the score for each result // The function takes a result array [filename, title, anchor, descr, score] // The function takes a result array [docname, title, anchor, descr, score, filename] // and returns the new score. /* score: function(result) { return result[4]; score: result => { const [docname, title, anchor, descr, score, filename] = result return score }, */
-
@@ -28,9 +30,11 @@ if (!Scorer) {// or matches in the last dotted part of the object name objPartialMatch: 6, // Additive scores depending on the priority of the object objPrio: {0: 15, // used to be importantResults 1: 5, // used to be objectResults 2: -5}, // used to be unimportantResults objPrio: { 0: 15, // used to be importantResults 1: 5, // used to be objectResults 2: -5, // used to be unimportantResults }, // Used when the priority is not in the mapping. objPrioDefault: 0,
-
@@ -39,456 +43,455 @@ if (!Scorer) {partialTitle: 7, // query found in terms term: 5, partialTerm: 2 partialTerm: 2, }; } if (!splitQuery) { function splitQuery(query) { return query.split(/\s+/); const _removeChildren = (element) => { while (element && element.lastChild) element.removeChild(element.lastChild); }; /** * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping */ const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string const _displayItem = (item, highlightTerms, searchTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; const [docName, title, anchor, descr] = item; let listItem = document.createElement("li"); let requestUrl; let linkUrl; if (docBuilder === "dirhtml") { // dirhtml builder let dirname = docName + "/"; if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; requestUrl = docUrlRoot + dirname; linkUrl = requestUrl; } else { // normal html builders requestUrl = docUrlRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } const params = new URLSearchParams(); params.set("highlight", [...highlightTerms].join(" ")); let linkEl = listItem.appendChild(document.createElement("a")); linkEl.href = linkUrl + "?" + params.toString() + anchor; linkEl.innerHTML = title; if (descr) listItem.appendChild(document.createElement("span")).innerText = " (" + descr + ")"; else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) .then((data) => { if (data) listItem.appendChild( Search.makeSearchSummary(data, searchTerms, highlightTerms) ); }); Search.output.appendChild(listItem); }; const _finishSearch = (resultCount) => { Search.stopPulse(); Search.title.innerText = _("Search Results"); if (!resultCount) Search.status.innerText = Documentation.gettext( "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." ); else Search.status.innerText = _( `Search finished, found ${resultCount} page(s) matching the search query.` ); }; const _displayNextItem = ( results, resultCount, highlightTerms, searchTerms ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { _displayItem(results.pop(), highlightTerms, searchTerms); setTimeout( () => _displayNextItem(results, resultCount, highlightTerms, searchTerms), 5 ); } // search finished, update title and status message else _finishSearch(resultCount); }; /** * Default splitQuery function. Can be overridden in ``sphinx.search`` with a * custom function per language. * * The regular expression works by splitting the string on consecutive characters * that are not Unicode letters, numbers, underscores, or emoji characters. * This is the same as ``\W+`` in Python, preserving the surrogate pair area. */ if (typeof splitQuery === "undefined") { var splitQuery = (query) => query .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) .filter(term => term) // remove remaining empty strings } /** * Search Module */ var Search = { _index : null, _queued_query : null, _pulse_status : -1, htmlToText : function(htmlString) { var virtualDocument = document.implementation.createHTMLDocument('virtual'); var htmlElement = $(htmlString, virtualDocument); htmlElement.find('.headerlink').remove(); docContent = htmlElement.find('[role=main]')[0]; if(docContent === undefined) { console.warn("Content block not found. Sphinx search tries to obtain it " + "via '[role=main]'. Could you check your theme or template."); return ""; } return docContent.textContent || docContent.innerText; const Search = { _index: null, _queued_query: null, _pulse_status: -1, htmlToText: (htmlString) => { const htmlElement = document .createRange() .createContextualFragment(htmlString); _removeChildren(htmlElement.querySelectorAll(".headerlink")); const docContent = htmlElement.querySelector('[role="main"]'); if (docContent !== undefined) return docContent.textContent; console.warn( "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." ); return ""; }, init : function() { var params = $.getQueryParameters(); if (params.q) { var query = params.q[0]; $('input[name="q"]')[0].value = query; this.performSearch(query); } init: () => { const query = new URLSearchParams(window.location.search).get("q"); document .querySelectorAll('input[name="q"]') .forEach((el) => (el.value = query)); if (query) Search.performSearch(query); }, loadIndex : function(url) { $.ajax({type: "GET", url: url, data: null, dataType: "script", cache: true, complete: function(jqxhr, textstatus) { if (textstatus != "success") { document.getElementById("searchindexloader").src = url; } }}); }, loadIndex: (url) => (document.body.appendChild(document.createElement("script")).src = url), setIndex : function(index) { var q; this._index = index; if ((q = this._queued_query) !== null) { this._queued_query = null; Search.query(q); setIndex: (index) => { Search._index = index; if (Search._queued_query !== null) { const query = Search._queued_query; Search._queued_query = null; Search.query(query); } }, hasIndex : function() { return this._index !== null; }, hasIndex: () => Search._index !== null, deferQuery : function(query) { this._queued_query = query; }, deferQuery: (query) => (Search._queued_query = query), stopPulse : function() { this._pulse_status = 0; }, stopPulse: () => (Search._pulse_status = -1), startPulse : function() { if (this._pulse_status >= 0) return; function pulse() { var i; startPulse: () => { if (Search._pulse_status >= 0) return; const pulse = () => { Search._pulse_status = (Search._pulse_status + 1) % 4; var dotString = ''; for (i = 0; i < Search._pulse_status; i++) dotString += '.'; Search.dots.text(dotString); if (Search._pulse_status > -1) window.setTimeout(pulse, 500); } Search.dots.innerText = ".".repeat(Search._pulse_status); if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); }; pulse(); }, /** * perform a search for something (or wait until index is loaded) */ performSearch : function(query) { performSearch: (query) => { // create the required interface elements this.out = $('#search-results'); this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out); this.dots = $('<span></span>').appendTo(this.title); this.status = $('<p class="search-summary"> </p>').appendTo(this.out); this.output = $('<ul class="search"/>').appendTo(this.out); $('#search-progress').text(_('Preparing search...')); this.startPulse(); const searchText = document.createElement("h2"); searchText.textContent = _("Searching"); const searchSummary = document.createElement("p"); searchSummary.classList.add("search-summary"); searchSummary.innerText = ""; const searchList = document.createElement("ul"); searchList.classList.add("search"); const out = document.getElementById("search-results"); Search.title = out.appendChild(searchText); Search.dots = Search.title.appendChild(document.createElement("span")); Search.status = out.appendChild(searchSummary); Search.output = out.appendChild(searchList); const searchProgress = document.getElementById("search-progress"); // Some themes don't use the search progress node if (searchProgress) { searchProgress.innerText = _("Preparing search..."); } Search.startPulse(); // index already loaded, the browser was quick! if (this.hasIndex()) this.query(query); else this.deferQuery(query); if (Search.hasIndex()) Search.query(query); else Search.deferQuery(query); }, /** * execute search (requires search index to be loaded) */ query : function(query) { var i; // stem the searchterms and add them to the correct list var stemmer = new Stemmer(); var searchterms = []; var excluded = []; var hlterms = []; var tmp = splitQuery(query); var objectterms = []; for (i = 0; i < tmp.length; i++) { if (tmp[i] !== "") { objectterms.push(tmp[i].toLowerCase()); } query: (query) => { // stem the search terms and add them to the correct list const stemmer = new Stemmer(); const searchTerms = new Set(); const excludedTerms = new Set(); const highlightTerms = new Set(); const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); splitQuery(query.trim()).forEach((queryTerm) => { const queryTermLower = queryTerm.toLowerCase(); // maybe skip this "word" // stopwords array is from language_data.js if ( stopwords.indexOf(queryTermLower) !== -1 || queryTerm.match(/^\d+$/) ) return; if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") { // skip this "word" continue; } // stem the word var word = stemmer.stemWord(tmp[i].toLowerCase()); // prevent stemmer from cutting word smaller than two chars if(word.length < 3 && tmp[i].length >= 3) { word = tmp[i]; } var toAppend; let word = stemmer.stemWord(queryTermLower); // select the correct list if (word[0] == '-') { toAppend = excluded; word = word.substr(1); } if (word[0] === "-") excludedTerms.add(word.substr(1)); else { toAppend = searchterms; hlterms.push(tmp[i].toLowerCase()); searchTerms.add(word); highlightTerms.add(queryTermLower); } // only add if not already in the list if (!$u.contains(toAppend, word)) toAppend.push(word); } var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" ")); // console.debug('SEARCH: searching for:'); // console.info('required: ', searchterms); // console.info('excluded: ', excluded); }); // prepare search var terms = this._index.terms; var titleterms = this._index.titleterms; // console.debug("SEARCH: searching for:"); // console.info("required: ", [...searchTerms]); // console.info("excluded: ", [...excludedTerms]); // array of [filename, title, anchor, descr, score] var results = []; $('#search-progress').empty(); // array of [docname, title, anchor, descr, score, filename] let results = []; _removeChildren(document.getElementById("search-progress")); // lookup as object for (i = 0; i < objectterms.length; i++) { var others = [].concat(objectterms.slice(0, i), objectterms.slice(i+1, objectterms.length)); results = results.concat(this.performObjectSearch(objectterms[i], others)); } objectTerms.forEach((term) => results.push(...Search.performObjectSearch(term, objectTerms)) ); // lookup as search terms in fulltext results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms)); results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); // let the scorer override scores with a custom scoring function if (Scorer.score) { for (i = 0; i < results.length; i++) results[i][4] = Scorer.score(results[i]); } if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); // now sort the results by score (in opposite order of appearance, since the // display function below uses pop() to retrieve items) and then // alphabetically results.sort(function(a, b) { var left = a[4]; var right = b[4]; if (left > right) { return 1; } else if (left < right) { return -1; } else { results.sort((a, b) => { const leftScore = a[4]; const rightScore = b[4]; if (leftScore === rightScore) { // same score: sort alphabetically left = a[1].toLowerCase(); right = b[1].toLowerCase(); return (left > right) ? -1 : ((left < right) ? 1 : 0); const leftTitle = a[1].toLowerCase(); const rightTitle = b[1].toLowerCase(); if (leftTitle === rightTitle) return 0; return leftTitle > rightTitle ? -1 : 1; // inverted is intentional } return leftScore > rightScore ? 1 : -1; }); // remove duplicate search results // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept let seen = new Set(); results = results.reverse().reduce((acc, result) => { let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); if (!seen.has(resultStr)) { acc.push(result); seen.add(resultStr); } return acc; }, []); results = results.reverse(); // for debugging //Search.lastresults = results.slice(); // a copy //console.info('search results:', Search.lastresults); // console.info("search results:", Search.lastresults); // print the results var resultCount = results.length; function displayNextItem() { // results left, load the summary and display it if (results.length) { var item = results.pop(); var listItem = $('<li></li>'); var requestUrl = ""; var linkUrl = ""; if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') { // dirhtml builder var dirname = item[0] + '/'; if (dirname.match(/\/index\/$/)) { dirname = dirname.substring(0, dirname.length-6); } else if (dirname == 'index/') { dirname = ''; } requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname; linkUrl = requestUrl; } else { // normal html builders requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX; linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX; } listItem.append($('<a/>').attr('href', linkUrl + highlightstring + item[2]).html(item[1])); if (item[3]) { listItem.append($('<span> (' + item[3] + ')</span>')); Search.output.append(listItem); setTimeout(function() { displayNextItem(); }, 5); } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { $.ajax({url: requestUrl, dataType: "text", complete: function(jqxhr, textstatus) { var data = jqxhr.responseText; if (data !== '' && data !== undefined) { var summary = Search.makeSearchSummary(data, searchterms, hlterms); if (summary) { listItem.append(summary); } } Search.output.append(listItem); setTimeout(function() { displayNextItem(); }, 5); }}); } else { // no source available, just display title Search.output.append(listItem); setTimeout(function() { displayNextItem(); }, 5); } } // search finished, update title and status message else { Search.stopPulse(); Search.title.text(_('Search Results')); if (!resultCount) Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.')); else Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount)); Search.status.fadeIn(500); } } displayNextItem(); _displayNextItem(results, results.length, highlightTerms, searchTerms); }, /** * search for object names */ performObjectSearch : function(object, otherterms) { var filenames = this._index.filenames; var docnames = this._index.docnames; var objects = this._index.objects; var objnames = this._index.objnames; var titles = this._index.titles; var i; var results = []; for (var prefix in objects) { for (var iMatch = 0; iMatch != objects[prefix].length; ++iMatch) { var match = objects[prefix][iMatch]; var name = match[4]; var fullname = (prefix ? prefix + '.' : '') + name; var fullnameLower = fullname.toLowerCase() if (fullnameLower.indexOf(object) > -1) { var score = 0; var parts = fullnameLower.split('.'); // check for different match types: exact matches of full name or // "last name" (i.e. last dotted part) if (fullnameLower == object || parts[parts.length - 1] == object) { score += Scorer.objNameMatch; // matches in last name } else if (parts[parts.length - 1].indexOf(object) > -1) { score += Scorer.objPartialMatch; } var objname = objnames[match[1]][2]; var title = titles[match[0]]; // If more than one term searched for, we require other words to be // found in the name/title/description if (otherterms.length > 0) { var haystack = (prefix + ' ' + name + ' ' + objname + ' ' + title).toLowerCase(); var allfound = true; for (i = 0; i < otherterms.length; i++) { if (haystack.indexOf(otherterms[i]) == -1) { allfound = false; break; } } if (!allfound) { continue; } } var descr = objname + _(', in ') + title; var anchor = match[3]; if (anchor === '') anchor = fullname; else if (anchor == '-') anchor = objnames[match[1]][1] + '-' + fullname; // add custom score for some objects according to scorer if (Scorer.objPrio.hasOwnProperty(match[2])) { score += Scorer.objPrio[match[2]]; } else { score += Scorer.objPrioDefault; } results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]); } performObjectSearch: (object, objectTerms) => { const filenames = Search._index.filenames; const docNames = Search._index.docnames; const objects = Search._index.objects; const objNames = Search._index.objnames; const titles = Search._index.titles; const results = []; const objectSearchCallback = (prefix, match) => { const name = match[4] const fullname = (prefix ? prefix + "." : "") + name; const fullnameLower = fullname.toLowerCase(); if (fullnameLower.indexOf(object) < 0) return; let score = 0; const parts = fullnameLower.split("."); // check for different match types: exact matches of full name or // "last name" (i.e. last dotted part) if (fullnameLower === object || parts.slice(-1)[0] === object) score += Scorer.objNameMatch; else if (parts.slice(-1)[0].indexOf(object) > -1) score += Scorer.objPartialMatch; // matches in last name const objName = objNames[match[1]][2]; const title = titles[match[0]]; // If more than one term searched for, we require other words to be // found in the name/title/description const otherTerms = new Set(objectTerms); otherTerms.delete(object); if (otherTerms.size > 0) { const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); if ( [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) ) return; } } let anchor = match[3]; if (anchor === "") anchor = fullname; else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; const descr = objName + _(", in ") + title; // add custom score for some objects according to scorer if (Scorer.objPrio.hasOwnProperty(match[2])) score += Scorer.objPrio[match[2]]; else score += Scorer.objPrioDefault; results.push([ docNames[match[0]], fullname, "#" + anchor, descr, score, filenames[match[0]], ]); }; Object.keys(objects).forEach((prefix) => objects[prefix].forEach((array) => objectSearchCallback(prefix, array) ) ); return results; }, /** * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions */ escapeRegExp : function(string) { return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string }, /** * search for full-text terms in the index */ performTermsSearch : function(searchterms, excluded, terms, titleterms) { var docnames = this._index.docnames; var filenames = this._index.filenames; var titles = this._index.titles; performTermsSearch: (searchTerms, excludedTerms) => { // prepare search const terms = Search._index.terms; const titleTerms = Search._index.titleterms; const docNames = Search._index.docnames; const filenames = Search._index.filenames; const titles = Search._index.titles; var i, j, file; var fileMap = {}; var scoreMap = {}; var results = []; const scoreMap = new Map(); const fileMap = new Map(); // perform the search on the required terms for (i = 0; i < searchterms.length; i++) { var word = searchterms[i]; var files = []; var _o = [ {files: terms[word], score: Scorer.term}, {files: titleterms[word], score: Scorer.title} searchTerms.forEach((word) => { const files = []; const arr = [ { files: terms[word], score: Scorer.term }, { files: titleTerms[word], score: Scorer.title }, ]; // add support for partial matches if (word.length > 2) { var word_regex = this.escapeRegExp(word); for (var w in terms) { if (w.match(word_regex) && !terms[word]) { _o.push({files: terms[w], score: Scorer.partialTerm}) } } for (var w in titleterms) { if (w.match(word_regex) && !titleterms[word]) { _o.push({files: titleterms[w], score: Scorer.partialTitle}) } } const escapedWord = _escapeRegExp(word); Object.keys(terms).forEach((term) => { if (term.match(escapedWord) && !terms[word]) arr.push({ files: terms[term], score: Scorer.partialTerm }); }); Object.keys(titleTerms).forEach((term) => { if (term.match(escapedWord) && !titleTerms[word]) arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); }); } // no match but word was a required one if ($u.every(_o, function(o){return o.files === undefined;})) { break; } if (arr.every((record) => record.files === undefined)) return; // found search word in contents $u.each(_o, function(o) { var _files = o.files; if (_files === undefined) return if (_files.length === undefined) _files = [_files]; files = files.concat(_files); // set score for the word in each file to Scorer.term for (j = 0; j < _files.length; j++) { file = _files[j]; if (!(file in scoreMap)) scoreMap[file] = {}; scoreMap[file][word] = o.score; } arr.forEach((record) => { if (record.files === undefined) return; let recordFiles = record.files; if (recordFiles.length === undefined) recordFiles = [recordFiles]; files.push(...recordFiles); // set score for the word in each file recordFiles.forEach((file) => { if (!scoreMap.has(file)) scoreMap.set(file, {}); scoreMap.get(file)[word] = record.score; }); }); // create the mapping for (j = 0; j < files.length; j++) { file = files[j]; if (file in fileMap && fileMap[file].indexOf(word) === -1) fileMap[file].push(word); else fileMap[file] = [word]; } } files.forEach((file) => { if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); else fileMap.set(file, [word]); }); }); // now check if the files don't contain excluded terms for (file in fileMap) { var valid = true; const results = []; for (const [file, wordList] of fileMap) { // check if all requirements are matched var filteredTermCount = // as search terms with length < 3 are discarded: ignore searchterms.filter(function(term){return term.length > 2}).length // as search terms with length < 3 are discarded const filteredTermCount = [...searchTerms].filter( (term) => term.length > 2 ).length; if ( fileMap[file].length != searchterms.length && fileMap[file].length != filteredTermCount ) continue; wordList.length !== searchTerms.size && wordList.length !== filteredTermCount ) continue; // ensure that none of the excluded terms is in the search result for (i = 0; i < excluded.length; i++) { if (terms[excluded[i]] == file || titleterms[excluded[i]] == file || $u.contains(terms[excluded[i]] || [], file) || $u.contains(titleterms[excluded[i]] || [], file)) { valid = false; break; } } if ( [...excludedTerms].some( (term) => terms[term] === file || titleTerms[term] === file || (terms[term] || []).includes(file) || (titleTerms[term] || []).includes(file) ) ) break; // if we have still a valid result we can add it to the result list if (valid) { // select one (max) score for the file. // for better ranking, we should calculate ranking by using words statistics like basic tf-idf... var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]})); results.push([docnames[file], titles[file], '', null, score, filenames[file]]); } // select one (max) score for the file. const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); // add result to the result list results.push([ docNames[file], titles[file], "", null, score, filenames[file], ]); } return results; },
-
@@ -496,34 +499,33 @@ var Search = {/** * helper function to return a node containing the * search summary for a given text. keywords is a list * of stemmed words, hlwords is the list of normal, unstemmed * of stemmed words, highlightWords is the list of normal, unstemmed * words. the first one is used to find the occurrence, the * latter for highlighting it. */ makeSearchSummary : function(htmlText, keywords, hlwords) { var text = Search.htmlToText(htmlText); if (text == "") { return null; } var textLower = text.toLowerCase(); var start = 0; $.each(keywords, function() { var i = textLower.indexOf(this.toLowerCase()); if (i > -1) start = i; }); start = Math.max(start - 120, 0); var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); var rv = $('<p class="context"></p>').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlighted'); }); return rv; } makeSearchSummary: (htmlText, keywords, highlightWords) => { const text = Search.htmlToText(htmlText).toLowerCase(); if (text === "") return null; const actualStartPosition = [...keywords] .map((k) => text.indexOf(k.toLowerCase())) .filter((i) => i > -1) .slice(-1)[0]; const startWithContext = Math.max(actualStartPosition - 120, 0); const top = startWithContext === 0 ? "" : "..."; const tail = startWithContext + 240 < text.length ? "..." : ""; let summary = document.createElement("div"); summary.classList.add("context"); summary.innerText = top + text.substr(startWithContext, 240).trim() + tail; highlightWords.forEach((highlightWord) => _highlightText(summary, highlightWord, "highlighted") ); return summary; }, }; $(document).ready(function() { Search.init(); }); _ready(Search.init);
-
-
-
@@ -15,6 +15,7 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="#" />
-
@@ -44,9 +45,10 @@<li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul class="current"> <li class="toctree-l1 current"><a class="current reference internal" href="#">Index</a></li>
-
@@ -102,6 +104,8 @@<h2 id="A">A</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="C08_Groups_and_Rings.html#index-3">abel</a> </li> <li><a href="C02_Basics.html#index-24">absolute value</a> </li> <li><a href="C03_Logic.html#index-17">absurd</a>
-
@@ -164,7 +168,7 @@</li> <li><a href="C03_Logic.html#index-18">constructor</a> </li> <li><a href="C08_Topology.html#index-3">continuity</a> <li><a href="C09_Topology.html#index-3">continuity</a> </li> <li><a href="C03_Logic.html#index-17">contradiction</a> </li>
-
@@ -180,7 +184,7 @@<td style="width: 33%; vertical-align: top;"><ul> <li><a href="C02_Basics.html#index-13">definitional equality</a> </li> <li><a href="C09_Differential_Calculus.html#index-0">differential calculus</a> <li><a href="C10_Differential_Calculus.html#index-0">differential calculus</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul>
-
@@ -194,7 +198,7 @@<h2 id="E">E</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="C09_Differential_Calculus.html#index-1">elementary calculus</a> <li><a href="C10_Differential_Calculus.html#index-1">elementary calculus</a> </li> <li><a href="C03_Logic.html#index-4">erw</a> </li>
-
@@ -222,7 +226,7 @@</li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="C08_Topology.html#index-1">Filter</a> <li><a href="C09_Topology.html#index-1">Filter</a> </li> <li><a href="C03_Logic.html#index-12">from</a> </li>
-
@@ -238,10 +242,10 @@</li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="C02_Basics.html#index-14">group (algebraic structure)</a> <li><a href="C02_Basics.html#index-14">group (algebraic structure)</a>, <a href="C08_Groups_and_Rings.html#index-1">[1]</a> <ul> <li><a href="C02_Basics.html#index-15">(tactic)</a> <li><a href="C02_Basics.html#index-15">(tactic)</a>, <a href="C08_Groups_and_Rings.html#index-2">[1]</a> </li> </ul></li> </ul></td>
-
@@ -266,7 +270,7 @@<td style="width: 33%; vertical-align: top;"><ul> <li><a href="C03_Logic.html#index-5">injective function</a> </li> <li><a href="C10_Integration_and_Measure_Theory.html#index-0">integration</a>, <a href="C10_Integration_and_Measure_Theory.html#index-1">[1]</a> <li><a href="C11_Integration_and_Measure_Theory.html#index-0">integration</a>, <a href="C11_Integration_and_Measure_Theory.html#index-1">[1]</a> </li> <li><a href="C03_Logic.html#index-0">intro</a> </li>
-
@@ -302,13 +306,15 @@<td style="width: 33%; vertical-align: top;"><ul> <li><a href="C02_Basics.html#index-21">max</a> </li> <li><a href="C10_Integration_and_Measure_Theory.html#index-2">measure theory</a> <li><a href="C11_Integration_and_Measure_Theory.html#index-2">measure theory</a> </li> <li><a href="C02_Basics.html#index-29">metric space</a>, <a href="C09_Topology.html#index-2">[1]</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="C02_Basics.html#index-29">metric space</a>, <a href="C08_Topology.html#index-2">[1]</a> </li> <li><a href="C02_Basics.html#index-21">min</a> </li> <li><a href="C08_Groups_and_Rings.html#index-0">monoid</a> </li> <li><a href="C03_Logic.html#index-3">monotone function</a> </li>
-
@@ -324,7 +330,7 @@<td style="width: 33%; vertical-align: top;"><ul> <li><a href="C02_Basics.html#index-20">norm_num</a> </li> <li><a href="C09_Differential_Calculus.html#index-2">normed space</a> <li><a href="C10_Differential_Calculus.html#index-2">normed space</a> </li> </ul></td> </tr></table>
-
@@ -374,7 +380,7 @@<td style="width: 33%; vertical-align: top;"><ul> <li><a href="C03_Logic.html#index-21">right</a> </li> <li><a href="C02_Basics.html#index-7">ring (algebraic structure)</a> <li><a href="C02_Basics.html#index-7">ring (algebraic structure)</a>, <a href="C08_Groups_and_Rings.html#index-4">[1]</a> <ul> <li><a href="C02_Basics.html#index-6">(tactic)</a>
-
@@ -419,7 +425,7 @@tactics <ul> <li><a href="C02_Basics.html#index-15">abel</a> <li><a href="C02_Basics.html#index-15">abel</a>, <a href="C08_Groups_and_Rings.html#index-3">[1]</a> </li> <li><a href="C02_Basics.html#index-12">apply</a>, <a href="C02_Basics.html#index-17">[1]</a> </li>
-
@@ -439,7 +445,7 @@</li> <li><a href="C03_Logic.html#index-18">constructor</a> </li> <li><a href="C08_Topology.html#index-3">continuity</a> <li><a href="C09_Topology.html#index-3">continuity</a> </li> <li><a href="C03_Logic.html#index-17">contradiction</a> </li>
-
@@ -459,7 +465,7 @@</li> <li><a href="C03_Logic.html#index-12">from</a> </li> <li><a href="C02_Basics.html#index-15">group</a> <li><a href="C02_Basics.html#index-15">group</a>, <a href="C08_Groups_and_Rings.html#index-2">[1]</a> </li> <li><a href="C02_Basics.html#index-11">have</a>, <a href="C03_Logic.html#index-12">[1]</a> </li>
-
@@ -504,9 +510,9 @@<td style="width: 33%; vertical-align: top;"><ul> <li><a href="C03_Logic.html#index-12">this</a> </li> <li><a href="C08_Topology.html#index-4">topological space</a> <li><a href="C09_Topology.html#index-4">topological space</a> </li> <li><a href="C08_Topology.html#index-0">topology</a> <li><a href="C09_Topology.html#index-0">topology</a> </li> </ul></td> </tr></table>
-
-
-
@@ -1,7 +1,8 @@<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Mathematics in Lean — Mathematics in Lean 0.1 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-
@@ -15,6 +16,7 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" />
-
@@ -45,9 +47,10 @@<li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
@@ -77,8 +80,8 @@<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <div class="section" id="mathematics-in-lean"> <h1>Mathematics in Lean<a class="headerlink" href="#mathematics-in-lean" title="Permalink to this headline"></a></h1> <section id="mathematics-in-lean"> <h1>Mathematics in Lean<a class="headerlink" href="#mathematics-in-lean" title="Permalink to this heading"></a></h1> <div class="toctree-wrapper compound"> <ul> <li class="toctree-l1"><a class="reference internal" href="C01_Introduction.html">1. Introduction</a><ul>
-
@@ -127,28 +130,33 @@<li class="toctree-l2"><a class="reference internal" href="C07_Hierarchies.html#sub-objects">7.3. Sub-objects</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a><ul> <li class="toctree-l2"><a class="reference internal" href="C08_Topology.html#filters">8.1. Filters</a></li> <li class="toctree-l2"><a class="reference internal" href="C08_Topology.html#metric-spaces">8.2. Metric spaces</a></li> <li class="toctree-l2"><a class="reference internal" href="C08_Topology.html#topological-spaces">8.3. Topological spaces</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a><ul> <li class="toctree-l2"><a class="reference internal" href="C08_Groups_and_Rings.html#monoids-and-groups">8.1. Monoids and Groups</a></li> <li class="toctree-l2"><a class="reference internal" href="C08_Groups_and_Rings.html#rings">8.2. Rings</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a><ul> <li class="toctree-l2"><a class="reference internal" href="C09_Topology.html#filters">9.1. Filters</a></li> <li class="toctree-l2"><a class="reference internal" href="C09_Topology.html#metric-spaces">9.2. Metric spaces</a></li> <li class="toctree-l2"><a class="reference internal" href="C09_Topology.html#topological-spaces">9.3. Topological spaces</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a><ul> <li class="toctree-l2"><a class="reference internal" href="C09_Differential_Calculus.html#elementary-differential-calculus">9.1. Elementary Differential Calculus</a></li> <li class="toctree-l2"><a class="reference internal" href="C09_Differential_Calculus.html#differential-calculus-in-normed-spaces">9.2. Differential Calculus in Normed Spaces</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a><ul> <li class="toctree-l2"><a class="reference internal" href="C10_Differential_Calculus.html#elementary-differential-calculus">10.1. Elementary Differential Calculus</a></li> <li class="toctree-l2"><a class="reference internal" href="C10_Differential_Calculus.html#differential-calculus-in-normed-spaces">10.2. Differential Calculus in Normed Spaces</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a><ul> <li class="toctree-l2"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html#elementary-integration">10.1. Elementary Integration</a></li> <li class="toctree-l2"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html#measure-theory">10.2. Measure Theory</a></li> <li class="toctree-l2"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html#integration">10.3. Integration</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a><ul> <li class="toctree-l2"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html#elementary-integration">11.1. Elementary Integration</a></li> <li class="toctree-l2"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html#measure-theory">11.2. Measure Theory</a></li> <li class="toctree-l2"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html#integration">11.3. Integration</a></li> </ul> </li> </ul> </div> <div class="toctree-wrapper compound"> </div> </div> </section> </div>
-
-
-
-
@@ -16,6 +16,7 @@<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/jquery.js"></script> <script src="_static/underscore.js"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js"></script> <script src="_static/doctools.js"></script> <script src="_static/js/theme.js"></script> <script src="_static/searchtools.js"></script>
-
@@ -47,9 +48,10 @@<li class="toctree-l1"><a class="reference internal" href="C05_Elementary_Number_Theory.html">5. Elementary Number Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C06_Structures.html">6. Structures</a></li> <li class="toctree-l1"><a class="reference internal" href="C07_Hierarchies.html">7. Hierarchies</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Topology.html">8. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Differential_Calculus.html">9. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Integration_and_Measure_Theory.html">10. Integration and Measure Theory</a></li> <li class="toctree-l1"><a class="reference internal" href="C08_Groups_and_Rings.html">8. Groups and Rings</a></li> <li class="toctree-l1"><a class="reference internal" href="C09_Topology.html">9. Topology</a></li> <li class="toctree-l1"><a class="reference internal" href="C10_Differential_Calculus.html">10. Differential Calculus</a></li> <li class="toctree-l1"><a class="reference internal" href="C11_Integration_and_Measure_Theory.html">11. Integration and Measure Theory</a></li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
-
-
-
@@ -1,1 +1,1 @@Search.setIndex({docnames:["C01_Introduction","C02_Basics","C03_Logic","C04_Sets_and_Functions","C05_Elementary_Number_Theory","C06_Structures","C07_Hierarchies","C08_Topology","C09_Differential_Calculus","C10_Integration_and_Measure_Theory","genindex","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["C01_Introduction.rst","C02_Basics.rst","C03_Logic.rst","C04_Sets_and_Functions.rst","C05_Elementary_Number_Theory.rst","C06_Structures.rst","C07_Hierarchies.rst","C08_Topology.rst","C09_Differential_Calculus.rst","C10_Integration_and_Measure_Theory.rst","genindex.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"0":[0,1,2,3,4,5,6,7,8,9],"02463336":6,"1":[1,2,3,4,5,6,7,8,9],"10":2,"12":4,"15":2,"17":4,"2":[0,1,2,3,4,5,6,7,8,9],"256":7,"263":6,"27":4,"2c":4,"3":[0,1,2,3,4,5,6,7],"37":2,"4":[0,1,2,4,5,7,8],"4c":4,"5":[1,2,5,7,8],"50":6,"512":7,"6":[2,4,5,6,7,8],"64":7,"7":[2,4],"70":6,"73":6,"8":[2,4,7],"9":8,"\u00b9":[1,3,5,6,7],"\u02e2":7,"\u03b1":[1,2,3,4,5,6,7,8,9],"\u03b2":[1,2,3,5,6,7,9],"\u03b3":[1,2,5,7],"\u03b4":[2,7],"\u03b4po":7,"\u03b5":[2,7,8],"\u03b52po":2,"\u03b5_po":[7,8],"\u03b5k_po":8,"\u03b5po":[2,7],"\u03b9":[7,8,9],"\u03bc":[7,9],"\u03bd":9,"\u03c0":[7,8],"\u03c3":5,"\u03c6":7,"\u1d50":9,"\u1da0":[7,8,9],"\u2080":3,"\u2081":6,"\u2102":[1,5,8],"\u2115":[0,1,2,3,4,5,6,7,8,9],"\u211a":[1,4,7],"\u211d":[1,2,3,5,6,7,8,9],"\u2124":[1,4,5,6],"\ud835\udcdd":[7,8,9],"\ud835\udcdf":7,"\ud835\udce4":7,"\ud835\udd42":8,"\ud835\udd5c":[8,9],"\ud835\udfd9":6,"abstract":[1,2,5,6,7],"add_assoc\u2083":6,"addcommgroup\u2083":6,"addcommmonoid\u2083":6,"addcommsemigroup\u2083":6,"addgroup\u2081":5,"addgroup\u2082":5,"addgroup\u2083":6,"addmonoid\u2083":6,"addmonoid\u2084":6,"addmonoidhom\u2081":6,"addsemigroup\u2083":6,"boolean":1,"break":6,"case":[1,2,3,4,5,6,7,9],"class":[1,4,5,6,7,8,9],"commgroup\u2083":6,"commmonoid\u2083":6,"commsemigroup\u2083":6,"default":[1,2,3,4,5,6,8],"dia\u2081":6,"diaoneclass\u2081":6,"do":[0,1,2,3,4,5,6,7,8,9],"export":6,"final":[1,2,3,5,7,9],"fr\u00e9chet":8,"function":[1,2,4,5,6,8,9,11],"group\u2081":[5,6],"group\u2081cat":5,"group\u2082":5,"group\u2083":6,"h\u03b5":8,"h\u2080":[1,2,3,4,7],"h\u2081":[1,2,3,4],"h\u2082":[1,3,4],"h\u2083":[1,3],"hasinvgroup\u2082":5,"hasmulgroup\u2082":5,"hasonegroup\u2082":5,"import":[1,2,3,4,5,6,7,9],"int":[5,6],"inv\u2081":6,"ismonoidhom\u2081":6,"ismonoidhom\u2082":6,"k\u00fclshammer":0,"le\u2081":6,"left_inv_eq_right_inv\u2081":6,"long":[1,2,3,5,6,8],"lt\u2081":6,"map\u2082":6,"mem_iinter\u2082":3,"mem_iunion\u2082":3,"module\u2081":6,"module\u2083":6,"monoid\u2081":6,"monoid\u2082":6,"monoid\u2083":6,"monoidhom\u2081":6,"monoidhomclass\u2081":6,"monoidhomclass\u2082":6,"monoidhomclass\u2083":6,"mul_assoc\u2083":6,"mul_left_cancel\u2083":6,"mul_right_cancel\u2083":6,"n\u2080":2,"n\u2081":2,"new":[0,1,2,3,4,5,6,7],"nsmul\u2081":6,"one\u2081":6,"one\u2082":6,"orderedcommmonoid\u2081":6,"partialorder\u2081":6,"pos\u2080":2,"preorder\u2081":6,"return":[0,2,3,4,5,7],"ring\u2081":6,"ring\u2083":6,"ringhom\u2081":6,"ringhomclass\u2083":6,"s\u1d9c":[7,9],"s\u2081":6,"s\u2082":6,"schr\u00f6der":11,"semigroup\u2081":6,"semigroup\u2082":6,"semigroup\u2083":6,"short":[0,1,2,3,4,5],"smul\u2083":6,"subgroup\u2081":6,"subgroupclass\u2081":6,"submonoid\u2081":6,"submonoid\u2081monoid":6,"submonoidclass\u2081":6,"switch":[1,6],"tendsto\u2081":7,"tendsto\u2082":7,"toaddcommgroup\u2083":6,"toaddgroup\u2083":6,"todia\u2081":6,"todiaoneclass\u2081":6,"tomonoidhom\u2081":6,"toone\u2081":6,"tosemigroup\u2081":6,"tosmul\u2083":6,"true":[1,2,3,6,7],"try":[0,1,2,3,4,5,6,7],"while":[0,1,2,6,7],"x\u2080":[7,8],"x\u2081":[2,3,5,7],"x\u2081a":3,"x\u2082":[2,3,5],"x\u2082a":3,"x\u2082eq":3,"x\u2082na":3,"y\u2080":7,"y\u2081":5,"y\u2082":5,"z\u2080":7,"z\u2081":5,"z\u2082":5,"zsmul\u2081":6,A:[1,2,3,4,5,6,7,8],And:[2,4,6,7],As:[0,1,2,3,4,5,6,7,8,9],At:[0,1,2,4,5,6],Be:[1,3],But:[0,1,2,3,4,5,6,7],By:[1,3,5,6],For:[0,1,2,3,4,5,6,7,8,9],If:[0,1,2,3,4,5,6,7],In:[0,1,2,3,4,5,6,7,8,9],It:[0,1,2,3,4,5,6,7,8],Its:[5,6],Not:[1,5,7],Of:[1,2,4,6,7,8,9],On:[1,2,3,5,6,7,9],One:[1,2,3,4,5,6,7],Or:[2,3],Such:[0,1,2,6],That:[0,4,5,6],The:[0,1,4,5,6,7,8,9,11],Their:[7,8],Then:[2,3,5,6,7,9],There:[0,1,2,3,4,6,7,8,9],These:[0,1,3,4,5,8,9],To:[0,1,2,3,4,5,6,7],With:[1,3,4,6,7],_:[0,1,2,3,4,5,6,7,8,9],_add_mod:5,_def:4,_eq:5,_in:7,_inst_1:5,_le:5,_root_:[1,4],a_0:3,a_1:3,a_2:3,a_def:3,a_of_b_of_c:1,ab:[2,5],abandon:4,abbrevi:[1,2,3,5],abel:1,abelian:[1,5,6],abgrpmodul:6,abil:0,abl:[0,1,2,3,4,5,6,8],abn:2,about:[0,2,3,4,5,6,7,8,11],abov:[0,1,2,3,4,5,6,7,9],abs_add:[1,2],abs_l:[1,5],abs_lt:2,abs_mod:5,abs_mul:2,abs_nonneg:2,abs_of_neg:2,abs_of_nonneg:[2,5],abs_po:2,abs_zero:2,absa:2,absb:2,absolut:2,absorb1:1,absorb2:1,absorpt:1,abstractli:7,absurd:[2,4],abus:5,ac:5,accept:[0,1,2,7],access:[1,3,5,6,7,9],accessor:5,accommod:5,accompani:5,accord:5,achiev:[5,6,7],acknowledg:0,acpo:2,across:6,act:1,activ:0,actual:[2,3,4,6,7],ad:[1,2,3,4,5,6,7],adapt:5,add:[2,4,5,6,7,8],add_assoc:[1,4,5,6],add_comm:[1,4,5,6],add_def:5,add_im:5,add_l:1,add_le_add:[1,2],add_le_add_left:1,add_le_add_right:1,add_left_cancel:1,add_left_inj:2,add_left_neg:[1,5],add_lt_add_left:1,add_lt_add_of_le_of_lt:1,add_lt_add_of_lt_of_l:1,add_lt_add_right:1,add_mul:[1,6],add_mul_mod_self_left:4,add_neg_cancel_right:1,add_nonneg:[1,5],add_one_le_of_lt:5,add_po:1,add_pos_of_pos_of_nonneg:1,add_r:5,add_right_cancel:1,add_right_neg:1,add_smul:6,add_sub:1,add_sub_cancel:4,add_x:5,add_zero:[1,5,6],addalt:5,addalt_comm:5,addalt_x:5,addcommgroup:1,addgroup:[1,5],addgrouppoint:5,addit:[1,2,4,5,6,7,8,9],addmonoid:6,addzeroclass:6,adi:5,adject:6,adopt:1,advantag:[2,3,4,5,8],ae:[7,9],aestronglymeasur:9,affect:6,aforement:7,after:[1,2,4,6,7,8],again:[1,2,3,4,5,6,7],against:2,agre:3,ai:3,aim:4,aka:7,aleb:2,alex:0,algebra:[4,6,7,8,9,11],algebrahom:6,algorithm:5,all:[0,1,2,3,4,5,6,7,8,9],allow:[1,2,3,4,5,6,7,8,9],almost:[5,6,7,9],alon:3,along:[1,4,7],alpha:[2,3],alreadi:[0,1,2,3,4,5,6,7],also:[0,1,2,3,4,5,6,7,8,9],altern:[0,2,3,4,5,6,7],although:[0,3,4,5,6,7],alwai:[0,1,2,3,5,6],ambigu:[1,5],among:4,an:[0,1,2,3,4,5,6,7,8,9],analog:[1,2,3,4,5,7,8],analysi:[0,5,8],ancient:4,and_comm:3,anecdot:6,angl:2,ani:[0,1,2,3,4,5,6,7,8,9],ann:5,annoi:[4,6],annot:[1,2,3,4,5,6],anonym:[2,3,4,5],anoth:[0,1,2,3,4,5,6,7],answer:[0,5,7],antireflex:5,antisymm:3,antisymmetr:2,anyhow:2,anyth:[2,5,7],apart:[5,6],api:1,appeal:[3,6],appear:[0,1,2,5,6,7],appli:[2,3,4,5,6,7,8,9,11],applic:[1,2,4,5,9],appreci:4,approach:[4,5,6,7],appropri:[1,2,3,5,6],approxim:1,ar:[0,1,2,3,4,5,6,7,8,9],arbitrari:[1,2,3,4,5],arbitrarili:[2,7],archetyp:5,argu:6,argument:[1,2,3,4,5,6,7],aris:2,arithmet:1,around:[1,3,6,7,9],arrang:5,arrow:[1,2,6,7],artifici:5,ascii:6,ascript:6,asid:3,ask:[2,4,5,6,7],aspect:[0,5],assembl:7,assert:[2,3,6],assign:[2,3,5,6],assist:[0,2,5],associ:[0,1,2,4,5,6,7,9],assum:[0,1,2,3,4,6,7],assumpt:[0,1,2,3,4,5,7,8,9],assur:5,asymmetri:2,attach:7,attain:7,attempt:6,attent:[1,2,4,6,7],attop:[7,9],attop_basi:7,attr:6,attract:2,attribut:6,auto:6,autom:[0,1,5],automat:[0,1,2,3,4,5,6,7,8],aux:[1,2,4,7],auxiliari:[2,7],avail:[0,1,2,4,5,6],averag:5,avoid:[1,2,3,4,5,6,8],awai:[2,5],axiom:[1,2,3,5,6,7,9],axiomat:[1,2,3,5],b:[1,2,3,4,5,6,7,8,9],baanen:5,back:[0,1,2,3,5,6,7],background:0,backslash:[1,3],backward:[2,7],bad:[5,6,7],badinst:6,bair:[7,8],balanc:1,ball:[3,8],banach:[8,9],bar:[0,1,2],bare:6,barrier:6,bartosz:0,base:[0,2,3,4,6,7,8],basi:[5,7],basic:[0,2,4,5,7,9,11],baz:1,bbb:[2,5],bc:5,bci:5,bd:5,becaus:[1,2,3,4,5,6,7,8],becom:[1,4,5,6,7],been:[0,1,2,4,5,6,8],befor:[0,1,2,3,4,5,6],begin:[1,2,3,4,5,6],begun:7,behav:[2,3,6,7],behavior:[3,6,7],behind:3,being:[1,3,5,7,8],belong:[5,6,7],below:[0,2,3,4,5,6,7,8,9],beq:2,berman:0,bernstein:11,besid:6,bespok:5,best:0,beta:[2,3],better:[3,4,5,6,7],between:[0,1,2,3,4,5,6,7,8,9],bewar:6,bex:3,bex_def:3,beyond:[2,6,8],bi:[1,2,5],big:[0,5,7,8],bigcup_:3,bigger:[0,3,8],bigoper:[4,5],biject:[3,5],bilinear:9,binari:[1,2,4,5,6],bind:[1,3],binder:6,bipartit:5,bit:[1,2,4,6,7],black:[4,6],block:[1,4],blur:7,bochner:9,boil:6,bold:2,bolt:1,book:[0,2,7],border:7,borelspac:9,boss:7,both:[1,2,3,4,5,6,7,8],bother:[1,3],bottom:[6,7],bound:[1,2,3,4,5,7,8,9],bounded:8,bounded_of_ex_finset:4,bourbaki:7,box:4,bpo:[2,7],bq:5,brace:1,bracket:[1,2,5,6],branch:[2,3,6],breviti:[1,5],bring:[3,4,7],broader:[4,8],broadest:5,brows:[0,1,4],bryan:0,build:[0,2,4,6,7,11],builder:3,built:[0,2,6],builtin:6,bulb:5,bulwi:0,bundl:[5,6,7,8],button:0,by_cas:[2,3,4],by_contra:[2,4],c:[0,1,2,4,5,6,7,8,9],cach:0,calc:[1,2,3,5,7],calcul:[0,2,4,5,11],calculu:[7,9,11],call:[0,1,2,3,4,5,6,7,8,9],can:[0,1,2,3,4,5,6,7,8,9],candid:5,cannot:[2,3,4,5,6,7],canon:[2,3,4,5],cantor:3,cap:3,capabl:5,capit:5,cardin:3,care:[1,2,3,5],carneiro:0,carri:[0,1,2,3,4,5,6,7,9],carrier:[1,5,6],categor:7,categori:[5,7,8],cauchi:7,cauchyseq:7,cauchyseq_iff:7,cauchyseq_of_le_geometric_two:7,cauchyseq_tendsto_of_complet:7,cdist:7,cdot:5,center:[0,7],central:[0,4],centuri:3,ceq:2,certain:[2,6,7],certifi:0,cha:0,chain:5,challeng:[0,1,2,3,5,8],chanc:2,chang:[0,1,2,4,5,7,9],chapter:[0,1,2,3,4,5,6,7,8],charact:[1,3,6],character:[1,3,4,7,8],chat:0,cheat:[0,1],check:[0,1,2,3,4,5,6,7],checksynthord:6,chen:0,chestnut:2,choic:[1,2,3,5,7],choos:[0,2,3,4,5,6,7],choose_spec:3,chose:6,chosen:[2,5],circ:[3,5],claim:7,clarifi:5,clash:1,classic:[2,3,4],claus:6,clean:[2,7],clear:[1,2,4,5,6],clearer:[1,3,5],clearli:7,clever:1,click:[0,1,3,4,5,6],clock:0,close:[1,2,3,6,8,9],closed_nhds_basi:7,closedbal:7,closer:[2,7],closur:7,cloud:0,clunki:7,cluster:7,clusterpt:7,cmd:[1,2],co:2,cocki:1,code:[0,1,2,3,5,6],codomain:[2,4,7],coe:6,coe_inject:6,coe_natab:5,coe_natabs_norm:5,coeffici:5,coefun:6,coerc:6,coercion:[5,6,7,8],coincid:[4,5,7],coinduc:7,coinduced_compos:7,coinduced_le_iff_le_induc:7,collari:0,collect:[1,2,3,5,7,9],collis:6,colon:2,comap:7,comap_comap:7,combin:[1,2,5,6,7],come:[0,1,2,3,4,5,6,7],comfort:0,comma:1,command:[0,1,2,3,4,5,6],commelin:0,comment:[0,4],commgroup:1,commmonoid:6,common:[1,2,3,4,5,7],commonli:[4,5],commr:[1,2,5],commun:[0,4],commut:[1,2,3,4,5,6,8],comp:7,compact:9,compactspac:7,compani:2,companion:[0,1],compar:[0,5,6,7],comparison:6,compat:[1,7],compl:9,complain:1,complement:[3,7,9],complementari:0,complet:[0,1,2,3,4,6,8],completespac:[7,8,9],complex:[0,1,2,4,5,8,9],complic:[1,2,6],compon:[2,3,5,7,9],compos:[3,5,7],composit:[2,3,5,6,7],compound:[1,2,7],compress:[0,1,7],comput:[0,2,3,4,5,8,9],computation:4,concentr:3,concept:[5,7,8],conceptu:3,concis:[1,5],conclud:[2,8],conclus:[1,2,4],concret:[1,2,4,5,6,7],condens:3,condit:[3,4,6,7,8],confid:3,configur:5,confirm:[1,2,3,4],confus:[3,4,6,7],congr:2,congratul:[1,2,4],congruent:4,conj:5,conj_im:5,conj_r:5,conjug:5,conjunct:[6,11],connect:[1,3,5,7],consid:[1,2,3,4,5,6,7,8,9],consist:[1,3,5,6,7,8],constant:[1,2,9],constitut:1,constraint:[5,7],construct:[0,2,3,4,5,6,7],constructor:[2,3,4,5,6],consult:5,cont:8,contain:[0,2,3,4,5,6,7,8,9],contdiff:8,contdiff_iff_continuous_differenti:8,contdiffat:8,contend:4,content:[0,1,2,4,7],context:[1,2,4,5,6,7,8,9],contextu:5,continu:[0,1,4,5,6,9],continuous_def:7,continuous_dist:7,continuous_fst:7,continuous_id:[6,7],continuous_iff:7,continuous_iff_coinduced_l:7,continuous_linear_map:8,continuous_pow:7,continuous_snd:7,continuousat:[7,9],continuousat_extend:7,continuousat_iff:7,continuouslinearmap:8,continuouson:[7,8],continuum:2,contract:2,contradict:[2,3,4],contradictori:2,contrapos:[2,3,4],contrari:2,contrast:[2,3,5,6,7],contravari:7,contribut:[0,3],control:2,conveni:[1,2,3,5,6,7],convent:[1,5,9],convention:7,converg:[9,11],convergesto:2,convergesto_add:2,convergesto_const:2,convergesto_mul:2,convergesto_mul_const:2,convergesto_uniqu:2,convers:[0,2,4,7],convert:[2,4],convinc:5,convolut:9,copi:[0,3,4,6,7],coprim:4,coprime_mn:4,core:[0,4,5],correct:[0,1],correctli:3,correspond:[0,1,2,3,4,5,6,7,8],could:[0,1,2,4,5,6,7],count_factors_mul_of_po:4,countabl:9,counterexampl:[2,8],counterpart:5,coupl:[1,2,6,7],cours:[1,2,4,6,7,8,9],covari:7,cover:[0,1,3,6,7,8],creat:[0,1,6],creativ:5,criterion:7,crucial:7,crude:4,cryptic:2,cs:2,ct:2,ctrl:[0,1,2,4,5],cue:5,cup:3,curiou:[1,6],curli:[1,2],current:[0,1,2,6],curri:1,cursor:[0,1,2],curv:0,custom:5,cut:4,czubin:0,d:[1,2,4,5,8],dai:3,danger:[4,5],data:[1,2,4,5,6,7],databas:[3,4,6,7],datatyp:4,de:0,deal:[1,2,3,4,5,7],dealt:2,decid:[4,7],decidableeq:4,decidablepr:4,decis:4,declar:[0,1,4,5,6],decompos:[0,3],decreas:[1,5],dedekind:3,deduc:[6,7],def:[0,2,3,4,5,6,7],defect:[2,6,7],defin:[1,2,3,4,6,7,8,9,11],definit:[0,1,2,3,4,5,6,7,8,9],definition:[1,4,5,6,7],delet:[1,2,3,4],delic:3,delimit:1,demonstr:[6,7],deni:0,denomin:[2,4,5],denot:[1,3,4,6,7],dens:7,denseinduc:7,densiti:7,depend:[0,2,3,4,5,6,7],deriv:[1,2,4,8,9],deriv_add:8,deriv_eq_zero:8,deriv_zero_of_not_differentiableat:8,descend:6,describ:[0,1,2,3,4,5,6,7],descript:[0,1,2,4,7],deserv:4,design:[0,1,2,3,5,7],desir:[1,3,6,7],destruct:2,destructur:6,det:9,detail:[1,2,3,4,5,6],detect:2,determin:[1,5,7],develop:[0,1,4,9],devic:6,devot:7,di:[2,5],dia:6,dia_assoc:6,dia_inv:6,dia_on:6,diagram:3,diamond:6,dictionari:1,did:[0,2,6,7],dif_neg:3,dif_po:3,diff_eq:3,differ:[0,1,2,3,4,5,6,7,8],differenti:[9,11],differentiableat:8,differentiableon:8,difficult:[2,6],digress:7,dimension:[8,9],direct:[1,2,3,6,7,8],directli:[2,4,5,6,7],discret:5,discuss:[1,2,4,5,6,7,8],dishwash:0,disjoint:[3,9],disjunct:[1,3,11],dispens:4,displai:[0,1,2,6],dispos:2,dist:[1,7],dist_comm:[1,7],dist_eq_zero:7,dist_le_range_sum_dist:7,dist_nonneg:[1,7],dist_self:1,dist_triangl:[1,7],distanc:[1,2,7,8],distinct:[0,2,3,4,5,7],distinguish:[0,5,6,7,8],distract:6,distriblattic:1,distribut:[1,4,5,6],div:5,div_def:5,div_dvd_of_dvd:4,div_eq_mul_inv:5,div_eq_of_eq_mul_right:4,div_lt_self:4,div_nonneg:5,div_po:2,divab:2,divac:2,divbc:2,dive:0,divid:[1,2,4,5],divis:[1,2,4,5,6],divisor:[1,2,4,5],document:[0,1,3,4,6],doe:[0,1,2,3,4,5,6,7,8],doesn:[1,2,7],domain:[1,2,3,4,5,7],domin:9,don:[0,1,2,3,4,5,6,7,9],done:[0,2,3,4,6,7],doorn:0,dot:[1,7],doubl:[2,3],doubt:0,down:[0,3,4,6,7],dozen:3,draw:[1,5,6],drop:2,dsimp:[2,3,4,5],dual:[5,7],dualli:7,due:[1,3,6],duplic:6,dvd:1,dvd_add_iff_left:4,dvd_antisymm:1,dvd_fac:4,dvd_factori:4,dvd_gcd:4,dvd_gcd_iff:2,dvd_iff_exists_eq_mul_left:4,dvd_mul:4,dvd_mul_left:1,dvd_mul_of_dvd_left:1,dvd_mul_of_dvd_right:4,dvd_mul_right:[2,4],dvd_of_dvd_pow:4,dvd_prod_of_mem:4,dvd_sub:4,dvd_tran:1,dwell:3,e:[1,2,3,4,5,6,7,8,9],each:[0,1,2,3,4,5,6,7,8],earlier:1,easi:[0,4,5,6,7],easier:[0,1,3,4,6,7],easiest:[2,4],easili:[1,4,5,6],ebner:0,edit:0,editor:[0,1],ediv_add_emod:5,ediv_lt_of_lt_mul:5,ediv_mul_l:5,ef:2,effect:[1,3,6,7],effici:[5,7],effort:[1,4],eg:2,eight:7,either:[1,2,3,5,6,7],elabor:7,ele1:2,eleg:5,element:[1,2,3,4,5,6,7,8,9],elementari:[0,3,5,7,11],elim:2,elim_finite_subcov:7,elimin:1,els:[2,3,4],em:[2,3],emb:5,embark:6,emetricspac:7,emod_lt:5,emod_lt_of_po:5,emod_nonneg:5,emphas:6,emphasi:[0,6],empti:[3,4,5,7,9],enabl:[2,3,4,5],enat:4,encapsul:[3,5,8],encod:9,encount:[4,6],encourag:[0,1,2,3,4,5],end:[1,2,3,4,5,6,7,8],endow:6,engin:4,enjoi:[2,3,4,7],ennreal:9,enough:[0,1,2,3,4,6,7],ensur:[6,7],enter:[0,1,2,3,7],enthusiast:0,entir:[1,3,5,7,8],entourag:7,entri:[0,5],enumer:[1,2],epo:2,eq1:4,eq2:4,eq:[3,5],eq_empty_or_nonempti:7,eq_neg_of_add_eq_zero:1,eq_of_dvd_of_prim:4,eq_one_or_self_of_dvd:4,eq_two_or_odd:3,eq_univ:3,eq_univ_of_foral:3,eq_zero_or_eq_zero_of_mul_eq_zero:2,equal:[1,2,3,4,5,6,7,9],equat:[1,2,3,4,5],equilater:5,equip:[1,3,5,6,7,8,9],equiv:5,equival:[1,2,3,4,5,7,8,9],eras:4,eric:0,error:[1,2,3,6],erw:2,especi:[1,2,5,6,7],essenti:[2,3,5,7],establish:[0,1,2,3,4,5],eta:5,etc:7,euclidean:5,euclideandomain:5,eval:0,even:[0,1,2,3,4,5,6,7,8,9],even_iff:3,even_of_even_sqr:4,eventu:[2,3,7],eventually_eventually_nhd:7,eventually_left_invers:8,eventually_of_foral:7,eventually_right_invers:8,eventuallyeq:7,ever:[0,7],everi:[0,1,2,3,4,5,6,7,8,9],everyth:[1,2,6,7],everywher:[2,3,6,7,9],evid:5,evolv:1,ex:[0,2],ex_finset_of_bound:4,exact:[1,2,3,4,5,7],exactli:[1,2,3,5,6,7],exampl:[0,2,3,4,5,6,7,8,9,11],except:[1,2,5],exclam:7,exclud:[2,4],exercis:[0,1,2,3,5,6,7,8],exfalso:2,exhibit:[2,7],exist:[1,2,3,6,7],existenti:[3,11],exists_abs_le_of_convergesto:2,exists_deriv_eq_slop:8,exists_deriv_eq_zero:8,exists_forall_g:7,exists_forall_l:7,exists_infinite_prim:3,exists_one_lt_norm:8,exists_prime_and_dvd:3,exists_prime_factor:4,exists_prime_factor_mod_4_eq_3:4,exot:7,exp:[1,3],exp_le_exp:1,exp_log:3,exp_lt_exp:1,exp_po:[1,3],expand:[1,2,3,4,5],expect:[1,2,3,4,5,6,7],expend:6,experi:[0,1,7],explain:[1,2,3,4,5,6,7,9],explan:[0,7],explicit:[1,2,5,6,7],explicitli:[1,2,3,5,6,7,8],explor:[4,7],expon:1,exponenti:4,expos:[2,7],express:[0,1,2,3,4,5,6,7,8,9],ext:[2,3,4,5,6],ext_iff:5,extend:[1,3,4,5,6,7,9],extens:[0,1,6,7,8],extension:[3,5],extra:[1,2,3,5,6,7],extract:[2,7],extrem:[0,6,7],f:[0,1,2,3,4,5,6,7,8,9],f_:7,f_cont:7,f_le:7,f_ne:7,fac:4,fac_po:4,face:[5,6,7],facilit:[2,7],fact:[0,2,3,4,5,6,7,8,9,11],factor:[4,5],factori:4,factorial_po:4,factorization_mul:4,factorization_pow:4,factors_uniqu:4,fail:[1,2,3,4,5,6,7,9],failur:6,fairli:2,fall:3,fals:[1,2,3,4,6],falso:2,famili:[7,8],familiar:[0,1,4,5,7,8],famou:3,far:[2,3,6,7],favor:[1,5],fderiv:8,fear:6,feat:4,featur:[0,2,4],feedback:0,feel:[0,1,2,6,7],fermatlasttheorem:0,fetch:0,few:[1,2,3,4,7],field:[0,1,5,6,8],field_simp:[2,5],figur:[0,1,2,5],file:[0,1,4,5,6,7],fill:[2,3,4,5],filter:[4,8,9,11],filter_upward:7,filteri:7,fin:[5,9],find:[0,1,2,4,5,6,7],finicki:1,finish:[1,2,3,4],finit:[1,3,4,5,7,8,9],finitedimension:[8,9],finset:[4,5,7],fintyp:7,first:[0,1,2,3,4,5,6,7,8,9],firstcountabletopolog:7,fix:[4,6,7],fixm:5,flag:[2,3],flexibl:7,flori:0,fn_ub_add:2,fneven:2,fnhaslb:2,fnhasub:2,fnlb:2,fnodd:2,fnub:2,fnub_add:2,fnuba:2,focu:[0,1,7,9],focus:7,folder:0,follow:[0,1,2,3,4,5,6,7,8,9],foo:[1,3,5],forc:[1,2,3],foreshadow:1,forewarn:0,forget:6,form:[0,1,2,3,4,5,6,7,9],formal:[0,1,2,3,4,5,6,7,8],format:1,former:5,formul:[4,7],formula:9,forth:5,fortiori:7,fortun:3,forward:[1,2,5,7],found:[1,5,8],foundat:[2,3,4,5],four:[2,5],fourth:[1,2],frac:5,fraction:4,fraenkel:2,framework:0,free:[0,1,7],freeli:4,frequent:7,friend:[2,5],from:[0,1,2,3,4,5,6,7,8,9],front:2,frustrat:[0,6],fst:[5,7],fubini:9,full:[1,2,3,4,5,6,7],fulli:[3,7],fun:[0,2,3,4,5,6,7,8,9],functori:7,fundament:[0,4,5,6,9],funlik:6,funni:7,further:[1,7],fx:3,fxeq:3,g:[1,2,3,5,6,7,8,9],g_1:5,g_2:5,g_3:5,g_:7,gabriel:0,gadget:[2,7],gain:6,galoi:[3,5,7],game:[0,6],gaussian:[2,11],gaussianint:5,gaussint:5,gave:7,gcd:[1,2,4],gcd_zero_left:1,gcd_zero_right:1,gcongr:5,ge:[0,2,5],gener:[1,2,3,4,5,6,7,8,9],genuin:2,geometr:7,get:[1,2,3,4,6,7,8,11],gin:0,giovanni:0,git:0,github:[0,1],gitpod:0,give:[1,2,3,4,6,7,9],given:[0,1,2,3,4,5,6,7],glb:1,global:7,go:[0,1,2,3,4,6,7],goal:[0,1,2,3,4,5,7],goe:[3,4,5,6,7],good:[1,2,3,4,5,6,7],gorbachev:0,got:6,govern:[1,5],gradual:[6,7],graph:5,grate:[0,5],great:[1,5],greater:[0,1,2,3,4,7],greatest:[1,5,7],greef:0,greek:[1,4],group:[0,1,2,3,5,6,7,8],groupcat:5,grouptheori:5,grow:[0,6],grp:5,guai:0,guarante:[0,3,5],guess:[1,2,3,4,5],guilherm:0,gya:3,h0:4,h1:[1,2,3,4,5],h2:[1,2,3,5],h3:1,h:[1,2,3,4,5,6,7,8,9],h_def:3,h_inj:9,ha:[0,1,2,3,4,5,6,7,8,9],hab:8,habit:6,hac:6,hack:3,had:[1,6],hal:6,half:3,hand:[1,2,3,4,5,6,7],handi:4,handl:[1,3,4,6],happen:[1,6,7],happi:0,hard:[0,1,3,5,6],harder:[2,5],harm:3,has_basi:7,hasbasi:7,hasderivat:[8,9],hasderivat_sin:8,hasfderivat:8,hasfderivatfilt:8,hasfderivwithinat:[8,9],haskel:1,hasmul:5,hasquoti:6,hasstrictfderivat:8,hausdorff:7,have:[0,1,2,3,4,5,6,7,8,9],haven:[0,2,6,7],hb:[2,7],hba:6,hball:7,hbound:9,hc:8,hd:7,hdi:9,headach:4,headi:5,heart:4,heather:5,heaven:5,heavier:6,heavili:[3,7],hello:0,help:[0,1,2,3,4,5,6,7],helper:1,henc:[0,2,3,4,5,6,7,8],here:[0,1,2,3,4,5,6,7,8,9],hesit:4,hf:[3,7,8,9],hfa:2,hfc:8,hff:8,hfi:8,hfx:7,hg:[3,7,8,9],hgb:2,hidden:2,hide:[6,7],hierarchi:[5,11],high:2,higher:6,highlight:[0,2],hint:[0,1,2,9],histor:1,hit:[0,1],hk:[0,8],hle:7,hlim:9,hm:[4,8],hmea:9,hmn:0,hmp:8,hn:[3,4,7,8],hna:2,hnb:2,hne:7,ho:7,hold:[1,2,3,4,5,7,9],home:[4,5],hood:[3,5],hope:0,hopelessli:6,hoskinson:0,hover:[0,1,2,3,4,5],how:[0,1,2,3,4,5,6,7,9],howev:[1,2,5,6,7,8],hp:7,hpo:7,hq:7,hr:7,hs:[2,4,7,9],hsu:7,ht:2,html:0,http:6,hu:[7,8],huge:6,hum:7,human:1,hunt:6,hunter:0,huo:7,hurdl:6,hurt:2,hux:7,hw:6,hx:[2,3,5,6,8],hxeq:3,hy:[5,6],hyp:1,hypothes:[1,2,3,4,5],hypothesi:[0,1,2,3,4],hz:[5,6],i:[2,3,4,5,7,8,9],icc:[7,8],ici:7,id:[4,6,7,8],idea:[1,2,3,5,6,7],ident:[3,4,5,6,7,11],identifi:[1,2,4],ie:[6,7],if_neg:3,if_po:3,iff:[1,3,7,8,9,11],ignor:[0,7],ih:4,iinter:9,il:4,illustr:[1,2,3,4,5],im:5,imag:[3,4,6,7],image_subset_iff:3,imagin:1,imaginari:5,immedi:[2,3,5,6],implement:[2,5,6,8],impli:[1,2,3,4,5,7],implic:[1,7,11],implicit:[1,2,5,6,7,8],implicitli:[1,2],importantli:6,imposs:1,impress:0,improv:[3,4],incl:7,includ:[0,1,2,3,4,6,7,8],inclus:[1,3,7],inconsist:1,inconveni:8,incorpor:6,increas:1,increment:[0,1],inde:[1,5,6,7,8],indefinit:4,indent:1,independ:[2,3,5],index:[3,6,7],indic:[1,2,3,5,6],indirect:6,indirectli:1,individu:1,induc:7,induced_compos:7,induct:[7,11],induction_on:4,inequ:[1,2,6,7],inf:[1,6,7],inf_assoc:1,inf_comm:1,inf_le_left:[1,7],inf_le_right:1,inf_sup_left:1,inf_sup_right:1,inf_sup_self:1,infer:[1,2,3,5,6],infer_inst:[8,9],inferenti:0,inferr:6,infimum:[1,6,7,9],infin:[4,7,9],infinit:[3,7,11],infix:[1,6],infixl:6,infixr:6,info:6,inform:[0,1,2,3,5,6,7],infoview:1,infrastructur:0,infti:8,ingredi:[3,5,7,8],inhabit:[3,5,7],inherit:[5,6],inherit_doc:6,inj:4,inject:[2,3,4,6,7],injf:[2,3],injg:2,injon:[3,9],inl:[2,3],inner:3,input:[1,3,7],inr:[2,3],inria:6,inscrut:[2,3],insert:[0,2,4,5,7,8],insid:[0,1,2,3],insight:2,insist:[1,6],inspect:1,inspir:2,inst:6,inst_1:6,instal:[0,6],instanc:[1,2,3,4,5,6,7,8],instanti:[2,5,6,7],instcommr:5,instead:[0,1,2,3,4,5,6,7],instruct:[0,1,2,7],intact:0,integ:[1,2,4,6,11],integr:[2,8,11],integral_add:9,integral_eq_sub_of_hasderivat:9,integral_hasstrictderivat_right:9,integral_id:9,integral_image_eq_integral_abs_det_fderiv_smul:9,integral_one_div:9,integral_prod:9,intend:[0,1,2,5],inter_def:3,inter_set:7,interact:[0,5,6,9],interchang:1,interconnect:5,interest:[1,2,3,5,6,7],interestingli:[5,8],interfac:5,interior:[5,8],interior_iinter_subset:8,interior_subset:8,intermedi:[6,7],intern:[2,5],interpret:[0,1,4,5,7],intersect:[1,3,5,6,7,9],interv:[4,7,9],interval_cas:4,intervalintegr:9,intro:[0,1,2,3,4,5,6,7],introduc:[0,1,2,3,4,7,9],introduct:[1,2,7,11],introductori:8,intuit:[3,7],inv:[5,6],inv_dia:6,inv_eq_of_dia:6,inv_eq_of_mul:6,inv_fun:3,inv_fun_eq:3,inv_mul:6,invari:9,invers:[1,3,5,6,8,9],inverse_spec:3,invert:6,invest:5,invfun:[3,5],invfun_eq:3,invis:[5,6],invok:[0,1,7],involv:[1,2,4,5,6,7],inward:2,ioo:[7,8],ipo:4,irrat:11,irration:4,irreduc:[4,5],irreducible_iff_prim:5,irreflex:2,is_addit:5,is_closed_l:8,isaddhaarmeasur:9,isaiah:0,isbigo_iff_isbigowith:8,isbigowith:8,isbigowith_iff:8,isclos:[7,8],isclosed_l:7,iscompact:7,iscompact_icc:7,iscompact_univ:7,isdomain:2,iseqv:6,islinear:5,islittleo_iff_forall_isbigowith:8,islocalmin:8,isn:[0,2,3,4,6],isomorph:[5,8],isopen:7,isopen_compl_iff:7,isopen_empti:7,isopen_iff:7,isopen_iint:7,isopen_iunion:7,isopen_univ:7,isrorc:8,issu:[4,5,6,7],item:7,iter:8,iteratedfderiv:8,its:[0,1,2,3,4,5,6,7,8,9],itself:[0,2,3,5,6,7,8],iunion:9,j:[3,5],job:1,johan:0,join:[0,1,5],journei:7,juggl:6,julian:0,jump:[1,4,5,7],just:[0,1,2,3,4,5,6,7],justif:[1,2],justifi:[0,1,2,7],k:[0,2,4,5,7,8],keep:[1,5,6],kei:[1,4,5,7],keyboard:1,keyword:[1,2,4,5],kind:[0,1,6,7],knew:7,know:[0,1,2,3,4,5,6,7,8],known:[0,1,2,3,4,5,6,7,8],l:[0,1,8,9],label:[1,2],lake:0,lambda:[2,5],lambda_l:5,lambda_nonneg:5,languag:[0,1,2,3],larg:[0,6,7],larger:[1,7],last:[1,2,3,4,5,6,7],later:[0,1,2,4,5,6,7],latter:[5,7],lattic:[1,5,6,7],law:1,layer:[6,7],lbf:2,lbg:2,lcm:1,lcm_zero_left:1,lcm_zero_right:1,ldot:[2,3,4],le:[1,5,6],le_abs_self:2,le_antisymm:[1,2],le_iff_exists_add:7,le_inf:1,le_inf_iff:7,le_min:1,le_mul_of_one_le_right:5,le_of_dvd:4,le_of_l:6,le_of_max_le_left:2,le_of_max_le_right:2,le_of_mul_le_mul_right:5,le_of_not_gt:2,le_op_norm:8,le_or_gt:2,le_principal_iff:7,le_refl:[1,2],le_sup:4,le_sup_left:1,le_sup_right:1,le_tran:[1,2],lead:[1,2,4,5,6,7],leader:1,lean4:1,lean:[0,1,2,3,4,5,6,7,8],learn:[0,1,4,5],least:[1,5,6,7],leav:[0,1,2,3,5,6],lebesgu:9,led:6,left:[0,1,2,3,4,5,6,7,8,9],left_distrib:[5,6],left_inv:5,left_inv_eq_right_inv:6,left_neg_eq_right_neg:6,leftinvers:3,leftinverse_invfun:3,legal:1,lemma:[2,4,5,6,7,8,9,11],less:[1,2,3,4,5,6,7],let:[0,1,2,3,4,5,6,7,8,9],letter:[1,5,8],level:[1,2,6],leverag:7,librari:[0,1,2,3,4,5,7,8],life:[0,2],light:5,like:[0,1,2,3,4,5,6,7],lim_:7,limit:[2,6,7],linarith:[1,2,4,5],line:[0,1,2,3,4,6],linear:[1,2,5,7],linearord:2,linearorderedr:5,liner:0,linf:5,link:[5,6],list:[1,2,3,4,5],littl:[1,2,7,8],live:[0,5],ll:[0,2,4,6,7],local:[1,2,6,7,8],localinvers:8,log:[1,3,9],log_le_log:1,log_lt_log:1,logic:[0,1,3,4,5,11],logician:1,longer:[0,4,5],look:[1,2,3,4,6,7],loop:4,loss:4,lot:[0,3,5,6,7],loud:1,lower:[1,2,4],lowest:4,lr:1,lt_ab:2,lt_asymm:2,lt_iff_le_and_n:1,lt_iff_le_not_l:2,lt_irrefl:[1,2],lt_of_le_of_lt:[1,2],lt_of_lt_of_l:1,lt_of_not_g:2,lt_succ_iff:4,lt_succ_of_l:4,lt_tran:[1,2],lt_trichotomi:2,lub:1,m:[0,1,2,4,6,7,8],m_iunion:9,mac:[1,2],macbeth:5,machineri:[5,6,7],maco:0,made:[1,2,3,5,7],magic:[2,5,6],mai:[0,1,2,3,5,6,7,8],main:[2,6,7,8],maintain:1,make:[0,1,2,3,4,5,6,7,8],manag:[0,1,4,5,7],mani:[1,2,3,5,6,7,8,9,11],manifest:[1,7],manipul:[2,5,7],manner:[2,5],manual:[0,3,4],map:[1,2,3,5,6,7],map_add:[6,8],map_eq:7,map_inv_of_inv:6,map_le_iff_le_comap:7,map_map:7,map_mono:7,map_mul:6,map_on:6,map_smul:8,map_zero:6,mapsto:[1,5],mario:0,mark:[0,1,2,6,7],marker:2,marriag:5,martin:0,mascellani:0,mass:9,master:[0,1,4],match:[1,2,5],mathbb:[3,4,5],mathcal:[5,8],mathemat:[0,1,2,3,4,5,6,7],mathematician:[4,7],mathematics_in_lean:0,mathieu:0,mathlib:[0,1,2,3,4,5,6,7,8,9],matric:[1,5],matter:[1,2],mauricio:0,max:[1,2,6,7,9],maximum:[2,4,7],mayb:6,mdvdn:4,mean:[1,2,3,4,5,6,7,8,9],meaningless:2,meant:[0,2,6],meanwhil:[1,4],measur:[0,5,7,8,11],measurableset:9,measurablespac:9,measure_eq_iinf:9,measure_iunion_l:9,measuretheori:9,mechan:[1,2,5],mediat:4,meet:[1,2,3,5],mem:3,mem_:4,mem_ball_self:7,mem_closedball_self:7,mem_closure_iff:7,mem_closure_iff_clusterpt:7,mem_closure_iff_nhds_basi:7,mem_closure_iff_seq_limit:7,mem_closure_of_tendsto:7,mem_diff:3,mem_eras:4,mem_filt:4,mem_iff:7,mem_iint:3,mem_image_of_mem:3,mem_insert:4,mem_int:4,mem_inter_iff:3,mem_iunion:3,mem_nhds_iff:7,mem_of_dvd_prod_prim:4,mem_of_tendsto:7,mem_sdiff:4,mem_setof:3,mem_union:[3,4],member:[3,7],membership:[3,4,6],mention:[2,3,5,6,7],menu:[0,1],meq:4,messag:6,messi:5,messier:5,meta:[2,6],metavari:6,method:[0,2,3,4,5],metric:[1,5,8,11],metricspac:[1,7,8],mf:2,mg:2,mge2:4,mgt2:4,mid:5,middl:[0,1,2,7],midpoint:5,might:[1,2,3,4,5],mil:0,min:[1,2,7,9],min_le_left:1,min_le_right:1,mind:[1,2,5,6],mindich:0,minfac:4,minimum:7,minor:[6,8],miss:[1,3,4],mission:0,mk:[5,6,7],mkofnhd:7,mltn:4,mne1:4,mnez:4,mod:5,mod_4_eq_3_or_mod_4_eq_3:4,mod_def:5,mod_lt:4,mode:[1,2,5],model:[3,7],modern:5,modifi:6,modu:1,modul:6,modular:1,modulo:[1,4,5],moment:[1,2,5],mono:7,monof:2,monoid:[2,3,4,6],monoidhomclass:6,monoton:[2,6,7],monro:0,monticon:0,moral:[0,5],more:[0,2,3,4,5,6,7,8,11],moreov:[0,1,4,5,7],morphism:[5,8,11],morrison:0,most:[1,2,3,4,5,6,7,9],motiv:2,move:[0,1,2,6,7],mp:[1,2,3,4,7],mpr:[1,2,5,7],much:[0,2,4,6,7,8],mul:[4,5,6,7],mul_add:[0,1,4,6],mul_assoc:[1,2,4,5,6],mul_comm:[1,2,4,5,6],mul_def:5,mul_div_cancel:[2,4],mul_im:5,mul_inv:6,mul_inv_cancel_right:5,mul_inv_rev:1,mul_le_mul:2,mul_left_comm:[0,4],mul_left_inv:[1,5],mul_left_not_lt:5,mul_lt_mul_right:2,mul_mem:6,mul_mod:4,mul_mod_right:4,mul_nonneg:1,mul_on:[1,5,6],mul_po:[1,4],mul_r:5,mul_right_inj:4,mul_right_inv:[1,5],mul_smul:6,mul_sub:1,mul_sum:5,mul_zero:[1,5,6],muloneclass:6,multilinear:8,multipl:[1,2,3,4,5,6,8],multipli:5,mulzeroclass:6,mundan:2,must:[1,5,6,7],my_fil:0,my_lemma2:2,my_lemma3:2,my_lemma4:2,my_lemma:2,my_squar:5,myab:2,mynat:4,mypoint1:5,mypoint2:5,mypoint3:5,myre:1,mysmul:6,mysquar:5,mysteri:[5,6],mz:4,n:[0,1,2,3,4,5,6,7,8,9],n_p:7,n_q:7,na:2,naiv:[6,7],name:[1,2,3,4,5,6,7,8],namespac:[1,2,3,4,5,7],nash:0,nat:[0,1,2,3,4,5,7],natab:5,natabs_mul:5,natabs_norm_mod_lt:5,natabs_of_nonneg:5,natur:[0,1,2,3,4,5,6,7,8],nb:2,ne:[4,5],nearbi:[1,4],nearest:5,nebot:7,nebot_of_l:7,necessari:[0,2,4,5],necessarili:[1,9],need:[0,1,2,3,4,5,6,7],neg:[5,6,7,9],neg_add:6,neg_add_cancel_left:1,neg_def:5,neg_eq_of_add_eq_zero:1,neg_im:5,neg_le_abs_self:2,neg_neg:1,neg_r:5,neg_zero:1,negat:[1,5,11],negsucc:6,neighborhood:7,neither:[3,5,6],neq:4,nest:[1,2],net:1,neutral:6,never:[0,6],newcom:0,next:[0,1,2,3,4,5,6,7,8],nge:2,nhd:7,nhds_basis_bal:7,nhds_basis_closedbal:7,nhds_basis_ioo_po:7,nhds_basis_open:7,nhds_induc:7,nhds_mkofnhd:7,nhds_prod_eq:7,nice:[1,2,4,6,7],nicer:[5,7],nicola:0,nineteenth:3,nna:2,nnc:2,nnez:4,nnf:2,nng:2,nnz:4,non:[1,3,6,7,9],noncomm_r:1,noncomput:[3,5],nondecreas:[2,4],nondistribut:1,nonempti:[3,7],nonempty_interior_of_iunion_of_clos:8,nonexist:2,nonneg:[1,5],nonneg_of_mul_nonneg_left:1,nontrivi:[2,3,4,5,7,8],nontriviallynormedfield:[8,9],nonzero:[2,4,5,9],nor:[3,5],norm:[2,5,7,11],norm_add_l:8,norm_conj:5,norm_eq_zero:[5,8],norm_mod_lt:5,norm_mul:[5,8],norm_nonneg:[5,8],norm_num:[1,2,4,5],norm_po:5,norm_smul:8,norm_y_po:5,normedaddcommgroup:[8,9],normedaddgroup:8,normedfield:8,normedgroup:8,normedspac:[8,9],not_imp_self:3,not_le_of_gt:2,not_lt_of_g:[2,4,5],not_monotone_iff:2,not_norm_mul_left_lt_norm:5,not_not:2,notat:[1,2,3,4,5,6,7,8,9],note:[1,2,4,5,6,7,9],noth:[1,2,3,4,5,6],notic:[1,2,3,4,5,7],notin:3,notion:[1,2,3,4,5,7,8,9],noun:6,now:[0,1,2,3,4,5,6,7,8,9],np:4,npow_nz:4,npowz:4,ns:2,nsmul:6,nsmul_succ:6,nsmul_zero:6,nsqr_nez:4,nt:2,nth_rewrit:1,nth_rw:1,number:[0,1,2,3,5,6,7,8,11],numer:[1,4,5],nut:1,o:8,obfusc:7,object:[0,1,2,3,4,5,11],observ:[2,4,7],obtain:[1,2,4,5,7,8],obviou:[0,4,5,6],occasion:7,occur:4,occurr:1,odd:[1,2,3,4],of_le_succ:4,of_map:7,off:[2,3,4],offend:6,offer:[0,2,5,7],ofnat:6,ofnat_l:5,ofnat_lt:5,often:[0,1,2,3,4,5,6,7],og:2,old:[2,5,6],oliv:0,omit:5,onc:[1,2,3,4,5,6,7,9],one:[0,1,2,3,4,5,6,7,8,9],one_add_one_eq_two:1,one_def:5,one_dia:6,one_im:5,one_mem:6,one_mul:[1,2,5,6],one_r:5,one_smul:6,oner:1,ones:[0,1,2,3,5,9],onli:[0,1,2,3,4,5,6,7,8,9],onlin:0,op_norm_le_bound:8,op_norm_le_of_shel:8,open:[0,1,2,3,4,5,8,9],oper:[1,2,3,4,5,6,7,8],opportun:7,opposit:[6,7],optim:[6,9],option:[1,2,4,5,6,7],order:[1,2,3,4,5,6,7,8],orderedcanceladdcommmonoid:2,orderpreshom:6,orderpreshomclass:6,orderpresmonoidhom:6,ordinari:[1,2,4,5,7],ordinarili:[4,5],organ:0,organiz:1,orient:5,origin:[0,1,5],other:[1,2,3,4,5,6,7],otherwis:[1,2,3,4,5],our:[0,1,2,3,4,5,6,7,9],ourselv:[4,6],out:[0,1,2,3,4,5,6,7],outer:1,outermost:3,outlin:[1,2,4,7],outparam:6,output:1,outsid:[1,4],over:[0,1,2,3,4,5,6,7,8],overlap:6,overload:3,overview:11,own:[0,1,4,5,6],p4:4,p4eq:4,p:[0,1,2,3,4,5,6,7,9],p_1:4,p_i:[4,7],p_k:4,p_n:4,page:[0,1,4],pai:[1,2,6,7],pair:[1,2,4,5,7],pairwis:9,panel:0,paper:[2,3,5,7,9],paquet:0,paradox:7,paragraph:7,paramet:[5,6],parent:6,parenthes:[1,2,3,4],pariti:[0,4],parity_simp:0,pars:[1,3],part:[1,2,3,4,5,6,7,9],partial:[0,1,2,3,5,6],partialord:[1,2],particular:[1,2,5,6,7],partli:[1,6],pass:[1,5],past:[0,1],path:6,patholog:7,pattern:[1,2,3,5,6],payoff:5,pdf:0,pdvd:4,peel:2,pen:2,peopl:[0,1],perform:[1,2,3],perm:5,permgroup:5,permiss:1,permut:4,person:0,perspicu:2,phenomenon:3,phrase:[0,1,2,4,5],pi:7,pick:[0,6],pictur:[4,5],piec:[1,4,5,6,7],pietro:0,piotrowski:0,pitfal:3,place:[0,1,2,5,7],placehold:2,placement:4,plai:[1,3,4,6,7],plan:[1,6,7],plane:7,plausibl:3,ple:4,pltn:4,pne3:4,point:[0,1,2,3,5,6,7,8,9],pointwis:[5,7,8],polynomi:5,ponen:1,poor:6,pop:0,port:0,posit:[1,3,4,5,7,9],possibl:[1,2,3,4,5,7],postfix:6,potscrubb:0,pow_eq:4,pow_eq_zero:[2,4],pow_two:[1,4],pow_two_le_fac:4,pow_two_nonneg:[1,2],power:[0,1,3,4,5,6],pp:4,practic:[1,2,3,6,7],pragmat:5,pre:2,preal:5,preced:4,precis:[1,3,7,8],precondit:7,pred:4,predecessor:4,predic:[2,3,4,6,7,8],prefer:[0,1,2,3],prefix:[4,6],preimag:[3,7],preliminari:6,prematur:6,preorder:[2,6,7],presenc:6,present:[1,2,4,7],preserv:[4,6,7],preserves_mul:5,press:0,presuppos:0,pretend:6,pretti:[2,6,7],previou:[1,2,3,5,6,7,8,9],previous:6,price:7,primari:6,primarili:[6,7],prime:[1,2,3,5,6,11],prime_def_lt:4,prime_iff:3,prime_of_mem_factor:4,prime_p:4,prime_q:4,prime_thre:4,prime_two:4,prime_x:3,primes_infinit:4,primes_mod_4_eq_3_infinit:4,primit:[2,3],princip:7,principalidealr:5,principl:[1,2,3,4,6,8],print:[0,3,4,5,9],priori:6,prioriti:5,probabl:[1,5,6,7],problem:[3,4,5,6,7],proce:[4,6],procedur:[4,6],process:3,prod:[4,7,9],prod_:4,prod_empti:4,prod_factor:4,prod_insert:4,prod_map:7,prod_mk:7,prod_po:4,prod_range_succ:4,prod_range_zero:4,produc:[2,8],product:[2,4,5,6,7,9],profici:4,program:[0,1,2],progress:[0,1,5],prohibit:7,project:[0,4,5,7],promis:[6,7],promot:1,proof:[0,1,2,3,4,5,6,7,8],prop:[0,2,3,4,5,6,7,9],propag:6,properti:[1,2,3,4,5,6,7,8,9],proposit:[0,2,3,4,5],protect:5,provabl:[1,3,6,7],prove:[0,2,3,4,5,6,7,8,9,11],provid:[0,1,2,3,4,5,6,7,8,9],proxi:5,ps:4,pseudoemetricspac:7,pseudometricspac:7,psycholog:6,pull:[0,7],pullback:7,pun:2,pure:[1,7],pure_le_nhd:7,purpos:[1,2,3,4,5,6,7],push:[2,4,7],push_neg:[2,3,4],push_pul:7,pushforward:7,put:[0,1,2,3,4,5,6,7],q:[2,4,5,6,7],qk:4,quad:5,quadrat:5,quantifi:[1,3,4,5,7,11],quantiti:7,quest:6,question:[0,4,6,7,9],quick:[4,8],quicker:0,quickli:[3,9],quirk:3,quirki:4,quit:[2,6,7],quot:[5,7],quotient:[4,5,6,7],quotient_mul_add_remainder_eq:5,quotient_zero:5,quotientmonoid:6,r:[1,2,4,5,6,7],r_wellfound:5,radiu:7,raini:3,rais:[1,4],random:6,rang:[0,2,3,4,7],rare:6,rather:[0,1,2,4,5,6,7],ration:[1,2,4,7],rb:7,rcase:[2,3,4,7],re:[4,5],reach:[2,6],read:[0,1,4,5,6,7],readabl:[1,2,3,4,7],reader:[1,7],readi:[4,6,7,8],real:[1,2,3,4,5,6,7,8,9],real_norm_l:8,realli:[1,2,3,4,6,7],reason:[0,1,2,4,5,6,7],rec_on:7,recal:[1,2,4,5,7,9],recaptur:7,recast:7,recent:5,recogn:[1,2,4,5,6,7],recommend:[0,1,3],recon:7,reconcil:2,record:[5,6],recov:7,recurs:[2,3,5,11],redefin:[5,6],reduc:[0,2,3,4,5],reduct:[2,3,5],redund:[1,5,7,9],refer:[0,1,2,4,5,6,7,8],refin:[4,8],refl:[2,3,5,6],refl_tran:5,reflect:2,reflex:[1,2],reformul:7,refus:[6,7],regiment:0,region:3,regist:[5,6],regular:[6,7],regularspac:7,rel:[3,5],relat:[1,2,3,5,6,7,8,9],relatedli:7,relationship:[3,4],relativ:3,relev:[0,1,2,4,5,6,7],reli:[1,2,3,5,7],remain:[0,1,2,3,5,6,7],remaind:[4,5],remainder_lt:5,remark:[5,6],rememb:[1,2,3,4,5,6,7],remov:[4,7],renam:0,render:[2,4],repeat:[1,4,5,6],repeatedli:[2,7],repetit:[1,6],replac:[0,1,2,3,4,6],replai:0,report:1,repositori:[0,1],repres:[0,1,2,3,4,5,6,8],represent:[3,4,5],reproduc:5,reprov:1,requir:[0,1,2,3,4,5,6,7,8,9],resolut:6,resolve_left:3,respect:[1,2,3,4,5,7],respons:[0,1],rest:[2,3,5,7],restat:[2,6],restor:6,restrict:[3,4,7],result:[0,1,2,3,4,5,6,7],retri:6,reus:6,reusabl:6,reveal:1,revers:[1,2,3,5,7],revert:[4,5],review:7,rewrit:[0,1,2,3,4,5,6,7],rewritten:3,rfl:[0,1,2,3,4,5,6,7,8,9],rich:[5,6],rid:2,right:[1,2,3,4,5,6,7,8],right_distrib:[5,6],right_inv:5,rightinvers:3,ring:[0,1,2,3,4,5,6],ringhom:6,rintro:[0,2,3,4,7],rise:[4,6],road:5,robust:[5,6],role:[4,5,7],roll:8,rolland:0,roman:5,root:[5,6,11],roughli:[2,3,4],round:[0,1,5],routin:2,rpo:7,rule:[0,2,4,5,6,7],run:0,rush:0,rw:[0,2,3,4,5,6,7,11],rwa:[3,4,5],s:[0,1,2,3,4,5,6,7,8,9],s_0:[2,3],s_1:2,s_2:2,s_:3,s_n:[2,3],sa:2,sad:7,safe:6,sai:[0,1,2,3,4,5,6,7,9],said:[0,2,4,5],sake:[1,4],salient:7,same:[0,1,2,3,4,5,6,7],satisfi:[1,3,4,5,6,7,8],save:2,saw:[1,5,6,7],sb:2,sb_aux:3,sb_fun:3,sb_inject:3,sb_right_inv:3,sb_set:3,sb_surject:3,sbaux:3,sbfun:3,sbset:3,scalar:[5,6,8],scale:3,scari:5,scheme:5,schroeder_bernstein:3,scienc:6,scientist:2,scope:[1,2,3,5],scott:0,scratch:2,script:1,search:[4,5,6],second:[0,1,2,3,4,5,6,7,9],section:[0,1,2,3,4,5,6,7,8,9],see:[0,1,2,3,4,5,6,7,8,9],seek:5,seem:[1,2,4,6,7,8],seen:[0,1,2,4,5,6,7],segment:[7,9],select:[0,7],self:6,self_of_nhd:7,self_sub:1,self_trans_symm:5,selfmodul:6,semi:6,semicolon:[2,4],semigroup:6,send:9,sens:[0,2,3,4,5,6,7,8],sensibl:7,sent:7,separ:[0,1,2,4,5],sequenc:[3,6,7,8,11],seriou:[4,6,7],serv:[1,3,4,5,9],set:[0,1,2,4,5,6,8,9,11],set_integral_const:9,set_opt:6,setco:6,setlik:6,setminu:3,setoid:6,sets_of_superset:7,setub:2,sever:[6,7,9],shade:3,shame:6,sharp:0,shift:[0,1,6,7],shorten:2,shorter:[1,3,4,7],shot:7,should:[0,1,2,3,4,5,6,7,8],shouldn:7,show:[0,1,2,3,4,5,6,7,8,9],shown:[1,5,8,9],side:[0,1,2,3,4,5,6,7,8],sight:[2,6],sigma:[5,9],sigmafinit:9,sign:7,signatur:6,signific:3,silent:[5,6],silli:6,silva:0,similar:[1,2,3,5,6,7],similarli:[2,3,4,5],simp:[0,2,3,4,5,6,7,8],simpa:[4,8],simpl:[2,4,5,6,8],simpler:6,simplex:5,simpli:[0,1,2,3,4,5,6,7],simplif:[2,3,4],simplifi:[0,2,3,4,5,7,9],sin:[2,8],sinc:[0,1,2,3,4,5,6,7],singl:[0,1,2,3,4,5,6,8],singleton:4,sinter:3,sinter_eq_biint:3,situat:[1,3,6,7],size:5,skeleton:[5,7],sketch:[2,3,4,7],skill:[0,1,2,3,4],slick:2,slight:3,slightli:[1,6,7,8],slow:7,small:[0,2,4,5,7],smaller:[3,4,7],smallest:[4,6,7],smart:4,smul:[5,6],smul_add:6,smul_distrib:5,snd:[5,7],snippet:[2,4,5],so:[0,1,2,3,4,5,6,7,8,9],solut:[0,1,4,6],solv:[0,1,2,3,4,5,6,7],some:[0,1,2,3,4,5,6,7,8],someth:[0,1,2,4,6,7],sometim:[1,2,3,4,5,6,7],somewhat:[1,3,7],somewher:7,soon:[0,2,6,7],sophist:7,sorri:[0,1,2,3,4,5,6,7,8],sort:[1,3,4],sosi:2,sosx:2,sound:[3,5,6],sourc:[2,7],space:[1,2,3,5,6,9,11],speak:[2,5,7],special:[3,4,5,6,7,9],specif:[0,1,3,4,5,6],specifi:[1,2,3,4,5,7,8,9],spell:7,split:[1,2,3,4],spot:2,sq_ab:5,sq_add_sq_eq_zero:5,sq_nonneg:1,sqr_eq:4,sqrt:[2,3,4,5],squar:[1,2,4,5,6],squiggli:2,ss:3,ssubt:3,stage:[2,5,6],stai:5,stand:[1,2,5,7,8],standard:[4,5,6,7],standardsimplex:5,standardtwosimplex:5,start:[1,2,3,4,6,7,8,9,11],state:[0,1,2,3,4,6,7,8],statement:[0,1,2,3,4,5,6,7,8,9],stdsimplex:5,steep:0,steinhau:8,step:[0,1,2,3,4,5,6],stick:[1,2,7,8],still:[0,1,2,3,4,5,6,7,9],stipul:8,stop:6,store:5,stori:6,str:5,straightforward:[2,6],strang:[2,4],strategi:[1,2,4],strength:1,strengthen:[1,2,4],stretch:[4,5],strict:[1,2],stricter:8,strictli:[1,2,8],strictmono:7,strictorderedr:1,strike:[1,2],strong:[2,4],strong_induction_on:4,stronger:7,strongli:0,stronglymeasurableatfilt:9,struc:5,structur:[2,4,6,7,8,9,11],stuck:6,studi:[6,7],style:[0,1],sub:[3,7,9,11],sub_add_cancel:[1,5],sub_eq_add_neg:1,sub_self:[1,2],sub_sub:1,subgoal:2,subgroup:6,subject:5,submonoid:6,subobject:6,subproof:1,subr:6,subscript:1,subsequ:[2,4,7],subset:[1,2,3,5,7,8],subset_def:3,subset_iff:4,subspac:[1,6],substant:4,substanti:0,substitut:[0,2],subsum:4,subtl:[5,7],subtleti:6,subtract:[1,4,5],subtyp:[5,6,7],succ:[3,4,6],succ_add:4,succ_eq_add_on:4,succ_le_succ:4,succ_mul:4,succ_ne_zero:4,succ_po:4,succe:6,success:6,successor:4,suffic:[1,2,3,7],suffici:[4,7],suggest:[0,2,4,5,7],suitabl:[0,1,2,5,7],sum:[1,2,4,5,6,7],sum_add_distrib:5,sum_eq:5,sum_eq_on:5,sum_id:4,sum_mul:5,sum_range_succ:4,sum_range_zero:4,sum_sqr:4,summat:4,sumofsquar:2,sumofsquares_mul:2,sunion:3,sunion_eq_biunion:3,sup:[1,4,7],sup_assoc:1,sup_comm:1,sup_inf_left:1,sup_inf_right:1,sup_inf_self:1,sup_l:1,superfici:7,superscript:7,suppli:5,support:[0,1,2,3,4,5,6,7],suppos:[1,2,3,4,5,7],suppress:1,supremum:[1,4,6],sure:[0,1,2,3,5,6],surject:[2,3,7],surjf:[2,3],surjg:2,surpris:6,surprisingli:[5,6],swap:5,swapxi:5,sweet:3,symbol:[1,2,5,6],symm:[3,4,5,6,7,8],symmetr:[2,3],symmetri:[3,6],syntact:2,syntax:[0,1,2,4,6],synth:6,synthes:[5,6],synthinst:6,system:[3,4,5,6],t2space:7,t3space:7,t:[0,1,2,3,4,5,6,7,9],t_3:7,t_:7,t_x:7,t_y:7,t_z:7,tab:[1,3,4],tackl:6,tactic:[0,1,2,3,4,5,6,7,8],tag:[2,3,6],take:[1,2,3,4,5,6,7,8,9],taken:[1,2],talk:[4,7,8],tantamount:[1,3],target:[1,6,7,9],task:[0,2,4,5,6,7],tauto:4,tautolog:4,teach:0,tear:6,technic:[1,5,6],techniqu:[2,7],technolog:6,tediou:[1,2,6],tell:[0,2,3,4,5,6],temporarili:[1,2],tempt:6,tend:[1,7],tendsto:[7,9],tendsto_attop:7,tendsto_congr:7,tendsto_iff:7,tendsto_integral_of_dominated_converg:9,tendsto_nhds_uniqu:7,tendsto_pow_attop_nhds_0_of_lt_1:7,tendsto_right_iff:7,tendsto_subseq:7,term:[0,1,2,3,4,5,7],terminolog:5,ters:6,test:4,text:[0,3,5,7],textbook:[0,1,2],th:4,than:[0,1,2,3,4,5,6,7,8],thank:6,thei:[0,1,2,3,4,5,6,7,8],them:[0,1,2,3,4,5,6,7],theme:3,themselv:[0,4,5],theorem:[0,2,4,5,7,8,9,11],theoret:[2,3,7],theori:[0,1,2,3,6,7,8,11],therefor:[1,4,5,7],thereof:0,thi:[0,1,2,3,4,5,6,7,8,9],thing:[0,1,2,3,4,5,6,7],think:[0,1,2,3,4,5,6,7,8],third:[1,2,3,5,7],thorough:0,those:[0,1,2,3,5,6,7,8],though:[2,3,4,5],three:[1,2,4,5,7],through:[0,1,3,4,5,6,7],thu:[1,3,4,5,7],thumb:4,tighter:[1,3],tightli:5,time:[1,4,5,6,7,8,9],timesav:1,tiresom:7,to_addit:6,to_localinvers:8,tofun:[5,6],togeth:[1,2,3,4,5,7],tomuloneclass:6,too:[0,1,3,5,6,7],tool:[0,1,5,6],top:[0,6,7,8],topic:[4,6],topolog:[1,5,6,8,11],topologicalspac:[7,8],toreal:9,total:1,tour:[7,8],trace:6,tradeoff:3,train:[1,6],tran:[2,4,5,6],trans_assoc:5,trans_refl:5,transform:[2,3],transit:[1,2,5,7],translat:[4,6,7],trap:6,treat:[2,3,5,6,7,8],tri:[1,2,4,6],triangl:[1,2,5],trick:[1,2,4,6,8],tricki:[2,3,4,6],trigger:6,tripl:3,trivial:[3,4,7],troubl:[2,3,5],truncat:4,truth:[1,4],tupl:5,turn:[2,3,4,5,6,7,8],tutori:0,twice:[0,1,7],two:[0,1,2,3,4,5,6,7,9],two_l:4,two_le_of_mod_4_eq_3:4,two_mul:1,type:[0,1,2,3,4,5,6,7,8,9],typeclass:6,typic:1,u:[2,3,5,7,9],ubf:2,ubfa:2,ubg:2,ubgb:2,ultim:0,un:3,unbundl:6,unchang:[1,2],uncom:1,uncount:7,uncurri:7,under:[5,6,7],underli:[0,1,5,6],underneath:[1,3],underscor:[1,2,3],understand:[0,2,3,4,5,6,7],understood:[4,7],unfold:[1,2,3,4,5,7],unicod:[1,3,6],unif:6,uniform:[3,7,8],uniformcontinu:7,uniformcontinuous_iff:7,uniformli:8,union:[1,3,4,5,6,8,9],union_def:3,uniqu:[1,2,3,4,5,7],unit:[5,6,7],univ:[3,7,8,9],univ_set:7,univers:[1,3,5,7,11],unknown:6,unless:[1,2,5],unlik:[3,4],unnecessari:3,unpack:[2,3],unpleas:[6,7],unrel:6,unshad:3,unspecifi:6,unsurprisingli:3,until:[1,4,6,7],up:[0,2,3,4,5,6,7],updat:0,upper:[1,2],us:[0,2,3,4,5,6,7,8,9,11],usabl:6,usag:1,user:[0,6],usual:[1,2,3,4,5,7,9],v:[2,3,5,7],val:5,valid:2,valu:[1,2,3,4,5,6,7,8,9],van:0,varepsilon:[2,7],variabl:[1,2,3,4,5,6,7,8,9],variant:[1,2,7],variat:[1,3,4,5,7,8],varieti:7,variou:[2,3,5,6,9],vastli:2,ve:[6,7],vector:[1,3,6,8],verbos:3,veri:[0,2,4,6,7,9],verifi:2,versa:[1,3],version:[0,1,2,3,4,5,6,7,8,9],vertic:[2,5],vi:5,via:7,vice:[1,3],view:[0,5,6,7],visibl:1,vocabulari:3,volum:9,vs:[0,1,2,3,5],w:[1,6],wa:[1,3],wai:[0,1,2,3,4,5,6,7,9],want:[0,1,2,3,4,5,6,7,8,9],wasn:7,we:[0,1,2,3,4,5,6,7,8,9],weak:6,weaker:[1,2],weav:5,web:[0,1,4],weight:5,weightedaverag:5,weird:[6,7],weirder:8,welcom:[0,1],well:[0,1,2,3,4,5,6,7],were:[2,4,5,7],what:[0,1,2,3,4,5,6,7],whatev:[0,2,4],whatsnew:6,when:[0,1,2,3,4,5,6,7,8],whenev:[1,2,4,5],where:[0,1,2,3,4,5,6,7,8,9],wherea:[0,1,2,3,5,7],wherebi:[5,7],whether:[1,2,3,4,6,7],which:[0,1,2,3,4,5,6,7,8,9],who:[0,7],whole:5,whose:[1,2,4,5,6,7,8],why:[0,2,4,6,7],wieser:0,window:[0,1,2,5],winston:0,wise:5,wish:7,within:[1,2,7],without:[1,2,4,5,6,7,8],withtop:8,wlog:3,won:[2,4,6,7],word:[1,2,3,4,5,7],work:[0,1,2,3,4,5,6,7,8],world:0,worri:[1,3,4,5],worth:[1,2,5],would:[1,2,3,4,5,6,7,8],wouldn:6,wrap:[6,7],write:[0,1,2,4,5,6,7,8,9],written:[1,2,3,4,5,6,7,8],wrong:3,wrote:4,x:[0,1,2,3,4,5,6,7,8,9],x_0:7,x_1:[2,3],x_2:[2,3],x_i:7,x_nonneg:5,xa:3,xai:3,xeq:[2,3],xgt:2,xlt:2,xltz:2,xmem:3,xnt:3,xnu:3,xpo:3,xs:[2,3],xstu:3,xsu:3,xt:3,xtu:3,xu:3,xy:[2,5],y:[0,1,2,3,4,5,6,7,8,9],y_nonneg:5,yball:7,yeq:2,yet:[2,3,4,5,6,7],yield:[1,2,3,4,5,7],ylim:7,ylt:2,you:[0,1,2,3,4,5,6,7,8,9],your:[0,1,2,3,5,6,7],yourself:[2,5],ypo:3,z:[0,1,2,5,6,7,8,9],z_nonneg:5,zermelo:2,zero:[2,3,4,5,6,7,8,9],zero_add:[1,4,5,6],zero_def:5,zero_dvd_iff:4,zero_im:5,zero_l:[4,5],zero_lt_on:[2,4],zero_lt_two:5,zero_mul:[1,4,5,6],zero_r:5,zero_smul:6,zf:2,zlty:2,zsmul:6,zulip:[0,4]},titles:["<span class=\"section-number\">1. </span>Introduction","<span class=\"section-number\">2. </span>Basics","<span class=\"section-number\">3. </span>Logic","<span class=\"section-number\">4. </span>Sets and Functions","<span class=\"section-number\">5. </span>Elementary Number Theory","<span class=\"section-number\">6. </span>Structures","<span class=\"section-number\">7. </span>Hierarchies","<span class=\"section-number\">8. </span>Topology","<span class=\"section-number\">9. </span>Differential Calculus","<span class=\"section-number\">10. </span>Integration and Measure Theory","Index","Mathematics in Lean"],titleterms:{"function":[3,7],"schr\u00f6der":3,The:[2,3],about:1,algebra:[1,5],appli:1,asymptot:8,ball:7,basic:[1,6],bernstein:3,build:5,calcul:1,calculu:8,close:7,compact:7,comparison:8,complet:7,conjunct:2,continu:[7,8],converg:[2,7],countabl:7,defin:5,differenti:8,disjunct:2,elementari:[4,8,9],exampl:1,existenti:2,fact:1,filter:7,fundament:7,gaussian:5,get:0,hierarchi:6,ident:1,iff:2,implic:2,index:10,induct:4,infinit:4,integ:5,integr:9,introduct:0,irrat:4,lean:11,lemma:1,linear:8,logic:2,mani:4,map:8,mathemat:11,measur:9,metric:7,more:1,morphism:6,negat:2,norm:8,number:4,object:6,open:7,overview:0,prime:4,prove:1,quantifi:2,recurs:4,root:4,rw:1,separ:7,sequenc:2,set:[3,7],space:[7,8],start:0,structur:[1,5],sub:6,theorem:[1,3],theori:[4,9],topolog:7,uniformli:7,univers:2,us:1}}) Search.setIndex({"docnames": ["C01_Introduction", "C02_Basics", "C03_Logic", "C04_Sets_and_Functions", "C05_Elementary_Number_Theory", "C06_Structures", "C07_Hierarchies", "C08_Groups_and_Rings", "C09_Topology", "C10_Differential_Calculus", "C11_Integration_and_Measure_Theory", "genindex", "index"], "filenames": ["C01_Introduction.rst", "C02_Basics.rst", "C03_Logic.rst", "C04_Sets_and_Functions.rst", "C05_Elementary_Number_Theory.rst", "C06_Structures.rst", "C07_Hierarchies.rst", "C08_Groups_and_Rings.rst", "C09_Topology.rst", "C10_Differential_Calculus.rst", "C11_Integration_and_Measure_Theory.rst", "genindex.rst", "index.rst"], "titles": ["<span class=\"section-number\">1. </span>Introduction", "<span class=\"section-number\">2. </span>Basics", "<span class=\"section-number\">3. </span>Logic", "<span class=\"section-number\">4. </span>Sets and Functions", "<span class=\"section-number\">5. </span>Elementary Number Theory", "<span class=\"section-number\">6. </span>Structures", "<span class=\"section-number\">7. </span>Hierarchies", "<span class=\"section-number\">8. </span>Groups and Rings", "<span class=\"section-number\">9. </span>Topology", "<span class=\"section-number\">10. </span>Differential Calculus", "<span class=\"section-number\">11. </span>Integration and Measure Theory", "Index", "Mathematics in Lean"], "terms": {"The": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12], "goal": [0, 1, 2, 3, 4, 5, 8], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "book": [0, 2, 8], "teach": 0, "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "formal": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "mathemat": [0, 1, 2, 3, 4, 5, 6, 7, 8], "us": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "lean": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "4": [0, 1, 2, 4, 5, 7, 8, 9], "interact": [0, 5, 6, 7, 10], "proof": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "assist": [0, 2, 5], "It": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "assum": [0, 1, 2, 3, 4, 6, 7, 8], "know": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "some": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "doe": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "requir": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "much": [0, 2, 4, 6, 7, 8, 9], "although": [0, 3, 4, 5, 6, 7, 8], "we": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "cover": [0, 1, 3, 6, 7, 8, 9], "exampl": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "rang": [0, 2, 3, 4, 7, 8], "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "number": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12], "theori": [0, 1, 2, 3, 6, 7, 8, 9, 12], "measur": [0, 5, 8, 9, 12], "analysi": [0, 5, 9], "focu": [0, 1, 7, 8, 10], "elementari": [0, 3, 5, 7, 8, 12], "aspect": [0, 5, 7], "those": [0, 1, 2, 3, 5, 6, 7, 8, 9], "field": [0, 1, 5, 6, 7, 9], "hope": 0, "thei": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "ar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "familiar": [0, 1, 4, 5, 8, 9], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "pick": [0, 6], "them": [0, 1, 2, 3, 4, 5, 6, 7, 8], "up": [0, 2, 3, 4, 5, 6, 7, 8], "go": [0, 1, 2, 3, 4, 6, 8], "also": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "don": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "t": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "presuppos": 0, "ani": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "background": [0, 7], "method": [0, 2, 3, 4, 5], "seen": [0, 1, 2, 4, 5, 6, 7, 8], "kind": [0, 1, 6, 8], "comput": [0, 2, 3, 4, 5, 7, 9, 10], "program": [0, 1, 2], "write": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10], "definit": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "theorem": [0, 2, 4, 5, 7, 8, 9, 10, 12], "regiment": 0, "languag": [0, 1, 2, 3], "like": [0, 1, 2, 3, 4, 5, 6, 7, 8], "understand": [0, 2, 3, 4, 5, 6, 7, 8], "In": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "return": [0, 2, 3, 4, 5, 7, 8], "provid": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "feedback": 0, "inform": [0, 1, 2, 3, 5, 6, 8], "interpret": [0, 1, 4, 5, 7, 8], "express": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "guarante": [0, 3, 5], "well": [0, 1, 2, 3, 4, 5, 6, 7, 8], "form": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "ultim": 0, "certifi": 0, "correct": [0, 1, 7], "our": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "learn": [0, 1, 4, 5], "more": [0, 2, 3, 4, 5, 6, 7, 8, 9, 12], "about": [0, 2, 3, 4, 5, 6, 7, 8, 9, 12], "project": [0, 4, 5, 7, 8], "page": [0, 1, 4], "commun": [0, 4], "web": [0, 1, 4], "tutori": 0, "base": [0, 2, 3, 4, 6, 7, 8, 9], "s": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "larg": [0, 6, 8], "ever": [0, 8], "grow": [0, 6, 7], "librari": [0, 1, 2, 3, 4, 5, 7, 8, 9], "mathlib": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "strongli": 0, "recommend": [0, 1, 3], "join": [0, 1, 5], "zulip": [0, 4], "onlin": 0, "chat": 0, "group": [0, 1, 2, 3, 5, 6, 8, 9, 12], "haven": [0, 2, 6, 8], "alreadi": [0, 1, 2, 3, 4, 5, 6, 7, 8], "ll": [0, 2, 4, 6, 8], "find": [0, 1, 2, 4, 5, 6, 8], "live": [0, 5], "welcom": [0, 1], "enthusiast": 0, "happi": 0, "answer": [0, 5, 8], "question": [0, 4, 6, 8, 10], "offer": [0, 2, 5, 8], "moral": [0, 5, 7], "support": [0, 1, 2, 3, 4, 5, 6, 8], "read": [0, 1, 4, 5, 6, 7, 8], "pdf": 0, "html": 0, "version": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "design": [0, 1, 2, 3, 5, 7, 8], "run": 0, "insid": [0, 1, 2, 3, 7], "vs": [0, 1, 2, 3, 5], "code": [0, 1, 2, 3, 5, 6], "editor": [0, 1], "To": [0, 1, 2, 3, 4, 5, 6, 7, 8], "instal": [0, 6], "follow": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "instruct": [0, 1, 2, 8], "make": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "sure": [0, 1, 2, 3, 5, 6, 7], "have": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "git": 0, "fetch": 0, "mathematics_in_lean": 0, "repositori": [0, 1], "open": [0, 1, 2, 3, 4, 5, 7, 9, 10], "each": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "section": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "ha": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "an": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "associ": [0, 1, 2, 4, 5, 6, 7, 8, 10], "file": [0, 1, 4, 5, 6, 7, 8], "exercis": [0, 1, 2, 3, 5, 6, 7, 8, 9], "folder": 0, "mil": 0, "organ": 0, "chapter": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "copi": [0, 3, 4, 6, 7, 8], "experi": [0, 1, 8], "do": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "leav": [0, 1, 2, 3, 5, 6, 7], "origin": [0, 1, 5, 7], "intact": 0, "easier": [0, 1, 3, 4, 6, 8], "updat": 0, "chang": [0, 1, 2, 4, 5, 8, 10], "see": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "below": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "call": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "my_fil": 0, "whatev": [0, 2, 4], "want": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "creat": [0, 1, 6], "your": [0, 1, 2, 3, 5, 6, 7, 8], "own": [0, 1, 4, 5, 6], "At": [0, 1, 2, 4, 5, 6], "point": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10], "textbook": [0, 1, 2], "side": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "panel": 0, "type": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "ctrl": [0, 1, 2, 4, 5], "shift": [0, 1, 6, 8], "p": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "command": [0, 1, 2, 3, 4, 5, 6, 7], "maco": 0, "document": [0, 1, 3, 4, 6], "view": [0, 5, 6, 7, 8], "bar": [0, 1, 2], "appear": [0, 1, 2, 5, 6, 7, 8], "press": 0, "select": [0, 8], "soon": [0, 2, 6, 7, 8], "highlight": [0, 2], "menu": [0, 1], "window": [0, 1, 2, 5], "click": [0, 1, 3, 4, 5, 6], "current": [0, 1, 2, 6], "altern": [0, 2, 3, 4, 5, 6, 8], "cloud": 0, "gitpod": 0, "how": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "github": [0, 1], "still": [0, 1, 2, 3, 4, 5, 6, 8, 10], "work": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "describ": [0, 1, 2, 3, 4, 5, 6, 8], "abov": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "progress": [0, 1, 5, 7], "pull": [0, 7, 8], "lake": 0, "ex": [0, 2], "cach": 0, "content": [0, 1, 2, 4, 8], "which": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "why": [0, 2, 4, 6, 7, 8], "suggest": [0, 2, 4, 5, 8], "intend": [0, 1, 2, 5], "while": [0, 1, 2, 6, 7, 8], "contain": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "explan": [0, 7, 8], "hint": [0, 1, 2, 10], "text": [0, 3, 5, 8], "often": [0, 1, 2, 3, 4, 5, 6, 7, 8], "includ": [0, 1, 2, 3, 4, 6, 7, 8, 9], "one": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "eval": [0, 7], "hello": 0, "world": 0, "should": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "abl": [0, 1, 2, 3, 4, 5, 6, 7, 9], "correspond": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "If": [0, 1, 2, 3, 4, 5, 6, 8], "line": [0, 1, 2, 3, 4, 6, 7], "show": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "hover": [0, 1, 2, 3, 4, 5], "cursor": [0, 1, 2], "over": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "respons": [0, 1], "pop": 0, "encourag": [0, 1, 2, 3, 4, 5], "edit": 0, "try": [0, 1, 2, 3, 4, 5, 6, 8], "moreov": [0, 1, 4, 5, 8], "lot": [0, 3, 5, 6, 7, 8], "challeng": [0, 1, 2, 3, 5, 9], "rush": 0, "past": [0, 1, 7], "just": [0, 1, 2, 3, 4, 5, 6, 7, 8], "through": [0, 1, 3, 4, 5, 6, 7, 8], "central": [0, 4], "all": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "when": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "feel": [0, 1, 2, 6, 8], "comfort": 0, "master": [0, 1, 4], "relev": [0, 1, 2, 4, 5, 6, 7, 8], "skill": [0, 1, 2, 3, 4], "free": [0, 1, 7, 8], "move": [0, 1, 2, 6, 8], "alwai": [0, 1, 2, 3, 5, 6, 7], "compar": [0, 5, 6, 8], "solut": [0, 1, 4, 6], "ones": [0, 1, 2, 3, 5, 10], "put": [0, 1, 2, 3, 4, 5, 6, 7, 8], "simpli": [0, 1, 2, 3, 4, 5, 6, 7, 8], "tool": [0, 1, 5, 6], "build": [0, 2, 4, 6, 7, 8, 12], "complex": [0, 1, 2, 4, 5, 7, 9, 10], "known": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "depend": [0, 2, 3, 4, 5, 6, 7, 8], "everi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "check": [0, 1, 2, 3, 4, 5, 6, 7, 8], "print": [0, 3, 4, 5, 10], "\u2115": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "These": [0, 1, 3, 4, 5, 7, 9, 10], "object": [0, 1, 2, 3, 4, 5, 7, 12], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "def": [0, 2, 3, 4, 5, 6, 7, 8], "f": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "3": [0, 1, 2, 3, 4, 5, 6, 7, 8], "prop": [0, 2, 3, 4, 5, 6, 7, 8, 10], "statement": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "fermatlasttheorem": 0, "y": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "z": [0, 1, 2, 5, 6, 7, 8, 9, 10], "n": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "where": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "itself": [0, 2, 3, 5, 6, 7, 8, 9], "Such": [0, 1, 2, 6], "proposit": [0, 2, 3, 4, 5], "easi": [0, 4, 5, 6, 7, 8], "rfl": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "hard": [0, 1, 3, 5, 6, 7], "sorri": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "manag": [0, 1, 4, 5, 8], "construct": [0, 2, 3, 4, 5, 6, 7, 8], "accept": [0, 1, 2, 8], "term": [0, 1, 2, 3, 4, 5, 7, 8], "done": [0, 2, 3, 4, 6, 7, 8], "someth": [0, 1, 2, 4, 6, 8], "veri": [0, 2, 4, 6, 7, 8, 10], "impress": 0, "cheat": [0, 1], "so": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "now": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "game": [0, 6], "left": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "rule": [0, 2, 4, 5, 6, 8], "complementari": 0, "companion": [0, 1], "prove": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "thorough": 0, "underli": [0, 1, 5, 6, 7], "logic": [0, 1, 3, 4, 5, 7, 12], "framework": 0, "core": [0, 4, 5], "syntax": [0, 1, 2, 4, 6], "peopl": [0, 1], "who": [0, 8], "prefer": [0, 1, 2, 3], "user": [0, 6], "manual": [0, 3, 4], "befor": [0, 1, 2, 3, 4, 5, 6, 7], "new": [0, 1, 2, 3, 4, 5, 6, 7, 8], "dishwash": 0, "person": 0, "hit": [0, 1], "button": 0, "figur": [0, 1, 2, 5], "out": [0, 1, 2, 3, 4, 5, 6, 7, 8], "activ": 0, "potscrubb": 0, "featur": [0, 2, 4, 7], "later": [0, 1, 2, 4, 5, 6, 7, 8], "sens": [0, 2, 3, 4, 5, 6, 7, 8, 9], "here": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "refer": [0, 1, 2, 4, 5, 6, 8, 9], "back": [0, 1, 2, 3, 5, 6, 7, 8], "necessari": [0, 2, 4, 5, 7], "anoth": [0, 1, 2, 3, 4, 5, 6, 7, 8], "thing": [0, 1, 2, 3, 4, 5, 6, 8], "distinguish": [0, 5, 6, 7, 8, 9], "place": [0, 1, 2, 5, 8], "greater": [0, 1, 2, 3, 4, 8], "emphasi": [0, 6], "tactic": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "given": [0, 1, 2, 3, 4, 5, 6, 7, 8], "two": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "wai": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "down": [0, 3, 4, 6, 8], "themselv": [0, 4, 5], "suitabl": [0, 1, 2, 5, 8], "descript": [0, 1, 2, 4, 8], "thereof": 0, "For": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "repres": [0, 1, 2, 3, 4, 5, 6, 9], "fact": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "even": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], "m": [0, 1, 2, 4, 6, 7, 8, 9], "nat": [0, 1, 2, 3, 4, 5, 7, 8], "fun": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "k": [0, 2, 4, 5, 7, 8, 9], "hk": [0, 9], "hmn": 0, "rw": [0, 2, 3, 4, 5, 6, 7, 8, 12], "mul_add": [0, 1, 4, 6], "l": [0, 1, 9, 10], "_": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "compress": [0, 1, 8], "singl": [0, 1, 2, 3, 4, 5, 6, 7, 9], "instead": [0, 1, 2, 3, 4, 5, 6, 7, 8], "style": [0, 1], "same": [0, 1, 2, 3, 4, 5, 6, 7, 8], "comment": [0, 4], "henc": [0, 2, 3, 4, 5, 6, 8, 9], "ignor": [0, 7, 8], "sai": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "natur": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "rintro": [0, 2, 3, 4, 7, 8], "need": [0, 1, 2, 3, 4, 5, 6, 7, 8], "twice": [0, 1, 8], "let": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "substitut": [0, 2], "obviou": [0, 4, 5, 6], "ring": [0, 1, 2, 3, 4, 5, 6, 12], "As": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "enter": [0, 1, 2, 3, 7, 8], "displai": [0, 1, 2, 6], "state": [0, 1, 2, 3, 4, 6, 7, 8, 9], "separ": [0, 1, 2, 4, 5], "tell": [0, 2, 3, 4, 5, 6, 7], "what": [0, 1, 2, 3, 4, 5, 6, 7, 8], "establish": [0, 1, 2, 3, 4, 5], "task": [0, 2, 4, 5, 6, 8], "remain": [0, 1, 2, 3, 5, 6, 8], "replai": 0, "step": [0, 1, 2, 3, 4, 5, 6], "sinc": [0, 1, 2, 3, 4, 5, 6, 7, 8], "continu": [0, 1, 4, 5, 6, 10], "first": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "introduc": [0, 1, 2, 3, 4, 8, 10], "could": [0, 1, 2, 4, 5, 6, 7, 8], "renam": 0, "decompos": [0, 3], "hypothesi": [0, 1, 2, 3, 4], "assumpt": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10], "second": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "declar": [0, 1, 4, 5, 6, 7], "next": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "rewrit": [0, 1, 2, 3, 4, 5, 6, 8], "replac": [0, 1, 2, 3, 4, 6, 7], "solv": [0, 1, 2, 3, 4, 5, 6, 8], "result": [0, 1, 2, 3, 4, 5, 6, 7, 8], "abil": 0, "small": [0, 2, 4, 5, 8], "increment": [0, 1], "extrem": [0, 6, 8], "power": [0, 1, 3, 4, 5, 6], "reason": [0, 1, 2, 4, 5, 6, 7, 8], "quicker": 0, "than": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "There": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10], "isn": [0, 2, 3, 4, 6], "sharp": 0, "distinct": [0, 2, 3, 4, 5, 8], "between": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "insert": [0, 2, 4, 5, 7, 8, 9], "did": [0, 2, 6, 8], "phrase": [0, 1, 2, 4, 5], "mul_left_comm": [0, 4], "convers": [0, 2, 4, 7, 8], "short": [0, 1, 2, 3, 4, 5], "middl": [0, 1, 2, 8], "That": [0, 4, 5, 6], "said": [0, 2, 4, 5], "reduc": [0, 2, 3, 4, 5], "liner": 0, "carri": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "But": [0, 1, 2, 3, 4, 5, 6, 7, 8], "substanti": 0, "autom": [0, 1, 5], "justifi": [0, 1, 2, 8], "longer": [0, 4, 5], "calcul": [0, 2, 4, 5, 12], "bigger": [0, 3, 9], "inferenti": 0, "invok": [0, 1, 8], "simplifi": [0, 2, 3, 4, 5, 8, 10], "specif": [0, 1, 3, 4, 5, 6], "pariti": [0, 4], "automat": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "intro": [0, 1, 2, 3, 4, 5, 6, 7, 8], "simp": [0, 2, 3, 4, 5, 6, 7, 8, 9], "parity_simp": 0, "big": [0, 5, 7, 8, 9], "differ": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "onli": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "its": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "built": [0, 2, 6, 7], "wherea": [0, 1, 2, 3, 5, 7, 8], "top": [0, 6, 7, 8, 9], "meant": [0, 2, 6], "complet": [0, 1, 2, 3, 4, 6, 7, 9], "extens": [0, 1, 6, 8, 9], "rather": [0, 1, 2, 4, 5, 6, 7, 8], "think": [0, 1, 2, 3, 4, 5, 6, 8, 9], "basic": [0, 2, 4, 5, 8, 10, 12], "entri": [0, 5, 7], "brows": [0, 1, 4, 7], "frustrat": [0, 6], "curv": 0, "steep": 0, "newcom": 0, "avail": [0, 1, 2, 4, 5, 6, 7], "round": [0, 1, 5], "clock": 0, "doubt": 0, "enough": [0, 1, 2, 3, 4, 6, 7, 8], "too": [0, 1, 3, 5, 6, 7, 8], "contribut": [0, 3], "develop": [0, 1, 4, 7, 10], "mission": 0, "choos": [0, 2, 3, 4, 5, 6, 7, 8], "dive": 0, "come": [0, 1, 2, 3, 4, 5, 6, 7, 8], "forewarn": 0, "fundament": [0, 4, 5, 6, 10], "life": [0, 2], "mai": [0, 1, 2, 3, 5, 6, 7, 8, 9], "never": [0, 6], "acknowledg": 0, "grate": [0, 5], "gabriel": 0, "ebner": 0, "set": [0, 1, 2, 4, 5, 6, 7, 9, 10, 12], "infrastructur": 0, "scott": 0, "morrison": 0, "mario": 0, "carneiro": 0, "help": [0, 1, 2, 3, 4, 5, 6, 8], "port": 0, "julian": 0, "berman": 0, "alex": 0, "best": 0, "bulwi": 0, "cha": 0, "bryan": 0, "gin": 0, "ge": [0, 2, 5], "chen": 0, "mauricio": 0, "collari": 0, "johan": 0, "commelin": 0, "mark": [0, 1, 2, 6, 8], "czubin": 0, "deni": 0, "gorbachev": 0, "winston": 0, "de": 0, "greef": 0, "mathieu": 0, "guai": 0, "paquet": 0, "k\u00fclshammer": 0, "martin": 0, "c": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10], "giovanni": 0, "mascellani": 0, "isaiah": 0, "mindich": 0, "hunter": 0, "monro": 0, "pietro": 0, "monticon": 0, "oliv": 0, "nash": 0, "bartosz": 0, "piotrowski": 0, "nicola": 0, "rolland": 0, "guilherm": 0, "silva": 0, "flori": 0, "van": 0, "doorn": 0, "eric": 0, "wieser": 0, "been": [0, 1, 2, 4, 5, 6, 9], "partial": [0, 1, 2, 3, 5, 6, 7], "hoskinson": 0, "center": [0, 8], "nut": 1, "bolt": 1, "gener": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "without": [1, 2, 4, 5, 6, 7, 8, 9], "net": 1, "hand": [1, 2, 3, 4, 5, 6, 8], "equal": [1, 2, 3, 4, 5, 6, 7, 8, 10], "right": [1, 2, 3, 4, 5, 6, 8, 9], "tantamount": [1, 3], "name": [1, 2, 3, 4, 5, 6, 7, 8, 9], "b": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "real": [1, 2, 3, 4, 5, 6, 8, 9, 10], "mul_assoc": [1, 2, 4, 5, 6, 7], "mul_comm": [1, 2, 4, 5, 6, 7], "elimin": 1, "explicitli": [1, 2, 3, 5, 6, 7, 8, 9], "purpos": [1, 2, 3, 4, 5, 6, 8], "illustr": [1, 2, 3, 4, 5, 7], "multipl": [1, 2, 3, 4, 5, 6, 7, 9], "written": [1, 2, 3, 4, 5, 6, 7, 8, 9], "howev": [1, 2, 5, 6, 7, 8, 9], "good": [1, 2, 3, 4, 5, 6, 7, 8], "mind": [1, 2, 5, 6, 7], "notat": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "convent": [1, 5, 7, 10], "parenthes": [1, 2, 3, 4], "\u211d": [1, 2, 3, 5, 6, 7, 8, 9, 10], "import": [1, 2, 3, 4, 5, 6, 7, 8, 10], "begin": [1, 2, 3, 4, 5, 6], "sake": [1, 4], "breviti": [1, 5], "suppress": 1, "happen": [1, 6, 8], "charact": [1, 3, 6], "r": [1, 2, 4, 5, 6, 7, 8], "symbol": [1, 2, 5, 6, 7], "doesn": [1, 2, 8], "until": [1, 4, 6, 8], "space": [1, 2, 3, 5, 6, 7, 10, 12], "tab": [1, 3, 4], "kei": [1, 4, 5, 7, 8], "curiou": [1, 6], "abbrevi": [1, 2, 3, 5], "get": [1, 2, 3, 4, 6, 7, 8, 9, 12], "access": [1, 3, 5, 6, 7, 8, 10], "keyboard": 1, "easili": [1, 4, 5, 6, 7], "backslash": [1, 3], "lead": [1, 2, 4, 5, 6, 7, 8], "lean4": 1, "input": [1, 3, 8], "leader": 1, "report": 1, "infoview": 1, "A": [1, 2, 3, 4, 5, 6, 7, 8, 9], "typic": [1, 7], "might": [1, 2, 3, 4, 5, 7], "look": [1, 2, 3, 4, 6, 7, 8], "1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "h\u2081": [1, 2, 3, 4], "prime": [1, 2, 3, 5, 6, 7, 12], "h\u2082": [1, 3, 4], "h\u2083": [1, 3], "denot": [1, 3, 4, 6, 7, 8], "context": [1, 2, 4, 5, 6, 7, 8, 9, 10], "plai": [1, 3, 4, 6, 7, 8], "three": [1, 2, 4, 5, 7, 8], "label": [1, 2], "everyth": [1, 2, 6, 8], "identifi": [1, 2, 4], "subscript": 1, "h": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "legal": 1, "would": [1, 2, 3, 4, 5, 6, 7, 8, 9], "h1": [1, 2, 3, 4, 5], "h2": [1, 2, 3, 5], "h3": 1, "foo": [1, 3, 5], "baz": 1, "last": [1, 2, 3, 4, 5, 6, 7, 8], "sometim": [1, 2, 3, 4, 5, 6, 7, 8], "target": [1, 6, 7, 8, 10], "combin": [1, 2, 5, 6, 7, 8], "practic": [1, 2, 3, 6, 7, 8], "mean": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "usual": [1, 2, 3, 4, 5, 7, 8, 10], "clear": [1, 2, 4, 5, 6], "case": [1, 2, 3, 4, 5, 6, 7, 8, 10], "With": [1, 3, 4, 6, 8], "arrow": [1, 2, 6, 8], "revers": [1, 2, 3, 5, 8], "note": [1, 2, 4, 5, 6, 7, 8, 10], "noth": [1, 2, 3, 4, 5, 6, 7], "argument": [1, 2, 3, 4, 5, 6, 7, 8], "tri": [1, 2, 4, 6], "match": [1, 2, 5], "pattern": [1, 2, 3, 5, 6], "local": [1, 2, 6, 7, 8, 9], "d": [1, 2, 4, 5, 7, 9], "e": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "sub_self": [1, 2], "hyp": 1, "list": [1, 2, 3, 4, 5], "comma": 1, "squar": [1, 2, 4, 5, 6, 7], "bracket": [1, 2, 5, 6, 7], "after": [1, 2, 4, 6, 8, 9], "trick": [1, 2, 4, 6, 9], "variabl": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "onc": [1, 2, 3, 4, 5, 6, 7, 8, 10], "outsid": [1, 4], "inspect": 1, "reveal": 1, "inde": [1, 5, 6, 7, 8, 9], "delimit": 1, "scope": [1, 2, 3, 5], "end": [1, 2, 3, 4, 5, 6, 7, 8, 9], "block": [1, 4, 7], "final": [1, 2, 3, 5, 7, 8, 10], "recal": [1, 2, 4, 5, 7, 8, 10], "introduct": [1, 2, 7, 8, 12], "determin": [1, 5, 7, 8], "both": [1, 2, 3, 4, 5, 6, 7, 8, 9], "expect": [1, 2, 3, 4, 5, 6, 7, 8], "rais": [1, 4], "error": [1, 2, 3, 6], "explain": [1, 2, 3, 4, 5, 6, 7, 8, 10], "output": [1, 7], "meanwhil": [1, 4], "take": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "two_mul": 1, "add_mul": [1, 6], "distribut": [1, 4, 5, 6], "addit": [1, 2, 4, 5, 6, 7, 8, 9, 10], "add_assoc": [1, 4, 5, 6], "precis": [1, 3, 7, 8, 9], "possibl": [1, 2, 3, 4, 5, 7, 8], "calc": [1, 2, 3, 5, 7, 8], "keyword": [1, 2, 4, 5], "notic": [1, 2, 3, 4, 5, 7, 8], "finicki": 1, "underscor": [1, 2, 3], "justif": [1, 2], "format": 1, "indic": [1, 2, 3, 5, 6], "indent": 1, "One": [1, 2, 3, 4, 5, 6, 7, 8], "outlin": [1, 2, 4, 8], "modulo": [1, 4, 5], "individu": 1, "pure": [1, 8], "littl": [1, 2, 8, 9], "underneath": [1, 3], "pow_two": [1, 4], "mul_sub": 1, "add_sub": 1, "sub_sub": 1, "add_zero": [1, 5, 6], "perform": [1, 2, 3], "exact": [1, 2, 3, 4, 5, 7, 8], "becaus": [1, 2, 3, 4, 5, 6, 7, 8, 9], "exactli": [1, 2, 3, 5, 6, 7, 8], "close": [1, 2, 3, 6, 7, 9, 10], "bit": [1, 2, 4, 6, 7, 8], "commut": [1, 2, 3, 4, 5, 6, 7, 9], "long": [1, 2, 3, 5, 6, 7, 9], "axiom": [1, 2, 3, 5, 6, 7, 8, 10], "indirectli": 1, "data": [1, 2, 4, 5, 6, 8], "other": [1, 2, 3, 4, 5, 6, 7, 8], "similar": [1, 2, 3, 5, 6, 7, 8], "common": [1, 2, 3, 4, 5, 7, 8], "variat": [1, 3, 4, 5, 8, 9], "nth_rewrit": 1, "allow": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "particular": [1, 2, 5, 6, 7, 8], "instanc": [1, 2, 3, 4, 5, 6, 7, 8, 9], "enumer": [1, 2], "start": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12], "occurr": 1, "nth_rw": 1, "consist": [1, 3, 5, 6, 7, 8, 9], "collect": [1, 2, 3, 5, 8, 10], "oper": [1, 2, 3, 4, 5, 6, 7, 8, 9], "time": [1, 4, 5, 6, 8, 9, 10], "constant": [1, 2, 7, 10], "mapsto": [1, 5], "abelian": [1, 5, 6], "negat": [1, 5, 12], "invers": [1, 3, 5, 6, 7, 9, 10], "add_comm": [1, 4, 5, 6, 7], "zero_add": [1, 4, 5, 6], "add_left_neg": [1, 5], "mul_on": [1, 5, 6, 7], "one_mul": [1, 2, 5, 6], "being": [1, 3, 5, 7, 8, 9], "suffic": [1, 2, 3, 7, 8], "give": [1, 2, 3, 4, 6, 7, 8, 10], "element": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "concret": [1, 2, 4, 5, 6, 8], "integ": [1, 2, 4, 6, 7, 12], "abstract": [1, 2, 5, 6, 7, 8], "character": [1, 3, 4, 8, 9], "axiomat": [1, 2, 3, 5], "train": [1, 6], "recogn": [1, 2, 4, 5, 6, 8], "appropri": [1, 2, 3, 5, 6], "\u2124": [1, 4, 5, 6, 7], "ration": [1, 2, 4, 8], "\u211a": [1, 4, 7, 8], "\u2102": [1, 5, 7, 9], "extend": [1, 3, 4, 5, 6, 8, 10], "order": [1, 2, 3, 4, 5, 6, 8, 9], "Not": [1, 5, 8], "properti": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "hold": [1, 2, 3, 4, 5, 7, 8, 10], "arbitrari": [1, 2, 3, 4, 5, 7], "taken": [1, 2], "cours": [1, 2, 4, 6, 7, 8, 9, 10], "linear": [1, 2, 5, 7, 8], "matric": [1, 5, 7], "fail": [1, 2, 3, 4, 5, 6, 8, 10], "commr": [1, 2, 5, 7], "unchang": [1, 2], "linarith": [1, 2, 4, 5], "permiss": 1, "strike": [1, 2], "balanc": 1, "concis": [1, 5, 7], "readabl": [1, 2, 3, 4, 8], "strengthen": [1, 2, 4], "deriv": [1, 2, 4, 7, 9, 10], "most": [1, 2, 3, 4, 5, 6, 7, 8, 10], "organiz": 1, "mechan": [1, 2, 5], "namespac": [1, 2, 3, 4, 5, 7, 8], "full": [1, 2, 3, 4, 5, 6, 7, 8], "shorter": [1, 3, 4, 7, 8], "avoid": [1, 2, 3, 4, 5, 6, 7, 9], "due": [1, 3, 6], "clash": 1, "myre": 1, "add_right_neg": 1, "effect": [1, 3, 6, 8], "temporarili": [1, 2], "reprov": [1, 7], "care": [1, 2, 3, 5], "earlier": [1, 7], "pai": [1, 2, 6, 7, 8], "attent": [1, 2, 4, 6, 7, 8], "curli": [1, 2], "implicit": [1, 2, 5, 6, 7, 8, 9], "moment": [1, 2, 5], "worri": [1, 3, 4, 5, 7], "neg_add_cancel_left": 1, "add_neg_cancel_right": 1, "add_left_cancel": 1, "add_right_cancel": 1, "plan": [1, 6, 8], "brace": 1, "imagin": 1, "situat": [1, 3, 6, 7, 8], "draw": [1, 5, 6], "conclus": [1, 2, 4], "hypothes": [1, 2, 3, 4, 5], "redund": [1, 5, 8, 10], "few": [1, 2, 3, 4, 8], "extra": [1, 2, 3, 5, 6, 7, 8], "oner": 1, "complic": [1, 2, 6, 7], "tediou": [1, 2, 6], "suppos": [1, 2, 3, 4, 5, 8], "infer": [1, 2, 3, 5, 6, 7], "mul_zero": [1, 5, 6], "serv": [1, 3, 4, 5, 10], "therefor": [1, 4, 5, 8], "promot": 1, "modular": 1, "subproof": 1, "wa": [1, 3, 7], "except": [1, 2, 5, 7], "ad": [1, 2, 3, 4, 5, 6, 8], "variant": [1, 2, 7, 8], "whose": [1, 2, 4, 5, 6, 7, 8, 9], "necessarili": [1, 10], "miss": [1, 3, 4], "piec": [1, 4, 5, 6, 7, 8], "either": [1, 2, 3, 5, 6, 8], "becom": [1, 4, 5, 6, 8], "technic": [1, 5, 6], "strictli": [1, 2, 9], "less": [1, 2, 3, 4, 5, 6, 7, 8], "script": 1, "slightli": [1, 6, 7, 8, 9], "clearer": [1, 3, 5], "human": 1, "reader": [1, 8], "maintain": 1, "evolv": 1, "rememb": [1, 2, 3, 4, 5, 6, 7, 8], "zero_mul": [1, 4, 5, 6], "By": [1, 3, 5, 6, 7], "neg_eq_of_add_eq_zero": 1, "eq_neg_of_add_eq_zero": 1, "neg_zero": 1, "neg_neg": 1, "had": [1, 6], "annot": [1, 2, 3, 4, 5, 6], "third": [1, 2, 3, 5, 8], "specifi": [1, 2, 3, 4, 5, 8, 9, 10], "imposs": 1, "default": [1, 2, 3, 4, 5, 6, 7, 9], "subtract": [1, 4, 5], "provabl": [1, 3, 6, 8], "sub_eq_add_neg": 1, "On": [1, 2, 3, 5, 6, 8, 10], "defin": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12], "reflex": [1, 2], "present": [1, 2, 4, 7, 8], "forc": [1, 2, 3, 7], "unfold": [1, 2, 3, 4, 5, 8], "deal": [1, 2, 3, 4, 5, 8], "equat": [1, 2, 3, 4, 5], "interchang": 1, "self_sub": 1, "effort": [1, 4], "one_add_one_eq_two": 1, "norm_num": [1, 2, 4, 5], "strength": 1, "weaker": [1, 2], "notion": [1, 2, 3, 4, 5, 7, 8, 9, 10], "addgroup": [1, 5, 7], "otherwis": [1, 2, 3, 4, 5, 7], "addcommgroup": [1, 7], "commgroup": 1, "g": [1, 2, 3, 5, 6, 7, 8, 9, 10], "mul_left_inv": [1, 5], "\u00b9": [1, 3, 5, 6, 7, 8], "cocki": 1, "helper": 1, "along": [1, 4, 7, 8], "mul_right_inv": [1, 5], "mul_inv_rev": 1, "non": [1, 3, 6, 7, 8, 10], "abel": [1, 7], "noncomm_r": 1, "seem": [1, 2, 4, 6, 8, 9], "odd": [1, 2, 3, 4], "partli": [1, 6, 7], "histor": [1, 7], "conveni": [1, 2, 3, 5, 6, 7, 8], "great": [1, 5], "sort": [1, 3, 4], "inequ": [1, 2, 6, 8], "le": [1, 5, 6], "whenev": [1, 2, 4, 5], "consid": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "le_refl": [1, 2], "le_tran": [1, 2], "detail": [1, 2, 3, 4, 5, 6, 7], "unless": [1, 2, 5], "realli": [1, 2, 3, 4, 6, 7, 8], "insist": [1, 6], "discuss": [1, 2, 4, 5, 6, 7, 8, 9], "implic": [1, 8, 12], "h\u2080": [1, 2, 3, 4, 8], "dot": [1, 7, 8], "option": [1, 2, 4, 5, 6, 8], "within": [1, 2, 8], "visibl": 1, "must": [1, 5, 6, 8], "decreas": [1, 5], "fourth": [1, 2], "mode": [1, 2, 5], "entir": [1, 3, 5, 8, 9], "lt_of_le_of_lt": [1, 2], "lt_of_lt_of_l": 1, "lt_tran": [1, 2], "togeth": [1, 2, 3, 4, 5, 7, 8], "handl": [1, 3, 4, 6, 7], "arithmet": 1, "5": [1, 2, 5, 7, 8, 9], "pass": [1, 5], "exp_le_exp": 1, "mpr": [1, 2, 5, 8], "exp": [1, 3], "applic": [1, 2, 4, 5, 7, 10], "function": [1, 2, 4, 5, 6, 7, 9, 10, 12], "compound": [1, 2, 8], "pars": [1, 3], "exp_lt_exp": 1, "log_le_log": 1, "log": [1, 3, 10], "log_lt_log": 1, "add_le_add": [1, 2], "add_le_add_left": 1, "add_le_add_right": 1, "add_lt_add_of_le_of_lt": 1, "add_lt_add_of_lt_of_l": 1, "add_lt_add_left": 1, "add_lt_add_right": 1, "add_nonneg": [1, 5], "add_po": 1, "add_pos_of_pos_of_nonneg": 1, "exp_po": [1, 3], "bi": [1, 2, 5], "lr": 1, "iff": [1, 3, 7, 8, 9, 10, 12], "connect": [1, 3, 5, 8], "equival": [1, 2, 3, 4, 5, 7, 8, 9, 10], "mp": [1, 2, 3, 4, 8], "forward": [1, 2, 5, 7, 8], "direct": [1, 2, 3, 6, 7, 8, 9], "stand": [1, 2, 5, 7, 8, 9], "modu": 1, "ponen": 1, "respect": [1, 2, 3, 4, 5, 7, 8], "thu": [1, 3, 4, 5, 8], "again": [1, 2, 3, 4, 5, 6, 7, 8], "numer": [1, 4, 5], "constitut": 1, "part": [1, 2, 3, 4, 5, 6, 8, 10], "strategi": [1, 2, 4], "api": 1, "reli": [1, 2, 3, 5, 8], "guess": [1, 2, 3, 4, 5], "cmd": [1, 2], "mac": [1, 2], "a_of_b_of_c": 1, "approxim": 1, "loud": 1, "probabl": [1, 5, 6, 8], "add_l": 1, "choic": [1, 2, 3, 5, 8], "exist": [1, 2, 3, 6, 7, 8], "jump": [1, 4, 5, 8], "nearbi": [1, 4], "sq_nonneg": 1, "delet": [1, 2, 3, 4], "uncom": 1, "previou": [1, 2, 3, 5, 6, 7, 8, 9, 10], "confirm": [1, 2, 3, 4], "finish": [1, 2, 3, 4, 7], "job": 1, "pow_two_nonneg": [1, 2], "tend": [1, 8], "around": [1, 3, 6, 7, 8, 10], "binari": [1, 2, 4, 5, 6], "increas": 1, "worth": [1, 2, 5], "definition": [1, 4, 5, 6, 8], "principl": [1, 2, 3, 4, 6, 9], "favor": [1, 5], "timesav": 1, "clever": 1, "involv": [1, 2, 4, 5, 6, 7, 8], "nice": [1, 2, 4, 6, 7, 8], "idea": [1, 2, 3, 5, 6, 8], "abs_l": [1, 5], "constructor": [1, 2, 3, 4, 5, 6], "split": [1, 2, 3, 4], "conjunct": [1, 6, 12], "congratul": [1, 2, 4], "min": [1, 2, 8, 10], "uniqu": [1, 2, 3, 4, 5, 7, 8], "min_le_left": 1, "min_le_right": 1, "le_min": 1, "max": [1, 2, 6, 8, 10], "pair": [1, 2, 4, 5, 7, 8], "act": [1, 7], "curri": 1, "logician": 1, "haskel": 1, "bind": [1, 3], "tighter": [1, 3], "infix": [1, 6], "le_antisymm": [1, 2], "usag": 1, "inconsist": 1, "outer": 1, "level": [1, 2, 6], "nest": [1, 2], "bother": [1, 3], "repetit": [1, 6], "foreshadow": 1, "univers": [1, 3, 5, 7, 8, 12], "quantifi": [1, 3, 4, 5, 7, 8, 12], "desir": [1, 3, 6, 7, 8], "implicitli": [1, 2], "repeat": [1, 4, 5, 6], "mani": [1, 2, 3, 5, 6, 7, 8, 9, 10, 12], "whether": [1, 2, 3, 4, 6, 8], "Of": [1, 2, 4, 6, 7, 8, 9, 10], "interest": [1, 2, 3, 5, 6, 8], "vice": [1, 3], "versa": [1, 3], "word": [1, 2, 3, 4, 5, 7, 8], "switch": [1, 6], "transit": [1, 2, 5, 8], "total": 1, "satisfi": [1, 3, 4, 5, 6, 8, 9], "disjunct": [1, 3, 12], "stick": [1, 2, 8, 9], "aux": [1, 2, 4, 8], "valu": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "yield": [1, 2, 3, 4, 5, 8], "made": [1, 2, 3, 5, 8], "manifest": [1, 8], "triangl": [1, 2, 5], "abs_add": [1, 2], "sub_add_cancel": [1, 5], "relat": [1, 2, 3, 5, 6, 7, 8, 9, 10], "divis": [1, 2, 4, 5, 6], "Be": [1, 3], "ordinari": [1, 2, 4, 5, 7, 8], "unicod": [1, 3, 6], "obtain": [1, 2, 4, 5, 8, 9], "dvd": 1, "dvd_tran": 1, "dvd_mul_of_dvd_left": 1, "dvd_mul_left": 1, "expon": 1, "expand": [1, 2, 3, 4, 5], "w": [1, 6], "greatest": [1, 5, 8], "divisor": [1, 2, 4, 5, 7], "gcd": [1, 2, 4], "least": [1, 5, 6, 8], "lcm": 1, "analog": [1, 2, 3, 4, 5, 8, 9], "divid": [1, 2, 4, 5, 7], "gcd_zero_right": 1, "gcd_zero_left": 1, "lcm_zero_right": 1, "lcm_zero_left": 1, "dvd_antisymm": 1, "complain": 1, "ambigu": [1, 5], "_root_": [1, 4], "saw": [1, 5, 6, 7, 8], "govern": [1, 5], "class": [1, 4, 5, 6, 7, 8, 9, 10], "\u03b1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "partialord": [1, 2], "adopt": 1, "letter": [1, 5, 9], "\u03b2": [1, 2, 3, 5, 6, 8, 10], "\u03b3": [1, 2, 5, 8], "greek": [1, 4], "especi": [1, 2, 5, 6, 7, 8], "strict": [1, 2], "somewhat": [1, 3, 8], "lt_irrefl": [1, 2], "lt_iff_le_and_n": 1, "lattic": [1, 5, 6, 7, 8], "inf_le_left": [1, 8], "inf_le_right": 1, "le_inf": 1, "le_sup_left": 1, "le_sup_right": 1, "sup_l": 1, "lower": [1, 2, 4], "bound": [1, 2, 3, 4, 5, 8, 9, 10], "upper": [1, 2], "glb": 1, "lub": 1, "infimum": [1, 6, 7, 8, 10], "supremum": [1, 4, 6, 7], "inf": [1, 6, 8], "sup": [1, 4, 8], "further": [1, 8], "matter": [1, 2], "meet": [1, 2, 3, 5], "keep": [1, 5, 6, 7], "dictionari": 1, "subset": [1, 2, 3, 5, 8, 9], "domain": [1, 2, 3, 4, 5, 7, 8], "boolean": 1, "truth": [1, 4], "fals": [1, 2, 3, 4, 6], "true": [1, 2, 3, 6, 8], "posit": [1, 3, 4, 5, 8, 10], "subspac": [1, 6], "vector": [1, 3, 6, 7, 9], "intersect": [1, 3, 5, 6, 7, 8, 10], "sum": [1, 2, 4, 5, 6, 7, 8], "inclus": [1, 3, 7, 8], "topolog": [1, 5, 6, 9, 12], "union": [1, 3, 4, 5, 6, 7, 9, 10], "inf_comm": [1, 7], "inf_assoc": 1, "sup_comm": 1, "sup_assoc": 1, "absorpt": 1, "law": [1, 7], "absorb1": 1, "absorb2": 1, "found": [1, 5, 7, 9], "inf_sup_self": 1, "sup_inf_self": 1, "distriblattic": 1, "inf_sup_left": 1, "inf_sup_right": 1, "sup_inf_left": 1, "sup_inf_right": 1, "shown": [1, 5, 9, 10], "explicit": [1, 2, 5, 6, 8], "nondistribut": 1, "finit": [1, 3, 4, 5, 7, 8, 9, 10], "impli": [1, 2, 3, 4, 5, 8], "larger": [1, 8], "carrier": [1, 5, 6, 7], "compat": [1, 7, 8], "strictorderedr": 1, "mul_po": [1, 4], "mul_nonneg": 1, "coupl": [1, 2, 6, 8], "metric": [1, 5, 9, 12], "equip": [1, 3, 5, 6, 7, 8, 9, 10], "distanc": [1, 2, 8, 9], "dist": [1, 8], "map": [1, 2, 3, 5, 6, 7, 8], "metricspac": [1, 8, 9], "dist_self": 1, "dist_comm": [1, 8], "dist_triangl": [1, 8], "nonneg": [1, 5], "nonneg_of_mul_nonneg_left": 1, "dist_nonneg": [1, 8], "dealt": 2, "simpl": [2, 4, 5, 6, 9], "absolut": 2, "\u03b5": [2, 8, 9], "though": [2, 3, 4, 5], "treat": [2, 3, 5, 6, 7, 8, 9], "appli": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "my_lemma": 2, "\u03b4": [2, 8], "hb": [2, 8], "subsequ": [2, 4, 8], "lemma": [2, 4, 5, 6, 7, 8, 9, 10, 12], "mention": [2, 3, 5, 6, 7, 8], "my_lemma2": 2, "stage": [2, 5, 6], "my_lemma3": 2, "epo": 2, "ele1": 2, "xlt": 2, "ylt": 2, "essenti": [2, 3, 5, 7, 8], "colon": 2, "off": [2, 3, 4], "my_lemma4": 2, "abs_mul": 2, "mul_le_mul": 2, "abs_nonneg": 2, "mul_lt_mul_right": 2, "extract": [2, 8], "hidden": 2, "expos": [2, 8], "predic": [2, 3, 4, 6, 7, 8, 9], "fnub": 2, "fnlb": 2, "lambda": [2, 5], "hfa": 2, "hgb": 2, "dsimp": [2, 3, 4, 5, 7], "simplif": [2, 3, 4], "contract": 2, "anyhow": 2, "control": 2, "transform": [2, 3], "rest": [2, 3, 5, 7, 8], "routin": 2, "nnf": 2, "nng": 2, "nna": 2, "codomain": [2, 4, 8], "structur": [2, 4, 6, 7, 8, 9, 10, 12], "monoid": [2, 3, 4, 6, 12], "fnub_add": 2, "orderedcanceladdcommmonoid": 2, "high": [2, 7], "monoton": [2, 6, 8], "nondecreas": [2, 4], "placehold": 2, "Or": [2, 3], "backward": [2, 8], "subgoal": 2, "mf": 2, "mg": 2, "aleb": 2, "flag": [2, 3], "squiggli": 2, "marker": 2, "nnc": 2, "bbb": [2, 5], "fneven": 2, "fnodd": 2, "ef": 2, "eg": 2, "og": 2, "shorten": [2, 7], "rid": 2, "won": [2, 4, 6, 7, 8], "cannot": [2, 3, 4, 5, 6, 7, 8], "contrari": 2, "syntact": 2, "reduct": [2, 3, 5], "erw": 2, "harder": [2, 5], "spot": 2, "manipul": [2, 5, 7, 8], "foundat": [2, 3, 4, 5, 7], "mundan": 2, "assert": [2, 3, 6, 7], "contrast": [2, 3, 5, 6, 8], "zermelo": 2, "fraenkel": 2, "sin": [2, 9], "co": [2, 7], "zf": 2, "defect": [2, 6, 8], "theoret": [2, 3, 8], "motiv": 2, "detect": 2, "meaningless": 2, "independ": [2, 3, 5], "continuum": 2, "meta": [2, 6], "beyond": [2, 6, 9], "ask": [2, 4, 5, 6, 7, 8], "xs": [2, 3], "refl": [2, 3, 5, 6, 7], "tran": [2, 4, 5, 6, 7], "setub": 2, "inject": [2, 3, 4, 6, 7, 8], "x_1": [2, 3], "x_2": [2, 3], "x\u2081": [2, 3, 5, 8], "x\u2082": [2, 3, 5], "add": [2, 4, 5, 6, 7, 8, 9], "nonzero": [2, 4, 5, 10], "sourc": [2, 8], "inspir": 2, "add_left_inj": 2, "composit": [2, 3, 5, 6, 7, 8], "injg": 2, "injf": [2, 3], "canon": [2, 3, 4, 5], "exhibit": [2, 8], "anonym": [2, 3, 4, 5, 7], "angl": 2, "certain": [2, 6, 8], "fnhasub": 2, "fnhaslb": 2, "ubf": 2, "ubg": 2, "rcase": [2, 3, 4, 8], "ubfa": 2, "ubgb": 2, "unpack": [2, 3], "main": [2, 6, 8, 9], "els": [2, 3, 4], "turn": [2, 3, 4, 5, 6, 8, 9], "fn_ub_add": 2, "directli": [2, 4, 5, 6, 8], "lbf": 2, "lbg": 2, "recurs": [2, 3, 5, 12], "arbitrarili": [2, 8], "assign": [2, 3, 5, 6, 7], "compon": [2, 3, 5, 8, 10], "destruct": 2, "produc": [2, 7, 9], "tag": [2, 3, 6], "chosen": [2, 5], "intern": [2, 5, 7], "primit": [2, 3], "scientist": 2, "sight": [2, 6], "hurt": 2, "chanc": 2, "yourself": [2, 5], "compani": 2, "old": [2, 5, 6], "chestnut": 2, "product": [2, 4, 5, 6, 7, 8, 10], "magic": [2, 5, 6], "verifi": 2, "sumofsquar": 2, "sumofsquares_mul": 2, "sosx": 2, "sosi": 2, "xeq": [2, 3], "yeq": 2, "insight": 2, "gaussian": [2, 7, 12], "i": [2, 3, 4, 5, 7, 8, 9, 10], "sqrt": [2, 3, 4, 5], "norm": [2, 5, 8, 12], "reflect": 2, "di": [2, 5], "xy": [2, 5], "cryptic": 2, "easiest": [2, 4], "perspicu": 2, "6": [2, 4, 5, 6, 7, 8, 9], "divab": 2, "divbc": 2, "beq": 2, "ceq": 2, "And": [2, 4, 6, 8], "pretti": [2, 6, 7, 8], "Then": [2, 3, 5, 6, 7, 8, 10], "divac": 2, "alpha": [2, 3], "beta": [2, 3], "surject": [2, 3, 7, 8], "mul_div_cancel": [2, 4], "field_simp": [2, 5], "denomin": [2, 4, 5], "hx": [2, 3, 5, 6, 7, 9], "surjg": 2, "surjf": [2, 3], "contradict": [2, 3, 4], "speak": [2, 5, 7, 8], "irreflex": 2, "asymmetri": 2, "lt_asymm": 2, "eventu": [2, 3, 8], "fnuba": 2, "not_le_of_gt": 2, "not_lt_of_g": [2, 4, 5], "lt_of_not_g": 2, "le_of_not_gt": 2, "snippet": [2, 4, 5, 7], "counterexampl": [2, 9], "monof": 2, "four": [2, 5], "valid": 2, "far": [2, 3, 6, 8], "q": [2, 4, 5, 6, 7, 8], "straightforward": [2, 6], "difficult": [2, 6], "conclud": [2, 9], "nonexist": 2, "contradictori": 2, "classic": [2, 3, 4, 7], "by_contra": [2, 4], "not_not": 2, "front": 2, "push": [2, 4, 7, 8], "inward": 2, "facilit": [2, 8], "push_neg": [2, 3, 4], "restat": [2, 6, 7], "contrapos": [2, 3, 4], "similarli": [2, 3, 4, 5, 7], "yet": [2, 3, 4, 5, 6, 8], "semicolon": [2, 4], "falso": 2, "anyth": [2, 5, 8], "elim": 2, "strang": [2, 4, 7], "fairli": 2, "reach": [2, 6], "37": 2, "exfalso": 2, "absurd": [2, 4], "slick": 2, "drop": 2, "manner": [2, 5], "techniqu": [2, 8], "variou": [2, 3, 5, 6, 10], "xltz": 2, "zlty": 2, "10": [2, 7, 9], "7": [2, 4, 5, 7], "behav": [2, 3, 6, 8], "roughli": [2, 3, 4], "friend": [2, 5], "were": [2, 4, 5, 8], "inscrut": [2, 3], "gadget": [2, 8], "auxiliari": [2, 8], "pow_eq_zero": [2, 4], "doubl": [2, 3], "symmetr": [2, 3, 7], "abs_lt": 2, "dvd_gcd_iff": 2, "8": [2, 4, 7, 8], "15": 2, "not_monotone_iff": 2, "antisymmetr": 2, "aris": 2, "preorder": [2, 6, 8], "pre": 2, "lt_iff_le_not_l": 2, "repeatedli": [2, 8], "instanti": [2, 5, 6, 8], "inl": [2, 3], "inr": [2, 3], "branch": [2, 3, 6], "le_or_gt": 2, "abs_of_nonneg": [2, 5], "abs_of_neg": 2, "against": 2, "immedi": [2, 3, 5, 6, 7], "attract": 2, "closer": [2, 8], "advantag": [2, 3, 4, 5, 7, 9], "myab": 2, "le_abs_self": 2, "neg_le_abs_self": 2, "enjoi": [2, 3, 4, 8], "pun": 2, "lt_ab": 2, "genuin": 2, "vertic": [2, 5], "lt_trichotomi": 2, "xgt": 2, "dvd_mul_right": [2, 4], "eq_zero_or_eq_zero_of_mul_eq_zero": 2, "zero": [2, 3, 4, 5, 6, 7, 8, 9, 10], "nontrivi": [2, 3, 4, 5, 8, 9], "integr": [2, 9, 12], "isdomain": [2, 7], "em": [2, 3], "exclud": [2, 4], "by_cas": [2, 3, 4], "dispos": 2, "s_0": [2, 3], "s_1": 2, "s_2": 2, "ldot": [2, 3, 4], "varepsilon": [2, 8], "s_n": [2, 3], "render": [2, 4], "convergesto": 2, "ext": [2, 3, 4, 5, 6, 7], "enabl": [2, 3, 4, 5], "actual": [2, 3, 4, 6, 7, 8], "u": [2, 3, 5, 7, 8, 10], "v": [2, 3, 5, 8], "congr": 2, "reconcil": 2, "peel": 2, "ab": [2, 5, 7], "convert": [2, 4, 7], "quit": [2, 6, 8], "zero_lt_on": [2, 4], "fill": [2, 3, 4, 5], "convergesto_const": 2, "\u03b5po": [2, 8], "nge": 2, "abs_zero": 2, "save": 2, "troubl": [2, 3, 5], "pen": [2, 7], "paper": [2, 3, 5, 7, 8, 10], "ns": 2, "nt": 2, "maximum": [2, 4, 8], "implement": [2, 5, 6, 7, 9], "convergesto_add": 2, "cs": 2, "ct": 2, "clean": [2, 8], "\u03b52po": 2, "hs": [2, 4, 7, 8, 10], "ht": 2, "le_of_max_le_left": 2, "le_of_max_le_right": 2, "tricki": [2, 3, 4, 6, 7], "convergesto_mul_const": 2, "acpo": 2, "abs_po": 2, "exists_abs_le_of_convergesto": 2, "strong": [2, 4], "n\u2080": 2, "bpo": [2, 8], "pos\u2080": 2, "div_po": 2, "n\u2081": 2, "convergesto_mul": 2, "sketch": [2, 3, 4, 8], "limit": [2, 6, 8], "bold": 2, "scratch": 2, "convergesto_uniqu": 2, "sa": 2, "sb": 2, "abn": 2, "na": 2, "hna": 2, "nb": 2, "hnb": 2, "absa": 2, "absb": 2, "observ": [2, 4, 8], "everywher": [2, 3, 6, 8, 10], "linearord": 2, "9": [2, 8], "vastli": 2, "awai": [2, 5], "vocabulari": 3, "uniform": [3, 8, 9], "conceptu": [3, 7], "overload": 3, "verbos": 3, "system": [3, 4, 5, 6], "wrong": 3, "ss": 3, "sub": [3, 8, 10, 12], "cap": 3, "un": 3, "cup": 3, "univ": [3, 8, 9, 10], "empti": [3, 4, 5, 7, 8, 10], "member": [3, 8], "membership": [3, 4, 6, 7], "mem": 3, "notin": 3, "ident": [3, 4, 5, 6, 7, 8, 12], "databas": [3, 4, 6, 8], "unlik": [3, 4], "existenti": [3, 7, 12], "subset_def": 3, "inter_def": 3, "mem_setof": 3, "xu": 3, "mem_inter_iff": 3, "xsu": 3, "phenomenon": 3, "quirk": 3, "process": 3, "pitfal": 3, "heavili": [3, 8], "fall": 3, "union_def": 3, "mem_union": [3, 4], "xtu": 3, "xt": 3, "unnecessari": [3, 7], "correctli": 3, "special": [3, 4, 5, 6, 7, 8, 10], "rewritten": 3, "diff_eq": 3, "mem_diff": 3, "xstu": 3, "xnt": 3, "xnu": 3, "extension": [3, 5], "unsurprisingli": 3, "harm": 3, "and_comm": 3, "antisymm": 3, "hood": [3, 5], "builder": 3, "trivial": [3, 4, 7, 8], "eq_two_or_odd": 3, "even_iff": 3, "confus": [3, 4, 6, 7, 8], "fortun": 3, "agre": 3, "prime_iff": 3, "symm": [3, 4, 5, 6, 7, 8, 9], "rwa": [3, 4, 5], "restrict": [3, 4, 7, 8], "signific": 3, "ball": [3, 9], "bex": 3, "bex_def": 3, "prime_x": 3, "slight": 3, "ssubt": 3, "index": [3, 6, 7, 8], "model": [3, 8], "sequenc": [3, 6, 8, 9, 12], "a_0": 3, "a_1": 3, "a_2": 3, "mem_iunion": 3, "xai": 3, "mem_iint": 3, "mem_iunion\u2082": 3, "mem_iinter\u2082": 3, "exists_prime_and_dvd": 3, "eq_univ": 3, "eq_univ_of_foral": 3, "exists_infinite_prim": 3, "\u2080": 3, "sunion": 3, "sinter": 3, "relationship": [3, 4], "sunion_eq_biunion": 3, "sinter_eq_biint": 3, "preimag": [3, 7, 8], "imag": [3, 4, 6, 7, 8], "tripl": 3, "mem_image_of_mem": 3, "galoi": [3, 5, 8], "image_subset_iff": 3, "represent": [3, 4, 5], "asid": 3, "raini": 3, "dai": 3, "behavior": [3, 6, 8], "nonempti": [3, 7, 8], "condit": [3, 4, 6, 7, 8, 9], "fxeq": 3, "ai": 3, "fx": 3, "eq": [3, 5], "injon": [3, 10], "theme": 3, "rel": [3, 5], "relativ": 3, "xpo": 3, "ypo": 3, "exp_log": 3, "ingredi": [3, 5, 8, 9], "inhabit": [3, 5, 8], "appeal": [3, 6], "choose_spec": 3, "noncomput": [3, 5, 7], "inverse_spec": 3, "dif_po": 3, "dif_neg": 3, "fulli": [3, 7, 8], "alon": 3, "leftinvers": 3, "rightinvers": 3, "hack": 3, "half": [3, 7], "dozen": 3, "condens": 3, "cantor": 3, "famou": [3, 7], "j": [3, 5, 7], "intuit": [3, 8], "cardin": [3, 7], "biject": [3, 5, 7], "nineteenth": 3, "centuri": 3, "infinit": [3, 8, 12], "dedekind": 3, "quickli": [3, 7, 10], "behind": [3, 7], "problem": [3, 4, 5, 6, 8], "shade": 3, "region": 3, "diagram": 3, "circ": [3, 5], "scale": 3, "inner": 3, "smaller": [3, 4, 8], "concentr": 3, "unshad": 3, "compos": [3, 5, 7, 8], "disjoint": [3, 7, 10], "sound": [3, 5, 6], "plausibl": 3, "delic": 3, "improv": [3, 4], "confid": 3, "better": [3, 4, 5, 6, 8], "invfun": [3, 5], "leftinverse_invfun": 3, "invfun_eq": 3, "sbaux": 3, "sbset": 3, "sb_aux": 3, "s_": 3, "sb_set": 3, "bigcup_": 3, "mathbb": [3, 4, 5, 7], "sbfun": 3, "complement": [3, 8, 10], "outermost": 3, "setminu": 3, "inv_fun": 3, "inv_fun_eq": 3, "sb_right_inv": 3, "goe": [3, 4, 5, 6, 8], "neither": [3, 5, 6], "nor": [3, 5], "sb_inject": 3, "hf": [3, 7, 8, 9, 10], "hg": [3, 8, 9, 10], "a_def": 3, "h_def": 3, "hxeq": 3, "xa": 3, "wlog": 3, "x\u2081a": 3, "resolve_left": 3, "x\u2082a": 3, "not_imp_self": 3, "x\u2082na": 3, "if_po": 3, "if_neg": 3, "x\u2082eq": 3, "hn": [3, 4, 8, 9], "sb_fun": 3, "bring": [3, 4, 8], "tradeoff": 3, "encapsul": [3, 5, 9], "symmetri": [3, 6], "dwell": 3, "succ": [3, 4, 6], "sb_surject": 3, "gya": 3, "xmem": 3, "sweet": 3, "schroeder_bernstein": 3, "substant": 4, "ancient": 4, "fraction": 4, "lowest": 4, "2c": 4, "4c": 4, "factor": [4, 5, 7], "coprim": [4, 7], "smart": 4, "12": 4, "encount": [4, 6], "algebra": [4, 6, 8, 9, 10, 12], "prime_def_lt": 4, "eq_one_or_self_of_dvd": 4, "prime_p": 4, "17": 4, "commonli": [4, 5], "prime_two": 4, "prime_thre": 4, "broader": [4, 9], "irreduc": [4, 5], "coincid": [4, 5, 8], "rise": [4, 6, 7], "dvd_mul": 4, "even_of_even_sqr": 4, "dvd_of_dvd_pow": 4, "proce": [4, 6], "profici": 4, "prefix": [4, 6, 7], "search": [4, 5, 6], "engin": 4, "hesit": 4, "mul_right_inj": 4, "heart": [4, 7], "irration": 4, "dvd_gcd": 4, "coprime_mn": 4, "sqr_eq": 4, "meq": 4, "dvd_iff_exists_eq_mul_left": 4, "two_l": 4, "le_of_dvd": 4, "approach": [4, 5, 6, 8], "quick": [4, 7, 9], "ne": [4, 5], "occur": 4, "suffici": [4, 8], "permut": [4, 7], "prime_of_mem_factor": 4, "prod_factor": 4, "factors_uniqu": 4, "talk": [4, 7, 8, 9], "factorization_mul": 4, "mnez": 4, "nnez": 4, "factorization_pow": 4, "black": [4, 6], "box": 4, "simpa": [4, 7, 9], "nnz": 4, "nsqr_nez": 4, "eq1": 4, "eq2": 4, "add_mul_mod_self_left": 4, "mul_mod_right": 4, "count_factors_mul_of_po": 4, "successor": 4, "succ_ne_zero": 4, "npow_nz": 4, "dvd_sub": 4, "pow_eq": 4, "npowz": 4, "add_sub_cancel": 4, "understood": [4, 8], "quotient": [4, 5, 6, 8], "pictur": [4, 5, 7], "mediat": 4, "headach": 4, "contend": 4, "issu": [4, 5, 6, 8], "th": 4, "topic": [4, 6, 7], "enat": 4, "infin": [4, 8, 10], "appreci": 4, "role": [4, 5, 8], "datatyp": 4, "freeli": 4, "translat": [4, 6, 7, 8], "mathematician": [4, 8], "inj": 4, "factori": 4, "fac": 4, "ih": 4, "fac_po": 4, "succ_po": 4, "dvd_fac": 4, "ipo": 4, "il": 4, "of_le_succ": 4, "dvd_mul_of_dvd_right": 4, "crude": 4, "remaind": [4, 5, 7], "pow_two_le_fac": 4, "finset": [4, 5, 7, 8], "bigoper": [4, 5, 7], "prod": [4, 7, 8, 10], "sum_range_zero": 4, "sum_range_succ": 4, "summat": 4, "prod_range_zero": 4, "prod_range_succ": 4, "deserv": 4, "danger": [4, 5], "ordinarili": [4, 5], "loop": 4, "indefinit": 4, "fix": [4, 6, 7, 8], "placement": 4, "re": [4, 5], "handi": 4, "sum_id": 4, "div_eq_of_eq_mul_right": 4, "succ_eq_add_on": 4, "sum_sqr": 4, "mynat": 4, "thumb": 4, "decid": [4, 8], "preced": [4, 7], "truncat": 4, "exponenti": 4, "cut": 4, "predecessor": 4, "pred": 4, "mul": [4, 5, 6, 8], "succ_add": 4, "succ_mul": 4, "explor": [4, 8], "standard": [4, 5, 6, 8], "formul": [4, 7, 8], "quirki": 4, "among": 4, "annoi": [4, 6], "h0": 4, "succ_le_succ": 4, "zero_l": [4, 5], "interval_cas": 4, "interv": [4, 8, 10], "decis": [4, 7], "procedur": [4, 6], "revert": [4, 5], "minfac": 4, "smallest": [4, 6, 8], "strong_induction_on": 4, "subsum": 4, "exists_prime_factor": 4, "np": 4, "mltn": 4, "mdvdn": 4, "mne1": 4, "mz": 4, "zero_dvd_iff": 4, "mgt2": 4, "pp": 4, "pdvd": 4, "factorial_po": 4, "dvd_factori": 4, "primes_infinit": 4, "refin": [4, 9], "ple": 4, "p_1": 4, "p_n": 4, "prod_": 4, "p_i": [4, 8], "computation": 4, "test": 4, "decidableeq": 4, "abandon": 4, "ourselv": [4, 6], "subset_iff": 4, "mem_int": 4, "mem_sdiff": 4, "tauto": 4, "dispens": 4, "tautolog": 4, "dvd_prod_of_mem": 4, "eq_of_dvd_of_prim": 4, "prime_q": 4, "preserv": [4, 6, 8], "induction_on": 4, "singleton": 4, "prod_empti": 4, "prod_insert": 4, "mem_of_dvd_prod_prim": 4, "mem_insert": 4, "wrote": 4, "filter": [4, 9, 10, 12], "mem_filt": 4, "aim": [4, 7], "prod_po": 4, "_def": 4, "mem_": 4, "id": [4, 6, 8, 9], "bounded_of_ex_finset": 4, "qk": 4, "lt_succ_of_l": 4, "le_sup": 4, "ex_finset_of_bound": 4, "decidablepr": 4, "lt_succ_iff": 4, "congruent": 4, "p_k": 4, "loss": 4, "27": 4, "mod_4_eq_3_or_mod_4_eq_3": 4, "mul_mod": 4, "mod_lt": 4, "hm": [4, 9], "two_le_of_mod_4_eq_3": 4, "neq": 4, "div_dvd_of_dvd": 4, "div_lt_self": 4, "exists_prime_factor_mod_4_eq_3": 4, "mge2": 4, "home": [4, 5], "stretch": [4, 5], "remov": [4, 8], "eras": 4, "mem_eras": 4, "readi": [4, 6, 7, 8, 9], "dvd_add_iff_left": 4, "primes_mod_4_eq_3_infinit": 4, "p4": 4, "pltn": 4, "p4eq": 4, "ps": 4, "pne3": 4, "seriou": [4, 6, 8], "feat": 4, "modern": [5, 7], "subject": 5, "mysteri": [5, 6], "consult": 5, "ann": 5, "baanen": 5, "abus": 5, "paramet": [5, 6], "broadest": 5, "constraint": [5, 8], "bundl": [5, 6, 7, 8, 9], "tupl": 5, "hy": [5, 6, 7], "hz": [5, 6], "mypoint1": 5, "mypoint2": 5, "mypoint3": 5, "mk": [5, 6, 7, 8], "former": 5, "latter": [5, 7, 8], "quot": [5, 8], "protect": 5, "add_x": 5, "addalt": 5, "eta": 5, "messier": 5, "y\u2081": 5, "z\u2081": 5, "y\u2082": 5, "z\u2082": 5, "addalt_x": 5, "addalt_comm": 5, "apart": [5, 6], "effici": [5, 7, 8], "scalar": [5, 6, 7, 9], "smul": [5, 6, 7], "smul_distrib": 5, "road": 5, "link": [5, 6], "belong": [5, 6, 8], "simplex": 5, "convinc": 5, "equilater": 5, "interior": [5, 9], "standardtwosimplex": 5, "x_nonneg": 5, "y_nonneg": 5, "z_nonneg": 5, "sum_eq": 5, "swap": 5, "swapxi": 5, "interestingli": [5, 7, 9], "midpoint": 5, "div_nonneg": 5, "weight": 5, "averag": 5, "weightedaverag": 5, "lambda_nonneg": 5, "lambda_l": 5, "fin": [5, 7, 10], "standardsimplex": 5, "sum_eq_on": 5, "div_eq_mul_inv": 5, "sum_mul": 5, "sum_add_distrib": 5, "mul_sum": 5, "islinear": 5, "is_addit": 5, "preserves_mul": 5, "linf": 5, "subtyp": [5, 6, 7, 8], "preal": 5, "val": 5, "sigma": [5, 10], "wherebi": [5, 8], "stdsimplex": 5, "\u03c3": [5, 7], "fst": [5, 8], "snd": [5, 8], "custom": 5, "robust": [5, 6], "interfac": 5, "redefin": [5, 6], "accessor": 5, "weav": 5, "rich": [5, 6], "interconnect": 5, "hierarchi": [5, 7, 12], "clarifi": 5, "antireflex": 5, "cdot": 5, "mathcal": [5, 9], "proxi": 5, "bipartit": 5, "graph": 5, "categori": [5, 8, 9], "morphism": [5, 9, 12], "basi": [5, 8], "discret": 5, "inherit": [5, 6, 7], "polynomi": 5, "coeffici": [5, 7], "dual": [5, 8], "accommod": [5, 7], "almost": [5, 6, 7, 8, 10], "marriag": 5, "heaven": 5, "group\u2081": [5, 6], "inv": [5, 6], "struc": 5, "counterpart": 5, "assur": 5, "groupcat": 5, "group\u2081cat": 5, "str": 5, "capit": 5, "roman": 5, "equiv": [5, 7], "tofun": [5, 6], "right_inv": 5, "left_inv": 5, "creativ": 5, "evid": 5, "coercion": [5, 6, 7, 8, 9], "omit": 5, "perm": [5, 7], "under": [5, 6, 7, 8], "orient": 5, "permgroup": 5, "trans_assoc": 5, "trans_refl": 5, "refl_tran": 5, "self_trans_symm": [5, 7], "grouptheori": 5, "g_1": 5, "g_2": 5, "g_3": 5, "tightli": 5, "isomorph": [5, 7, 9], "Its": [5, 6], "neg": [5, 6, 8, 10], "reproduc": 5, "accompani": 5, "addgroup\u2081": 5, "scheme": 5, "addgrouppoint": 5, "arrang": 5, "mul_inv_cancel_right": 5, "achiev": [5, 6, 8], "silent": [5, 6], "regist": [5, 6, 7], "grp": 5, "contextu": 5, "cue": 5, "synthes": [5, 6], "whole": 5, "_inst_1": 5, "candid": 5, "group\u2082": 5, "mysquar": 5, "my_squar": 5, "remark": [5, 6], "headi": 5, "store": 5, "hasmulgroup\u2082": 5, "hasonegroup\u2082": 5, "hasinvgroup\u2082": 5, "suppli": 5, "accord": 5, "capabl": 5, "chain": 5, "recent": 5, "prioriti": 5, "bad": [5, 6, 8], "artifici": 5, "addgroup\u2082": 5, "subtl": [5, 7, 8], "configur": 5, "invis": [5, 6], "wise": 5, "euclidean": 5, "terminolog": 5, "mid": 5, "imaginari": 5, "gaussint": 5, "im": 5, "pointwis": [5, 8, 9], "root": [5, 6, 7, 12], "ac": 5, "bci": 5, "adi": 5, "bd": 5, "bc": 5, "hasmul": 5, "zero_def": 5, "one_def": 5, "add_def": 5, "neg_def": 5, "mul_def": 5, "zero_r": 5, "zero_im": 5, "one_r": 5, "one_im": 5, "add_r": 5, "add_im": 5, "neg_r": 5, "neg_im": 5, "mul_r": 5, "mul_im": 5, "surprisingli": [5, 6], "concept": [5, 7, 8, 9], "light": 5, "bulb": 5, "skeleton": [5, 8], "scari": 5, "instcommr": 5, "left_distrib": [5, 6], "right_distrib": [5, 6], "ext_iff": 5, "bq": 5, "archetyp": 5, "int": [5, 6, 7], "ediv_add_emod": 5, "emod_nonneg": 5, "emod_lt": 5, "unit": [5, 6, 8], "algorithm": 5, "conjug": [5, 7], "frac": 5, "nearest": 5, "size": 5, "vi": 5, "multipli": 5, "emb": 5, "forth": 5, "quadrat": 5, "gaussianint": 5, "stai": 5, "face": [5, 6, 8], "machineri": [5, 6, 8], "adapt": 5, "invest": 5, "pragmat": 5, "seek": 5, "heather": 5, "macbeth": 5, "eleg": 5, "div": 5, "mod": 5, "_add_mod": 5, "abs_mod": 5, "_le": 5, "emod_lt_of_po": 5, "zero_lt_two": 5, "fixm": 5, "_eq": 5, "sq_add_sq_eq_zero": 5, "linearorderedr": 5, "norm_nonneg": [5, 9], "norm_eq_zero": [5, 9], "norm_po": 5, "norm_mul": [5, 9], "conj": 5, "conj_r": 5, "conj_im": 5, "norm_conj": 5, "bespok": 5, "quad": 5, "record": [5, 6], "div_def": 5, "mod_def": 5, "messi": 5, "nicer": [5, 7, 8], "norm_mod_lt": 5, "norm_y_po": 5, "sq_ab": 5, "gcongr": 5, "ediv_mul_l": 5, "le_of_mul_le_mul_right": 5, "ediv_lt_of_lt_mul": 5, "natab": 5, "coe_natabs_norm": 5, "natabs_of_nonneg": 5, "natabs_norm_mod_lt": 5, "ofnat_lt": 5, "coe_natab": 5, "not_norm_mul_left_lt_norm": 5, "natabs_mul": 5, "le_mul_of_one_le_right": 5, "ofnat_l": 5, "add_one_le_of_lt": 5, "euclideandomain": 5, "quotient_mul_add_remainder_eq": 5, "quotient_zero": 5, "r_wellfound": 5, "remainder_lt": 5, "mul_left_not_lt": 5, "payoff": 5, "principalidealr": 5, "irreducible_iff_prim": 5, "studi": [6, 8], "prematur": 6, "technolog": 6, "simpler": 6, "ring\u2081": 6, "gradual": [6, 8], "bottom": [6, 7, 8], "endow": [6, 7], "one\u2081": 6, "heavier": 6, "inferr": 6, "resolut": 6, "ie": [6, 8], "attribut": [6, 7], "ensur": [6, 7, 8], "self": 6, "one\u2082": 6, "usabl": 6, "silli": 6, "affect": 6, "importantli": [6, 7], "habit": 6, "ascript": [6, 7], "messag": 6, "typeclass": 6, "stuck": 6, "metavari": 6, "263": 6, "auto": 6, "sever": [6, 8, 10], "unknown": 6, "collis": 6, "builtin": 6, "\ud835\udfd9": 6, "inherit_doc": 6, "diamond": 6, "dia\u2081": 6, "dia": 6, "infixl": 6, "70": 6, "semigroup": 6, "dia_assoc": 6, "semigroup\u2081": 6, "todia\u2081": 6, "previous": 6, "semigroup\u2082": 6, "hurdl": 6, "neutral": [6, 7], "diaoneclass\u2081": 6, "one_dia": 6, "dia_on": 6, "trace": 6, "info": 6, "ters": 6, "expend": 6, "attempt": 6, "succe": 6, "success": 6, "set_opt": 6, "synthinst": 6, "monoid\u2081": 6, "hide": [6, 7, 8], "subtleti": [6, 7], "fear": 6, "unrel": 6, "tosemigroup\u2081": 6, "todiaoneclass\u2081": 6, "monoid\u2082": 6, "toone\u2081": 6, "overlap": [6, 7], "tear": 6, "signatur": 6, "restor": 6, "optim": [6, 10], "reusabl": 6, "inv\u2081": 6, "postfix": 6, "inv_dia": 6, "weak": 6, "preliminari": 6, "left_inv_eq_right_inv\u2081": 6, "hba": 6, "hac": 6, "export": 6, "inv_eq_of_dia": 6, "dia_inv": 6, "naiv": [6, 8], "duplic": 6, "to_addit": 6, "semi": [6, 7], "left_inv_eq_right_inv": 6, "left_neg_eq_right_neg": 6, "whatsnew": 6, "addsemigroup\u2083": 6, "add_assoc\u2083": 6, "semigroup\u2083": 6, "mul_assoc\u2083": 6, "addmonoid\u2083": 6, "addzeroclass": 6, "monoid\u2083": 6, "muloneclass": 6, "tomuloneclass": 6, "addcommsemigroup\u2083": 6, "commsemigroup\u2083": 6, "addcommmonoid\u2083": 6, "commmonoid\u2083": 6, "addgroup\u2083": 6, "neg_add": 6, "group\u2083": 6, "inv_mul": 6, "inv_eq_of_mul": 6, "propag": 6, "attr": 6, "mul_inv": [6, 7], "mul_left_cancel\u2083": 6, "mul_right_cancel\u2083": 6, "addcommgroup\u2083": 6, "commgroup\u2083": 6, "demonstr": [6, 8], "opposit": [6, 8], "gain": 6, "besid": 6, "parent": 6, "ring\u2083": 6, "mulzeroclass": 6, "toaddgroup\u2083": 6, "mayb": 6, "claus": 6, "le\u2081": 6, "50": 6, "\u2081": 6, "preorder\u2081": 6, "partialorder\u2081": 6, "orderedcommmonoid\u2081": 6, "modul": [6, 7], "pretend": 6, "smul\u2083": 6, "infixr": 6, "73": 6, "module\u2081": 6, "zero_smul": 6, "one_smul": [6, 7], "mul_smul": [6, 7], "add_smul": [6, 7], "smul_add": 6, "surpris": 6, "toaddcommgroup\u2083": 6, "inst": 6, "module\u2083": 6, "hunt": 6, "unspecifi": 6, "embark": 6, "quest": 6, "huge": 6, "trap": 6, "refus": [6, 8], "tosmul\u2083": 6, "inst_1": 6, "safe": [6, 7], "selfmodul": 6, "invert": [6, 7], "nsmul\u2081": 6, "zsmul\u2081": 6, "ofnat": 6, "negsucc": 6, "intermedi": [6, 8], "abgrpmodul": 6, "failur": 6, "synth": 6, "indirect": 6, "path": 6, "thank": 6, "offend": 6, "poor": 6, "forget": 6, "http": 6, "inria": 6, "hal": 6, "scienc": 6, "02463336": 6, "modifi": 6, "nsmul": 6, "addmonoid\u2084": 6, "nsmul_zero": 6, "nsmul_succ": 6, "mysmul": 6, "stori": 6, "incorpor": 6, "zsmul": 6, "lt\u2081": 6, "comparison": 6, "ismonoidhom\u2081": 6, "unpleas": [6, 8], "chose": 6, "ismonoidhom\u2082": 6, "map_on": [6, 7], "map_mul": [6, 7], "tempt": 6, "higher": 6, "unif": 6, "psycholog": 6, "rare": 6, "adject": 6, "bare": 6, "noun": 6, "argu": 6, "continuous_id": [6, 8], "primari": 6, "monoidhom\u2081": 6, "coefun": 6, "coerc": [6, 7], "coe": 6, "addmonoidhom\u2081": 6, "addmonoid": [6, 7], "map_zero": [6, 7], "map_add": [6, 7, 9], "ringhom\u2081": 6, "minor": [6, 9], "tomonoidhom\u2081": 6, "juggl": 6, "monoidhomclass\u2081": 6, "badinst": 6, "wouldn": 6, "priori": 6, "boil": 6, "hopelessli": 6, "checksynthord": 6, "random": 6, "deduc": [6, 7, 8], "outparam": 6, "trigger": 6, "retri": 6, "monoidhomclass\u2082": 6, "promis": [6, 8], "map_inv_of_inv": 6, "got": 6, "presenc": 6, "layer": [6, 8], "funlik": 6, "monoidhomclass": 6, "monoidhomclass\u2083": 6, "coe_inject": 6, "stop": 6, "ringhomclass\u2083": 6, "ringhom": [6, 7], "algebrahom": 6, "ve": [6, 8], "primarili": [6, 7, 8], "unbundl": 6, "orderpreshom": 6, "le_of_l": 6, "orderpresmonoidhom": 6, "orderpreshomclass": 6, "subgroup": 6, "subr": 6, "reus": 6, "led": 6, "descend": [6, 7], "break": 6, "barrier": 6, "setlik": 6, "wrap": [6, 8], "submonoid\u2081": 6, "submonoid": [6, 7], "mul_mem": [6, 7], "one_mem": [6, 7], "tackl": 6, "setco": 6, "submonoid\u2081monoid": 6, "destructur": 6, "binder": 6, "submonoidclass\u2081": 6, "subgroup\u2081": 6, "subgroupclass\u2081": 6, "subobject": 6, "s\u2081": 6, "s\u2082": 6, "shame": 6, "across": 6, "weird": [6, 8], "distract": 6, "emphas": [6, 7], "anecdot": 6, "devic": 6, "hasquoti": 6, "bewar": 6, "regular": [6, 8], "ascii": 6, "setoid": [6, 7], "commmonoid": 6, "iseqv": 6, "hw": 6, "quotientmonoid": 6, "map\u2082": 6, "treatment": 7, "constantli": 7, "review": [7, 8], "contort": 7, "verbatim": 7, "safer": 7, "friendli": 7, "proceed": 7, "mostli": 7, "comm": 7, "addcommmonoid": 7, "monoidhom": 7, "addmonoidhom": 7, "packag": 7, "unfortun": 7, "consequ": 7, "comp": [7, 8], "mul_inv_self": 7, "map_inv": 7, "enforc": 7, "sent": [7, 8], "mulequiv": 7, "addequiv": 7, "ulequiv": 7, "projector": 7, "ofbiject": 7, "closur": [7, 8], "inv_mem": 7, "issubgroup": 7, "addsubgroup": 7, "add_mem": 7, "zero_mem": 7, "neg_mem": 7, "inferinst": 7, "benefit": 7, "amount": 7, "sup_eq_closur": 7, "mem_bot": 7, "ambient": 7, "ty": 7, "comap": [7, 8], "pushforward": [7, 8], "mem_map": 7, "mem_comap": 7, "kernel": 7, "ker": 7, "mem_ker": 7, "mem_rang": 7, "\u03c6": [7, 8], "hst": 7, "\u03c8": 7, "homomorph": 7, "lagrang": 7, "sylow": 7, "corner": 7, "nonconstruct": 7, "setfintyp": 7, "propdecid": 7, "fintyp": [7, 8], "card": 7, "index_mul_card": 7, "hdvd": 7, "exists_subgroup_card_pow_prim": 7, "corollari": 7, "eq_bot_iff_card": 7, "eq_bot_iff_foral": 7, "card_eq_one_iff": 7, "card_dvd_of_l": 7, "inf_bot_of_coprim": 7, "mathfrak": 7, "_n": 7, "cycl": 7, "iscycl": 7, "closure_iscycl": 7, "cyclic": 7, "freegroup": 7, "induct": [7, 8, 12], "myelement": 7, "gave": [7, 8], "embodi": 7, "lift": 7, "send": [7, 10], "mymorph": 7, "cube": 7, "presentedgroup": 7, "normal": 7, "somehow": 7, "creation": 7, "mygroup": 7, "feed": 7, "togroup": 7, "mymap": 7, "compat_mymap": 7, "mynewmorph": 7, "mulact": 7, "downsid": 7, "setup": 7, "synonym": 7, "groupact": 7, "addact": 7, "\u1d65": 7, "affin": 7, "add_vadd": 7, "topermhom": 7, "caylei": 7, "embed": 7, "cayleyisomorph": 7, "subgroupofmulact": 7, "partit": 7, "orbit": 7, "orbitrel": 7, "global": [7, 8], "\u03c9": 7, "selfequivsigmaorbit": 7, "card_congr": 7, "card_sigma": 7, "furthermor": 7, "stabil": 7, "orbitequivquotientstabil": 7, "groupequivquotientprodsubgroup": 7, "conjugate_on": 7, "quotientgroup": 7, "clue": 7, "onto": 7, "quotientkerequivrang": 7, "pullback": [7, 8], "quotientmulequivofeq": 7, "seri": 7, "card_po": 7, "index_eq_card": 7, "eq_of_mul_eq_mul_right": 7, "aux_card_eq": 7, "bijective_iff_injective_and_card": 7, "ker_eq_bot_iff": 7, "ker_restrict": 7, "iso\u2081": 7, "g\u2080": 7, "g\u2081": 7, "g\u2082": 7, "iso\u2082": 7, "prodcongr": 7, "finaliso": 7, "exot": [7, 8], "semir": 7, "commsemir": 7, "doubli": 7, "mislead": 7, "tradition": 7, "taught": 7, "promin": 7, "isunit": 7, "m\u02e3": 7, "mainli": 7, "mkofmuleqon": 7, "\u2124\u02e3": 7, "units_eq_one_or": 7, "r\u02e3": 7, "s\u02e3": 7, "isormoph": 7, "ringequiv": 7, "toward": 7, "geometri": 7, "submodul": 7, "parser": 7, "eq_zero_iff_mem": 7, "mem_sup": 7, "mul_le_left": 7, "mul_le_right": 7, "mul_le_inf": 7, "quotientmap": 7, "quotequivofeq": 7, "chines": 7, "\u03c0": [7, 8, 9], "font": 7, "\u03b9": [7, 8, 9, 10], "iscoprim": 7, "quotientinfringequivpiquoti": 7, "zmod": 7, "pinot": 7, "prodequivpi": 7, "pi": [7, 8], "ker_pi_quotient_mk": 7, "chinesemap": 7, "proven": 7, "chinesemap_mk": 7, "famili": [7, 8, 9], "injective_lift_iff": 7, "chinesemap_inj": 7, "maxim": 7, "iscoprime_iff_add": 7, "iscoprime_iff_exist": 7, "iscoprime_iff_sup_eq": 7, "iscoprime_iff_codisjoint": 7, "opportun": [7, 8], "mem_insert_of_mem": 7, "mem_insert_self": 7, "iscoprime_inf": 7, "simp_rw": 7, "iinf_insert": 7, "one_eq_top": 7, "eq_top_iff": 7, "chinesemap_surj": 7, "hi": 7, "mk_surject": 7, "\u1d9c": 7, "he": 7, "chineseiso": 7, "encod": [7, 10], "algebramap": 7, "alghom": 7, "\u2090": 7, "endomorph": 7, "univari": 7, "indetermin": 7, "crucial": [7, 8], "bodi": 7, "map_pow": 7, "coeff": 7, "degre": 7, "natdegre": 7, "withbot": 7, "absorb": 7, "formula": [7, 10], "nozerodivisor": 7, "degree_mul": 7, "hp": [7, 8], "hq": [7, 8], "natdegree_mul": 7, "natdegree_comp": 7, "evalu": 7, "isroot": 7, "vanish": 7, "count": 7, "pain": 7, "multiset": 7, "roots_x_sub_c": 7, "aeval": 7, "aroot": 7, "caveat": 7, "aroots_def": 7, "c_neg": 7, "linear_combin": 7, "c_mul": 7, "p_ne_zero": 7, "apply_fun": 7, "roots_mul": 7, "alembert": 7, "gauss": 7, "isalgclos": 7, "eval\u2082": 7, "ofreal": 7, "multivari": 7, "briefli": 7, "mvpolynomi": 7, "circl": 7, "circleequ": 7, "coordin": 7, "calculu": [8, 10, 12], "quantiti": 8, "begun": 8, "paradox": 8, "x\u2080": [8, 9], "convention": 8, "eight": 8, "varieti": 8, "wish": 8, "64": 8, "y\u2080": 8, "z\u2080": 8, "paragraph": 8, "512": 8, "bourbaki": 8, "spell": 8, "dualli": 8, "neighborhood": 8, "etc": 8, "attop": [8, 10], "\ud835\udcdd": [8, 9, 10], "\ud835\udce4": 8, "entourag": 8, "\u03bc": [8, 10], "ae": [8, 10], "univ_set": 8, "sets_of_superset": 8, "inter_set": 8, "blur": 8, "princip": 8, "\ud835\udcdf": 8, "x_0": 8, "ioo": [8, 9], "tendsto\u2081": 8, "tendsto": [8, 10], "lim_": 8, "abstractli": 8, "salient": 8, "f_": 8, "tendsto\u2082": 8, "via": 8, "leverag": 8, "map_mono": 8, "map_map": 8, "shot": 8, "256": 8, "map_le_iff_le_comap": 8, "contravari": 8, "comap_comap": 8, "plane": 8, "\u02e2": 8, "nhds_prod_eq": 8, "aforement": 8, "le_inf_iff": 8, "shouldn": 8, "prohibit": 8, "precondit": 8, "nebot": 8, "tour": [8, 9], "claim": 8, "recaptur": 8, "superfici": 8, "stronger": 8, "flexibl": 8, "hasbasi": 8, "nhds_basis_ioo_po": 8, "has_basi": 8, "tendsto_iff": 8, "reformul": 8, "ici": 8, "attop_basi": 8, "knew": 8, "n_p": 8, "n_q": 8, "tiresom": 8, "\u1da0": [8, 9, 10], "superscript": 8, "eventuallyeq": 8, "tendsto_congr": 8, "eventually_of_foral": 8, "mono": 8, "item": 8, "filter_upward": 8, "hr": 8, "aka": 8, "occasion": 8, "frequent": 8, "sophist": 8, "mem_closure_of_tendsto": 8, "clusterpt": 8, "mem_closure_iff_clusterpt": 8, "le_principal_iff": 8, "nebot_of_l": 8, "hux": 8, "hum": 8, "dist_eq_zero": 8, "emetricspac": 8, "pseudometricspac": 8, "pseudoemetricspac": 8, "journei": 8, "recast": 8, "tendsto_attop": 8, "continuous_iff": 8, "devot": 8, "uncurri": 8, "slow": 8, "continuous_fst": 8, "assembl": 8, "prod_mk": 8, "continuous_snd": 8, "continuous_dist": 8, "clunki": 8, "elabor": 8, "prod_map": 8, "sad": 8, "border": 8, "obfusc": 8, "continuous_pow": 8, "continuousat": [8, 10], "continuousat_iff": 8, "geometr": 8, "closedbal": 8, "sign": 8, "radiu": 8, "mem_ball_self": 8, "mem_closedball_self": 8, "isopen": 8, "isopen_iff": 8, "Their": [8, 9], "isclos": [8, 9], "s\u1d9c": [8, 10], "isopen_compl_iff": 8, "hu": [8, 9], "mem_of_tendsto": 8, "mem_closure_iff": 8, "mem_closure_iff_seq_limit": 8, "nhds_basis_bal": 8, "nhds_basis_closedbal": 8, "mem_iff": 8, "segment": [8, 10], "somewher": 8, "continuouson": [8, 9], "minimum": 8, "iscompact": 8, "icc": [8, 9], "iscompact_icc": 8, "strictmono": 8, "tendsto_subseq": 8, "exists_forall_l": 8, "exists_forall_g": 8, "compactspac": 8, "iscompact_univ": 8, "cauchi": 8, "uniformcontinu": 8, "uniformcontinuous_iff": 8, "clearli": 8, "isclosed_l": 8, "eq_empty_or_nonempti": 8, "attain": 8, "cauchyseq": 8, "cauchyseq_iff": 8, "completespac": [8, 9, 10], "cauchyseq_tendsto_of_complet": 8, "criterion": 8, "tendsto_pow_attop_nhds_0_of_lt_1": 8, "dist_le_range_sum_dist": 8, "cauchyseq_of_le_geometric_two": 8, "\u03b5_po": [8, 9], "le_iff_exists_add": 8, "boss": 8, "bair": [8, 9], "exclam": 8, "rec_on": 8, "ho": 8, "hd": 8, "dens": 8, "densiti": 8, "\u03b4po": 8, "hpo": 8, "hball": 8, "mem_closure_iff_nhds_basi": 8, "recon": 8, "rpo": 8, "rb": 8, "incl": 8, "cdist": 8, "ylim": 8, "yball": 8, "categor": 8, "topologicalspac": [8, 9], "isopen_univ": 8, "isopen_empti": 8, "isopen_iunion": 8, "isopen_iinter_of_finit": 8, "continuous_def": 8, "attach": 8, "filteri": 8, "mem_nhds_iff": 8, "digress": 8, "pure_le_nhd": 8, "self_of_nhd": 8, "eventually_eventually_nhd": 8, "mkofnhd": 8, "nhds_mkofnhd": 8, "functori": 8, "induc": 8, "sensibl": 8, "uncount": 8, "relatedli": 8, "coinduc": 8, "t_x": 8, "t_y": 8, "coinduced_le_iff_le_induc": 8, "covari": 8, "coinduced_compos": 8, "induced_compos": 8, "focus": 8, "nhd": 8, "recov": 8, "continuous_iff_coinduced_l": 8, "g_": 8, "t_z": 8, "wasn": 8, "t_": 8, "x_i": 8, "price": 8, "patholog": 8, "t2space": 8, "hausdorff": 8, "t3space": 8, "regularspac": 8, "tendsto_nhds_uniqu": 8, "closed_nhds_basi": 8, "nhds_basis_open": 8, "t_3": 8, "denseinduc": 8, "continuousat_extend": 8, "funni": 8, "_in": 8, "nhds_induc": 8, "fortiori": 8, "f_cont": 8, "tendsto_right_iff": 8, "firstcountabletopolog": 8, "cluster": 8, "hfx": 8, "push_pul": 8, "of_map": 8, "f_ne": 8, "f_le": 8, "map_eq": 8, "hne": 8, "hle": 8, "huo": 8, "hsu": 8, "elim_finite_subcov": 8, "introductori": 9, "hasderivat": [9, 10], "hasderivat_sin": 9, "differentiableat": 9, "inconveni": 9, "deriv_zero_of_not_differentiableat": 9, "deriv_add": 9, "islocalmin": 9, "deriv_eq_zero": 9, "roll": 9, "weirder": 9, "hab": 9, "hfc": 9, "hfi": 9, "exists_deriv_eq_zero": 9, "differentiableon": 9, "exists_deriv_eq_slop": 9, "normedaddcommgroup": [9, 10], "norm_add_l": 9, "infer_inst": [9, 10], "normedspac": [9, 10], "normedaddgroup": 9, "stipul": 9, "norm_smul": 9, "banach": [9, 10], "dimension": [9, 10], "finitedimension": [9, 10], "\ud835\udd5c": [9, 10], "nontriviallynormedfield": [9, 10], "normedfield": 9, "exists_one_lt_norm": 9, "continuouslinearmap": 9, "cont": 9, "map_smul": 9, "le_op_norm": 9, "hmp": 9, "op_norm_le_bound": 9, "steinhau": 9, "bounded": 9, "uniformli": 9, "nonempty_interior_of_iunion_of_clos": 9, "continuous_linear_map": 9, "op_norm_le_of_shel": 9, "interior_subset": 9, "interior_iinter_subset": 9, "is_closed_l": 9, "hc": 9, "h\u03b5": 9, "real_norm_l": 9, "\u03b5k_po": 9, "o": 9, "normedgroup": 9, "isbigowith": 9, "isbigowith_iff": 9, "isbigo_iff_isbigowith": 9, "islittleo_iff_forall_isbigowith": 9, "hasfderivat": 9, "fderiv": 9, "fr\u00e9chet": 9, "hff": 9, "iter": 9, "multilinear": 9, "withtop": 9, "infti": 9, "contdiff": 9, "iteratedfderiv": 9, "contdiff_iff_continuous_differenti": 9, "stricter": 9, "hasstrictfderivat": 9, "\ud835\udd42": 9, "isrorc": 9, "contdiffat": 9, "localinvers": 9, "eventually_left_invers": 9, "eventually_right_invers": 9, "to_localinvers": 9, "hasfderivwithinat": [9, 10], "hasfderivatfilt": 9, "measuretheori": 10, "intervalintegr": 10, "integral_id": 10, "integral_one_div": 10, "differenti": [10, 12], "integral_hasstrictderivat_right": 10, "stronglymeasurableatfilt": 10, "volum": 10, "integral_eq_sub_of_hasderivat": 10, "convolut": 10, "bochner": 10, "lebesgu": 10, "measurablespac": 10, "countabl": 10, "measurableset": 10, "compl": 10, "iunion": 10, "iinter": 10, "measure_eq_iinf": 10, "measure_iunion_l": 10, "hmea": 10, "hdi": 10, "pairwis": 10, "m_iunion": 10, "\u1d50": 10, "integral_add": 10, "ennreal": 10, "toreal": 10, "set_integral_const": 10, "domin": 10, "converg": [10, 12], "aestronglymeasur": 10, "hbound": 10, "hlim": 10, "tendsto_integral_of_dominated_converg": 10, "fubini": 10, "sigmafinit": 10, "\u03bd": 10, "integral_prod": 10, "bilinear": 10, "borelspac": 10, "isaddhaarmeasur": 10, "invari": 10, "mass": 10, "compact": 10, "h_inj": 10, "det": 10, "integral_image_eq_integral_abs_det_fderiv_smul": 10, "overview": 12, "schr\u00f6der": 12, "bernstein": 12, "irrat": 12}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"introduct": 0, "get": 0, "start": 0, "overview": 0, "basic": [1, 6], "calcul": 1, "prove": 1, "ident": 1, "algebra": [1, 5, 7], "structur": [1, 5], "us": 1, "theorem": [1, 3], "lemma": 1, "more": 1, "exampl": 1, "appli": 1, "rw": 1, "fact": 1, "about": 1, "logic": 2, "implic": 2, "univers": 2, "quantifi": 2, "The": [2, 3], "existenti": 2, "negat": 2, "conjunct": 2, "iff": 2, "disjunct": 2, "sequenc": 2, "converg": [2, 8], "set": [3, 8], "function": [3, 8], "schr\u00f6der": 3, "bernstein": 3, "elementari": [4, 9, 10], "number": 4, "theori": [4, 10], "irrat": 4, "root": 4, "induct": 4, "recurs": 4, "infinit": 4, "mani": 4, "prime": 4, "defin": 5, "build": 5, "gaussian": 5, "integ": 5, "hierarchi": 6, "morphism": [6, 7], "sub": 6, "object": 6, "group": 7, "ring": 7, "monoid": 7, "subgroup": 7, "concret": 7, "action": 7, "quotient": 7, "unit": 7, "subr": 7, "ideal": 7, "polynomi": 7, "topolog": 8, "filter": 8, "metric": 8, "space": [8, 9], "continu": [8, 9], "ball": 8, "open": 8, "close": 8, "compact": 8, "uniformli": 8, "complet": 8, "fundament": 8, "separ": 8, "countabl": 8, "differenti": 9, "calculu": 9, "norm": 9, "linear": 9, "map": 9, "asymptot": 9, "comparison": 9, "integr": 10, "measur": 10, "index": 11, "mathemat": 12, "lean": 12}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}})
-
-
-
@@ -1,51 +1,52 @@{"version": 5, {"version": 6, "packagesDir": "lake-packages", "packages": [{"git": {"url": "https://github.com/EdAyers/ProofWidgets4", {"url": "https://github.com/leanprover-community/mathlib4", "subDir?": null, "rev": "a0c2cd0ac3245a0dade4f925bcfa97e06dd84229", "rev": "5c9a2858ec8178550107ce072e8d1119429752df", "opts": {}, "name": "proofwidgets", "inputRev?": "v0.0.13", "inherited": true}}, "name": "mathlib", "inputRev?": "master", "inherited": false}}, {"git": {"url": "https://github.com/mhuisi/lean4-cli.git", {"url": "https://github.com/leanprover/std4", "subDir?": null, "rev": "5a858c32963b6b19be0d477a30a1f4b6c120be7e", "rev": "b35ae7244d3372031b56646689117a3e4edf19b7", "opts": {}, "name": "Cli", "inputRev?": "nightly", "name": "std", "inputRev?": "main", "inherited": true}}, {"git": {"url": "https://github.com/leanprover-community/mathlib4", {"url": "https://github.com/leanprover-community/quote4", "subDir?": null, "rev": "6b391efa697c6b0e8590cac08cc1c3ec02974702", "rev": "a387c0eb611857e2460cf97a8e861c944286e6b2", "opts": {}, "name": "mathlib", "name": "Qq", "inputRev?": "master", "inherited": false}}, "inherited": true}}, {"git": {"url": "https://github.com/gebner/quote4", {"url": "https://github.com/leanprover-community/aesop", "subDir?": null, "rev": "81cc13c524a68d0072561dbac276cd61b65872a6", "rev": "9dc4a1097a690216eaa7cf2d2290efd447e60d7a", "opts": {}, "name": "Qq", "name": "aesop", "inputRev?": "master", "inherited": true}}, {"git": {"url": "https://github.com/JLimperg/aesop", {"url": "https://github.com/leanprover/lean4-cli", "subDir?": null, "rev": "086c98bb129ca856381d4414dc0afd6e3e4ae2ef", "rev": "39229f3630d734af7d9cfb5937ddc6b41d3aa6aa", "opts": {}, "name": "aesop", "inputRev?": "master", "name": "Cli", "inputRev?": "nightly", "inherited": true}}, {"git": {"url": "https://github.com/leanprover/std4", {"url": "https://github.com/leanprover-community/ProofWidgets4", "subDir?": null, "rev": "b5f7bd40d2162fe148e585543f284a5d8cc0ef26", "rev": "27715d1daf32b9657dc38cd52172d77b19bde4ba", "opts": {}, "name": "std", "inputRev?": "main", "inherited": true}}]} "name": "proofwidgets", "inputRev?": "v0.0.18", "inherited": true}}], "name": "mil"}
-
-
-
@@ -1,1 +1,1 @@leanprover/lean4:nightly-2023-08-23 leanprover/lean4:v4.2.0-rc4
-
-