Zulip Chat Archive

Stream: mathlib4

Topic: Wedderburn-Artin Theorem


Edison Xie (Apr 02 2025 at 10:23):

I've commited a proof of wedderburn-artin as a draft #23583, I know there has been discussion towards TwoSidedIdeal and I'd like to know how people think about the current status and this PR :)

Edison Xie (Apr 02 2025 at 10:23):

cc @Junyan Xu

Edison Xie (Apr 09 2025 at 20:17):

#23583 is now ready-for-review!

Junyan Xu (Apr 09 2025 at 23:25):

I've built some minimal amount of isotypic component APIs in order to get more useful intermediate results from the proof. I haven't finished the proof of the WA theorem with this approach yet, but you can see my progress here. I'm sorry I didn't give detailed review on @Jiang Xu Wan's PR(s) (cc @Lior Silberman) but I'd appreciate suggestions to adapt our isotypic APIs to each other.

Edison Xie (Apr 10 2025 at 10:06):

Junyan Xu said:

I've built some minimal amount of isotypic component APIs in order to get more useful intermediate results from the proof.

Is there going to be a PR soon? :curious:

Junyan Xu (Apr 10 2025 at 10:34):

I'm currently adding and refining the isotypic API to make to proof flow more naturally and it will take some time.
I just introduce IsIsotypicOfType and one thing I have not coded is that if M is isotypic of type S, then it's isomorphic to a Finsupp over S (easy using finsuppEquivDFinsupp and isSemisimpleModule_iff_exists_linearEquiv_dfinsupp), and the number of copies of S must be Module.rank (DomMulAct <| Module.End R S) (S →ₗ[R] M) (this should be a separate Module.simpleLength definition, and if you take Cardinal.toENat you should get Module.length).

Junyan Xu (Apr 10 2025 at 13:32):

This is quite lovely:

import Mathlib
variable (R M : Type*) [Semiring R] [AddCommMonoid M] [Module R M]

def Module.End.domMulActEquiv : letI E := Module.End R M
    E ≃ₗ[DomMulAct E] DomMulAct E where
  __ := DomMulAct.mk
  map_add' _ _ := rfl
  map_smul' _ _ := rfl

combined with (ι →₀ M →ₗ[R] N) ≃ₗ[S] (M →ₗ[R] ι →₀ N) here (For M finite), this is enough to show the number of simple copies is invariant (it also follows from the theory of length if the number is finite), which is probably useful to prove the uniqueness part of Wedderburn--Artin.

Edison Xie (Apr 10 2025 at 14:55):

what's DomMulAct?

Aaron Liu (Apr 10 2025 at 14:58):

It lets the type act on the domain

Yaël Dillies (Apr 10 2025 at 14:58):

docs#DomMulAct

Edison Xie (Apr 10 2025 at 14:58):

wait so if it's a type synonym for MulOpposite, what's the difference?

Aaron Liu (Apr 10 2025 at 14:59):

Motivation

Right action can be represented in mathlib as an action of the opposite group Mᵐᵒᵖ. However,
this "domain shift" action cannot be an instance because this would create a "diamond"
(a.k.a. ambiguous notation): if M is a monoid, then how does Mᵐᵒᵖ act on M → M? On the one
hand, Mᵐᵒᵖ acts on M by c • a = a * c.unop, thus we have an action
(c • f) a = f a * c.unop. On the other hand, M acts on itself by multiplication on the left, so
with this new instance we would have (c • f) a = f (c.unop * a). Clearly, these are two different
actions, so both of them cannot be instances in the library.

To overcome this difficulty, we introduce a type synonym DomMulAct M := Mᵐᵒᵖ (notation:
Mᵈᵐᵃ). This new type carries the same algebraic structures as Mᵐᵒᵖ but acts on α → β by this
new action. So, e.g., Mᵈᵐᵃ acts on (M → M) → M by DomMulAct.mk c • F f = F (fun a ↦ c • f a)
while (Mᵈᵐᵃ)ᵈᵐᵃ (which is isomorphic to M) acts on (M → M) → M by
DomMulAct.mk (DomMulAct.mk c) • F f = F (fun a ↦ f (c • a)).

Junyan Xu (Apr 10 2025 at 16:21):

If MulOpposite is used in this case there will be a diamond for Module (MulOpposite E) E with Semiring.toOppositeModule. DomMulAct is the correct type synonym to use to obtain the right instances.

Junyan Xu (Apr 10 2025 at 17:53):

Sorry, it's not really a diamond, the actions are still defeq.

Junyan Xu (Apr 11 2025 at 23:41):

Opened #23963

Edison Xie (Apr 13 2025 at 02:17):

Junyan Xu said:

Opened #23963

So actually I am bit confused here, we both have the same results in two different PRs, how is it gonna work? If yours/my PR got merged do we delete the other one or do we adapt to each others?

Junyan Xu (Apr 13 2025 at 13:01):

I think my PR now includes all the end results from your PR. Since I adopted your statements I'm adding you as coauthors. If my PR gets merged, but you think some intermediate results in your PR is worth keeping, you might leave them there to get them reviewed.

Ruben Van de Velde (Apr 13 2025 at 13:31):

Please add a note to that effect on the PRs as well

Junyan Xu (Apr 13 2025 at 13:49):

I added "A replacement of #23583 with more meaningful intermediate results." in the description of #23963.

#23583 depends on another PR and still has "wip" in the title so I think it's unlikely that it gets merged first ...

Edison Xie (Apr 13 2025 at 14:10):

it's no longer a WIP I just forgot to change :((, the dependent PR is because @Eric Wieser wants to consult someone's opinion and that some one has yet replied in a week :((, however you have a point I should probly just close #23583 :smiling_face_with_tear:

Edison Xie (Apr 13 2025 at 14:43):

closed #23583

Edison Xie (Apr 13 2025 at 14:46):

I think #23963 also covers part of 074E by the use of IsIsotypic for simple rings? @Junyan Xu

Eric Wieser (Apr 13 2025 at 14:50):

I think some intermediate results from that PR like TwoSidedIdeal.span_eq_bot would still be good to have

Edison Xie (Apr 13 2025 at 14:51):

Eric Wieser said:

I think some intermediate results from that PR like TwoSidedIdeal.span_eq_bot would still be good to have

I will open a separate PR if necessary :)

Junyan Xu (Apr 13 2025 at 17:16):

Edison Xie said:

I think #23963 also covers part of 074E by the use of IsIsotypic for simple rings? Junyan Xu

I think the PR only covered parts (1) and (2) so far. (2) is equivalent to A being a semisimple A-module, i.e. A is a semisimple ring.

Edison Xie (Apr 14 2025 at 10:11):

Junyan Xu said:

Edison Xie said:

I think #23963 also covers part of 074E by the use of IsIsotypic for simple rings? Junyan Xu

I think the PR only covered parts (1) and (2) so far. (2) is equivalent to A being a semisimple A-module, i.e. A is a semisimple ring.

I have a whole file on 074E in our brauer project will PR after you get that merged :rolling_on_the_floor_laughing:

Junyan Xu (Apr 19 2025 at 11:17):

:merge: #24119 (+212 -116) is a preliminary PR with little mathematical content.
:pr-open: #23963 (+407 -20) is basic isotypic API + Wedderburn–Artin for Artinian simple rings.
:pr-open: #24192 (+484 -60) is more advanced isotypic API + Wedderburn–Artin for semisimple rings (module docstrings are added here).
Previous discussions:
#mathlib4 > two-sided ideals @ 💬
#mathlib4 > independent submodules @ 💬

Edison Xie (Apr 19 2025 at 19:31):

Junyan Xu said:

#24119 (+212 -116) is a preliminary PR with little mathematical content.

reviewed #24119!

Junyan Xu (Apr 21 2025 at 15:35):

Do we have this in the Brauer group repo? This is 28.F4 on Lorenz and I think it leads to a prove of the uniqueness part of Wedderburn--Artin (simple case) without talking about modules of the matrix algebra, using endomorphism algebras as substitutes.

import Mathlib

variable {ι R M : Type*} [Semiring R] [AddCommMonoid M] [Module R M] [Finite ι]

namespace Module.End

def ringHomEndFinsupp : End (End R M) M →+* End (End R (ι →₀ M)) (ι →₀ M) where
  toFun f :=
  { __ := Finsupp.mapRange.addMonoidHom f
    map_smul' g x := sorry }
  map_one' := _
  map_mul' := _
  map_zero' := _
  map_add' := _

def ringEquivEndFinsupp [Nonempty ι] :
    End (End R M) M ≃+* End (End R (ι →₀ M)) (ι →₀ M) where

end Module.End

Edison Xie (Apr 21 2025 at 16:07):

I have the uniqueness of Wedderburn using stack 074E

Edison Xie (Apr 21 2025 at 16:09):

Junyan Xu said:

Do we have this in the Brauer group repo? This is 28.F4 on Lorenz and I think it leads to a prove of the uniqueness part of Wedderburn--Artin (simple case) without talking about modules of the matrix algebra, using endomorphism algebras as substitutes.

import Mathlib

variable {ι R M : Type*} [Semiring R] [AddCommMonoid M] [Module R M] [Finite ι]

namespace Module.End

def ringHomEndFinsupp : End (End R M) M →+* End (End R (ι →₀ M)) (ι →₀ M) where
  toFun f :=
  { __ := Finsupp.mapRange.addMonoidHom f
    map_smul' g x := sorry }
  map_one' := _
  map_mul' := _
  map_zero' := _
  map_add' := _

def ringEquivEndFinsupp [Nonempty ι] :
    End (End R M) M ≃+* End (End R (ι →₀ M)) (ι →₀ M) where

end Module.End

and I have this for a different purpose, I can't remember what it exactly is but it's either for double centralizer theorem or skolem-noether

Junyan Xu (Apr 21 2025 at 16:17):

Turns out it's easy using a bit of induction (and no need of finiteness):

@[simps] noncomputable def ringHomEndFinsupp :
    End (End R M) M →+* End (End R (ι →₀ M)) (ι →₀ M) where
  toFun f :=
  { toFun := Finsupp.mapRange.addMonoidHom f
    map_add' := map_add _
    map_smul' g x := x.induction_linear (by simp)
      (fun _ _ h h'  by rw [smul_add, map_add, h, h', map_add, smul_add]) fun i m  by
        ext j
        show f (Finsupp.lapply j ∘ₗ g ∘ₗ Finsupp.lsingle i  m) = _
        rw [map_smul]
        simp }
  map_one' := by ext; simp
  map_mul' _ _ := by ext; simp
  map_zero' := by ext; simp
  map_add' _ _ := by ext; simp

@[simps!] noncomputable def ringEquivEndFinsupp (i : ι) :
    End (End R M) M ≃+* End (End R (ι →₀ M)) (ι →₀ M) where
  __ := ringHomEndFinsupp ι
  invFun f :=
  { toFun m := f (Finsupp.single i m) i
    map_add' _ _ := by simp
    map_smul' g m := let g := Finsupp.mapRange.linearMap g
      show _ = g _ i by rw [ g.smul_def,  map_smul]; simp [g] }
  left_inv _ := by ext; simp
  right_inv f := by
    ext x j
    show f (Finsupp.lsingle (R := R) (M := M) i ∘ₗ Finsupp.lapply j  x) i = _
    rw [map_smul]
    simp

(Edit: added RingEquiv version)


Last updated: May 02 2025 at 03:31 UTC