/- Copyright (c) 2014 Mario Carneiro. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Mario Carneiro ! This file was ported from Lean 3 source module algebra.char_zero.lemmas ! leanprover-community/mathlib commit acee671f47b8e7972a1eb6f4eed74b4b3abce829 ! Please do not edit these lines, except to modify the commit id ! if you have ported upstream changes. -/ import Mathlib.Data.Nat.Cast.Field import Mathlib.Algebra.GroupPower.Lemmas /-! # Characteristic zero (additional theorems) A ring `R` is called of characteristic zero if every natural number `n` is non-zero when considered as an element of `R`. Since this definition doesn't mention the multiplicative structure of `R` except for the existence of `1` in this file characteristic zero is defined for additive monoids with `1`. ## Main statements * Characteristic zero implies that the additive monoid is infinite. -/ namespace Nat variable {R :R: Type ?u.2Type _} [AddMonoidWithOneType _: Type (?u.2+1)R] [R: Type ?u.2CharZeroCharZero: (R : Type ?u.23) β [inst : AddMonoidWithOne R] β PropR] /-- `Nat.cast` as an embedding into monoids of characteristic `0`. -/ @[R: Type ?u.2simps] defsimps: β {R : Type u_1} [inst : AddMonoidWithOne R] [inst_1 : CharZero R] (a : β), βcastEmbedding a = βacastEmbedding :castEmbedding: {R : Type u_1} β [inst : AddMonoidWithOne R] β [inst : CharZero R] β β βͺ Rβ βͺβ: TypeR := β¨Nat.cast,R: Type ?u.17cast_injectiveβ© #align nat.cast_embeddingcast_injective: β {R : Type ?u.300} [inst : AddMonoidWithOne R] [inst_1 : CharZero R], Function.Injective Nat.castNat.castEmbedding #align nat.cast_embedding_applyNat.castEmbedding: {R : Type u_1} β [inst : AddMonoidWithOne R] β [inst : CharZero R] β β βͺ RNat.castEmbedding_apply @[simp] theoremNat.castEmbedding_apply: β {R : Type u_1} [inst : AddMonoidWithOne R] [inst_1 : CharZero R] (a : β), βcastEmbedding a = βacast_pow_eq_one {R :R: Type u_1Type _} [SemiringType _: Type (?u.415+1)R] [R: Type ?u.415CharZeroCharZero: (R : Type ?u.421) β [inst : AddMonoidWithOne R] β PropR] (R: Type ?u.415q :q: ββ) (β: Typen :n: ββ) (β: Typehn :hn: n β 0n βn: β0) : (0: ?m.554q :q: βR) ^R: Type ?u.415n =n: β1 β1: ?m.622q =q: β1 :=1: ?m.781Goals accomplished! π#align nat.cast_pow_eq_one Nat.cast_pow_eq_one @[simp, norm_cast] theoremGoals accomplished! πcast_div_charZero {k :k: Type ?u.1363Type _} [DivisionSemiringType _: Type (?u.1363+1)k] [k: Type ?u.1363CharZeroCharZero: (R : Type ?u.1369) β [inst : AddMonoidWithOne R] β Propk] {k: Type ?u.1363mm: βn :n: ββ} (β: Typen_dvd :n_dvd: n β£ mn β£n: βm) : ((m: βm /m: βn :n: ββ) :β: Typek) =k: Type ?u.1363m /m: βn :=n: βGoals accomplished! πR: Type ?u.1348
instβΒ³: AddMonoidWithOne R
instβΒ²: CharZero R
k: Type u_1
instβΒΉ: DivisionSemiring k
instβ: CharZero k
m: β
n_dvd: 0 β£ m
inlR: Type ?u.1348
instβΒ³: AddMonoidWithOne R
instβΒ²: CharZero R
k: Type u_1
instβΒΉ: DivisionSemiring k
instβ: CharZero k
m, n: β
n_dvd: n β£ m
hn: n β 0
inrR: Type ?u.1348
instβΒ³: AddMonoidWithOne R
instβΒ²: CharZero R
k: Type u_1
instβΒΉ: DivisionSemiring k
instβ: CharZero k
m: β
n_dvd: 0 β£ m
inlR: Type ?u.1348
instβΒ³: AddMonoidWithOne R
instβΒ²: CharZero R
k: Type u_1
instβΒΉ: DivisionSemiring k
instβ: CharZero k
m, n: β
n_dvd: n β£ m
hn: n β 0
inrGoals accomplished! π#align nat.cast_div_char_zero Nat.cast_div_charZero end Nat section variable (Goals accomplished! πM :M: Type ?u.3310Type _) [AddMonoidWithOneType _: Type (?u.3310+1)M] [M: Type ?u.3295CharZeroCharZero: (R : Type ?u.3301) β [inst : AddMonoidWithOne R] β PropM] instanceM: Type ?u.3295CharZero.NeZero.two : NeZero (CharZero.NeZero.two: NeZero 22 :2: ?m.3364M) := β¨M: Type ?u.3310Goals accomplished! π2 β 02 β 0Goals accomplished! π2 β 0Goals accomplished! π2 β 02 β 02 β 02 β 02 β 0β© #align char_zero.ne_zero.twoGoals accomplished! πCharZero.NeZero.two end section variable {CharZero.NeZero.two: β (M : Type u_1) [inst : AddMonoidWithOne M] [inst_1 : CharZero M], NeZero 2R :R: Type ?u.8459Type _} [NonAssocSemiringType _: Type (?u.8459+1)R] [NoZeroDivisorsR: Type ?u.4919R] [R: Type ?u.8459CharZeroCharZero: (R : Type ?u.8856) β [inst : AddMonoidWithOne R] β PropR] {R: Type ?u.5409a :a: RR} @[simp] theorem add_self_eq_zero {R: Type ?u.4919a :a: RR} :R: Type ?u.5409a +a: Ra =a: R0 β0: ?m.5906a =a: R0 :=0: ?m.6429Goals accomplished! π#align add_self_eq_zeroGoals accomplished! πadd_self_eq_zero set_option linter.deprecated false @[simp] theorem bit0_eq_zero {add_self_eq_zero: β {R : Type u_1} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, a + a = 0 β a = 0a :a: RR} : bit0R: Type ?u.7433a =a: R0 β0: ?m.8054a =a: R0 :=0: ?m.8339add_self_eq_zero #align bit0_eq_zeroadd_self_eq_zero: β {R : Type ?u.8357} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, a + a = 0 β a = 0bit0_eq_zero @[simp] theorembit0_eq_zero: β {R : Type u_1} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, bit0 a = 0 β a = 0zero_eq_bit0 {zero_eq_bit0: β {R : Type u_1} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, 0 = bit0 a β a = 0a :a: RR} :R: Type ?u.84590 = bit00: ?m.8953a βa: Ra =a: R0 :=0: ?m.9370Goals accomplished! π#align zero_eq_bit0Goals accomplished! πzero_eq_bit0 theoremzero_eq_bit0: β {R : Type u_1} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, 0 = bit0 a β a = 0bit0_ne_zero : bit0bit0_ne_zero: β {R : Type u_1} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, bit0 a β 0 β a β 0a βa: R0 β0: ?m.10143a βa: R0 :=0: ?m.10415bit0_eq_zero.not #align bit0_ne_zerobit0_eq_zero: β {R : Type ?u.10418} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, bit0 a = 0 β a = 0bit0_ne_zero theorem zero_ne_bit0 :bit0_ne_zero: β {R : Type u_1} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, bit0 a β 0 β a β 00 β bit00: ?m.10986a βa: Ra βa: R0 :=0: ?m.11147zero_eq_bit0.not #align zero_ne_bit0zero_eq_bit0: β {R : Type ?u.11417} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, 0 = bit0 a β a = 0zero_ne_bit0 end section variable {zero_ne_bit0: β {R : Type u_1} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, 0 β bit0 a β a β 0R :R: Type ?u.14297Type _} [NonAssocRingType _: Type (?u.11497+1)R] [NoZeroDivisorsR: Type ?u.18277R] [R: Type ?u.11497CharZeroCharZero: (R : Type ?u.16103) β [inst : AddMonoidWithOne R] β PropR] theorem neg_eq_self_iff {R: Type ?u.11497a :a: RR} : -R: Type ?u.11895a =a: Ra βa: Ra =a: R0 := neg_eq_iff_add_eq_zero.trans0: ?m.12406add_self_eq_zero #align neg_eq_self_iffadd_self_eq_zero: β {R : Type ?u.12742} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, a + a = 0 β a = 0neg_eq_self_iff theorem eq_neg_self_iff {neg_eq_self_iff: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, -a = a β a = 0a :a: RR} :R: Type ?u.13096a = -a: Ra βa: Ra =a: R0 := eq_neg_iff_add_eq_zero.trans0: ?m.13607add_self_eq_zero #align eq_neg_self_iffadd_self_eq_zero: β {R : Type ?u.13943} [inst : NonAssocSemiring R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, a + a = 0 β a = 0eq_neg_self_iff theoremeq_neg_self_iff: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, a = -a β a = 0nat_mul_inj {n :n: ββ} {β: Typeaa: Rb :b: RR} (h : (R: Type ?u.14297n :n: βR) *R: Type ?u.14297a = (a: Rn :n: βR) *R: Type ?u.14297b) :b: Rn =n: β0 β¨0: ?m.15050a =a: Rb :=b: RGoals accomplished! π#align nat_mul_inj nat_mul_inj theorem nat_mul_inj' {Goals accomplished! πn :n: ββ} {β: Typeaa: Rb :b: RR} (h : (R: Type ?u.15782n :n: βR) *R: Type ?u.15782a = (a: Rn :n: βR) *R: Type ?u.15782b) (b: Rw :w: n β 0n βn: β0) :0: ?m.16536a =a: Rb :=b: RGoals accomplished! πR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
n: β
a, b: R
h: βn * a = βn * b
w: n β 0a = b#align nat_mul_inj'Goals accomplished! πnat_mul_inj' set_option linter.deprecated false theoremnat_mul_inj': β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {n : β} {a b : R}, βn * a = βn * b β n β 0 β a = bbit0_injective : Function.Injective (bit0 :bit0_injective: Function.Injective bit0R βR: Type ?u.16739R) := funR: Type ?u.16739aa: ?m.17204bb: ?m.17207h =>h: ?m.17210Goals accomplished! πR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
a, b: R
h: bit0 a = bit0 ba = bR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
a, b: R
h: a + a = b + ba = bR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
a, b: R
h: bit0 a = bit0 ba = bR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
a, b: R
h: 2 * a = 2 * ba = bR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
a, b: R
h: bit0 a = bit0 ba = bR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
a, b: R
h: 2 * a = 2 * bR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
a, b: R
h: bit0 a = bit0 ba = b#align bit0_injectiveGoals accomplished! πbit0_injective theorembit0_injective: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R], Function.Injective bit0bit1_injective : Function.Injective (bit1 :bit1_injective: Function.Injective bit1R βR: Type ?u.18277R) := funR: Type ?u.18277aa: ?m.18984bb: ?m.18987h =>h: ?m.18990Goals accomplished! πR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
a, b: R
h: bit1 a = bit1 ba = bR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
a, b: R
h: bit0 a = bit0 ba = bR: Type u_1
instβΒ²: NonAssocRing R
instβΒΉ: NoZeroDivisors R
instβ: CharZero R
a, b: R
h: bit1 a = bit1 ba = b#align bit1_injectiveGoals accomplished! πbit1_injective @[simp] theorembit1_injective: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R], Function.Injective bit1bit0_eq_bit0 {bit0_eq_bit0: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a b : R}, bit0 a = bit0 b β a = baa: Rb :b: RR} : bit0R: Type ?u.19354a = bit0a: Rb βb: Ra =a: Rb :=b: Rbit0_injective.eq_iff #align bit0_eq_bit0bit0_injective: β {R : Type ?u.19799} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R], Function.Injective bit0bit0_eq_bit0 @[simp] theorembit0_eq_bit0: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a b : R}, bit0 a = bit0 b β a = bbit1_eq_bit1 {bit1_eq_bit1: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a b : R}, bit1 a = bit1 b β a = baa: Rb :b: RR} : bit1R: Type ?u.19924a = bit1a: Rb βb: Ra =a: Rb :=b: Rbit1_injective.eq_iff #align bit1_eq_bit1bit1_injective: β {R : Type ?u.20579} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R], Function.Injective bit1bit1_eq_bit1 @[simp] theorembit1_eq_bit1: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a b : R}, bit1 a = bit1 b β a = bbit1_eq_one {bit1_eq_one: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, bit1 a = 1 β a = 0a :a: RR} : bit1R: Type ?u.20700a =a: R1 β1: ?m.21344a =a: R0 :=0: ?m.21534Goals accomplished! πGoals accomplished! π#align bit1_eq_oneGoals accomplished! πbit1_eq_one @[simp] theorembit1_eq_one: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, bit1 a = 1 β a = 0one_eq_bit1 {one_eq_bit1: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, 1 = bit1 a β a = 0a :a: RR} :R: Type ?u.228571 = bit11: ?m.23259a βa: Ra =a: R0 :=0: ?m.23696Goals accomplished! π#align one_eq_bit1Goals accomplished! πone_eq_bit1 end section variable {one_eq_bit1: β {R : Type u_1} [inst : NonAssocRing R] [inst_1 : NoZeroDivisors R] [inst_2 : CharZero R] {a : R}, 1 = bit1 a β a = 0R :R: Type ?u.24072Type _} [DivisionRingType _: Type (?u.24072+1)R] [R: Type ?u.24072CharZeroCharZero: (R : Type ?u.24078) β [inst : AddMonoidWithOne R] β PropR] @[simp] theoremR: Type ?u.24072half_add_self (a :a: RR) : (R: Type ?u.24147a +a: Ra) /a: R2 =2: ?m.24232a :=a: RGoals accomplished! πa = a#align half_add_self half_add_self @[simp] theoremGoals accomplished! πadd_halves' (a :a: RR) :R: Type ?u.25450a /a: R2 +2: ?m.25535a /a: R2 =2: ?m.25548a :=a: RGoals accomplished! πa = a#align add_halves' add_halves' theoremGoals accomplished! πsub_half (a :a: RR) :R: Type ?u.26193a -a: Ra /a: R2 =2: ?m.26278a /a: R2 :=2: ?m.26295Goals accomplished! πa = a#align sub_half sub_half theoremGoals accomplished! πhalf_sub (a :a: RR) :R: Type ?u.26933a /a: R2 -2: ?m.27018a = -(a: Ra /a: R2) :=2: ?m.27036Goals accomplished! π#align half_sub half_sub end namespace WithTopGoals accomplished! πinstance {instance: β {R : Type u_1} [inst : AddMonoidWithOne R] [inst_1 : CharZero R], CharZero (WithTop R)R :R: Type ?u.27736Type _} [AddMonoidWithOneType _: Type (?u.27736+1)R] [R: Type ?u.27736CharZeroCharZero: (R : Type ?u.27742) β [inst : AddMonoidWithOne R] β PropR] :R: Type ?u.27736CharZero (WithTopCharZero: (R : Type ?u.27751) β [inst : AddMonoidWithOne R] β PropR) where cast_injectiveR: Type ?u.27736mm: ?m.27782nn: ?m.27785h :=h: ?m.27788Goals accomplished! πend WithTop section RingHom variable {Goals accomplished! πRR: Type ?u.29119S :S: Type ?u.28006Type _} [NonAssocSemiringType _: Type (?u.28015+1)R] [NonAssocSemiringR: Type ?u.28003S] theoremS: Type ?u.28018RingHom.charZero (RingHom.charZero: β {R : Type u_1} {S : Type u_2} [inst : NonAssocSemiring R] [inst_1 : NonAssocSemiring S], (R β+* S) β β [hS : CharZero S], CharZero RΟ :Ο: R β+* SR β+*R: Type ?u.28015S) [S: Type ?u.28018hS :hS: CharZero SCharZeroCharZero: (R : Type ?u.28043) β [inst : AddMonoidWithOne R] β PropS] :S: Type ?u.28018CharZeroCharZero: (R : Type ?u.28157) β [inst : AddMonoidWithOne R] β PropR := β¨funR: Type ?u.28015aa: ?m.28294bb: ?m.28297h =>h: ?m.28300CharZero.cast_injective (CharZero.cast_injective: β {R : Type ?u.28302} [inst : AddMonoidWithOne R] [self : CharZero R], Function.Injective Nat.castGoals accomplished! πR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hS: CharZero S
a, b: β
h: βa = βbβa = βbR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hS: CharZero S
a, b: β
h: βa = βbβa = βbR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hS: CharZero S
a, b: β
h: βa = βbβΟ βa = βbR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hS: CharZero S
a, b: β
h: βa = βbβa = βbR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hS: CharZero S
a, b: β
h: βa = βbβΟ βa = βΟ βbR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hS: CharZero S
a, b: β
h: βa = βbβa = βbR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hS: CharZero S
a, b: β
h: βa = βbβΟ βb = βΟ βb)β© #align ring_hom.char_zeroGoals accomplished! πRingHom.charZero theoremRingHom.charZero: β {R : Type u_1} {S : Type u_2} [inst : NonAssocSemiring R] [inst_1 : NonAssocSemiring S], (R β+* S) β β [hS : CharZero S], CharZero RRingHom.charZero_iff {RingHom.charZero_iff: β {Ο : R β+* S}, Function.Injective βΟ β (CharZero R β CharZero S)Ο :Ο: R β+* SR β+*R: Type ?u.29119S} (S: Type ?u.29122hΟ : Function.InjectivehΟ: Function.Injective βΟΟ) :Ο: R β+* SCharZeroCharZero: (R : Type ?u.29430) β [inst : AddMonoidWithOne R] β PropR βR: Type ?u.29119CharZeroCharZero: (R : Type ?u.29541) β [inst : AddMonoidWithOne R] β PropS := β¨funS: Type ?u.29122hR => β¨hR: ?m.29664Goals accomplished! πR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero RFunction.Injective Nat.castR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βba = bR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βba = bR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero RFunction.Injective Nat.castR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βba = bR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βbβa = βbR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βba = bR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βbβΟ βa = βΟ βbR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βba = bR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βbβa = βΟ βbR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βba = bR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βbβa = βbβ©, funR: Type u_1
S: Type u_2
instβΒΉ: NonAssocSemiring R
instβ: NonAssocSemiring S
Ο: R β+* S
hΟ: Function.Injective βΟ
hR: CharZero R
a, b: β
h: βa = βbβa = βbhS =>hS: ?m.29803Ο.Ο: R β+* ScharZeroβ© #align ring_hom.char_zero_iffcharZero: β {R : Type ?u.29805} {S : Type ?u.29806} [inst : NonAssocSemiring R] [inst_1 : NonAssocSemiring S], (R β+* S) β β [hS : CharZero S], CharZero RRingHom.charZero_iff theoremRingHom.charZero_iff: β {R : Type u_1} {S : Type u_2} [inst : NonAssocSemiring R] [inst_1 : NonAssocSemiring S] {Ο : R β+* S}, Function.Injective βΟ β (CharZero R β CharZero S)RingHom.injective_nat (f :RingHom.injective_nat: β {R : Type u_1} [inst : NonAssocSemiring R] (f : β β+* R) [inst_1 : CharZero R], Function.Injective βfβ β+*β: TypeR) [R: Type ?u.30168CharZeroCharZero: (R : Type ?u.30206) β [inst : AddMonoidWithOne R] β PropR] : Function.Injective f :=R: Type ?u.30168Subsingleton.elim (Subsingleton.elim: β {Ξ± : Sort ?u.30594} [h : Subsingleton Ξ±] (a b : Ξ±), a = bNat.castRingHomNat.castRingHom: (Ξ± : Type ?u.30597) β [inst : NonAssocSemiring Ξ±] β β β+* Ξ±_) f βΈ_: Type ?u.30597Nat.cast_injective #align ring_hom.injective_natNat.cast_injective: β {R : Type ?u.30634} [inst : AddMonoidWithOne R] [inst_1 : CharZero R], Function.Injective Nat.castRingHom.injective_nat end RingHomRingHom.injective_nat: β {R : Type u_1} [inst : NonAssocSemiring R] (f : β β+* R) [inst_1 : CharZero R], Function.Injective βf