Zulip Chat Archive

Stream: general

Topic: slow elaboration of a proof


Yakov Pechersky (Jan 03 2022 at 23:02):

Consider the following on master:

import ring_theory.laurent_series

lemma is_unit_of_mem_non_zero_divisors {G₀ : Type*} [group_with_zero G₀]
  {x : G₀} (hx : x  non_zero_divisors G₀) :
  is_unit x :=
⟨⟨x, x⁻¹, mul_inv_cancel (non_zero_divisors.ne_zero hx),
  inv_mul_cancel (non_zero_divisors.ne_zero hx)⟩, rfl

set_option profiler true

instance {K : Type*} [field K] : is_fraction_ring (power_series K) (laurent_series K) :=
{ map_units := begin
    rintro y, hy⟩,
    rw [laurent_series.coe_algebra_map, subtype.coe_mk],
    refine is_unit_of_mem_non_zero_divisors _,
    have : function.injective (hahn_series.of_power_series  K) :=
      hahn_series.of_power_series_injective,
    exact ring_hom.map_mem_non_zero_divisors (hahn_series.of_power_series  K) this hy
  end,
  surj := sorry,
  eq_iff_exists := sorry }

#exit

On my machine it takes 40 seconds, where the offending line seems to be the one starting with exact ring_hom.... What's going on here?

Yakov Pechersky (Jan 03 2022 at 23:03):

Something else is up too -- if I change the proof to

{ map_units := begin
    rintro y, hy⟩,
    rw [laurent_series.coe_algebra_map],
    refine is_unit_of_mem_non_zero_divisors _,
    have : function.injective (algebra_map (power_series K) (laurent_series K)) :=
      hahn_series.of_power_series_injective,
    sorry,
  end,

that is also very slow

Eric Rodriguez (Jan 03 2022 at 23:07):

injective algebra maps and slow functions :) does specifying the TC arguments speed it up?

Alex J. Best (Jan 03 2022 at 23:28):

I don't know the root cause, but this is some sort of universe issue, changing to

universe u
instance {K : Type*} [field K] : is_fraction_ring (power_series K) (laurent_series K) :=
{ map_units := begin
    rintro y, hy⟩,
    rw [laurent_series.coe_algebra_map, subtype.coe_mk],
    refine is_unit_of_mem_non_zero_divisors _,
    have : function.injective (hahn_series.of_power_series  K) :=
      hahn_series.of_power_series_injective,
    exact ring_hom.map_mem_non_zero_divisors (hahn_series.of_power_series  K) this hy,
  end,
  surj := sorry,
  eq_iff_exists := sorry }

it becomes instant for me, edit: ok maybe not instant but seems way faster

Yakov Pechersky (Jan 03 2022 at 23:28):

@Eric Rodriguez which of the TC arguments? For which statement?

Yakov Pechersky (Jan 03 2022 at 23:29):

Even with universes, this is slow for me:

import ring_theory.laurent_series

universe u

lemma is_unit_of_mem_non_zero_divisors {G₀ : Type u} [group_with_zero G₀]
  {x : G₀} (hx : x  non_zero_divisors G₀) :
  is_unit x :=
⟨⟨x, x⁻¹, mul_inv_cancel (non_zero_divisors.ne_zero hx),
  inv_mul_cancel (non_zero_divisors.ne_zero hx)⟩, rfl

set_option profiler true

instance {K : Type u} [field K] : is_fraction_ring (power_series K) (laurent_series K) :=
{ map_units := begin
    rintro y, hy⟩,
    rw [laurent_series.coe_algebra_map],
    refine is_unit_of_mem_non_zero_divisors _,
    have : function.injective (algebra_map (power_series K) (laurent_series K)) :=
      hahn_series.of_power_series_injective,
    sorry,
  end,
  surj := sorry,
  eq_iff_exists := sorry }

#exit

Yakov Pechersky (Jan 03 2022 at 23:30):

But I can corroborate that {K : Type u} speeds it up!

Alex J. Best (Jan 03 2022 at 23:31):

Hm very strange, I have that exact file and it is only a second or so

Yakov Pechersky (Jan 03 2022 at 23:32):

Alex, with the exact line or the function.injective (algebra_map ...) line?

Alex J. Best (Jan 03 2022 at 23:33):

Oh right sorry, with exact + universes it is fast

Alex J. Best (Jan 03 2022 at 23:34):

But the second one is still slow

Yakov Pechersky (Jan 03 2022 at 23:38):

Strange. Gonna sweep it under the rug and just PR with the fast version. Thanks for the quick fix! #11220


Last updated: Dec 20 2023 at 11:08 UTC