Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(algebra/jordan/triple): Introduce Jordan triples #11553

Open
wants to merge 49 commits into
base: master
Choose a base branch
from

Conversation

mans0954
Copy link
Collaborator

@mans0954 mans0954 commented Jan 19, 2022

Introduces Jordan triples and establishes some basic properties.

This is a sibling PR to #11073, which introduces Jordan rings. A subsequent PR will show that all Jordan rings also have a Jordan triple product. Conversely, every element a of a Jordan triple A induces a Jordan ring multiplication on A (the a-homotope).


Open in Gitpod

@mans0954 mans0954 added the awaiting-review The author would like community review of the PR label Jan 19, 2022
@eric-wieser eric-wieser added awaiting-author A reviewer has asked the author a question or requested changes and removed awaiting-review The author would like community review of the PR labels Jan 19, 2022
... = ⦃a, b, a⦄ + 2•⦃a, b, c⦄ + ⦃c, b, c⦄ : by rw two_nsmul

/-- Define the multiplication operator `D` -/
@[simps] def D (a b : A) : add_monoid.End A :=
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a pretty bad name! Isn't there anything more explicit in the literature?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's usually written $D(a,b)$ in LaTeX (occasionally $L(a,b)$ or $a \Box b$). Normally it isn't introduced with a name, I got the term "multiplication operator" from N.A. Altwaijry and C.M. Edwards, The Banach-Lie algebra of multiplication operators on a JBW∗ -triple. J. Funct. Anal. 254 (2008), 2866-2892.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mul or mult would already be a better name. You can't just use a letter.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fully it's is_tp.D. If a symbol like +, * etc can represent a bilinear map, why not D?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+ and * are notation; feel free to introduce D as local notation or an abbreviation. But the convention is that the name is descriptive.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kbuzzard, you say this, but we have algebraic_geometry.AffineScheme.Γ! I think that one is due a rename to .Gamma or something.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We also have polynomial.C, polynomial.X.

Copy link
Collaborator

@YaelDillies YaelDillies left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

etc... but we need to decide on the naming convention for the middle argument.

src/algebra/ternary.lean Outdated Show resolved Hide resolved
src/algebra/ternary.lean Outdated Show resolved Hide resolved
src/algebra/ternary.lean Outdated Show resolved Hide resolved
src/algebra/ternary.lean Outdated Show resolved Hide resolved
@mans0954
Copy link
Collaborator Author

etc... but we need to decide on the naming convention for the middle argument.

*_mid?

@leanprover-community-bot-assistant leanprover-community-bot-assistant added the merge-conflict Please `git merge origin/master` then a bot will remove this label. label Jan 29, 2022
@leanprover-community-bot-assistant leanprover-community-bot-assistant removed the merge-conflict Please `git merge origin/master` then a bot will remove this label. label Feb 2, 2022
@mans0954
Copy link
Collaborator Author

mans0954 commented Feb 3, 2022

etc... but we need to decide on the naming convention for the middle argument.

Zulip thread: https://leanprover.zulipchat.com/#narrow/stream/113488-general/topic/Middle.20argument

Was a convention agreed for this?

@leanprover-community-bot-assistant leanprover-community-bot-assistant removed the blocked-by-other-PR This PR depends on another PR which is still in the queue. A bot manages this label via PR comment. label Feb 3, 2022
@mans0954
Copy link
Collaborator Author

mans0954 commented Feb 3, 2022

I've redefined the triple product along the lines discussed in #11575. I still haven't managed to redefine the Q operator along the lines @eric-wieser suggests.

by rw [map_add, add_monoid_hom.add_apply, add_monoid_hom.add_apply]

lemma add_middle (A : Type*) [add_comm_monoid A] [has_trilinear_tp A] (a b₁ b₂ c : A) :
⦃a, b₁ + b₂, c⦄ = ⦃a, b₁, c⦄ + ⦃a, b₂, c⦄ := by rw [map_add, add_monoid_hom.add_apply]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is (or should be) add_monoid_hom.map_add₂

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure there is a add_monoid_hom.map_add₂? Perhaps there should be? Did you mean linear_map.map_add₂?

theorem map_add₂ (f : M →ₛₗ[ρ₁₂] N →ₛₗ[σ₁₂] P) (x₁ x₂ y) : f (x₁ + x₂) y = f x₁ y + f x₂ y :=

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eric-wieser I guess the next step would be to define something like this:

class is_jordan_triple (R : Type u) [comm_ring R] (ρ : R →+* R)
(A : Type v) [add_comm_group A] [module R A]
  extends is_jordan_tp A :=
(triple_smul₁ : ∀ (r : R) (a b c : A), ⦃r•a, b, c⦄ = r • ⦃a, b, c⦄)
(triple_smul₂ : ∀ (r : R) (a b c : A), ⦃a, r•b, c⦄ = (ρ r) • ⦃a, b, c⦄)

But we then need to show that thetp is an instance of A →ₛₗ[ring_hom.id] A →ₛₗ[ρ] A →ₛₗ[ring_hom.id] A, and it's not immediately clear to me how to formulate that statement.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something along these lines, perhaps?

class is_jordan_triple (S : Type u) [comm_semiring S] [star_ring S]
(A : Type v) [add_comm_group A] [module S A]
  extends is_jordan_tp A :=
(triple_smul₁ : ∀ (s : S) (a b c : A), ⦃s•a, b, c⦄ = s • ⦃a, b, c⦄)
(triple_smul₂ : ∀ (s : S) (a b c : A), ⦃a, s•b, c⦄ = (star s) • ⦃a, b, c⦄)

variables (S : Type u) [comm_semiring S] [star_ring S]
variables {A : Type v} [add_comm_group A] [module S A]

def sesterlinear [is_jordan_triple S A] : A →ₗ[S] A →ₛₗ[star_ring_end S] A →ₗ[S] A := {
  to_fun := λ a, {
    to_fun := λ b, {
      to_fun := λ c, ⦃a, b, c⦄,
      map_add' := λ c₁ c₂, sorry,
      map_smul' := sorry,
    },
    map_add' := sorry,
    map_smul':= sorry,
  },
  map_add' := λ a₁ a₂, sorry,
  map_smul' := sorry,
}

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Trying something like this:

import algebra.lie.of_associative

universes u v

/-- An additive commutative monoid with a trilinear triple product -/
class has_triadditive_tp (A : Type*) [add_comm_group A] := (tp : A →+ A →+ A →+ A )

localized "notation ⦃a, b, c⦄ := has_triadditive_tp.tp a b c" in triple

class has_sesterlinear_tp (R : Type u) [comm_semiring R] [star_ring R] (A : Type*)
[add_comm_group A] [module R A] :=
(tp : A →ₗ[R] A →ₛₗ[star_ring_end R] A →ₗ[R] A )

instance : star_ring ℤ := star_ring_of_comm


lemma add_left {A : Type*} [add_comm_group A] [has_triadditive_tp A] (a₁ a₂ b c : A) :
  ⦃a₁ + a₂, b, c⦄ = ⦃a₁, b, c⦄ + ⦃a₂, b, c⦄ :=
by rw [map_add, add_monoid_hom.add_apply, add_monoid_hom.add_apply]

instance has_triadditive_tp_to_has_sesterlinear_tp {A : Type v} [add_comm_group A] 
[has_triadditive_tp A] :  has_sesterlinear_tp ℤ A := {
  tp := {
    to_fun := λ a, {
    to_fun := λ b, {
      to_fun := λ c, ⦃a, b, c⦄,
      map_add' := λ c₁ c₂, sorry,
      map_smul' := sorry,
    },
    map_add' := sorry,
    map_smul':= sorry,
  },
  map_add' := λ a₁ a₂, λ b, linear_map.ext (λ c, add_left a₁ a₂ b c)
  map_smul' := sorry,
  }
}

But it doesn't quite meet up in the middle

mvp.lean:33:28
type mismatch at application
  linear_map.ext (λ (c : A), add_left a₁ a₂ b c)
term
  λ (c : A), add_left a₁ a₂ b c
has type
  ∀ (c : A),
    ⇑(⇑(⇑has_triadditive_tp.tp (a₁ + a₂)) b) c =
      ⇑(⇑(⇑has_triadditive_tp.tp a₁) b) c + ⇑(⇑(⇑has_triadditive_tp.tp a₂) b) c
but is expected to have type
  ∀ (x : A), ⇑?m_10 x = ⇑?m_11 x

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a discrepancy here that my brain can't quite unpick at the moment. →+ is a add_monoid_hom, whereas →ₛₗ[star_ring_end R] is an instance of add_monoid_hom_class. So it is not quite right in lean to say that →ₛₗ[star_ring_end R] is an instance of →+ - which seems a bit unsatisfactory.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's the point of add_monoid_hom_class: you don't have to use add_monoid_hom to talk about additive monoid homs.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So why is the definition of →+

infixr ` →+ `:25 := add_monoid_hom

and not

infixr ` →+ `:25 := add_monoid_hom_class

?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add_monoid_hom A B is the type of additive monoid homomorphisms from A to B. add_monoid_hom_class F A B states that an already existing type F is a type of additive monoid homomorphisms from A to B. So for example add_monoid_hom is an add_monoid_hom_class, but so is add_equiv, ring_hom, continuous_add_monoid_hom...

Put another way, add_monoid_hom is here to be studied as an object on its own, by giving it an algebraic structure, an order, a topology... while add_monoid_hom_class is a way to talk about additive monoid homs individually.

src/algebra/jordan/triple.lean Outdated Show resolved Hide resolved
src/algebra/jordan/triple.lean Outdated Show resolved Hide resolved
src/algebra/jordan/triple.lean Outdated Show resolved Hide resolved
@leanprover-community-bot-assistant leanprover-community-bot-assistant added the merge-conflict Please `git merge origin/master` then a bot will remove this label. label Mar 7, 2022
@semorrison semorrison added the too-late This PR was ready too late for inclusion in mathlib3 label Jul 16, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
awaiting-author A reviewer has asked the author a question or requested changes too-late This PR was ready too late for inclusion in mathlib3
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

7 participants