Zulip Chat Archive
Stream: maths
Topic: Torsors
Bryan Wang (Oct 01 2025 at 16:14):
In mathlib there is docs#AddTorsor but no "MulTorsor", and furthermore AddTorsor is defined in a different (but I presume equivalent) way. I guess the more common definition of torsor is via a free, transitive group action, so something like
import Mathlib.Algebra.Group.Action.Pretransitive
class AddTorsor
(G : Type*) [AddGroup G] (F : Type*) [AddAction G F]
extends AddAction.IsPretransitive G F where
nonempty : Nonempty F
free : ∀ (f : F) (g : G), g +ᵥ f = f → g = 0
@[to_additive (attr := mk_iff)]
class MulTorsor
(G : Type*) [Group G] (F : Type*) [MulAction G F]
extends MulAction.IsPretransitive G F where
nonempty : Nonempty F
free : ∀ (f : F) (g : G), g • f = f → g = 1
Would this be a good definition to have? Surely this has been discussed before, but I'm not sure what is the opinion now.
Kenny Lau (Oct 01 2025 at 16:19):
your proposed definition has different "data"
Bryan Wang (Oct 01 2025 at 16:49):
you mean the IsPretransitive vs free?
Bryan Wang (Oct 01 2025 at 16:50):
If we go with this definition then I will also define free actions separately (right now there are faithful group actions, but not free actions as far as I can tell)
Bryan Wang (Oct 01 2025 at 17:03):
(deleted)
Kenny Lau (Oct 01 2025 at 17:10):
it's missing the vsub
Bryan Wang (Oct 01 2025 at 17:17):
Yeah I think I see the issue, basically the definition above is more like IsTorsor
Bryan Wang (Oct 02 2025 at 03:04):
We can show that the original docs#AddTorsor satisfies IsAddTorsor, and also show things like the equiv to group given a base point, rough sketch:
import Mathlib.Algebra.Group.Action.Pretransitive
import Mathlib.Algebra.AddTorsor.Defs
import Mathlib.GroupTheory.GroupAction.Hom
class IsAddTorsor
(G : Type*) [AddGroup G] (F : Type*) [AddAction G F]
extends AddAction.IsPretransitive G F where
nonempty : Nonempty F
free : ∀ (f : F) (g : G), g +ᵥ f = f → g = 0
@[to_additive (attr := mk_iff)]
class IsMulTorsor
(G : Type*) [Group G] (F : Type*) [MulAction G F]
extends MulAction.IsPretransitive G F where
nonempty : Nonempty F
free : ∀ (f : F) (g : G), g • f = f → g = 1
instance AddTorsor.isAddTorsor {G : Type*} [AddGroup G] {F : Type*} [AddTorsor G F] :
IsAddTorsor G F where
exists_vadd_eq x y := ⟨y -ᵥ x, vsub_vadd' _ _⟩
nonempty := nonempty
free f g h := (vsub_self f) ▸ (h ▸ (vadd_vsub' g f)).symm
@[to_additive]
noncomputable def IsMulTorsor.equiv_group (G : Type*) [Group G] (F : Type*)
[MulAction G F] [IsMulTorsor G F]
(b : F) :
F ≃ G where
toFun f := (toIsPretransitive.exists_smul_eq b f).choose
invFun g := g • b
left_inv := by
refine Function.leftInverse_iff_comp.mpr ?_
ext f; simpa using (toIsPretransitive.exists_smul_eq b f).choose_spec
right_inv := by
refine Function.rightInverse_iff_comp.mpr ?_
ext g; simp only [Function.comp_apply, id_eq]
apply inv_mul_eq_one.mp
apply free b _
rw [mul_smul]
exact inv_smul_eq_iff.mpr
(toIsPretransitive.exists_smul_eq b (g • b)).choose_spec.symm
if this looks ok then maybe I will open a PR with this definition.
Last updated: Dec 20 2025 at 21:32 UTC