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.RepresentationTheory.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.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_4} → (M : Type u_5) → [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 : Grp} → (A : Action V (MonCat.of ↑G)) → G ⟶ Grp.of (CategoryTheory.Aut A.V)FactFact: Prop → PropIsCyclic.exists_generatorIsCyclic.exists_generator: ∀ {α : Type u} [inst : Group α] [inst_1 : IsCyclic α], ∃ g, ∀ (x : α), x ∈ Subgroup.zpowers gisCyclic_of_prime_card variable (isCyclic_of_prime_card: ∀ {α : Type u} [inst : Group α] [inst_1 : Fintype α] {p : ℕ} [hp : Fact (Nat.Prime p)], Fintype.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 = amul_left_invmul_left_inv: ∀ {G : Type u_1} [inst : Group G] (a : G), a⁻¹ * a = 1Subgroup variable {Subgroup: (G : Type u_5) → [inst : Group G] → Type u_5GG: 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 : MonCat} → 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) → [inst_1 : 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_6} {M : Type u_7} [inst : Semiring R] [inst_1 : Nontrivial R] [inst_2 : AddCommGroup M] [inst_3 : Module R M] {ι : Type u_8} [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 : Ring R] → [inst_1 : StrongRankCondition R] → [inst_2 : AddCommGroup 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.total /- `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.total: {α : 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_1} → {R : Type u_3} → {M : Type u_6} → [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) [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₂rank_range_add_rank_kerrank_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 : Ring R] → [inst_1 : StrongRankCondition R] → [inst_2 : AddCommGroup M] → [inst_3 : Module R M] → [inst_4 : Module.Free R M] → [inst_5 : AddCommGroup 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_5} → [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_4} → (M : Type u_5) → [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_4} → (M : Type u_5) → [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, 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 : CommRing R] → {n : Type u_2} → [inst_1 : DecidableEq n] → {M : Type u_3} → [inst_2 : AddCommGroup 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), CompleteLattice.Independent 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 : n, ↑(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) ↔ f ∘ₗ f = 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 ≃+ 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.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.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_7) → (A : Type u_8) → [inst : Monoid M] → [inst : AddMonoid A] → Type (max u_7 u_8)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 : Type u_1} → {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: QsorryAx Q = 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: QsorryAx Q = 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 3sorryAx Q = 1} map_one' :=Goals accomplished! 🐙sorry map_mul' :=sorry: (fun c => { toFun := fun q => sorryAx Q, invFun := fun q => sorryAx Q, left_inv := ⋯, right_inv := ⋯, map_mul' := ⋯ }) 1 = 1sorrysorry: ∀ (x y : C 3), { toFun := fun c => { toFun := fun q => sorryAx Q, invFun := fun q => sorryAx Q, left_inv := ⋯, right_inv := ⋯, map_mul' := ⋯ }, map_one' := ⋯ }.toFun (x * y) = { toFun := fun c => { toFun := fun q => sorryAx Q, invFun := fun q => sorryAx Q, left_inv := ⋯, right_inv := ⋯, map_mul' := ⋯ }, map_one' := ⋯ }.toFun x * { toFun := fun c => { toFun := fun q => sorryAx Q, invFun := fun q => sorryAx Q, 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