Zulip Chat Archive

Stream: new members

Topic: subring of field is integral domain


Chengyan Hu (Jun 25 2025 at 18:27):

Hi! I'm really sorry I got stuck somewhere again. I have:

import Mathlib
open Ideal Padic Nat
variable
{L:Type*}[Field L]
{B : Type*} [CommRing B] [Algebra B L]

And I want to prove B is an integral domain.
I don't have much Idea and what I tried is

have DomainB: IsDomain B:= isDomain (B: subalgebra B L)

And it clearly failed.

Riccardo Brasca (Jun 25 2025 at 18:30):

This is false, isn't it? Take B=L[X]/X2B = L[X]/X^2 and make L a B algebra via X0X \mapsto 0.

Riccardo Brasca (Jun 25 2025 at 18:31):

If you want B to be a subring of L than you want B : Subring L.

Chengyan Hu (Jun 25 2025 at 18:35):

Yeah, I hope B works as a subring. But I checked how Algebra B L works in mathlib, and I think it automatically treat it as there is an embedding?

Chengyan Hu (Jun 25 2025 at 18:36):

class Algebra (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] extends SMul R A where
  /-- Embedding `R →+* A` given by `Algebra` structure.
  Use `algebraMap` from the root namespace instead. -/
  protected algebraMap : R →+* A
  commutes' :  r x, algebraMap r * x = x * algebraMap r
  smul_def' :  r x, r  x = algebraMap r * x

Kenny Lau (Jun 25 2025 at 18:36):

the "embedding" is our "moral" way of saying things

Kenny Lau (Jun 25 2025 at 18:36):

we "morally" think of algebras as embeddings, but it isn't actually required to be injective

Aaron Liu (Jun 25 2025 at 18:36):

Every ring is an algebra, so it clearly doesn't have to be injective

Chengyan Hu (Jun 25 2025 at 18:36):

Ahh I see

Kenny Lau (Jun 25 2025 at 18:36):

it's there because that's how mathematicians think about things and talk about things

Chengyan Hu (Jun 25 2025 at 18:38):

Here is the whole definition of variables Kevin wrote for me, I tried to make a simplification to let it easier to read, but clearly I made a mistake. Sorry for that.

variable
    -- let K be a number field with ring of integers A
    {A K : Type*}
    [CommRing A] [IsDedekindDomain A]
    [Field K] [NumberField K] [Algebra A K]
    [IsFractionRing A K]
    [IsIntegralClosure A  K]
    -- let L be an algebraic closure of K
    {L : Type*} [Field L] [Algebra K L]
    [Algebra A L] [IsScalarTower A K L]
    [IsAlgClosure K L]
    -- and let B be the integral closure of A in L
    {B : Type*} [CommRing B] [Algebra B L]
    [Algebra A B] [IsScalarTower A B L]
    [IsIntegralClosure B A L]

Chengyan Hu (Jun 25 2025 at 18:39):

And I really want B to be showed as an integral domain.

Chengyan Hu (Jun 25 2025 at 18:42):

I believe [IsIntegralClosure B A L] made things different here?

Kenny Lau (Jun 25 2025 at 18:55):

Chengyan Hu said:

I believe [IsIntegralClosure B A L] made things different here?

Yes, IsIntegralClosure contains an injectivity requirement.

Chengyan Hu (Jun 25 2025 at 19:45):

Thanks! Any suggestion on how to prove B is an integral domain here?

Chengyan Hu (Jun 25 2025 at 19:46):

Really no idea

Kenny Lau (Jun 25 2025 at 19:51):

Chengyan Hu said:

Thanks! Any suggestion on how to prove B is an integral domain here?

f is injective map, you prove xy=0 -> f(xy)=0 -> f(x)=0 or f(y)=0 -> x=0 or y=0

Kenny Lau (Jun 25 2025 at 19:52):

last step uses injective

Kenny Lau (Jun 25 2025 at 19:55):

but there might be faster proofs using Subring.instIsDomainSubtypeMem

Chengyan Hu (Jun 25 2025 at 20:00):

Thanks! I'll try.

Yakov Pechersky (Jun 25 2025 at 20:02):

Injectivity of the algebraMap as a typeclass is FaithfulSMul.

Yakov Pechersky (Jun 25 2025 at 20:03):

And then you use docs#Function.Injective.isDomain. There might already be an instance of a IsDomain when FaithfulSMul to a Field.

Chengyan Hu (Jun 25 2025 at 20:03):

yes?

Kevin Buzzard (Jun 25 2025 at 20:10):

@loogle IsIntegralClosure, IsDomain

loogle (Jun 25 2025 at 20:10):

:search: IsIntegralClosure.isField, IsIntegralClosure.isFractionRing_of_algebraic, and 45 more

Kevin Buzzard (Jun 25 2025 at 20:12):

@loogle IsIntegralClosure ?B ?A ?L, |- IsDomain ?B

loogle (Jun 25 2025 at 20:12):

:shrug: nothing found

Kevin Buzzard (Jun 25 2025 at 20:12):

I don't think it's there

Chengyan Hu (Jun 25 2025 at 20:15):

oh ok, so I have to work a bit on this seems simple but actually not thing

Kevin Buzzard (Jun 25 2025 at 20:21):

Here's the plan that people are suggesting:

import Mathlib

lemma isDomain_of_faithfulSMul (B L : Type*) [CommRing B] [CommRing L] [IsDomain L]
    [Algebra B L] [FaithfulSMul B L] : IsDomain B :=
  sorry

lemma faithfulSMul_of_isIntegralClosure (A B L : Type*) [CommRing A] [CommSemiring B] [CommRing L]
    [Algebra A L] [Algebra B L] [IsIntegralClosure B A L] : FaithfulSMul B L :=
  sorry

variable
    {A : Type*}
    [CommRing A]
    {L : Type*} [Field L]
    [Algebra A L]
    {B : Type*} [CommRing B] [Algebra B L]
    [Algebra A B] [IsScalarTower A B L]
    [IsIntegralClosure B A L]

example : IsDomain B := by
  have := faithfulSMul_of_isIntegralClosure A B L
  exact isDomain_of_faithfulSMul B L

Aaron Liu (Jun 25 2025 at 20:34):

import Mathlib

lemma isDomain_of_faithfulSMul (B L : Type*) [CommRing B] [CommRing L] [IsDomain L]
    [Algebra B L] [FaithfulSMul B L] : IsDomain B where
  mul_left_cancel_of_ne_zero := by
    intro a b c ha hbc
    apply FaithfulSMul B L›.eq_of_smul_eq_smul
    intro u
    simpa [mul_smul, smul_right_inj ha] using congr($hbc  u)
  mul_right_cancel_of_ne_zero := by
    intro a c b hc hab
    rw [mul_comm a, mul_comm b] at hab
    apply FaithfulSMul B L›.eq_of_smul_eq_smul
    intro u
    simpa [mul_smul, smul_right_inj hc] using congr($hab  u)
  exists_pair_ne := by
    refine 0, 1, ?_⟩
    apply_fun algebraMap B L
    simp

lemma faithfulSMul_of_isIntegralClosure (A B L : Type*) [CommRing A] [CommSemiring B] [CommRing L]
    [Algebra A L] [Algebra B L] [IsIntegralClosure B A L] : FaithfulSMul B L where
  eq_of_smul_eq_smul := by
    intro a b hab
    apply IsIntegralClosure.algebraMap_injective B A L
    simpa [Algebra.algebraMap_eq_smul_one] using hab 1

variable
    {A : Type*}
    [CommRing A]
    {L : Type*} [Field L]
    [Algebra A L]
    {B : Type*} [CommRing B] [Algebra B L]
    [Algebra A B] [IsScalarTower A B L]
    [IsIntegralClosure B A L]

example : IsDomain B := by
  have := faithfulSMul_of_isIntegralClosure A B L
  exact isDomain_of_faithfulSMul B L

Kevin Buzzard (Jun 25 2025 at 20:43):

lemma isDomain_of_faithfulSMul (B L : Type*) [CommRing B] [CommRing L] [IsDomain L]
    [Algebra B L] [FaithfulSMul B L] : IsDomain B :=
  Function.Injective.isDomain (algebraMap B L) <| by
  rwa [ faithfulSMul_iff_algebraMap_injective B L]

lemma faithfulSMul_of_isIntegralClosure (A B L : Type*) [CommRing A] [CommSemiring B] [CommRing L]
    [Algebra A L] [Algebra B L] [IsIntegralClosure B A L] : FaithfulSMul B L where
  eq_of_smul_eq_smul {b₁ b₂} h := by
    apply IsIntegralClosure.algebraMap_injective B A L
    simp [Algebra.algebraMap_eq_smul_one, h 1]

Yakov Pechersky (Jun 26 2025 at 01:35):

Right, these can't be an instance because it wouldn't be able to guess the target field etc


Last updated: Dec 20 2025 at 21:32 UTC