Dieses Kapitel übersetzt den Satz über den Frobenius-Endomorphismus
aus Kapitel 14 des Skripts Satz für Satz nach Lean. Es geht um den
„Traum jedes Studienanfängers“: (a+b)^p = a^p + b^p.
„R hat Charakteristik p“ ist die Typklasse CharP R p.
Das entscheidende Lemma ist CharP.cast_eq_zero: Das Bild von
p in R ist Null.
Binomialkoeffizienten heißen Nat.choose; die binomische Formel
ist add_pow, eine Summe über Finset.range. Endliche Summen und
ihre Umformungen sind das Lean-Lernthema dieses Kapitels.
Satz und Definition 14.2.2 (Frobenius-Endomorphismus). Es sei
p eine Primzahl und es sei R ein kommutativer Ring mit Eins
der Charakteristik p. Dann ist die Abbildung
F : R \to R, a \mapsto a^p ein Ringmorphismus.
Beweis. Die Verträglichkeit mit der Multiplikation ist klar,
weil R kommutativ ist: (a \cdot b)^p = a^p \cdot b^p.
Ebenso ist F(1) = 1. Interessant ist nur die Verträglichkeit
mit der Addition. … Die binomische Formel gilt in jedem
kommutativen Ring, also ist
(a+b)^p = \sum_{k=0}^{p} \binom{p}{k} \cdot a^k \cdot b^{p-k}.
Für alle Indizes 0 < k < p ist der Binomialkoeffizient
\binom{p}{k} ein Vielfaches von p …. Weil R die
Charakteristik p hat, ist p = 0 in R, und alle diese
Summanden verschwinden. Übrig bleiben nur die Summanden für
k = 0 und k = p.
theoremfrobenius_mul{R:Type*}[CommRingR](p:ℕ)(ab:R):(a*b)^p=a^p*b^p:=mul_powabptheoremfrobenius_add{R:Type*}[CommRingR](p:ℕ)[Factp.Prime][CharPRp](ab:R):(a+b)^p=a^p+b^p:=R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:R⊢ (a+b)^p=a^p+b^pR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primep⊢ (a+b)^p=a^p+b^p-- „Die binomische Formel gilt in jedem kommutativen-- Ring, also ist-- (a+b)^p = ∑ₖ (p über k)·a^k·b^{p−k}.“R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primep⊢ ∑m∈Finset.range(p+1),a^m*b^(p-m)*↑(p.choosem)=a^p+b^p-- „Für alle Indizes 0 < k < p ist der-- Binomialkoeffizient (p über k) ein Vielfaches von p-- …. Weil R die Charakteristik p hat, ist p = 0 in-- R, und alle diese Summanden verschwinden.“havehmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*(p.choosek:R)=0:=byR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:R⊢ (a+b)^p=a^p+b^pintrokhkR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primepk:ℕhk:k∈Finset.Ioo0p⊢ a^k*b^(p-k)*↑(p.choosek)=0obtain⟨hk0,hkp⟩:=Finset.mem_Ioo.mphkR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primepk:ℕhk:k∈Finset.Ioo0phk0:0<khkp:k<p⊢ a^k*b^(p-k)*↑(p.choosek)=0obtain⟨c,hc⟩:=hp.dvd_choose_self(byR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primepk:ℕhk:k∈Finset.Ioo0phk0:0<khkp:k<p⊢ k≠0omegaAll goals completed! 🐙)hkpR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primepk:ℕhk:k∈Finset.Ioo0phk0:0<khkp:k<pc:ℕhc:p.choosek=p*c⊢ a^k*b^(p-k)*↑(p.choosek)=0rw[hcR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primepk:ℕhk:k∈Finset.Ioo0phk0:0<khkp:k<pc:ℕhc:p.choosek=p*c⊢ a^k*b^(p-k)*↑(p*c)=0]R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primepk:ℕhk:k∈Finset.Ioo0phk0:0<khkp:k<pc:ℕhc:p.choosek=p*c⊢ a^k*b^(p-k)*↑(p*c)=0push_castR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primepk:ℕhk:k∈Finset.Ioo0phk0:0<khkp:k<pc:ℕhc:p.choosek=p*c⊢ a^k*b^(p-k)*(↑p*↑c)=0rw[CharP.cast_eq_zeroRpR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primepk:ℕhk:k∈Finset.Ioo0phk0:0<khkp:k<pc:ℕhc:p.choosek=p*c⊢ a^k*b^(p-k)*(0*↑c)=0]R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primepk:ℕhk:k∈Finset.Ioo0phk0:0<khkp:k<pc:ℕhc:p.choosek=p*c⊢ a^k*b^(p-k)*(0*↑c)=0ringR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0⊢ ∑m∈Finset.range(p+1),a^m*b^(p-m)*↑(p.choosem)=a^p+b^p-- „Übrig bleiben nur die Summanden für k = 0 und k = p.“havehsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0p:=byR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:R⊢ (a+b)^p=a^p+b^pextkR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0k:ℕ⊢ k∈Finset.range(p+1)↔k∈{0,p}∪Finset.Ioo0psimponly[Finset.mem_range,Finset.mem_union,Finset.mem_insert,Finset.mem_singleton,Finset.mem_Ioo]R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0k:ℕ⊢ k<p+1↔(k=0∨k=p)∨0<k∧k<pomegaR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0p⊢ ∑m∈Finset.range(p+1),a^m*b^(p-m)*↑(p.choosem)=a^p+b^phavehdisj:Disjoint({0,p}:Finsetℕ)(Finset.Ioo0p):=byR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:R⊢ (a+b)^p=a^p+b^prw[Finset.disjoint_leftR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0p⊢ ∀⦃a:ℕ⦄,a∈{0,p}→a∉Finset.Ioo0p]R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0p⊢ ∀⦃a:ℕ⦄,a∈{0,p}→a∉Finset.Ioo0pintrokhkhk'R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0pk:ℕhk:k∈{0,p}hk':k∈Finset.Ioo0p⊢ Falsesimponly[Finset.mem_insert,Finset.mem_singleton]athkR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0pk:ℕhk':k∈Finset.Ioo0phk:k=0∨k=p⊢ Falsesimponly[Finset.mem_Ioo]athk'R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0pk:ℕhk:k=0∨k=phk':0<k∧k<p⊢ FalseomegaR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0phdisj:Disjoint{0,p}(Finset.Ioo0p)⊢ ∑m∈Finset.range(p+1),a^m*b^(p-m)*↑(p.choosem)=a^p+b^prw[hsplit,R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0phdisj:Disjoint{0,p}(Finset.Ioo0p)⊢ ∑m∈{0,p}∪Finset.Ioo0p,a^m*b^(p-m)*↑(p.choosem)=a^p+b^pFinset.sum_unionhdisj,R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0phdisj:Disjoint{0,p}(Finset.Ioo0p)⊢ ∑x∈{0,p},a^x*b^(p-x)*↑(p.choosex)+∑x∈Finset.Ioo0p,a^x*b^(p-x)*↑(p.choosex)=a^p+b^pFinset.sum_pair(Ne.symmhp.ne_zero),R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0phdisj:Disjoint{0,p}(Finset.Ioo0p)⊢ a^0*b^(p-0)*↑(p.choose0)+a^p*b^(p-p)*↑(p.choosep)+∑x∈Finset.Ioo0p,a^x*b^(p-x)*↑(p.choosex)=a^p+b^pFinset.sum_eq_zerohmid,R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0phdisj:Disjoint{0,p}(Finset.Ioo0p)⊢ a^0*b^(p-0)*↑(p.choose0)+a^p*b^(p-p)*↑(p.choosep)+0=a^p+b^padd_zeroR:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0phdisj:Disjoint{0,p}(Finset.Ioo0p)⊢ a^0*b^(p-0)*↑(p.choose0)+a^p*b^(p-p)*↑(p.choosep)=a^p+b^p]R:Type u_1inst✝²:CommRingRp:ℕinst✝¹:Fact(Nat.Primep)inst✝:CharPRpa:Rb:Rhp:Nat.Primephmid:∀k∈Finset.Ioo0p,a^k*b^(p-k)*↑(p.choosek)=0hsplit:Finset.range(p+1)={0,p}∪Finset.Ioo0phdisj:Disjoint{0,p}(Finset.Ioo0p)⊢ a^0*b^(p-0)*↑(p.choose0)+a^p*b^(p-p)*↑(p.choosep)=a^p+b^p-- „(a+b)^p = (p über 0)·a⁰·b^p + (p über p)·a^p·b⁰-- = a^p + b^p.“simp[Nat.choose_zero_right,Nat.choose_self,add_comm]All goals completed! 🐙
Mathlib bündelt die drei Verträglichkeiten zum Ringmorphismus
frobenius R p : R →+* R; die Additivität heißt dort
add_pow_char. Das Skript beobachtet, dass der Frobenius über einem
Integritätsring injektiv und über einem endlichen Körper sogar
bijektiv ist. Das führt zur Klassifikation endlicher Körper:
Zu jeder Primzahlpotenz p^n gibt es genau einen Körper mit
p^n Elementen. In Mathlib heißt er GaloisField p n.
Der Frobenius des Körpers \mathbb{F}_p ist die Identität: Für
jedes a \in \mathbb{F}_p ist a^p = a. Das ist ein alter
Bekannter: der kleine
Satz von Fermat aus unserem dritten Kapitel! In Mathlib heißt er
ZMod.pow_card. Öffnen Sie AlgebraInLean/Frobenius.lean und
ersetzen Sie das sorry durch einen Beweis.