Zulip Chat Archive

Stream: kbb

Topic: splitting fields


Johan Commelin (Sep 14 2018 at 17:28):

It would be great if we could push the splitting fields branch to the point where we can define the Galois group of a splitting field.

Johan Commelin (Sep 14 2018 at 17:29):

So far we can adjoint the root of an irreducible polynomial. There is a sorryd statement of the universal property of adjoining a root.

Johan Commelin (Sep 14 2018 at 17:29):

Ooh, the branch I'm talking about is not in this repo, but in the community mathlib.

Johan Commelin (Sep 14 2018 at 17:31):

If we combine this with the stuff on Hecke operators, then we'll have the formal abstract of Kevin's paper (modulo one fact that requires a Mjölnir to prove).

Johan Commelin (Sep 17 2018 at 07:12):

Little hole in the quotient ring api. I'll leave it to others to :golf:

def quotient_ring.lift {α : Type u} {β : Type v} [comm_ring α] [comm_ring β]
(S : set α) [is_ideal S] (f : α  β) [is_ring_hom f] (H :  {a}, a  S  f a = 0) :
quotient_ring.quotient S  β :=
begin
  refine @quotient.lift _ _ (quotient_ring.quotient_rel S) f _,
  intros a b h,
  apply eq_of_sub_eq_zero,
  rw is_submodule.quotient_rel_eq at h,
  simpa only [is_ring_hom.map_sub f] using H h,
end

Johan Commelin (Sep 17 2018 at 07:29):

Here is adjoin_root.lift:

def lift {L} [discrete_field L] (i : K  L) [is_field_hom i]
  (x : L) (h : f.eval₂ i x = 0) : (adjoin_root f)  L :=
begin
  refine @quotient_ring.lift _ _ _ _
    (@span _ _ _ ring.to_module ({f} : set (polynomial K))) (is_ideal.span _)
    (eval₂ i x) _ _,
  intros g H,
  simp [span_singleton] at H,
  cases H with y H,
  dsimp at H,
  rw [ H, eval₂_mul],
  simp [h],
end

Johan Commelin (Sep 17 2018 at 07:29):

Which can undoubtly be golfed

Johan Commelin (Sep 17 2018 at 07:30):

@Mario Carneiro I think the next step was some really crazy inductive proof, right?

Mario Carneiro (Sep 17 2018 at 07:31):

yes

Mario Carneiro (Sep 17 2018 at 07:31):

the next step is the splitting field for one polynomial

Mario Carneiro (Sep 17 2018 at 07:33):

Do we know that every polynomial over a field has an irreducible factor?

Johan Commelin (Sep 17 2018 at 07:35):

I think so

Johan Commelin (Sep 17 2018 at 07:35):

We know that polynomial K is a PID

Johan Commelin (Sep 17 2018 at 07:35):

and every PID is a UFD

Johan Commelin (Sep 17 2018 at 07:35):

I think that latter fact is now also in mathlib

Mario Carneiro (Sep 17 2018 at 07:35):

we have UFDs?

Johan Commelin (Sep 17 2018 at 07:36):

Hmm, I guess there is a standard lemma on lift_mk or something?

Johan Commelin (Sep 17 2018 at 07:36):

We'll also need that.

Mario Carneiro (Sep 17 2018 at 07:36):

yes

Johan Commelin (Sep 17 2018 at 07:36):

Yes, Johannes added UFD's after Orsay

Johan Commelin (Sep 17 2018 at 07:36):

So we need this lift_mk for quotient rings, and then for adjoin root.

Mario Carneiro (Sep 17 2018 at 07:36):

the fact you want about lift is composition with the coercion from K, and value at the root

Mario Carneiro (Sep 17 2018 at 07:38):

is the proof constructive? (i.e. is there a function from a polynomial to its smallest irreducible factor or something)

Johan Commelin (Sep 17 2018 at 07:38):

Not only stuff from K, right? Also K[X]

Johan Commelin (Sep 17 2018 at 07:38):

Hmm, factoring is hard.

Mario Carneiro (Sep 17 2018 at 07:38):

that isn't needed, it follows by homness

Johan Commelin (Sep 17 2018 at 07:39):

???

Mario Carneiro (Sep 17 2018 at 07:39):

but I guess the quotient map is equal to the eval map, we want to know that

Mario Carneiro (Sep 17 2018 at 07:40):

oh, you didn't prove lift is a field hom

Mario Carneiro (Sep 17 2018 at 07:40):

we definitely need that

Johan Commelin (Sep 17 2018 at 07:43):

I didn't even prove it is a ring hom

Johan Commelin (Sep 17 2018 at 07:44):

Working on that now

Mario Carneiro (Sep 17 2018 at 07:44):

I think those are the same

Johan Commelin (Sep 17 2018 at 07:49):

@Mario Carneiro I need some help to get the right statements for these API things: this is in the quotient_ring namespace:

def lift (S : set α) [is_ideal S] (f : α  β) [is_ring_hom f] (H :  (a : α), a  S  f a = 0) :
quotient_ring.quotient S  β :=
begin
  refine @quotient.lift _ _ (quotient_ring.quotient_rel S) f _,
  intros a b h,
  apply eq_of_sub_eq_zero,
  rw is_submodule.quotient_rel_eq at h,
  simpa only [is_ring_hom.map_sub f] using H _ h,
end

lemma lift_mk {S : set α} [is_ideal S] {f : α  β} [is_ring_hom f] {H :  (a : α), a  S  f a = 0} {a : α} :
lift S f H a = f a :=
begin

end

Johan Commelin (Sep 17 2018 at 07:49):

Should the latter be a simp-lemma?

Johan Commelin (Sep 17 2018 at 07:49):

At the moment the ⟦a⟧ notation is broken.

Johan Commelin (Sep 17 2018 at 07:50):

This is my first time working with quotients in Lean...

Mario Carneiro (Sep 17 2018 at 07:50):

I forget the details but I don't think ⟦⟧ is part of the interface

Mario Carneiro (Sep 17 2018 at 07:51):

The only "public" functions are the map from K, and the root element

Johan Commelin (Sep 17 2018 at 07:52):

No, I'm working on quotient rings at the moment.

Johan Commelin (Sep 17 2018 at 07:52):

Splitting field will come later.

Johan Commelin (Sep 17 2018 at 07:52):

We don't even have lift for quotient rings at the moment.

Johan Commelin (Sep 17 2018 at 07:53):

I guess we want that notation for general quotient rings, right?

Mario Carneiro (Sep 17 2018 at 07:53):

ah okay

Mario Carneiro (Sep 17 2018 at 07:53):

you want to redefine mk for that

Mario Carneiro (Sep 17 2018 at 07:54):

that way you can give it the right type and find it with typeclass inference

Mario Carneiro (Sep 17 2018 at 07:54):

when you prove it is a ring hom

Johan Commelin (Sep 17 2018 at 07:55):

Aah, local attribute [instance] quotient_rel fixes it.

Mario Carneiro (Sep 17 2018 at 07:56):

that won't help outside the section

Mario Carneiro (Sep 17 2018 at 07:56):

you still want a public mk function

Johan Commelin (Sep 17 2018 at 08:00):

Right. Quotient rings already had that. But they didn't have lift

Mario Carneiro (Sep 17 2018 at 08:01):

in that case you should use it in the statement of lift_mk

Johan Commelin (Sep 17 2018 at 08:19):

Ok, this is what I now have

namespace quotient_ring -- move this to the right file
open is_submodule
variables {α : Type u} [comm_ring α] {β : Type v} [comm_ring β]

local attribute [instance] quotient_rel

def lift (S : set α) [is_ideal S] (f : α  β) [is_ring_hom f] (H :  (a : α), a  S  f a = 0) :
quotient S  β :=
begin
  refine @quotient.lift _ _ (quotient_rel S) f _,
  intros a b h,
  apply eq_of_sub_eq_zero,
  rw quotient_rel_eq at h,
  simpa only [is_ring_hom.map_sub f] using H _ h,
end

@[simp] lemma lift_mk {S : set α} [is_ideal S] {f : α  β} [is_ring_hom f] {H :  (a : α), a  S  f a = 0} {a : α} :
lift S f H a = f a := rfl

#print quotient_ring.is_ring_hom_mk

instance {S : set α} [is_ideal S] {f : α  β} [is_ring_hom f] {H :  (a : α), a  S  f a = 0} :
is_ring_hom (lift S f H) :=
{ map_one := by show lift S f H 1 = 1; simp [is_ring_hom.map_one f],
  map_add := λ a₁ a₂, quotient.induction_on₂ a₁ a₂ $ λ a₁ a₂, begin
    show lift S f H (mk a₁ + mk a₂) = lift S f H a₁ + lift S f H a₂,
    have := quotient_ring.is_ring_hom_mk S,
    rw  this.map_add,
    show lift S f H (a₁ + a₂) = lift S f H a₁ + lift S f H a₂,
    simp only [lift_mk, is_ring_hom.map_add f],
  end,
  map_mul := λ a₁ a₂, quotient.induction_on₂ a₁ a₂ $ λ a₁ a₂, begin
    show lift S f H (mk a₁ * mk a₂) = lift S f H a₁ * lift S f H a₂,
    have := quotient_ring.is_ring_hom_mk S,
    rw  this.map_mul,
    show lift S f H (a₁ * a₂) = lift S f H a₁ * lift S f H a₂,
    simp only [lift_mk, is_ring_hom.map_mul f],
  end }

end quotient_ring

Chris Hughes (Sep 17 2018 at 08:33):

You should be able to use quotient.lift' instead of @quotient.lift ...

Johan Commelin (Sep 17 2018 at 08:34):

Yes, I've been golfing them a bit. I didn't use the lift' version though.

Johan Commelin (Sep 17 2018 at 08:49):

Ok, I pushed a bunch of changes

Johan Commelin (Sep 17 2018 at 08:49):

@Mario Carneiro I think I might want to try the induction proof now...

Johan Commelin (Sep 17 2018 at 09:02):

Hmm, so we have UFD's but we don't know that K[X] is an example of a UFD

Johan Commelin (Sep 17 2018 at 09:03):

What we need to know is that if we have a polynomial f with a root x, then we can factor f as (X - x) * g, and the degree of g is lower than degree f.

Johan Commelin (Sep 17 2018 at 09:04):

@Chris Hughes Did you have stuff like that in your QR project?

Patrick Massot (Sep 17 2018 at 09:04):

This is Euclidean division

Patrick Massot (Sep 17 2018 at 09:04):

I think we have that

Chris Hughes (Sep 17 2018 at 09:04):

It's in polynomial.lean

Johan Commelin (Sep 17 2018 at 09:04):

Great

Chris Hughes (Sep 17 2018 at 09:04):

dvd_iff_is_root or something

Chris Hughes (Sep 17 2018 at 09:07):

Can't find it. We have similar stuff. p %ₘ (X - C a) = C (p.eval a) and dvd_iff_mod_by_monic_eq_zero

Johan Commelin (Sep 17 2018 at 09:07):

@Johannes Hölzl Have you thought about PID → UFD in Lean?

Chris Hughes (Sep 17 2018 at 09:08):

Euclidean_domain -> UFD might be easier, and that all that's needed.

Johannes Hölzl (Sep 17 2018 at 09:10):

I didn't think about it yet, but I surely want it. I guess that's my project for today :-)

Johan Commelin (Sep 17 2018 at 09:10):

Awesome!

Johan Commelin (Sep 17 2018 at 09:11):

Your version of UFD is not a Prop. Do we also want a version where it is a prop?

Patrick Massot (Sep 17 2018 at 09:11):

Johan, what's your plan? Are you still working towards a specific goal before the birthday?

Johannes Hölzl (Sep 17 2018 at 09:12):

when is the b-day again?

Johan Commelin (Sep 17 2018 at 09:12):

Friday

Johan Commelin (Sep 17 2018 at 09:12):

I'm not competent enough to work on pi

Johan Commelin (Sep 17 2018 at 09:12):

Maybe I shouldn't distract the experts, and let them work on that.

Patrick Massot (Sep 17 2018 at 09:13):

I think what is really needed is Mario and Johannes telling us whether they think anything from the kbb repository could be PR'ed on Friday

Johan Commelin (Sep 17 2018 at 12:16):

How would you even show that K[X] is an example of a UFD, with the current definition of UFD? You have to give an algorithm that factors polynomials, right? I'm not sure if those even exist for arbitrary K...

Johan Commelin (Sep 17 2018 at 12:17):

Or should we just use choice, somehow?

Johan Commelin (Sep 17 2018 at 12:17):

@Johannes Hölzl did you have a particular plan here?

Johannes Hölzl (Sep 17 2018 at 12:18):

Yes, in the worst case I will use choice.

Johan Commelin (Sep 17 2018 at 12:18):

Ok, I see

Johan Commelin (Sep 17 2018 at 12:53):

Here is a little hole in the polynomial api:

namespace polynomial

variables {R : Type u} [comm_semiring R] [decidable_eq R]

@[simp] lemma map_id (f : polynomial R) : map id f = f := sorry

end polynomial

Johan Commelin (Sep 17 2018 at 12:53):

How would I unsorry that?

Johannes Hölzl (Sep 17 2018 at 12:56):

@Johan Commelin By the way, kbb doesn't build for me: SL2Z_M.finitely_many_orbits is missing

Johannes Hölzl (Sep 17 2018 at 13:00):

@Johan Commelin eval₂ is defined using the finsupp.sum operator. The combination of single_eq_C_mul_X and finsupp.sum_single should be enough. With sum_single you can proof that the polynomial f has a sum representation over single and with single_eq_C_mul_X you change the representation to C (id a) * X^n

Johan Commelin (Sep 17 2018 at 13:04):

@Johan Commelin By the way, kbb doesn't build for me: SL2Z_M.finitely_many_orbits is missing

Aaah, Kenny changed this. It is now

def finiteness (hm : m  0) : fintype (quotient $ action_rel $ SL2Z_M_ m) :=
@fintype.of_equiv _ _ (reps.fintype m hm) (reps_equiv m hm).symm

on lines 344-345 of SL2Z_generators.lean

Johan Commelin (Sep 17 2018 at 13:05):

I think that error was in the Hecke operator file? I'm afraid that file won't really see any improvements. I don't have the time, and probably it is not realistic to work on it before Friday anyway.

Johan Commelin (Sep 17 2018 at 13:09):

@[simp] lemma map_id (f : polynomial R) : map id f = f :=
by dsimp [map,eval₂]; conv { to_lhs, congr, skip, funext, rw  single_eq_C_mul_X }; simp

Johan Commelin (Sep 17 2018 at 13:09):

@Johannes Hölzl Thanks, done :lol:

Johan Commelin (Sep 17 2018 at 17:26):

I think that progress on splitting fields will require a bit of an api for k[x] as UFD. Things like units of R[x] is units of R. Every polynomial in k[x] of degree (not nat_degree!) equal to 0 is a unit, and vice versa. All polynomials of degree 1 are irreducible. Etc...

Johan Commelin (Sep 17 2018 at 17:27):

I have not started on any of this. But I also found myself mentally blocked on writing down the definition of a splitting field.

Johan Commelin (Sep 17 2018 at 17:27):

I suspect those issues are related.

Johannes Hölzl (Sep 19 2018 at 18:16):

I don't know if this is still needed, but PID -> UFD is finished now

Patrick Massot (Sep 19 2018 at 18:19):

Nice! I think the hope was to make progress on splitting field, which will probably not happen very soon. But this is good to know anyway.

Johan Commelin (Sep 19 2018 at 18:40):

@Johannes Hölzl Cool. Thanks a lot! I think this should help with the splitting fields branch. The next steps there are probably proving that non-zero constants are exactly the units and linear polynomials are irreducible.

Johan Commelin (Sep 19 2018 at 18:41):

Once that is know, I think we can start some sort of construction of splitting fields that inducts on the degree of the polynomial.


Last updated: Dec 20 2023 at 11:08 UTC