Zulip Chat Archive

Stream: Is there code for X?

Topic: Summing over `monoid_hom.range`


Eric Wieser (Jan 08 2021 at 15:34):

I managed to stumble into this proof, but if feels super awkward for something so obvious:

@[to_additive]
lemma finset.prod_filter_univ_exists_eq {α β γ : Type*}
  [fintype α] [fintype β] [comm_monoid γ]
  (f : α  β) (h : function.injective f) {_ : decidable_pred (λ (b : β),  a, f a = b)} (g : β  γ) :
   x in finset.filter (λ (b : β),  a, f a = b) finset.univ, g x =  a, g (f a) :=
begin
  rw finset.prod_subtype (λ x, show x  _   a, x = f a, from _),
  rotate, apply_instance, { simp only [finset.mem_filter, finset.mem_univ, true_and] },
  symmetry,
  apply finset.prod_bij
    (λ a ha, (⟨f a, a, rfl : {x //  (a : α), x = f a}))
    (λ a ha, finset.mem_univ _)
    (λ a ha, _)
    (λ a₁ a₂ ha₁ ha₂ heq, h (subtype.ext_iff.mp heq))
    (λ b hb, let a, hb := b.prop in a, finset.mem_univ _, subtype.ext (by convert hb)⟩),
  refl,
end

lemma finset.sum_filter_univ_mem_monoid_hom_range {α β γ : Type*}
  [fintype α] [fintype β]
    [group α] [group β] [add_comm_monoid γ]
  (f : α →* β) (h : function.injective f) {_ : decidable_pred (λ (b : β), b  f.range)} (g : β  γ) :
   x in finset.filter (λ (b : β), b  f.range) finset.univ, g x =  a, g (f a) :=
begin
  exact finset.sum_filter_univ_exists_eq f h g,
end

Am I missing some lemmas that do most of the lifting for me?

Eric Wieser (Jan 08 2021 at 15:35):

Part of the problem seems to be the lack of a finset version of set.range (docs#finset.range is something completely different)

Eric Wieser (Jan 08 2021 at 16:37):

Aha!

lemma finset.filter_mem_range_univ {α β : Type*}
  [fintype α] [fintype β] [decidable_eq β]
  (f : α  β) {_ : decidable_pred (λ (b : β), b  set.range f)} :
  finset.filter (λ (b : β), b  set.range f) finset.univ = finset.image f finset.univ :=
by { ext, simp }

@[to_additive]
lemma finset.prod_filter_univ_exists_eq {α β γ : Type*}
  [fintype α] [fintype β] [comm_monoid γ]
  (f : α  β) (h : function.injective f) {_ : decidable_pred (λ (b : β),  a, f a = b)} (g : β  γ) :
   x in finset.filter (λ (b : β),  a, f a = b) finset.univ, g x =  a, g (f a) :=
begin
  classical,
  rw finset.prod_image (λ x _ y _ (z : f x = f y), h z),
  refine finset.prod_congr (finset.filter_mem_range_univ f) (λ _ _, rfl),
end

Are these names sensible enough for inclusion in mathlib?

Eric Wieser (Jan 12 2021 at 12:37):

#5708 adds the first one under a better name

Kyle Miller (Jan 12 2021 at 20:14):

I usually use finset.univ.image f. Your very first lemma ends up basically being finset.prod_image in algebra.big_operators.basic:

lemma finset.prod_filter_univ_exists_eq {α β γ : Type*}
  [fintype α] [fintype β] [comm_monoid γ]
  (f : α  β) (h : function.injective f) {_ : decidable_pred (λ (b : β),  a, f a = b)} (g : β  γ) :
   x in finset.univ.filter (λ (b : β),  a, f a = b), g x =  a, g (f a) :=
begin
  haveI : decidable_eq β := by { classical, apply_instance },
  have him : finset.univ.filter (λ (b : β),  a, f a = b) = finset.univ.image f,
  { ext, simp, },
  rw him,
  apply finset.prod_image,
  simp,
  apply h,
end

Kyle Miller (Jan 12 2021 at 20:16):

Oh, missed that that was from Jan 8 (and I appear to have only read the first message).

Eric Wieser (Jan 12 2021 at 20:21):

Right, your him is roughly the lemma I PR'd


Last updated: Dec 20 2023 at 11:08 UTC