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
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: :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
withh.unit
Done. And updated the henselian PR to use ring.inverse
Last updated: Dec 20 2023 at 11:08 UTC