import Mathlib.Algebra.Group.Defs import Mathlib.GroupTheory.SpecificGroups.Alternating import Mathlib.GroupTheory.SpecificGroups.Cyclic import Mathlib.GroupTheory.SpecificGroups.Dihedral import Mathlib.GroupTheory.SpecificGroups.KleinFour import Mathlib.GroupTheory.SpecificGroups.Quaternion -- import Mathlib.GroupTheory.Subgroup.Actions -- import Mathlib.GroupTheory.Subgroup.Basic -- import Mathlib.GroupTheory.Subgroup.Finite -- import Mathlib.GroupTheory.Subgroup.MulOpposite -- import Mathlib.GroupTheory.Subgroup.Pointwise -- import Mathlib.GroupTheory.Subgroup.Saturated -- import Mathlib.GroupTheory.Subgroup.Simple -- import Mathlib.GroupTheory.Subgroup.ZPowers import Mathlib.RepresentationTheory.Basic import Mathlib.CategoryTheory.Action.Basic import Mathlib.CategoryTheory.Endomorphism import Mathlib.GroupTheory.GroupAction.Basic import Mathlib.GroupTheory.GroupAction.DomAct.Basic import Mathlib.Algebra.DirectSum.Algebra import Mathlib.LinearAlgebra.DirectSum.Basis import Mathlib.LinearAlgebra.Matrix.Basis import Mathlib.LinearAlgebra.Matrix.NonsingularInverse import Mathlib.Data.Matrix.Invertible import Mathlib.LinearAlgebra.Eigenspace.Basic import Mathlib.GroupTheory.Index import Mathlib.LinearAlgebra.Eigenspace.Triangularizable import Mathlib.LinearAlgebra.Matrix.Spectrum import Mathlib.GroupTheory.FreeGroup.IsFreeGroup -- import Mathlib.LinearAlgebra.Matrix.GeneralLinearGroup import Mathlib.LinearAlgebra.QuadraticForm.IsometryEquiv import Mathlib.GroupTheory.SemidirectProduct import Mathlib.Logic.Equiv.Defs -- import Mathlib.Data.ZMod.Module import Mathlib.GroupTheory.PresentedGroup -- import Mathlib.GroupTheory.Commutator import Mathlib.GroupTheory.Coprod.Basic import Mathlib.Tactic -- Inspired by Finite symmetric groups in Physics -- Following Representations and Characters of GroupsRepresentation.trivialRepresentation.trivial: (k : Type u_1) → (G : Type u_2) → (V : Type u_3) → [inst : CommSemiring k] → [inst_1 : Monoid G] → [inst_2 : AddCommMonoid V] → [inst_3 : Module k V] → Representation k G VModule.EndModule.End: (R : Type u) → (M : Type v) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst : Module R M] → Type vDistribMulAction.toModuleEndDistribMulAction.toModuleEnd: (R : Type u_1) → {S : Type u_3} → (M : Type u_4) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → [inst_3 : Monoid S] → [inst_4 : DistribMulAction S M] → [inst_5 : SMulCommClass S R M] → S →* Module.End R MCategoryTheory.EndCategoryTheory.End: {C : Type u} → [inst : CategoryTheory.CategoryStruct.{v, u} C] → C → Type vCategoryTheory.AutCategoryTheory.Aut: {C : Type u} → [inst : CategoryTheory.Category.{v, u} C] → C → Type vAction.ρAutAction.ρAut: {V : Type (u + 1)} → [inst : CategoryTheory.LargeCategory V] → {G : Type u} → [inst_1 : Group G] → (A : Action V G) → G →* CategoryTheory.Aut A.VFactFact: Prop → PropIsCyclic.exists_generatorIsCyclic.exists_generator: ∀ {α : Type u_1} [inst : Group α] [inst_1 : IsCyclic α], ∃ g, ∀ (x : α), x ∈ Subgroup.zpowers gisCyclic_of_prime_card variable (isCyclic_of_prime_card: ∀ {α : Type u_1} [inst : Group α] {p : ℕ} [hp : Fact (Nat.Prime p)], Nat.card α = p → IsCyclic αp :p: ℕℕ) [ℕ: TypeFactFact: Prop → Propp.p: ℕPrime] (Prime: ℕ → PropF :F: Type uFType uF) [Type uF: Type (uF + 1)FieldField: Type uF → Type uFF] (F: Type uFι :ι: Type uιType uι) [Type uι: Type (uι + 1)FiniteFinite: Type uι → Propι] [ι: Type uιLTLT: Type uι → Type uιι] (ι: Type uιR :R: Type uRType uR) [Type uR: Type (uR + 1)RingRing: Type uR → Type uRR] -- (fp : ι → F) -- a list of indices, sorted abbrevR: Type uRModel.Index := {Model.Index: (ι : Type uι) → [inst : LT ι] → Type uιl :l: List ιListList: Type uι → Type uιι //ι: Type uιl.l: List ιSortedSorted: {α : Type uι} → (α → α → Prop) → List α → Prop(· < ·) } def(· < ·): ι → ι → Propfp :=fp: Type (max uι uF)Model.IndexModel.Index: (ι : Type uι) → [inst : LT ι] → Type uιι →₀ι: Type uιF defF: Type uFee (ee: fp F ι → fp F ιg :g: fp F ιfpfp: (F : Type uF) → [inst : Field F] → (ι : Type uι) → [inst : LT ι] → Type (max uι uF)FF: Type uFι) :ι: Type uιfpfp: (F : Type uF) → [inst : Field F] → (ι : Type uι) → [inst : LT ι] → Type (max uι uF)FF: Type uFι :=ι: Type uιgg: fp F ιFinFin: ℕ → Typep -- def Fp : Fin p → F := sorry -- https://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/Action.20of.20permutations.20on.20functions.2Ep: ℕ:MulAction (MulAction: (α : Type u_1) → Type u_1 → [inst : Monoid α] → Type u_1Equiv.PermEquiv.Perm: Type u_1 → Type (max 0 u_1)β)ᵐᵒᵖβ: Type u_1β :=β: Type u_1sorry variable (sorry: MulAction (Equiv.Perm β)ᵐᵒᵖ βαα: Type u_1β :β: Type u_2Type*) inType*: Type (u_2 + 1)-- works -- variable (α β : Type*) in -- #synth MulAction ((Equiv.Perm α)ᵈᵐᵃ)ᵐᵒᵖ (α → β) -- failsGroupGroup: Type u → Type uSemigroup.mul_assocSemigroup.mul_assoc: ∀ {G : Type u} [self : Semigroup G] (a b c : G), a * b * c = a * (b * c)MulOneClass.one_mulMulOneClass.one_mul: ∀ {M : Type u} [self : MulOneClass M] (a : M), 1 * a = aMulOneClass.mul_oneMulOneClass.mul_one: ∀ {M : Type u} [self : MulOneClass M] (a : M), a * 1 = aGroup.inv_mul_cancelGroup.inv_mul_cancel: ∀ {G : Type u} [self : Group G] (a : G), a⁻¹ * a = 1Subgroup variable {Subgroup: (G : Type u_3) → [inst : Group G] → Type u_3GG: Type uGH :H: Type uGType uG} [Type uG: Type (uG + 1)GroupGroup: Type uG → Type uGG] [G: Type uGGroupGroup: Type uG → Type uGH] (H: Type uGKK: Subgroup GL :L: Subgroup GSubgroupSubgroup: (G : Type uG) → [inst : Group G] → Type uGG)G: Type uGSubgroupSubgroup: (G : Type uG) → [inst : Group G] → Type uGGG: Type uGG ×G: Type uGHH: Type uGProd.instGroupProd.instGroup: {G : Type u_1} → {H : Type u_2} → [inst : Group G] → [inst : Group H] → Group (G × H)Group.FGGroup.FG: (G : Type u_3) → [inst : Group G] → PropMulHomMulHom: (M : Type u_10) → (N : Type u_11) → [inst : Mul M] → [inst : Mul N] → Type (max u_10 u_11)MonoidHomMonoidHom: (M : Type u_10) → (N : Type u_11) → [inst : MulOneClass M] → [inst : MulOneClass N] → Type (max u_10 u_11)Action.HomAction.Hom: {V : Type (u + 1)} → [inst : CategoryTheory.LargeCategory V] → {G : Type u} → [inst_1 : Monoid G] → Action V G → Action V G → Type uRepresentation.asGroupHomRepresentation.asGroupHom: {k : Type u_1} → {G : Type u_2} → {V : Type u_3} → [inst : CommSemiring k] → [inst_1 : Group G] → [inst_2 : AddCommMonoid V] → [inst_3 : Module k V] → Representation k G V → G →* (V →ₗ[k] V)ˣSubgroup.NormalSubgroup.Normal: {G : Type u_1} → [inst : Group G] → Subgroup G → PropSubgroup.indexSubgroup.index: {G : Type u_1} → [inst : Group G] → Subgroup G → ℕHasQuotient.QuotientHasQuotient.Quotient: (A : outParam (Type uG)) → {B : Type uG} → [inst : HasQuotient A B] → B → Type uGGG: Type uGK /- failed to synthesize instance HDiv (Type uG) (Subgroup G) ?m.4221 -/ -- #check G / KK: Subgroup GIsSimpleGroupIsSimpleGroup: (G : Type u_1) → [inst : Group G] → PropQuotientGroup.instHasQuotientSubgroupQuotientGroup.instHasQuotientSubgroup: {α : Type u_1} → [inst : Group α] → HasQuotient α (Subgroup α)QuotientGroup.Quotient.groupQuotientGroup.Quotient.group: {G : Type u} → [inst : Group G] → (N : Subgroup G) → [nN : N.Normal] → Group (G ⧸ N)LinearMap.kerLinearMap.ker: {R : Type u_1} → {R₂ : Type u_2} → {M : Type u_5} → {M₂ : Type u_7} → [inst : Semiring R] → [inst_1 : Semiring R₂] → [inst_2 : AddCommMonoid M] → [inst_3 : AddCommMonoid M₂] → [inst_4 : Module R M] → [inst_5 : Module R₂ M₂] → {τ₁₂ : R →+* R₂} → {F : Type u_11} → [inst_6 : FunLike F M M₂] → [inst_7 : SemilinearMapClass F τ₁₂ M M₂] → F → Submodule R MSet.preimage_kernImageSet.preimage_kernImage: ∀ {α : Type u_1} {β : Type u_2} {f : α → β}, GaloisConnection (Set.preimage f) (Set.kernImage f)Setoid.kerSetoid.ker: {α : Type u_1} → {β : Type u_2} → (α → β) → Setoid αFilter.kerFilter.ker: {α : Type u_1} → Filter α → Set αMonoidHom.kerMonoidHom.ker: {G : Type u_1} → [inst : Group G] → {M : Type u_7} → [inst_1 : MulOneClass M] → (G →* M) → Subgroup GRingHom.kerRingHom.ker: {R : Type u} → {S : Type v} → {F : Type u_1} → [inst : Semiring R] → [inst_1 : Semiring S] → [inst_2 : FunLike F R S] → [rcf : RingHomClass F R S] → F → Ideal RMonoidHom.rangeMonoidHom.range: {G : Type u_1} → [inst : Group G] → {N : Type u_5} → [inst_1 : Group N] → (G →* N) → Subgroup NQuotientGroup.quotientKerEquivRangeQuotientGroup.quotientKerEquivRange: {G : Type u} → [inst : Group G] → {H : Type v} → [inst_1 : Group H] → (φ : G →* H) → G ⧸ φ.ker ≃* ↥φ.rangeQuotientGroup.quotientInfEquivProdNormalQuotientQuotientGroup.quotientInfEquivProdNormalQuotient: {G : Type u} → [inst : Group G] → (H N : Subgroup G) → [hN : N.Normal] → ↥H ⧸ N.subgroupOf H ≃* ↥(H ⊔ N) ⧸ N.subgroupOf (H ⊔ N)QuotientGroup.quotientQuotientEquivQuotientQuotientGroup.quotientQuotientEquivQuotient: {G : Type u} → [inst : Group G] → (N : Subgroup G) → [nN : N.Normal] → (M : Subgroup G) → [nM : M.Normal] → N ≤ M → (G ⧸ N) ⧸ Subgroup.map (QuotientGroup.mk' N) M ≃* G ⧸ MBasisBasis: Type u_1 → (R : Type u_3) → (M : Type u_6) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst : Module R M] → Type (max (max u_1 u_3) u_6)Module.Finite.of_basisModule.Finite.of_basis: ∀ {R : Type u_1} {M : Type u_2} {ι : Type u_3} [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M] [inst_3 : Finite ι], Basis ι R M → Module.Finite R MModule.FreeModule.Free: (R : Type u) → (M : Type v) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst : Module R M] → PropModule.Finite.finite_basisModule.Finite.finite_basis: ∀ {R : Type u} {M : Type u_3} [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M] [inst_3 : Nontrivial R] {ι : Type u_5} [inst_4 : Module.Finite R M], Basis ι R M → Finite ιBasis.ofVectorSpaceBasis.ofVectorSpace: (K : Type u_3) → (V : Type u_4) → [inst : DivisionRing K] → [inst_1 : AddCommGroup V] → [inst_2 : Module K V] → Basis (↑(Basis.ofVectorSpaceIndex K V)) K VModule.finBasisModule.finBasis: (R : Type u) → (M : Type v) → [inst : Semiring R] → [inst_1 : StrongRankCondition R] → [inst_2 : AddCommMonoid M] → [inst_3 : Module R M] → [inst_4 : Module.Free R M] → [inst_5 : Module.Finite R M] → Basis (Fin (Module.finrank R M)) R MBasis.ofVectorSpaceIndex /- The `Subgroup` generated by a set. -/ -- def closure (k : Set G) : Subgroup G := -- sInf { K | k ⊆ K }Basis.ofVectorSpaceIndex: (K : Type u_3) → (V : Type u_4) → [inst : DivisionRing K] → [inst_1 : AddCommGroup V] → [inst : Module K V] → Set VSubgroup.closure /- The span of a set `s ⊆ M` is the smallest submodule of M that contains `s`. -/ -- def span (s : Set M) : Submodule R M := -- sInf { p | s ⊆ p }Subgroup.closure: {G : Type u_1} → [inst : Group G] → Set G → Subgroup GSubmodule.spanSubmodule.span: (R : Type u_1) → {M : Type u_4} → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → Set M → Submodule R MSubmoduleSubmodule: (R : Type uR) → (M : Type (max uR uι)) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst : Module R M] → Type (max uR uι)R (R: Type uRι →₀ι: Type uιR)R: Type uR/- Interprets (l : α →₀ R) as linear combination of the elements in the family (v : α → M) and evaluates this linear combination. -/ -- protected def total : (α →₀ R) →ₗ[R] M := -- Finsupp.lsum ℕ fun i => LinearMap.id.smulRight (v i)Finsupp.linearCombination /- `LinearIndependent R v` states the family of vectors `v` is linearly independent over `R`. -/ -- def LinearIndependent : Prop := -- LinearMap.ker (Finsupp.total ι M R v) = ⊥Finsupp.linearCombination: {α : Type u_1} → {M : Type u_2} → (R : Type u_5) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → (α → M) → (α →₀ R) →ₗ[R] MLinearIndependentLinearIndependent: {ι : Type u'} → (R : Type u_2) → {M : Type u_4} → (ι → M) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst : Module R M] → PropModule.rankModule.rank: (R : Type u_1) → (M : Type u_2) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst : Module R M] → Cardinal.{u_2}Module.Free.chooseBasisModule.Free.chooseBasis: (R : Type u) → (M : Type v) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → [inst_3 : Module.Free R M] → Basis (Module.Free.ChooseBasisIndex R M) R MBasis.coordBasis.coord: {ι : Type u_10} → {R : Type u_11} → {M : Type u_12} → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → Basis ι R M → ι → M →ₗ[R] RBasis.exists_basisBasis.exists_basis: ∀ (K : Type u_3) (V : Type u_4) [inst : DivisionRing K] [inst_1 : AddCommGroup V] [inst_2 : Module K V], ∃ s, Nonempty (Basis (↑s) K V)DirectSumDirectSum: (ι : Type v) → (β : ι → Type w) → [inst : (i : ι) → AddCommMonoid (β i)] → Type (max w v)Module.Free.directSumModule.Free.directSum: ∀ (R : Type u_1) [inst : Semiring R] {ι : Type u_2} (M : ι → Type u_3) [inst_1 : (i : ι) → AddCommMonoid (M i)] [inst_2 : (i : ι) → Module R (M i)] [inst_3 : ∀ (i : ι), Module.Free R (M i)], Module.Free R (DirectSum ι fun i => M i)DirectSum.instAlgebraDirectSum.instAlgebra: {ι : Type uι} → (R : Type uR) → (A : ι → Type uA) → [inst : CommSemiring R] → [inst_1 : (i : ι) → AddCommMonoid (A i)] → [inst_2 : (i : ι) → Module R (A i)] → [inst_3 : AddMonoid ι] → [inst_4 : DirectSum.GSemiring A] → [inst_5 : DirectSum.GAlgebra R A] → [inst_6 : DecidableEq ι] → Algebra R (DirectSum ι fun i => A i)DirectSum.add_applyDirectSum.add_apply: ∀ {ι : Type v} {β : ι → Type w} [inst : (i : ι) → AddCommMonoid (β i)] (g₁ g₂ : DirectSum ι fun i => β i) (i : ι), (g₁ + g₂) i = g₁ i + g₂ iLinearMapLinearMap: {R : Type u_14} → {S : Type u_15} → [inst : Semiring R] → [inst_1 : Semiring S] → (R →+* S) → (M : Type u_16) → (M₂ : Type u_17) → [inst_2 : AddCommMonoid M] → [inst_3 : AddCommMonoid M₂] → [inst : Module R M] → [inst : Module S M₂] → Type (max u_16 u_17)LinearMap.kerLinearMap.ker: {R : Type u_1} → {R₂ : Type u_2} → {M : Type u_5} → {M₂ : Type u_7} → [inst : Semiring R] → [inst_1 : Semiring R₂] → [inst_2 : AddCommMonoid M] → [inst_3 : AddCommMonoid M₂] → [inst_4 : Module R M] → [inst_5 : Module R₂ M₂] → {τ₁₂ : R →+* R₂} → {F : Type u_11} → [inst_6 : FunLike F M M₂] → [inst_7 : SemilinearMapClass F τ₁₂ M M₂] → F → Submodule R MLinearMap.rangeLinearMap.range: {R : Type u_1} → {R₂ : Type u_2} → {M : Type u_5} → {M₂ : Type u_6} → [inst : Semiring R] → [inst_1 : Semiring R₂] → [inst_2 : AddCommMonoid M] → [inst_3 : AddCommMonoid M₂] → [inst_4 : Module R M] → [inst_5 : Module R₂ M₂] → {τ₁₂ : R →+* R₂} → {F : Type u_10} → [inst_6 : FunLike F M M₂] → [inst_7 : SemilinearMapClass F τ₁₂ M M₂] → [inst : RingHomSurjective τ₁₂] → F → Submodule R₂ M₂LinearMap.rank_range_add_rank_kerLinearMap.rank_range_add_rank_ker: ∀ {R : Type u_1} {M M₁ : Type u} [inst : Ring R] [inst_1 : AddCommGroup M] [inst_2 : AddCommGroup M₁] [inst_3 : Module R M] [inst_4 : Module R M₁] [inst_5 : HasRankNullity.{u, u_1} R] (f : M →ₗ[R] M₁), Module.rank R ↥(LinearMap.range f) + Module.rank R ↥(LinearMap.ker f) = Module.rank R MLinearEquivLinearEquiv: {R : Type u_12} → {S : Type u_13} → [inst : Semiring R] → [inst_1 : Semiring S] → (σ : R →+* S) → {σ' : S →+* R} → [inst_2 : RingHomInvPair σ σ'] → [inst_3 : RingHomInvPair σ' σ] → (M : Type u_14) → (M₂ : Type u_15) → [inst_4 : AddCommMonoid M] → [inst_5 : AddCommMonoid M₂] → [inst : Module R M] → [inst : Module S M₂] → Type (max u_14 u_15)Basis.mapBasis.map: {ι : Type u_1} → {R : Type u_3} → {M : Type u_6} → {M' : Type u_7} → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → [inst_3 : AddCommMonoid M'] → [inst_4 : Module R M'] → Basis ι R M → (M ≃ₗ[R] M') → Basis ι R M'LinearEquiv.ofRankEqLinearEquiv.ofRankEq: {R : Type u} → (M M₁ : Type v) → [inst : Semiring R] → [inst_1 : StrongRankCondition R] → [inst_2 : AddCommMonoid M] → [inst_3 : Module R M] → [inst_4 : Module.Free R M] → [inst_5 : AddCommMonoid M₁] → [inst_6 : Module R M₁] → [inst_7 : Module.Free R M₁] → Module.rank R M = Module.rank R M₁ → M ≃ₗ[R] M₁Module.EndModule.End: (R : Type u) → (M : Type v) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst : Module R M] → Type vModule.End.semiring -- TODO: PR? -- #check Module.End.algebraModule.End.semiring: {R : Type u_1} → {M : Type u_4} → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → Semiring (Module.End R M)Module.End.instAlgebraModule.End.instAlgebra: (R : Type u) → (S : Type v) → (M : Type w) → [inst : CommSemiring R] → [inst_1 : Semiring S] → [inst_2 : AddCommMonoid M] → [inst_3 : Module R M] → [inst_4 : Module S M] → [inst_5 : SMulCommClass S R M] → [inst_6 : SMul R S] → [inst_7 : IsScalarTower R S M] → Algebra R (Module.End S M)DistribMulAction.toLinearMapDistribMulAction.toLinearMap: (R : Type u_1) → {S : Type u_3} → (M : Type u_4) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → [inst_3 : Monoid S] → [inst_4 : DistribMulAction S M] → [inst_5 : SMulCommClass S R M] → S → M →ₗ[R] MDistribMulAction.toModuleEndDistribMulAction.toModuleEnd: (R : Type u_1) → {S : Type u_3} → (M : Type u_4) → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → [inst_3 : Monoid S] → [inst_4 : DistribMulAction S M] → [inst_5 : SMulCommClass S R M] → S →* Module.End R MLinearMap.toMatrixLinearMap.toMatrix: {R : Type u_1} → [inst : CommSemiring R] → {m : Type u_3} → {n : Type u_4} → [inst_1 : Fintype n] → [inst_2 : Finite m] → [inst_3 : DecidableEq n] → {M₁ : Type u_5} → {M₂ : Type u_6} → [inst_4 : AddCommMonoid M₁] → [inst_5 : AddCommMonoid M₂] → [inst_6 : Module R M₁] → [inst_7 : Module R M₂] → Basis n R M₁ → Basis m R M₂ → (M₁ →ₗ[R] M₂) ≃ₗ[R] Matrix m n RlinearMap_toMatrix_mul_basis_toMatrixlinearMap_toMatrix_mul_basis_toMatrix: ∀ {ι : Type u_1} {ι' : Type u_2} {κ' : Type u_4} {R : Type u_5} {M : Type u_6} [inst : CommSemiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M] {N : Type u_9} [inst_3 : AddCommMonoid N] [inst_4 : Module R N] (b : Basis ι R M) (b' : Basis ι' R M) (c' : Basis κ' R N) (f : M →ₗ[R] N) [inst_5 : Fintype ι'] [inst_6 : Fintype ι] [inst_7 : Finite κ'] [inst_8 : DecidableEq ι] [inst_9 : DecidableEq ι'], (LinearMap.toMatrix b' c') f * b'.toMatrix ⇑b = (LinearMap.toMatrix b c') fMatrix section variable (Matrix: Type u → Type u' → Type v → Type (max u u' v)ll: Type umm: Type un:n: Type uType u) (Type u: Type (u + 1)α :α: Type uαType uα) [Type uα: Type (uα + 1)FintypeFintype: Type u → Type ul] [l: Type uFintypeFintype: Type u → Type um] [m: Type uFintypeFintype: Type u → Type un] [n: Type uMulMul: Type uα → Type uαα] [α: Type uαAddCommMonoidAddCommMonoid: Type uα → Type uαα] (α: Type uαx :x: Matrix l m αMatrixMatrix: Type u → Type u → Type uα → Type (max u uα)ll: Type umm: Type uα) (α: Type uαy :y: Matrix m n αMatrixMatrix: Type u → Type u → Type uα → Type (max u uα)mm: Type unn: Type uα) (α: Type uαz :z: Matrix l n αMatrixMatrix: Type u → Type u → Type uα → Type (max u uα)ll: Type unn: Type uα)α: Type uαx *x: Matrix l m αyy: Matrix m n αendMatrix.instHMulOfFintypeOfMulOfAddCommMonoidMatrix.instHMulOfFintypeOfMulOfAddCommMonoid: {l : Type u_1} → {m : Type u_2} → {n : Type u_3} → {α : Type v} → [inst : Fintype m] → [inst : Mul α] → [inst : AddCommMonoid α] → HMul (Matrix l m α) (Matrix m n α) (Matrix l n α)Matrix.mul_applyMatrix.mul_apply: ∀ {l : Type u_1} {m : Type u_2} {n : Type u_3} {α : Type v} [inst : Fintype m] [inst_1 : Mul α] [inst_2 : AddCommMonoid α] {M : Matrix l m α} {N : Matrix m n α} {i : l} {k : n}, (M * N) i k = ∑ j, M i j * N j kMatrix.sum_applyMatrix.sum_apply: ∀ {m : Type u_2} {n : Type u_3} {α : Type v} {β : Type w} [inst : AddCommMonoid α] (i : m) (j : n) (s : Finset β) (g : β → Matrix m n α), (∑ c ∈ s, g c) i j = ∑ c ∈ s, g c i jMatrix.toLinMatrix.toLin: {R : Type u_1} → [inst : CommSemiring R] → {m : Type u_3} → {n : Type u_4} → [inst_1 : Fintype n] → [inst_2 : Finite m] → [inst_3 : DecidableEq n] → {M₁ : Type u_5} → {M₂ : Type u_6} → [inst_4 : AddCommMonoid M₁] → [inst_5 : AddCommMonoid M₂] → [inst_6 : Module R M₁] → [inst_7 : Module R M₂] → Basis n R M₁ → Basis m R M₂ → Matrix m n R ≃ₗ[R] M₁ →ₗ[R] M₂Matrix.RepresentsMatrix.Represents: {ι : Type u_1} → [inst : Fintype ι] → {M : Type u_2} → [inst : AddCommGroup M] → {R : Type u_3} → [inst_1 : CommRing R] → [inst_2 : Module R M] → (ι → M) → [inst_3 : DecidableEq ι] → Matrix ι ι R → Module.End R M → PropMatrix.isRepresentationMatrix.isRepresentation: {ι : Type u_1} → [inst : Fintype ι] → {M : Type u_2} → [inst_1 : AddCommGroup M] → (R : Type u_3) → [inst_2 : CommRing R] → [inst_3 : Module R M] → (ι → M) → [inst_4 : DecidableEq ι] → Subalgebra R (Matrix ι ι R)Matrix.isRepresentation.toEndMatrix.isRepresentation.toEnd: {ι : Type u_1} → [inst : Fintype ι] → {M : Type u_2} → [inst_1 : AddCommGroup M] → (R : Type u_3) → [inst_2 : CommRing R] → [inst_3 : Module R M] → (b : ι → M) → [inst_4 : DecidableEq ι] → Submodule.span R (Set.range b) = ⊤ → ↥(Matrix.isRepresentation R b) →ₐ[R] Module.End R MPiToModule.fromMatrixPiToModule.fromMatrix: {ι : Type u_1} → [inst : Fintype ι] → {M : Type u_2} → [inst : AddCommGroup M] → (R : Type u_3) → [inst_1 : CommRing R] → [inst_2 : Module R M] → (ι → M) → [inst_3 : DecidableEq ι] → Matrix ι ι R →ₗ[R] (ι → R) →ₗ[R] MMatrix.invMatrix.inv: {n : Type u'} → {α : Type v} → [inst : Fintype n] → [inst : DecidableEq n] → [inst : CommRing α] → Inv (Matrix n n α)Matrix.invOf_eqMatrix.invOf_eq: ∀ {n : Type u'} {α : Type v} [inst : Fintype n] [inst_1 : DecidableEq n] [inst_2 : CommRing α] (A : Matrix n n α) [inst_3 : Invertible A.det] [inst_4 : Invertible A], ⅟ A = ⅟ A.det • A.adjugateMatrix.invOf_eq_nonsing_invMatrix.invOf_eq_nonsing_inv: ∀ {n : Type u'} {α : Type v} [inst : Fintype n] [inst_1 : DecidableEq n] [inst_2 : CommRing α] (A : Matrix n n α) [inst_3 : Invertible A], ⅟ A = A⁻¹Matrix.invertibleOfDetInvertible -- TODO: an endomorphism is invertible iff the matrix is invertibleMatrix.invertibleOfDetInvertible: {n : Type u'} → {α : Type v} → [inst : Fintype n] → [inst_1 : DecidableEq n] → [inst_2 : CommRing α] → (A : Matrix n n α) → [inst_3 : Invertible A.det] → Invertible AalgEquivMatrix -- change of basis matrixalgEquivMatrix: {R : Type u_1} → [inst : CommSemiring R] → {n : Type u_2} → [inst_1 : DecidableEq n] → {M : Type u_3} → [inst_2 : AddCommMonoid M] → [inst_3 : Module R M] → [inst_4 : Fintype n] → Basis n R M → Module.End R M ≃ₐ[R] Matrix n n Rbasis_toMatrix_mul_linearMap_toMatrix_mul_basis_toMatrixbasis_toMatrix_mul_linearMap_toMatrix_mul_basis_toMatrix: ∀ {ι : Type u_1} {ι' : Type u_2} {κ : Type u_3} {κ' : Type u_4} {R : Type u_5} {M : Type u_6} [inst : CommSemiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M] {N : Type u_9} [inst_3 : AddCommMonoid N] [inst_4 : Module R N] (b : Basis ι R M) (b' : Basis ι' R M) (c : Basis κ R N) (c' : Basis κ' R N) (f : M →ₗ[R] N) [inst_5 : Fintype ι'] [inst_6 : Finite κ] [inst_7 : Fintype ι] [inst_8 : Fintype κ'] [inst_9 : DecidableEq ι] [inst_10 : DecidableEq ι'], c.toMatrix ⇑c' * (LinearMap.toMatrix b' c') f * b'.toMatrix ⇑b = (LinearMap.toMatrix b c) fModule.End.eigenspaceModule.End.eigenspace: {R : Type v} → {M : Type w} → [inst : CommRing R] → [inst_1 : AddCommGroup M] → [inst_2 : Module R M] → Module.End R M → R → Submodule R MModule.End.HasEigenvalueModule.End.HasEigenvalue: {R : Type v} → {M : Type w} → [inst : CommRing R] → [inst_1 : AddCommGroup M] → [inst_2 : Module R M] → Module.End R M → R → PropModule.End.HasEigenvectorModule.End.HasEigenvector: {R : Type v} → {M : Type w} → [inst : CommRing R] → [inst_1 : AddCommGroup M] → [inst_2 : Module R M] → Module.End R M → R → M → PropModule.End.Eigenvalues /- The generalized eigenspace for a linear map `f`, a scalar `μ`, and an exponent `k ∈ ℕ` is the kernel of `(f - μ • id) ^ k`. (Def 8.10 of [axler2015]). Furthermore, a generalized eigenspace for some exponent `k` is contained in the generalized eigenspace for exponents larger than `k`. -/ -- def generalizedEigenspace (f : End R M) (μ : R) : ℕ →o Submodule R M where -- toFun k := LinearMap.ker ((f - algebraMap R (End R M) μ) ^ k) -- monotone' k m hm := by -- simp only [← pow_sub_mul_pow _ hm] -- exact -- LinearMap.ker_le_ker_comp ((f - algebraMap R (End R M) μ) ^ k) -- ((f - algebraMap R (End R M) μ) ^ (m - k))Module.End.Eigenvalues: {R : Type v} → {M : Type w} → [inst : CommRing R] → [inst_1 : AddCommGroup M] → [inst_2 : Module R M] → Module.End R M → Type vModule.End.genEigenspaceModule.End.genEigenspace: {R : Type v} → {M : Type w} → [inst : CommRing R] → [inst_1 : AddCommGroup M] → [inst_2 : Module R M] → Module.End R M → R → ℕ∞ →o Submodule R MOrderHomOrderHom: (α : Type u_6) → (β : Type u_7) → [inst : Preorder α] → [inst : Preorder β] → Type (max u_6 u_7)Module.End.eigenspaces_independentModule.End.eigenspaces_independent: ∀ {R : Type v} {M : Type w} [inst : CommRing R] [inst_1 : AddCommGroup M] [inst_2 : Module R M] [inst_3 : NoZeroSMulDivisors R M] (f : Module.End R M), iSupIndep f.eigenspaceModule.End.eigenvectors_linearIndependentModule.End.eigenvectors_linearIndependent: ∀ {R : Type v} {M : Type w} [inst : CommRing R] [inst_1 : AddCommGroup M] [inst_2 : Module R M] [inst_3 : NoZeroSMulDivisors R M] (f : Module.End R M) (μs : Set R) (xs : ↑μs → M), (∀ (μ : ↑μs), f.HasEigenvector (↑μ) (xs μ)) → LinearIndependent (ι := ↑μs) R xsModule.End.exists_eigenvalueModule.End.exists_eigenvalue: ∀ {K : Type u_1} {V : Type u_2} [inst : Field K] [inst_1 : AddCommGroup V] [inst_2 : Module K V] [inst_3 : IsAlgClosed K] [inst_4 : FiniteDimensional K V] [inst_5 : Nontrivial V] (f : Module.End K V), ∃ c, f.HasEigenvalue cMatrix.IsHermitian.det_eq_prod_eigenvaluesMatrix.IsHermitian.det_eq_prod_eigenvalues: ∀ {𝕜 : Type u_1} [inst : RCLike 𝕜] {n : Type u_2} [inst_1 : Fintype n] {A : Matrix n n 𝕜} [inst_2 : DecidableEq n] (hA : A.IsHermitian), A.det = ∏ i, ↑(hA.eigenvalues i)Basis.detBasis.det: {R : Type u_1} → [inst : CommRing R] → {M : Type u_2} → [inst_1 : AddCommGroup M] → [inst_2 : Module R M] → {ι : Type u_4} → [inst_3 : DecidableEq ι] → [inst_4 : Fintype ι] → Basis ι R M → M [⋀^ι]→ₗ[R] RLinearMap.detLinearMap.det: {M : Type u_7} → [inst : AddCommGroup M] → {A : Type u_8} → [inst_1 : CommRing A] → [inst_2 : Module A M] → (M →ₗ[A] M) →* ASubgroup.zpowersSubgroup.zpowers: {G : Type u_1} → [inst : Group G] → G → Subgroup GIsFreeGroup.GeneratorsIsFreeGroup.Generators: (G : Type u_1) → [inst : Group G] → [inst : IsFreeGroup G] → Type u_1Matrix.diagMatrix.diag: {n : Type u_3} → {α : Type v} → Matrix n n α → n → αMatrix.diagonalMatrix.diagonal: {n : Type u_3} → {α : Type v} → [inst : DecidableEq n] → [inst : Zero α] → (n → α) → Matrix n n αLinearMap.IsProjLinearMap.IsProj: {S : Type u_5} → [inst : Semiring S] → {M : Type u_6} → [inst_1 : AddCommMonoid M] → [inst_2 : Module S M] → Submodule S M → {F : Type u_7} → [inst : FunLike F M M] → F → PropLinearMap.isProj_iff_idempotent -- TODO: л is projection of a vector space V. Then V = Im л 0 Ker л.LinearMap.isProj_iff_idempotent: ∀ {S : Type u_5} [inst : Semiring S] {M : Type u_6} [inst_1 : AddCommMonoid M] [inst_2 : Module S M] (f : M →ₗ[S] M), (∃ p, LinearMap.IsProj p f) ↔ IsIdempotentElem fSubmodule.prodSubmodule.prod: {R : Type u_1} → {M : Type u_4} → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → Submodule R M → {M' : Type u_9} → [inst_3 : AddCommMonoid M'] → [inst_4 : Module R M'] → Submodule R M' → Submodule R (M × M')LinearMap.coprodLinearMap.coprod: {R : Type u} → {M : Type v} → {M₂ : Type w} → {M₃ : Type y} → [inst : Semiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : AddCommMonoid M₂] → [inst_3 : AddCommMonoid M₃] → [inst_4 : Module R M] → [inst_5 : Module R M₂] → [inst_6 : Module R M₃] → (M →ₗ[R] M₃) → (M₂ →ₗ[R] M₃) → M × M₂ →ₗ[R] M₃Matrix.GeneralLinearGroupMatrix.GeneralLinearGroup: (n : Type u) → (R : Type v) → [inst : DecidableEq n] → [inst : Fintype n] → [inst : CommRing R] → Type (max v u)Matrix.extMatrix.ext: ∀ {m : Type u_2} {n : Type u_3} {α : Type v} {M N : Matrix m n α}, (∀ (i : m) (j : n), M i j = N i j) → M = NRepresentationRepresentation: (k : Type u_1) → (G : Type u_2) → (V : Type u_3) → [inst : CommSemiring k] → [inst_1 : Monoid G] → [inst_2 : AddCommMonoid V] → [inst : Module k V] → Type (max u_2 u_3)Representation.asGroupHomRepresentation.asGroupHom: {k : Type u_1} → {G : Type u_2} → {V : Type u_3} → [inst : CommSemiring k] → [inst_1 : Group G] → [inst_2 : AddCommMonoid V] → [inst_3 : Module k V] → Representation k G V → G →* (V →ₗ[k] V)ˣRepresentation.asAlgebraHomRepresentation.asAlgebraHom: {k : Type u_1} → {G : Type u_2} → {V : Type u_3} → [inst : CommSemiring k] → [inst_1 : Monoid G] → [inst_2 : AddCommMonoid V] → [inst_3 : Module k V] → Representation k G V → MonoidAlgebra k G →ₐ[k] Module.End k VRepresentation.asModuleEquivRepresentation.asModuleEquiv: {k : Type u_1} → {G : Type u_2} → {V : Type u_3} → [inst : CommSemiring k] → [inst_1 : Monoid G] → [inst_2 : AddCommMonoid V] → [inst_3 : Module k V] → (ρ : Representation k G V) → ρ.asModule ≃ₗ[k] VRepresentation.ofMulActionRepresentation.ofMulAction: (k : Type u_1) → [inst : CommSemiring k] → (G : Type u_2) → [inst_1 : Monoid G] → (H : Type u_3) → [inst_2 : MulAction G H] → Representation k G (H →₀ k)Representation.ofDistribMulActionRepresentation.ofDistribMulAction: (k : Type u_1) → (G : Type u_2) → (A : Type u_3) → [inst : CommSemiring k] → [inst_1 : Monoid G] → [inst_2 : AddCommMonoid A] → [inst_3 : Module k A] → [inst_4 : DistribMulAction G A] → [inst_5 : SMulCommClass G k A] → Representation k G ARepresentation.linHomRepresentation.linHom: {k : Type u_1} → {G : Type u_2} → {V : Type u_3} → {W : Type u_4} → [inst : CommSemiring k] → [inst_1 : Group G] → [inst_2 : AddCommMonoid V] → [inst_3 : Module k V] → [inst_4 : AddCommMonoid W] → [inst_5 : Module k W] → Representation k G V → Representation k G W → Representation k G (V →ₗ[k] W)QuadraticMap.isometryEquivBasisRepr -- section -- variable {k G V: Type*} [CommRing k] [Monoid G] [AddCommMonoid V] [Module k V] -- variable (n : Type uN) [DecidableEq n] [Fintype n] -- variable (ρ₁ ρ₂ : Representation k G V) (T' : Matrix.GeneralLinearGroup n k) -- #check T'⁻¹ -- #check Matrix.GeneralLinearGroup.toLin T' -- def Representation.equivalent : Prop := -- ∃ T : Matrix.GeneralLinearGroup n k, -- ∀ g, ρ₁ g = T⁻¹ ∘ₗ ρ₂ g ∘ₗ T -- endQuadraticMap.isometryEquivBasisRepr: {ι : Type u_1} → {R : Type u_2} → {M : Type u_4} → {N : Type u_9} → [inst : CommSemiring R] → [inst_1 : AddCommMonoid M] → [inst_2 : AddCommMonoid N] → [inst_3 : Module R M] → [inst_4 : Module R N] → [inst_5 : Finite ι] → (Q : QuadraticMap R M N) → (v : Basis ι R M) → Q.IsometryEquiv (Q.basisRepr v)Representation.trivialRepresentation.trivial: (k : Type u_1) → (G : Type u_2) → (V : Type u_3) → [inst : CommSemiring k] → [inst_1 : Monoid G] → [inst_2 : AddCommMonoid V] → [inst_3 : Module k V] → Representation k G VCategoryTheory.Functor.Faithful.of_iso -- #check Real.cos -1 -- #check Real.cos (-1 : ℝ) -- #check Complex.cos (-1 : ℂ) -- example : Real.sqrt 1 = 1 := by -- norm_num -- example : Real.sqrt 1 = 1 ^ (1 / 2 : ℝ) := by -- norm_num -- done -- example : (Real.sqrt 2)^2 = (2 : ℝ) := by -- norm_num -- done -- works -- example : Real.sqrt 2 = 2 ^ (1 / 2) → false := by -- norm_num -- done -- works -- example : Real.sqrt 2 = 2 ^ (1 / 2 : ℝ) := by -- norm_num -- done -- fails -- example : Real.sqrt 2 = 2 ^ (1 / 2 : ℚ) := by -- norm_num -- done -- example : Real.sqrt (-1 : ℝ ) = Real.sqrt (-4 : ℝ ) := by -- norm_num -- done -- example : (2 : ℝ) * Real.sqrt (-1 : ℝ ) = Real.sqrt (-4 : ℝ ) := by -- norm_num -- done -- TODO: FG-module -- TODO: permutation moduleCategoryTheory.Functor.Faithful.of_iso: ∀ {C : Type u₁} [inst : CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [inst_1 : CategoryTheory.Category.{v₂, u₂} D] {F F' : CategoryTheory.Functor C D} [inst_2 : F.Faithful], (F ≅ F') → F'.FaithfulMonoidAlgebraMonoidAlgebra: (k : Type u₁) → Type u₂ → [inst : Semiring k] → Type (max u₁ u₂)LinearMap.traceLinearMap.trace: (R : Type u) → [inst : CommSemiring R] → (M : Type v) → [inst_1 : AddCommMonoid M] → [inst_2 : Module R M] → (M →ₗ[R] M) →ₗ[R] RLinearMap.trace_eq_matrix_traceLinearMap.trace_eq_matrix_trace: ∀ (R : Type u) [inst : CommSemiring R] {M : Type v} [inst_1 : AddCommMonoid M] [inst_2 : Module R M] {ι : Type w} [inst_3 : DecidableEq ι] [inst_4 : Fintype ι] (b : Basis ι R M) (f : M →ₗ[R] M), (LinearMap.trace R M) f = ((LinearMap.toMatrix b b) f).traceLinearMap.trace_eq_contractLinearMap.trace_eq_contract: ∀ (R : Type u_1) [inst : CommRing R] (M : Type u_2) [inst_1 : AddCommGroup M] [inst_2 : Module R M] [inst_3 : Module.Free R M] [inst_4 : Module.Finite R M], LinearMap.trace R M ∘ₗ dualTensorHom R M M = contractLeft R MLinearMap.baseChangeLinearMap.baseChange: {R : Type u_1} → (A : Type u_2) → {M : Type u_4} → {N : Type u_5} → [inst : CommSemiring R] → [inst_1 : Semiring A] → [inst_2 : Algebra R A] → [inst_3 : AddCommMonoid M] → [inst_4 : AddCommMonoid N] → [inst_5 : Module R M] → [inst_6 : Module R N] → (M →ₗ[R] N) → TensorProduct R A M →ₗ[A] TensorProduct R A NLinearMap.trace_eq_contract_of_basisLinearMap.trace_eq_contract_of_basis: ∀ {R : Type u_1} [inst : CommRing R] {M : Type u_2} [inst_1 : AddCommGroup M] [inst_2 : Module R M] {ι : Type u_5} [inst_3 : Finite ι], Basis ι R M → LinearMap.trace R M ∘ₗ dualTensorHom R M M = contractLeft R MalternatingGroup (alternatingGroup: (α : Type) → [inst : Fintype α] → [inst : DecidableEq α] → Subgroup (Equiv.Perm α)FinFin: ℕ → Type8) variable (8: ℕn :n: ℕℕ) abbrevℕ: TypeAₙ :Aₙ: Matrix (Fin n) (Fin n) ℕMatrix (Matrix: Type → Type → Type → TypeFinFin: ℕ → Typen) (n: ℕFinFin: ℕ → Typen)n: ℕℕ :=ℕ: TypeMatrix.of funMatrix.of: {m n α : Type} → (m → n → α) ≃ Matrix m n αii: Fin nj :j: Fin nFinFin: ℕ → Typen => ifn: ℕi ==i: Fin nj thenj: Fin n1 else (if1: ℕi ==i: Fin nn -n: ℕ1 ∨1: ℕj ==j: Fin nn -n: ℕ1 then1: ℕ2 else2: ℕ3)3: ℕAₙAₙ: (n : ℕ) → Matrix (Fin n) (Fin n) ℕ88: ℕQuaternionGroupQuaternionGroup: ℕ → Type8 -- https://en.wikipedia.org/wiki/Quaternion_group -- https://kconrad.math.uconn.edu/blurbs/grouptheory/genquat.pdf -- https://math.stackexchange.com/questions/305455/generalized-quaternion-group abbrev8: ℕQ₈ :=Q₈: TypeQuaternionGroupQuaternionGroup: ℕ → Type2 abbrev2: ℕC₃ :=C₃: TypeMultiplicative (Multiplicative: Type → TypeZModZMod: ℕ → Type3) -- variable (z : Z₃) -- #synth Group Z₃ -- variable {C₃ : Type} [Group C₃] [Fintype C₃] (h : Fintype.card C₃ = 3) [IsCyclic C₃] -- #check C₃3: ℕMultiplicative.groupMultiplicative.group: {α : Type u} → [inst : AddGroup α] → Group (Multiplicative α)Fintype.cardFintype.card: (α : Type) → [inst : Fintype α] → ℕC₃ -- #eval orderOf C₃C₃: TypeAdditive.ofMul <|Additive.ofMul: {α : Type 1} → α ≃ Additive αMultiplicative (Multiplicative: Type → TypeZModZMod: ℕ → Type3)3: ℕMultiplicative.toAdd <|Multiplicative.toAdd: {α : Type 1} → Multiplicative α ≃ αMultiplicative <|Multiplicative: Type → TypeZModZMod: ℕ → Type3 -- #synth AddGroup <| Multiplicative.toAdd <| Multiplicative <| ZMod 33: ℕMulAut.conjMulAut.conj: {G : Type u_3} → [inst : Group G] → G →* MulAut GRingEquivRingEquiv: (R : Type u_7) → (S : Type u_8) → [inst : Mul R] → [inst : Mul S] → [inst : Add R] → [inst : Add S] → Type (max u_7 u_8)SMulSMul: Type u → Type v → Type (max u v)MulActionMulAction: (α : Type u_9) → Type u_10 → [inst : Monoid α] → Type (max u_10 u_9)DistribMulActionDistribMulAction: (M : Type u_12) → (A : Type u_13) → [inst : Monoid M] → [inst : AddMonoid A] → Type (max u_12 u_13)LinearPMapLinearPMap: (R : Type u) → [inst : Ring R] → (E : Type v) → [inst_1 : AddCommGroup E] → [inst_2 : Module R E] → (F : Type w) → [inst_3 : AddCommGroup F] → [inst : Module R F] → Type (max v w)LinearPMap.instMulAction -- #check Equiv.Perm -- instance : MulAction C₃ Q₈ where -- smul g h := defLinearPMap.instMulAction: {R : Type u_1} → [inst : Ring R] → {E : Type u_2} → [inst_1 : AddCommGroup E] → [inst_2 : Module R E] → {F : Type u_3} → [inst_3 : AddCommGroup F] → [inst_4 : Module R F] → {M : Type u_5} → [inst_5 : Monoid M] → [inst_6 : DistribMulAction M F] → [inst_7 : SMulCommClass R M F] → MulAction M (E →ₗ.[R] F)c1 :c1: C₃C₃ :=C₃: Type11: C₃c1.c1: C₃val defval: {n : ℕ} → ZMod n → ℕf (f: ℕ → ZMod 3n :n: ℕℕ) :ℕ: TypeZModZMod: ℕ → Type3 :=3: ℕn %n: ℕ33: ZMod 3ff: ℕ → ZMod 300: ℕff: ℕ → ZMod 311: ℕff: ℕ → ZMod 32 /- 0 -/2: ℕff: ℕ → ZMod 333: ℕff: ℕ → ZMod 32 |>.2: ℕval /- 8 -/val: {n : ℕ} → ZMod n → ℕFintype.cardFintype.card: (α : Type) → [inst : Fintype α] → ℕQ₈ -- TODO: typo Multiplication of the dihedral group PR defQ₈: Typee :e: Q₈Q₈ :=Q₈: TypeQuaternionGroup.aQuaternionGroup.a: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n0 def0: ZMod (2 * 2)i :i: Q₈Q₈ :=Q₈: TypeQuaternionGroup.aQuaternionGroup.a: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n1 def1: ZMod (2 * 2)ne :ne: Q₈Q₈ :=Q₈: TypeQuaternionGroup.aQuaternionGroup.a: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n2 def2: ZMod (2 * 2)ni :ni: Q₈Q₈ :=Q₈: TypeQuaternionGroup.aQuaternionGroup.a: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n3 def3: ZMod (2 * 2)j :j: Q₈Q₈ :=Q₈: TypeQuaternionGroup.xaQuaternionGroup.xa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n0 def0: ZMod (2 * 2)nk :nk: Q₈Q₈ :=Q₈: TypeQuaternionGroup.xaQuaternionGroup.xa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n1 def1: ZMod (2 * 2)nj :nj: Q₈Q₈ :=Q₈: TypeQuaternionGroup.xaQuaternionGroup.xa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n2 def2: ZMod (2 * 2)k :k: Q₈Q₈ :=Q₈: TypeQuaternionGroup.xaQuaternionGroup.xa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n3 def3: ZMod (2 * 2)QuaternionGroup.f :QuaternionGroup.f: Q₈ → Q₈Q₈ →Q₈: TypeQ₈ |Q₈: Typeaa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n1 =>1: ZMod (2 * 2)xaxa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n0 -- i -> j |0: ZMod (2 * 2)xaxa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n0 =>0: ZMod (2 * 2)xaxa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n3 -- j -> k |3: ZMod (2 * 2)xaxa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n3 =>3: ZMod (2 * 2)aa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n1 -- k -> i |1: ZMod (2 * 2)aa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n3 =>3: ZMod (2 * 2)xaxa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n2 -- ni -> nj |2: ZMod (2 * 2)xaxa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n2 =>2: ZMod (2 * 2)xaxa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n1 -- nj -> nk |1: ZMod (2 * 2)xaxa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n1 =>1: ZMod (2 * 2)aa: {n : ℕ} → ZMod (2 * n) → QuaternionGroup n3 -- nk -> ni |3: ZMod (2 * 2)x =>x: Q₈x -- e, nex: Q₈ZMod.card -- example (z : ZMod 3) : 1 = 1 := by -- cases z.val with -- | zero => rfl -- | succ n => rfl -- example (q : Q₈) : Nat.repeat QuaternionGroup.f 3 q = 1 := by -- simp only [QuaternionGroup.one_def, Nat.repeat] -- cases q with -- | a i => cases i.val with -- | zero => -- rw (config := {occs := .pos {1} }) [QuaternionGroup.f] -- done -- | succ n => repeat { rw [QuaternionGroup.f] } -- | _ => sorry -- | _ => sorry -- done -- def φ : C₃ →* MulAut Q₈ where -- toFun c := { -- toFun := fun q => Nat.repeat QuaternionGroup.f c.val q, -- ^c.val, -- invFun := fun q => Nat.repeat QuaternionGroup.f (c.val + 1) q, --^c.val, -- left_inv := fun x => by -- simp [Function.LeftInverse, QuaternionGroup.f] -- done -- right_inv := fun x => by simp [Function.RightInverse] -- map_mul' := by simp [Function.LeftInverse, Function.RightInverse] -- } -- map_one' := sorry -- map_mul' := sorry -- #check Q₈ ⋊[φ] C₃ -- #check Q₈ ⋊[φ] C₃ -- https://en.wikipedia.org/wiki/Presentation_of_a_group -- https://mathworld.wolfram.com/GroupPresentation.html -- https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/Coxeter.20Groups -- https://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/Group.20algebra.20over.20finite.20groups -- https://encyclopediaofmath.org/wiki/Schur_index -- https://en.wikipedia.org/wiki/Covering_groups_of_the_alternating_and_symmetric_groups -- https://math.stackexchange.com/questions/4242277/number-of-schur-covering-groups -- https://en.m.wikipedia.org/wiki/Tietze_transformations -- https://mathworld.wolfram.com/GroupAlgebra.html -- https://github.com/leanprover-community/mathlib4/commits/j-loreaux/generator/ZMod.card: ∀ (n : ℕ) [inst : Fintype (ZMod n)], Fintype.card (ZMod n) = nPresentedGroup variable {PresentedGroup: {α : Type u_1} → Set (FreeGroup α) → Type u_1B :B: Type u_1Type*} [Type*: Type (u_1 + 1)DecidableEqDecidableEq: Type u_1 → Type (max 0 u_1)B] in defB: Type u_1demo :=demo: Type u_1PresentedGroup <|PresentedGroup: {α : Type u_1} → Set (FreeGroup α) → Type u_1Set.range <|Set.range: {α ι : Type u_1} → (ι → α) → Set αFunction.uncurry fun (Function.uncurry: {α β φ : Type u_1} → (α → β → φ) → α × β → φii: Bj :j: BB) =>B: Type u_1FreeGroup.ofFreeGroup.of: {α : Type u_1} → α → FreeGroup αi *i: BFreeGroup.ofFreeGroup.of: {α : Type u_1} → α → FreeGroup αj inductivej: Bgenerator (generator: ℕ → Typen :n: ℕℕ) |ℕ: Typea :a: {n : ℕ} → ZMod n → generator nZModZMod: ℕ → Typen →n: ℕgeneratorgenerator: ℕ → Typen |n: ℕb :b: {n : ℕ} → ZMod n → generator nZModZMod: ℕ → Typen →n: ℕgeneratorgenerator: ℕ → Typen derivingn: ℕDecidableEq defDecidableEq: Sort u → Sort (max 1 u)rel :rel: generator n → generator n → FreeGroup (generator n)generatorgenerator: ℕ → Typen →n: ℕgeneratorgenerator: ℕ → Typen →n: ℕFreeGroup (FreeGroup: Type → Typegeneratorgenerator: ℕ → Typen) |n: ℕgenerator.agenerator.a: {n : ℕ} → ZMod n → generator ni,i: ZMod ngenerator.agenerator.a: {n : ℕ} → ZMod n → generator nj =>j: ZMod nFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αgenerator.agenerator.a: {n : ℕ} → ZMod n → generator ni) *i: ZMod nFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αgenerator.agenerator.a: {n : ℕ} → ZMod n → generator nj) |j: ZMod ngenerator.bgenerator.b: {n : ℕ} → ZMod n → generator ni,i: ZMod ngenerator.bgenerator.b: {n : ℕ} → ZMod n → generator nj =>j: ZMod nFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αgenerator.bgenerator.b: {n : ℕ} → ZMod n → generator ni) *i: ZMod nFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αgenerator.bgenerator.b: {n : ℕ} → ZMod n → generator nj) |j: ZMod ngenerator.agenerator.a: {n : ℕ} → ZMod n → generator ni,i: ZMod ngenerator.bgenerator.b: {n : ℕ} → ZMod n → generator nj => (j: ZMod nFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αgenerator.agenerator.a: {n : ℕ} → ZMod n → generator nj) *j: ZMod nFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αgenerator.bgenerator.b: {n : ℕ} → ZMod n → generator ni))^i: ZMod nn |n: ℕgenerator.bgenerator.b: {n : ℕ} → ZMod n → generator ni,i: ZMod ngenerator.agenerator.a: {n : ℕ} → ZMod n → generator nj => (j: ZMod nFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αgenerator.bgenerator.b: {n : ℕ} → ZMod n → generator nj) *j: ZMod nFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αgenerator.agenerator.a: {n : ℕ} → ZMod n → generator ni))^i: ZMod nnn: ℕrelrel: (n : ℕ) → generator n → generator n → FreeGroup (generator n)
The presentation of the Dihedral group which makes it a Coxeter group is ⟨a, b | a^2 = 1, b^2 = 1, (a * b)^n = 1⟩
defDihedralPresentedGroup {DihedralPresentedGroup: {_i : ZMod n} → Type_i :_i: ZMod nZModZMod: ℕ → Typen} :=n: ℕPresentedGroup <|PresentedGroup: {α : Type} → Set (FreeGroup α) → TypeSet.range <|Set.range: {α ι : Type} → (ι → α) → Set αFunction.uncurry <|Function.uncurry: {α β φ : Type} → (α → β → φ) → α × β → φrelrel: (n : ℕ) → generator n → generator n → FreeGroup (generator n)n namespace DihedralPresentedGroup inductiven: ℕpre (pre: ℕ → Typen :n: ℕℕ) |ℕ: Typea :a: {n : ℕ} → ZMod n → pre nZModZMod: ℕ → Typen →n: ℕprepre: ℕ → Typen |n: ℕb :b: {n : ℕ} → ZMod n → pre nZModZMod: ℕ → Typen →n: ℕprepre: ℕ → Typen derivingn: ℕDecidableEqDecidableEq: Sort u → Sort (max 1 u)(1 :1: FreeGroup (pre n)FreeGroup (FreeGroup: Type → Typeprepre: ℕ → Typen))n: ℕ
The presentation of the Dihedral group which makes it a Coxeter group is ⟨a, b | a^2 = 1, b^2 = 1, (a * b)^n = 1⟩
defrel {rel: {i : ZMod n} → Set (FreeGroup (pre n))i :i: ZMod nZModZMod: ℕ → Typen} :n: ℕSet (Set: Type → TypeFreeGroup (FreeGroup: Type → Typeprepre: ℕ → Typen)) := {n: ℕFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αpre.apre.a: {n : ℕ} → ZMod n → pre ni)^i: ZMod n2} ∪ {2: ℕFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αpre.bpre.b: {n : ℕ} → ZMod n → pre ni)^i: ZMod n2} ∪ {(2: ℕFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αpre.apre.a: {n : ℕ} → ZMod n → pre ni) *i: ZMod nFreeGroup.of (FreeGroup.of: {α : Type} → α → FreeGroup αpre.bpre.b: {n : ℕ} → ZMod n → pre ni)) ^i: ZMod nn} abbrevn: ℕDihedralPresentedGroup' {DihedralPresentedGroup': {i : ZMod n} → Typei :i: ZMod nZModZMod: ℕ → Typen} :=n: ℕPresentedGroup <| @PresentedGroup: {α : Type} → Set (FreeGroup α) → Typerelrel: (n : ℕ) → {i : ZMod n} → Set (FreeGroup (pre n))nn: ℕi end DihedralPresentedGroup namespace PresentedQuaternionGroup -- variable {X : Type*} [DecidableEq X] inductivei: ZMod npre |pre: Typex :x: prepre |pre: Typey :y: prepre derivingpre: TypeDecidableEq inductiveDecidableEq: Sort u → Sort (max 1 u)rel {rel: {n : ℕ} → FreeGroup pre → FreeGroup pre → Propn :n: ℕℕ} :ℕ: TypeFreeGroupFreeGroup: Type → Typepre →pre: TypeFreeGroupFreeGroup: Type → Typepre →pre: TypeProp |Prop: Typecond1 :cond1: ∀ {n : ℕ}, rel (FreeGroup.of pre.x ^ n) (FreeGroup.of pre.y ^ 2)rel ((rel: {n : ℕ} → FreeGroup pre → FreeGroup pre → PropFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.x)^pre.x: pren) ((n: ℕFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.y)^pre.y: pre2) |2: ℕcond2 :cond2: ∀ {n : ℕ}, rel ((FreeGroup.of pre.y)⁻¹ * FreeGroup.of pre.x * FreeGroup.of pre.y) (FreeGroup.of pre.x)⁻¹rel ((rel: {n : ℕ} → FreeGroup pre → FreeGroup pre → PropFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.y)⁻¹ * (pre.y: preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.x) * (pre.x: preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.y)) ((pre.y: preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.x)⁻¹) end PresentedQuaternionGroup namespace C -- variable {X : Type*} [DecidableEq X] inductivepre.x: prepre |pre: Typea :a: prepre derivingpre: TypeDecidableEq defDecidableEq: Sort u → Sort (max 1 u)rel := {rel: Set (FreeGroup pre)a :a: FreeGroup preFreeGroupFreeGroup: Type → Typepre|pre: Typea^a: FreeGroup pren =n: ℕ1} end C abbrev1: FreeGroup preC (C: ℕ → Typen :n: ℕℕ) :=ℕ: TypePresentedGroup <|PresentedGroup: {α : Type} → Set (FreeGroup α) → TypeC.relC.rel: ℕ → Set (FreeGroup C.pre)nn: ℕnamespace D inductivepre |pre: Typex :x: prepre |pre: Typey :y: prepre derivingpre: TypeDecidableEq defDecidableEq: Sort u → Sort (max 1 u)x :=x: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.x defpre.x: prey :=y: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.y defpre.y: prerel :rel: Set (FreeGroup pre)Set (Set: Type → TypeFreeGroupFreeGroup: Type → Typepre) := {pre: Typex^x: FreeGroup pren} ∪ {n: ℕy^y: FreeGroup pre2} ∪ {(2: ℕx *x: FreeGroup prey)^y: FreeGroup pre2} end D abbrev2: ℕD (D: ℕ → Typen :n: ℕℕ) :=ℕ: TypePresentedGroup <|PresentedGroup: {α : Type} → Set (FreeGroup α) → TypeD.relD.rel: ℕ → Set (FreeGroup D.pre)n namespace De variable {n: ℕX :X: Type u_1Type*} [Type*: Type (u_1 + 1)DecidableEqDecidableEq: Type u_1 → Type (max 0 u_1)X] defX: Type u_1rel {rel: {x y : FreeGroup X} → Set (FreeGroup X)xx: FreeGroup Xy :y: FreeGroup XFreeGroupFreeGroup: Type u_1 → Type u_1X} :X: Type u_1Set (Set: Type u_1 → Type u_1FreeGroupFreeGroup: Type u_1 → Type u_1X) := {X: Type u_1x^x: FreeGroup Xn} ∪ {n: ℕy^y: FreeGroup X2} ∪ {(2: ℕx *x: FreeGroup Xy)^y: FreeGroup X2} end De def2: ℕDe (De: ℕ → Typen :n: ℕℕ) :=ℕ: TypePresentedGroup <| @PresentedGroup: {α : Type} → Set (FreeGroup α) → TypeDe.relDe.rel: ℕ → {X : Type} → {x y : FreeGroup X} → Set (FreeGroup X)nn: ℕD.preD.pre: TypeD.xD.x: FreeGroup D.preD.y namespace Q inductiveD.y: FreeGroup D.prepre |pre: Typex :x: prepre |pre: Typey :y: prepre derivingpre: TypeDecidableEq defDecidableEq: Sort u → Sort (max 1 u)x :=x: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.x defpre.x: prey :=y: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.y defpre.y: prerel :rel: Set (FreeGroup pre)Set (Set: Type → TypeFreeGroupFreeGroup: Type → Typepre) := {pre: Typex^x: FreeGroup pre4} ∪ {4: ℕy^y: FreeGroup pre4} ∪ {4: ℕy⁻¹ *y: FreeGroup prex *x: FreeGroup prey *y: FreeGroup prex} end Q abbrevx: FreeGroup preQ :=Q: TypePresentedGroup <|PresentedGroup: {α : Type} → Set (FreeGroup α) → TypeQ.relQ.rel: Set (FreeGroup Q.pre)def:CC: ℕ → Type3 →*3: ℕMulAutMulAut: (M : Type) → [inst : Mul M] → TypeQ where toFunQ: Typec := { toFun := func: C 3q =>q: Qsorry, invFun := funsorry: Qq =>q: Qsorry, left_inv := funsorry: Qx =>x: QGoals accomplished! 🐙;p: ℕ
inst✝⁶: Fact (Nat.Prime p)
F: Type uF
inst✝⁵: Field F
ι: Type uι
inst✝⁴: Finite ι
inst✝³: LT ι
R: Type uR
inst✝²: Ring R
G, H: Type uG
inst✝¹: Group G
inst✝: Group H
K, L: Subgroup G
n: ℕ
c: C 3
x: Qsorry = xright_inv := funGoals accomplished! 🐙x =>x: QGoals accomplished! 🐙;p: ℕ
inst✝⁶: Fact (Nat.Prime p)
F: Type uF
inst✝⁵: Field F
ι: Type uι
inst✝⁴: Finite ι
inst✝³: LT ι
R: Type uR
inst✝²: Ring R
G, H: Type uG
inst✝¹: Group G
inst✝: Group H
K, L: Subgroup G
n: ℕ
c: C 3
x: Qsorry = xmap_mul' :=Goals accomplished! 🐙Goals accomplished! 🐙;p: ℕ
inst✝⁶: Fact (Nat.Prime p)
F: Type uF
inst✝⁵: Field F
ι: Type uι
inst✝⁴: Finite ι
inst✝³: LT ι
R: Type uR
inst✝²: Ring R
G, H: Type uG
inst✝¹: Group G
inst✝: Group H
K, L: Subgroup G
n: ℕ
c: C 3sorry = 1} map_one' :=Goals accomplished! 🐙sorry map_mul' :=sorry: (fun c => { toFun := fun q => sorry, invFun := fun q => sorry, left_inv := ⋯, right_inv := ⋯, map_mul' := ⋯ }) 1 = 1sorrysorry: ∀ (x y : C 3), { toFun := fun c => { toFun := fun q => sorry, invFun := fun q => sorry, left_inv := ⋯, right_inv := ⋯, map_mul' := ⋯ }, map_one' := ⋯ }.toFun (x * y) = { toFun := fun c => { toFun := fun q => sorry, invFun := fun q => sorry, left_inv := ⋯, right_inv := ⋯, map_mul' := ⋯ }, map_one' := ⋯ }.toFun x * { toFun := fun c => { toFun := fun q => sorry, invFun := fun q => sorry, left_inv := ⋯, right_inv := ⋯, map_mul' := ⋯ }, map_one' := ⋯ }.toFun yQ ⋊[Q: Typeφ]φ: C 3 →* MulAut QCC: ℕ → Type33: ℕnamespace BT inductivepre |pre: Typee :e: prepre |pre: Typene :ne: prepre |pre: Typei :i: prepre |pre: Typej :j: prepre |pre: Typek :k: prepre |pre: Typef :f: prepre |pre: Typeg :g: prepre derivingpre: TypeDecidableEq defDecidableEq: Sort u → Sort (max 1 u)e :=e: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.e defpre.e: prene :=ne: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.ne defpre.ne: prei :=i: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.i defpre.i: prej :=j: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.j defpre.j: prek :=k: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.k defpre.k: pref :=f: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.f defpre.f: preg :=g: FreeGroup preFreeGroup.ofFreeGroup.of: {α : Type} → α → FreeGroup αpre.g defpre.g: prerel :rel: Set (FreeGroup pre)Set (Set: Type → TypeFreeGroupFreeGroup: Type → Typepre) := {pre: Typee} ∪ {e: FreeGroup prene^ne: FreeGroup pre2} ∪ {2: ℕi^i: FreeGroup pre4} ∪ {4: ℕj^j: FreeGroup pre4} ∪ {4: ℕi *i: FreeGroup prej *j: FreeGroup prek} ∪ {k: FreeGroup pref^f: FreeGroup pre3} ∪ {3: ℕg^g: FreeGroup pre3} ∪ {3: ℕf *f: FreeGroup preg} ∪ {g: FreeGroup pref⁻¹ *f: FreeGroup prei *i: FreeGroup pref *f: FreeGroup prej⁻¹} ∪ {j: FreeGroup pref⁻¹ *f: FreeGroup prej *j: FreeGroup pref *f: FreeGroup prek⁻¹} end BT -- example (a b: BT) [Group BT] : a^6 = 1 := by -- done abbrevk: FreeGroup preBT :=BT: TypePresentedGroup <|PresentedGroup: {α : Type} → Set (FreeGroup α) → TypeBT.rel -- namespace TT -- inductive pre -- | ofQ : FreeGroup Q.pre → pre -- | ofC : FreeGroup C.pre → pre -- def relQ := { FreeGroup.of <| pre.ofQ q | q ∈ Q.rel } -- def relC := { FreeGroup.of <| pre.ofC c | c ∈ C.rel 3 } -- def QC := FreeGroup <| Q.pre × C.pre -- def rel : Set (FreeGroup pre) := -- relQ ∪ relC -- end TT -- https://people.maths.bris.ac.uk/~matyd/GroupNames/1/e5/C3byQ8.html#s1 -- https://people.maths.bris.ac.uk/~matyd/GroupNames/1/SL(2,3).html -- https://en.wikipedia.org/wiki/Direct_product_of_groups#Presentations abbrevBT.rel: Set (FreeGroup BT.pre)TT :=TT: TypeQ ×Q: TypeCC: ℕ → Type33: ℕProdProd: Type u → Type v → Type (max u v)Prod.instGroupProd.instGroup: {G : Type u_1} → {H : Type u_2} → [inst : Group G] → [inst : Group H] → Group (G × H)MulHom -- free product of groupsMulHom: (M : Type u_10) → (N : Type u_11) → [inst : Mul M] → [inst : Mul N] → Type (max u_10 u_11)Monoid.Coprod open Monoid.CoprodMonoid.Coprod: (M : Type u_1) → (N : Type u_2) → [inst : MulOneClass M] → [inst : MulOneClass N] → Type (max u_1 u_2)Q ∗Q: TypeCC: ℕ → Type3 namespace BT def3: ℕof := @of: pre → PresentedGroup relPresentedGroup.ofPresentedGroup.of: {α : Type} → {rels : Set (FreeGroup α)} → α → PresentedGroup relsprepre: Typerel defrel: Set (FreeGroup pre)k' :=k': PresentedGroup relBT.ofBT.of: pre → PresentedGroup relpre.k defpre.k: pref' :=f': PresentedGroup relBT.ofBT.of: pre → PresentedGroup relpre.f defpre.f: prei' :=i': PresentedGroup relBT.ofBT.of: pre → PresentedGroup relpre.i -- example : f'⁻¹ * k' * f' = i' := by -- simp [f', k', i', BT.of, BT.rel] --, pre.k, pre.f, pre.i] -- have h : i'^4 = BT.of pre.e := by -- simp [i', BT.of, BT.rel] -- done -- done -- done -- done -- done -- done end BT -- TODO Tietze transformations -- https://math.stackexchange.com/questions/4273898/proving-an-isomorphism-via-generatorspre.i: pre