Zulip Chat Archive

Stream: maths

Topic: Z_p is a Henselian local ring


Johan Commelin (Sep 03 2021 at 20:44):

class henselian (R : Type*) [comm_ring R] extends local_ring R : Prop :=
(is_henselian :  (f : polynomial R) (hf : f.monic) (a₀ : R) (h₁ : f.eval a₀  maximal_ideal R)
  (h₂ : is_unit (f.derivative.eval a₀)),
   a : R, f.is_root a  (a - a₀  maximal_ideal R))

instance is_adic_complete.henselian (R : Type*)
  [comm_ring R] [local_ring R] [is_adic_complete (maximal_ideal R) R] :
  henselian R :=
-- long proof

instance (p : ) [fact p.prime] : henselian ℤ_[p] := infer_instance

https://github.com/leanprover-community/mathlib/pull/8986/files#diff-cfe5a51d476c544368bad568fb985d5b8dae8a645bd7434e8da6b9a9da5f29e4R664

Johan Commelin (Sep 03 2021 at 20:44):

I still need to clean up a bunch of prerequisites. But the code is sorry free.

Kevin Buzzard (Sep 03 2021 at 22:02):

Dumb maths question: is this equivalent to "a factorization of f mod m into coprime monics lifts"? You've just done the case where a factor is linear.

Kevin Buzzard (Sep 03 2021 at 22:03):

Henselization is I think like localization and completion -- it's unique up to unique isomorphism.

Kevin Buzzard (Sep 03 2021 at 22:05):

Dumb Lean question: why should these things be classes rather than structures? Is it just because they're props so they may as well be?

Adam Topaz (Sep 03 2021 at 22:14):

Kevin Buzzard said:

Dumb maths question: is this equivalent to "a factorization of f mod m into coprime monics lifts"? You've just done the case where a factor is linear.

This is equivalent, but the proof is not easy: stacks#04GG

Adam Topaz (Sep 03 2021 at 22:14):

It's time to work on etale maps :)

Adam Topaz (Sep 03 2021 at 22:15):

(There may be a more elementary proof of this equivalence though.)

Kevin Buzzard (Sep 03 2021 at 22:16):

My feeling is that if we take any interesting class of morphisms of schemes (e.g. finite, etale, affine...) and define this concept for rings and then try to extend it to schemes, we will find out pretty quickly what we should be doing next in algebraic geometry (or we might even find that our current set-up is not ideal).

Johan Commelin (Sep 04 2021 at 10:03):

I've finished cleaning up the whole mess. It's now about 10 PRs

Johan Commelin (Sep 06 2021 at 12:41):

The next two PRs in this saga are

  • #8991 feat(ring_theory/ideal/local_ring): residue field is an algebra
  • #8993 feat(linear_algebra/smodeq): sub_mem, eval

Johan Commelin (Sep 08 2021 at 08:41):

Another one is unblocked:

  • #8994 feat(ring_theory/discrete_valuation_ring): is_Hausdorff

Johan Commelin (Sep 09 2021 at 10:00):

And we're ready for the "big" one:

  • #8986 feat(ring_theory/henselian): Henselian local rings

Johan Commelin (Sep 09 2021 at 10:01):

The PR contains

  -- `R` is a local ring
  let inv : R  R := λ x, if hx : is_unit x then hx.some⁻¹ else 0,
  have hinv :  x, is_unit x  x * inv x = 1,
  { intros x hx, simp only [hx, inv, dif_pos], convert units.mul_inv hx.some, rw hx.some_spec },

as part of a proof.
Should we have a noncomputable monoid_with_zero.inv globally?

Johan Commelin (Sep 09 2021 at 10:02):

Hmm, if the junk value is 1, it could even be defined for arbitrary monoids.

Anne Baanen (Sep 09 2021 at 10:03):

That seems like it would give a lot of defeq issues, if you want to use monoid.inv in the place of group_with_zero.has_inv.inv.

Johan Commelin (Sep 09 2021 at 10:11):

If we define it globally, it should come with a big warning sign: :danger: :bourbaki: :nuclear: :biohazard: USE WITH CARE!

Reid Barton (Sep 09 2021 at 10:17):

probably it should not be called inv, since it isn't the inverse

Kevin Buzzard (Sep 09 2021 at 10:17):

of course the same could be said for inv on a field...

Anne Baanen (Sep 09 2021 at 10:18):

inv_ish? :upside_down:

Anne Baanen (Sep 09 2021 at 10:25):

notation x`☡` := monoid.accursed_unutterable_unsafe_inv

Kevin Buzzard (Sep 09 2021 at 10:26):

That notation is already taken for nat.sub on my branch of mathlib.

Johan Commelin (Sep 09 2021 at 10:54):

It's only three lines of code. I'm fine with keeping it inline in the proof, for now.

Johan Commelin (Sep 09 2021 at 10:55):

If it shows up more often, we can extract it into a global def.

Yakov Pechersky (Sep 09 2021 at 10:58):

We kinda have this already for fields and my wip PR on matrices, where one can upgrade a monoid to a div_inv_monoid over some predicate. Cf fpow

Eric Wieser (Sep 16 2021 at 14:03):

Isn't this docs#ring.inverse?

Eric Wieser (Sep 16 2021 at 14:04):

Which just to keep things interesting, only requires monoid_with_zero

Johan Commelin (Sep 16 2021 at 14:12):

@Eric Wieser Brilliant, so it already exists.

Eric Wieser (Sep 16 2021 at 14:13):

Having looked at its definition, it might be better to replace h.some with h.unit

Johan Commelin (Sep 16 2021 at 14:15):

I don't have thoughts about that

Johan Commelin (Sep 17 2021 at 12:50):

Eric Wieser said:

Having looked at its definition, it might be better to replace h.some with h.unit

Done. And updated the henselian PR to use ring.inverse


Last updated: Dec 20 2023 at 11:08 UTC