Skip to content
Open
Show file tree
Hide file tree
Changes from 220 commits
Commits
Show all changes
400 commits
Select commit Hold shift + click to select a range
80fcd13
Merge branch 'master' into spanRank-lemma
Thmoas-Guan Mar 4, 2026
782bd75
Update Cotangent.lean
Thmoas-Guan Mar 5, 2026
1dc4e82
golf
Thmoas-Guan Mar 5, 2026
251a214
Merge branch 'spanRank-lemma' into Regular-Local-Ring-Def
Thmoas-Guan Mar 5, 2026
ab939df
fix
Thmoas-Guan Mar 5, 2026
ee0a58c
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 5, 2026
858091e
fix
Thmoas-Guan Mar 5, 2026
565f6e5
Merge branch 'WithBot-ENat-lemmas' into Regular-Local-Ring
Thmoas-Guan Mar 5, 2026
d31c677
Merge branch 'master' into spanRank-lemma
Thmoas-Guan Mar 6, 2026
fdd4742
Merge branch 'master' into Regular-Local-Ring-Def
Thmoas-Guan Mar 6, 2026
3741e55
Merge branch 'master' into Regular-Local-Ring
Thmoas-Guan Mar 6, 2026
b12ab54
golf
Thmoas-Guan Mar 6, 2026
bd2a931
Merge branch 'spanRank-lemma' into Regular-Local-Ring-Def
Thmoas-Guan Mar 6, 2026
e3c8122
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 6, 2026
72fc90d
fix
Thmoas-Guan Mar 6, 2026
496f5a5
a temporary fix
Thmoas-Guan Mar 6, 2026
0691f4d
Merge branch 'spanRank-lemma' into Regular-Local-Ring-Def
Thmoas-Guan Mar 6, 2026
fd7371e
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 6, 2026
dd82339
fix
Thmoas-Guan Mar 6, 2026
c0cf3ae
Merge branch 'spanRank-lemma' into Regular-Local-Ring-Def
Thmoas-Guan Mar 6, 2026
b5e37b1
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 6, 2026
54003cd
move decl
Thmoas-Guan Mar 13, 2026
ef5b60d
generalize universe
Thmoas-Guan Mar 13, 2026
c50145c
fix
Thmoas-Guan Mar 13, 2026
9076eeb
Update SpanRank.lean
Thmoas-Guan Mar 13, 2026
0d6b267
golf
Thmoas-Guan Mar 13, 2026
88a89b5
golf more
Thmoas-Guan Mar 13, 2026
f3b46bd
add base change version
Thmoas-Guan Mar 13, 2026
2e0beff
Merge branch 'master' into spanRank-lemma
Thmoas-Guan Mar 14, 2026
ca5786a
fix variable
Thmoas-Guan Mar 15, 2026
cd54a09
fix naming and add spanFinrank version
Thmoas-Guan Mar 15, 2026
eea67d8
add lemma and golf
Thmoas-Guan Mar 15, 2026
6c59477
golf maximal ideal map
Thmoas-Guan Mar 16, 2026
435a579
remove lemma easy enough
Thmoas-Guan Mar 16, 2026
163291a
golf base change
Thmoas-Guan Mar 16, 2026
379c4ab
golf
Thmoas-Guan Mar 16, 2026
10bb149
Merge branch 'spanRank-lemma' into Regular-Local-Ring-Def
Thmoas-Guan Mar 16, 2026
0e42b01
fix
Thmoas-Guan Mar 16, 2026
868cddc
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 16, 2026
ce937df
add simp attr
Thmoas-Guan Mar 18, 2026
201acfd
split file
Thmoas-Guan Mar 19, 2026
cd6c4d0
Update Mathlib.lean
Thmoas-Guan Mar 19, 2026
723f840
Merge branch 'spanRank-lemma' into Regular-Local-Ring-Def
Thmoas-Guan Mar 19, 2026
86d66ea
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 19, 2026
23bbe4e
Merge branch 'master' into spanRank-lemma
Thmoas-Guan Mar 19, 2026
821e02e
Merge branch 'master' into Regular-Local-Ring-Def
Thmoas-Guan Mar 19, 2026
3838ac0
Merge branch 'master' into Regular-Local-Ring
Thmoas-Guan Mar 19, 2026
01211a7
move decl
Thmoas-Guan Mar 19, 2026
507efb1
Merge branch 'spanRank-lemma' into Regular-Local-Ring-Def
Thmoas-Guan Mar 19, 2026
6fc8258
fix import
Thmoas-Guan Mar 19, 2026
26b74f2
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 19, 2026
9236436
add doc
Thmoas-Guan Mar 19, 2026
3133352
Merge branch 'spanRank-lemma' into Regular-Local-Ring-Def
Thmoas-Guan Mar 19, 2026
c5a2091
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 19, 2026
46274e2
Merge branch 'master' into spanRank-lemma
Thmoas-Guan Mar 20, 2026
69c2bbd
add namespace
Thmoas-Guan Mar 20, 2026
0011ecf
fix doc
Thmoas-Guan Mar 20, 2026
bb90a75
restore open change
Thmoas-Guan Mar 20, 2026
f940521
Merge branch 'spanRank-lemma' into Regular-Local-Ring-Def
Thmoas-Guan Mar 20, 2026
fd3d647
fix doc
Thmoas-Guan Mar 20, 2026
19c1337
Merge branch 'spanRank-lemma' into Regular-Local-Ring-Def
Thmoas-Guan Mar 20, 2026
76b3ec6
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 20, 2026
29fec98
Merge branch 'master' into Regular-Local-Ring-Def
Thmoas-Guan Mar 21, 2026
63daebf
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 21, 2026
3ddb6f3
fix naming
Thmoas-Guan Mar 21, 2026
a979108
refine def
Thmoas-Guan Mar 21, 2026
a5f4135
fix doc
Thmoas-Guan Mar 21, 2026
29cdff6
Merge branch 'Regular-Local-Ring-Def' into Regular-Local-Ring
Thmoas-Guan Mar 21, 2026
1e7e98a
fix and golf
Thmoas-Guan Mar 21, 2026
4512ea4
Merge branch 'master' into Regular-Local-Ring
Thmoas-Guan Mar 31, 2026
887e323
small golfs
Thmoas-Guan Mar 31, 2026
e5b9953
use more simpa
Thmoas-Guan Mar 31, 2026
9ac80ec
split lemma
Thmoas-Guan Apr 1, 2026
26e0059
golf
Thmoas-Guan Apr 1, 2026
391236a
golf
Thmoas-Guan Apr 1, 2026
c0638af
separate lemma and golf
Thmoas-Guan Apr 1, 2026
f59c641
use more suffices
Thmoas-Guan Apr 1, 2026
be72cc1
separate lemma
Thmoas-Guan Apr 1, 2026
78fa7ef
separate lemma and golf
Thmoas-Guan Apr 1, 2026
b6dec0f
small golf
Thmoas-Guan Apr 1, 2026
239b827
move lemma
Thmoas-Guan Apr 1, 2026
1ae4f44
fix variable
Thmoas-Guan Apr 1, 2026
1c7008e
golf
Thmoas-Guan Apr 1, 2026
3ba7ac1
Update Basic.lean
Thmoas-Guan Apr 1, 2026
3e0162d
add two lemmas
Thmoas-Guan Apr 1, 2026
ff03d3b
add two lemmas
Thmoas-Guan Apr 1, 2026
fa61664
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 1, 2026
1f74255
reduce .1.1
Thmoas-Guan Apr 1, 2026
348b715
add more heoght analogus
Thmoas-Guan Apr 1, 2026
c24b383
add le lemma
Thmoas-Guan Apr 2, 2026
a12d523
reduce more .1.1 and .1.2
Thmoas-Guan Apr 2, 2026
e7fd6ee
add private and deprecation
Thmoas-Guan Apr 2, 2026
43fc664
golf Ideal.sup_primeHeight_eq_ringKrullDim
Thmoas-Guan Apr 2, 2026
a580c9e
fix
Thmoas-Guan Apr 2, 2026
e3f5da1
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 2, 2026
c0a96b7
fix
Thmoas-Guan Apr 2, 2026
fab80a8
add prime avoidance for maximal ideal
Thmoas-Guan Apr 2, 2026
23ad05a
golf using new prime avoidance
Thmoas-Guan Apr 2, 2026
f3e4ce9
golf
Thmoas-Guan Apr 2, 2026
74377c6
Merge branch 'master' into minimalPrimes-API
Thmoas-Guan Apr 3, 2026
b5387ef
make strict mono private
Thmoas-Guan Apr 3, 2026
f3a9bf1
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 3, 2026
732ccc0
fix
Thmoas-Guan Apr 3, 2026
ae7cff9
deprecate strict mono
Thmoas-Guan Apr 3, 2026
facecae
golf
Thmoas-Guan Apr 3, 2026
bc6aba4
deprecate primeHeight_eq_zero
Thmoas-Guan Apr 3, 2026
c043789
fix
Thmoas-Guan Apr 3, 2026
ef31947
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 3, 2026
a35ed7f
add height version of definition
Thmoas-Guan Apr 4, 2026
2eef181
deprecate more lemmas
Thmoas-Guan Apr 4, 2026
e09911d
deprecate more
Thmoas-Guan Apr 4, 2026
55ca9bf
deprecate even more
Thmoas-Guan Apr 4, 2026
618cfa2
deprecate even more
Thmoas-Guan Apr 4, 2026
ab901db
deprecate a prime height usage
Thmoas-Guan Apr 4, 2026
4643655
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 4, 2026
cd6b68c
deprecate further more
Thmoas-Guan Apr 4, 2026
375cdb8
golf
Thmoas-Guan Apr 4, 2026
c27d5f9
Merge branch 'master' into minimalPrimes-API
Thmoas-Guan Apr 6, 2026
57a4272
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 6, 2026
e8de354
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 6, 2026
82a4666
golf aesop
Thmoas-Guan Apr 8, 2026
9191ad1
Merge branch 'master' into minimalPrimes-API
Thmoas-Guan Apr 13, 2026
e2f57e5
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 13, 2026
7c7a431
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 13, 2026
c5ba185
Merge branch 'master' into minimalPrimes-API
Thmoas-Guan Apr 13, 2026
6ffc08d
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 13, 2026
0d67b58
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 13, 2026
e5ce17e
Merge branch 'master' into minimalPrimes-API
Thmoas-Guan Apr 14, 2026
108ba66
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 14, 2026
9790c4f
add lemma to avoid def eq
Thmoas-Guan Apr 14, 2026
903a565
replace more .1.1 and .1.2
Thmoas-Guan Apr 14, 2026
663dafa
fix
Thmoas-Guan Apr 14, 2026
4528e67
Merge branch 'refactor-minimalPrimes-API' into minimalPrimes-API
Thmoas-Guan Apr 14, 2026
7526af6
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 14, 2026
1254181
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 14, 2026
bcd4ca3
Merge branch 'master' into refactor-minimalPrimes-API
Thmoas-Guan Apr 15, 2026
cacbd5a
Merge branch 'refactor-minimalPrimes-API' into minimalPrimes-API
Thmoas-Guan Apr 15, 2026
55b3bc6
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 15, 2026
99d74db
fix doc
Thmoas-Guan Apr 15, 2026
29ed07c
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 15, 2026
6d956b6
fix and add deprecation
Thmoas-Guan Apr 15, 2026
0fae8ed
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 15, 2026
78f021d
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 15, 2026
e3f9ff2
Merge branch 'master' into refactor-minimalPrimes-API
Thmoas-Guan Apr 15, 2026
daacf70
Merge branch 'refactor-minimalPrimes-API' into minimalPrimes-API
Thmoas-Guan Apr 15, 2026
6e57b79
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 15, 2026
660b46e
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 15, 2026
5b55fdc
Update KrullsHeightTheorem.lean
Thmoas-Guan Apr 15, 2026
2dbb3d3
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 15, 2026
6364936
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 15, 2026
c03a1f7
fix
Thmoas-Guan Apr 15, 2026
6a196f3
Merge branch 'master' into refactor-minimalPrimes-API
Thmoas-Guan Apr 24, 2026
4ffe3c9
fix naming
Thmoas-Guan Apr 24, 2026
46336e4
Merge branch 'refactor-minimalPrimes-API' into minimalPrimes-API
Thmoas-Guan Apr 24, 2026
c489328
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 24, 2026
90805b4
fix
Thmoas-Guan Apr 24, 2026
a5e1b81
Merge branch 'refactor-minimalPrimes-API' into minimalPrimes-API
Thmoas-Guan Apr 24, 2026
c12e38a
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 24, 2026
10af992
fix
Thmoas-Guan Apr 24, 2026
8cf2de0
Merge branch 'refactor-minimalPrimes-API' into minimalPrimes-API
Thmoas-Guan Apr 24, 2026
08f157e
fix
Thmoas-Guan Apr 24, 2026
2473efc
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 24, 2026
3df1fb7
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 25, 2026
8734ba2
fix
Thmoas-Guan Apr 25, 2026
799d4ce
Merge branch 'master' into refactor-minimalPrimes-API
Thmoas-Guan Apr 28, 2026
b3d2ccb
Merge branch 'refactor-minimalPrimes-API' into minimalPrimes-API
Thmoas-Guan Apr 28, 2026
06c667a
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan Apr 28, 2026
2847a94
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan Apr 28, 2026
feee5c8
Merge branch 'master' into refactor-minimalPrimes-API
Thmoas-Guan May 5, 2026
7648ee6
fix naming
Thmoas-Guan May 5, 2026
9133052
Merge branch 'refactor-minimalPrimes-API' into minimalPrimes-API
Thmoas-Guan May 5, 2026
88ea9de
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 5, 2026
d6d581a
fix long line
Thmoas-Guan May 5, 2026
045dd3d
Merge branch 'refactor-minimalPrimes-API' into minimalPrimes-API
Thmoas-Guan May 5, 2026
acc4f74
fix
Thmoas-Guan May 5, 2026
b3809c0
Merge branch 'minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 5, 2026
b31ee58
fix
Thmoas-Guan May 5, 2026
3d41582
Merge branch 'minimalPrimes-API' into Regular-Local-Ring
Thmoas-Guan May 5, 2026
d6f76ed
fix
Thmoas-Guan May 5, 2026
a2c2b50
private primeHeight
Thmoas-Guan May 7, 2026
7f19e33
fix
Thmoas-Guan May 7, 2026
c6df49a
add predicate IsMinimalPrime
Thmoas-Guan May 8, 2026
3b13487
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 8, 2026
b7ad058
fix
Thmoas-Guan May 8, 2026
b2163ca
fix
Thmoas-Guan May 8, 2026
5cb85b2
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 8, 2026
8535ebb
add doc
Thmoas-Guan May 8, 2026
a594879
add deprecation
Thmoas-Guan May 8, 2026
ee62c94
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 8, 2026
3300967
add doc
Thmoas-Guan May 8, 2026
28241c7
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 8, 2026
9132a6c
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 8, 2026
7a76419
Merge branch 'master' into refactor-minimalPrimes-API
Thmoas-Guan May 12, 2026
1caa107
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 12, 2026
49218c8
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 12, 2026
8babb5d
fix
Thmoas-Guan May 12, 2026
97d4a16
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 12, 2026
58c054a
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 12, 2026
421559a
fix
Thmoas-Guan May 12, 2026
038ea15
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 12, 2026
0d7c0df
fix deprecation
Thmoas-Guan May 12, 2026
a3164f2
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 12, 2026
0667a90
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 12, 2026
924693e
Merge branch 'master' into refactor-minimalPrimes-API
Thmoas-Guan May 12, 2026
cb64816
adapt to changes in under
Thmoas-Guan May 12, 2026
e2c53ab
fix naming
Thmoas-Guan May 12, 2026
6ac19f6
fix
Thmoas-Guan May 12, 2026
1773697
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 12, 2026
5354bc4
fix
Thmoas-Guan May 12, 2026
4dcf91f
refactor name
Thmoas-Guan May 12, 2026
32775b4
golf
Thmoas-Guan May 12, 2026
b1889ac
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 12, 2026
1cd00d9
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 12, 2026
9b9ebbc
add doc
Thmoas-Guan May 12, 2026
49a319c
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 12, 2026
619c3eb
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 12, 2026
126d2d9
golf
Thmoas-Guan May 13, 2026
4d9a85d
remove unused lemma
Thmoas-Guan May 13, 2026
6d6d52c
alternative fix
Thmoas-Guan May 13, 2026
6aed22d
Merge branch 'refactor-minimalPrimes-API' into refactor-primeHeight
Thmoas-Guan May 13, 2026
2784124
golf
Thmoas-Guan May 13, 2026
392e9d8
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 13, 2026
6ebca89
Merge branch 'master' into refactor-primeHeight
Thmoas-Guan May 13, 2026
d73506b
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 13, 2026
c51f6dd
Merge branch 'master' into refactor-primeHeight
Thmoas-Guan May 17, 2026
d3cf8fd
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 17, 2026
4e5df3b
golf
Thmoas-Guan May 17, 2026
81e88dd
use under
Thmoas-Guan May 18, 2026
ff9fc4c
fix
Thmoas-Guan May 18, 2026
c8818f7
Merge branch 'refactor-primeHeight' into Regular-Local-Ring
Thmoas-Guan May 18, 2026
398d0d0
remove duplicated lemma
Thmoas-Guan May 21, 2026
02e7b8c
fix imports
Thmoas-Guan May 21, 2026
8c98c3f
Merge branch 'master' into Regular-Local-Ring
Thmoas-Guan May 23, 2026
4896637
golf
Thmoas-Guan May 23, 2026
a4d071d
Merge branch 'master' into Regular-Local-Ring
Thmoas-Guan May 23, 2026
c274d91
Merge branch 'master' into Regular-Local-Ring
Thmoas-Guan May 26, 2026
8d9a114
Merge branch 'master' into Regular-Local-Ring
Thmoas-Guan Jun 2, 2026
66de93b
fix merging error
Thmoas-Guan Jun 2, 2026
814be4a
separate lemma
Thmoas-Guan Jun 2, 2026
200a354
add doc
Thmoas-Guan Jun 2, 2026
8bb6fb9
add main lemma for span rank of maximal ideal
Thmoas-Guan Jun 3, 2026
65a5e0d
Merge branch 'lemma-for-spanrank-uder-surjection' into Regular-Local-…
Thmoas-Guan Jun 3, 2026
2eeb7a6
remove existing lemmas
Thmoas-Guan Jun 3, 2026
c142477
Merge branch 'master' into lemma-for-spanrank-uder-surjection
Thmoas-Guan Jun 4, 2026
cc7e5c3
Merge branch 'lemma-for-spanrank-uder-surjection' into Regular-Local-…
Thmoas-Guan Jun 4, 2026
8f3a14f
Merge branch 'master' into Regular-Local-Ring
Thmoas-Guan Jun 19, 2026
1cf0e90
add lemma for span rank one
Thmoas-Guan Jun 19, 2026
c16c83b
Merge branch 'spanRank-eq-one' into Regular-Local-Ring
Thmoas-Guan Jun 19, 2026
61b3605
add another prime avoidance
Thmoas-Guan Jun 19, 2026
c7517fd
Merge branch 'prime-avoidance-for-maximal-ideal' into Regular-Local-Ring
Thmoas-Guan Jun 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Mathlib.lean
Original file line number Diff line number Diff line change
Expand Up @@ -6660,6 +6660,7 @@ public import Mathlib.RingTheory.Regular.Depth
public import Mathlib.RingTheory.Regular.Flat
public import Mathlib.RingTheory.Regular.IsSMulRegular
public import Mathlib.RingTheory.Regular.RegularSequence
public import Mathlib.RingTheory.RegularLocalRing.Basic
public import Mathlib.RingTheory.RegularLocalRing.Defs
public import Mathlib.RingTheory.RingHom.Bijective
public import Mathlib.RingTheory.RingHom.EssFiniteType
Expand Down
332 changes: 332 additions & 0 deletions Mathlib/RingTheory/RegularLocalRing/Basic.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,332 @@
/-
Copyright (c) 2025 Nailin Guan. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Nailin Guan
-/
module

public import Mathlib.LinearAlgebra.Dimension.OrzechProperty
public import Mathlib.RingTheory.DiscreteValuationRing.TFAE
public import Mathlib.RingTheory.RegularLocalRing.Defs
public import Mathlib.RingTheory.Ideal.KrullsHeightTheorem
public import Mathlib.RingTheory.KrullDimension.Field
public import Mathlib.RingTheory.Regular.RegularSequence

/-!

# Regular Local Ring is Domain

In this file, we prove that regular local ring is domain

# Main definition and results

* `isDomain_of_isRegularLocalRing` : a regular local ring is domain

* `isRegular_of_span_eq_maximalIdeal` : for a regular local ring `R`, if a list of length equal to
its dimension generates `maximalIdeal R`, it form a regular sequence.

-/

@[expose] public section

open IsLocalRing IsRegularLocalRing

variable (R : Type*) [CommRing R]

variable {R} in
lemma IsLocalRing.ResidueField.map_bijective_of_surjective [IsLocalRing R] {S : Type*} [CommRing S]
[IsLocalRing S] (f : R →+* S) (surj : Function.Surjective f) [IsLocalHom f] :
Function.Bijective (ResidueField.map f) :=
⟨RingHom.injective _, Ideal.Quotient.lift_surjective_of_surjective _ _
(Ideal.Quotient.mk_surjective.comp surj)⟩

set_option backward.isDefEq.respectTransparency false in
lemma quotient_isRegularLocalRing_tfae [IsRegularLocalRing R] (S : Finset R)
(sub : (S : Set R) ⊆ maximalIdeal R) :
[∃ (T : Finset R), S ⊆ T ∧ T.card = ringKrullDim R ∧ Ideal.span T = maximalIdeal R,
LinearIndependent (ResidueField R) ((⇑(maximalIdeal R).toCotangent).comp (Set.inclusion sub)),
IsRegularLocalRing (R ⧸ Ideal.span (S : Set R)) ∧
(ringKrullDim (R ⧸ Ideal.span (S : Set R)) + S.card = ringKrullDim R)].TFAE := by
have : Nontrivial (R ⧸ Ideal.span (S : Set R)) := Ideal.Quotient.nontrivial_iff.mpr
(ne_top_of_le_ne_top Ideal.IsPrime.ne_top' (Ideal.span_le.mpr sub))
have lochom : IsLocalHom (Ideal.Quotient.mk (Ideal.span (S : Set R))) :=
IsLocalHom.of_surjective _ (Ideal.Quotient.mk_surjective)
tfae_have 1 → 2 := by
rintro ⟨T, h, card, span⟩
have Tsub : (T : Set R) ⊆ maximalIdeal R := by simpa [← span] using Ideal.subset_span
have : LinearIndependent (ResidueField R)
((⇑(maximalIdeal R).toCotangent).comp (Set.inclusion Tsub)) := by
apply linearIndependent_of_top_le_span_of_card_eq_finrank
· simp only [Set.range_comp, Set.range_inclusion Tsub, SetLike.coe_sort_coe, Finset.mem_coe,
top_le_iff, IsLocalRing.CotangentSpace.span_image_eq_top_iff]
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
apply Submodule.map_injective_of_injective (maximalIdeal R).injective_subtype
simp only [Submodule.map_span, Submodule.subtype_apply, Ideal.submodule_span_eq,
Submodule.map_top, Submodule.range_subtype]
convert span
ext
simpa using fun a ↦ Tsub a
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
· rw [← Nat.cast_inj (R := WithBot ℕ∞), (iff_finrank_cotangentSpace R).mp ‹_›, ← card]
simp
have li := LinearIndependent.comp this (Set.inclusion h) (Set.inclusion_injective h)
have inc : Set.inclusion Tsub ∘ Set.inclusion h = Set.inclusion sub := rfl
simpa [← Function.comp_assoc, ← inc] using li
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
tfae_have 2 → 3 := by
intro li
let _ : IsLocalRing (R ⧸ Ideal.span (S : Set R)) :=
IsLocalRing.of_surjective _ Ideal.Quotient.mk_surjective
rw [isRegularLocalRing_iff]
have le := ringKrullDim_le_ringKrullDim_quotient_add_card S
(by simpa [IsLocalRing.ringJacobson_eq_maximalIdeal] using sub)
have ge : (Submodule.spanFinrank (maximalIdeal (R ⧸ Ideal.span (S : Set R)))) + S.card ≤
ringKrullDim R := by
simp only [← Nat.cast_add, ← (iff_finrank_cotangentSpace R).mp ‹_›, Nat.cast_le,
spanFinrank_maximalIdeal_eq_finrank_cotangentSpace]
let f := Ideal.mapCotangent (maximalIdeal R) (maximalIdeal (R ⧸ Ideal.span (S : Set R)))
(Ideal.Quotient.mkₐ R (Ideal.span (S : Set R))) (fun x hx ↦ by simpa)
have ker : (LinearMap.ker f : Set (maximalIdeal R).Cotangent) = (Submodule.span
(ResidueField R) (Set.range (⇑(maximalIdeal R).toCotangent ∘ Set.inclusion sub))) := by
simp only [ Submodule.coe_span_eq_span_of_surjective R (ResidueField R)
IsLocalRing.residue_surjective, Finset.coe_sort_coe, SetLike.coe_set_eq]
ext x
induction x using Submodule.Quotient.induction_on
rename_i x
simp only [Ideal.mapCotangent, LinearMap.mem_ker, f]
change (maximalIdeal (R ⧸ Ideal.span (S : Set R))).toCotangent ⟨(Ideal.Quotient.mkₐ R
(Ideal.span (S : Set R))) x, _⟩ = 0 ↔ (maximalIdeal R).toCotangent x ∈ _
simp only [Ideal.Quotient.mkₐ_eq_mk, Set.range_comp,
Ideal.toCotangent_eq_zero, ← Submodule.map_span]
rw [← IsLocalRing.map_maximalIdeal_of_surjective _ Ideal.Quotient.mk_surjective,
← Ideal.map_pow, ← Ideal.mem_comap, ← Submodule.mem_comap, Submodule.comap_map_eq,
Ideal.comap_map_of_surjective' _ Ideal.Quotient.mk_surjective, Ideal.mk_ker, sup_comm,
← Submodule.comap_map_eq_of_injective (maximalIdeal R).subtype_injective (Submodule.span
R (Set.range (Set.inclusion sub)) ⊔ LinearMap.ker (maximalIdeal R).toCotangent)]
simp only [Finset.coe_sort_coe, Submodule.map_sup, Submodule.mem_comap,
Submodule.subtype_apply]
congr!
· simp only [Submodule.map_span, Submodule.subtype_apply, Ideal.submodule_span_eq]
congr
ext
simpa using fun a ↦ sub a
· exact (Ideal.map_toCotangent_ker (maximalIdeal R)).symm
let Q := (CotangentSpace R) ⧸ (Submodule.span (ResidueField R)
(Set.range (⇑(maximalIdeal R).toCotangent ∘ Set.inclusion sub)))
let f' : Q →+ (CotangentSpace (R ⧸ Ideal.span (S : Set R))) :=
QuotientAddGroup.lift _ f
(le_of_eq (AddSubgroup.ext (fun x ↦ (congrFun ker.symm x).to_iff)))
have bij : Function.Bijective f' := by
constructor
· rw [← AddMonoidHom.ker_eq_bot_iff, eq_bot_iff]
intro x hx
induction x using QuotientAddGroup.induction_on
rename_i x
have : x ∈ (LinearMap.ker f : Set (maximalIdeal R).Cotangent) := LinearMap.mem_ker.mpr hx
rw [ker] at this
exact AddSubgroup.mem_bot.mpr ((QuotientAddGroup.eq_zero_iff _).mpr this)
· apply QuotientAddGroup.lift_surjective_of_surjective
intro x
rcases Ideal.toCotangent_surjective _ x with ⟨y, hy⟩
rcases Ideal.Quotient.mk_surjective y.1 with ⟨z, hz⟩
have : z ∈ maximalIdeal R := by simp [← ((local_hom_TFAE _).out 0 4).mp lochom, hz]
use (maximalIdeal R).toCotangent ⟨z, this⟩
simp [f, ← hy, hz]
let e : Q ≃+ (CotangentSpace (R ⧸ Ideal.span (S : Set R))) := AddEquiv.ofBijective f' bij
have rk := rank_eq_of_equiv_equiv
(ResidueField.map (Ideal.Quotient.mk (Ideal.span (S : Set R))))
e (ResidueField.map_bijective_of_surjective _ Ideal.Quotient.mk_surjective) (fun r m ↦ by
induction m using Submodule.Quotient.induction_on
induction r using Submodule.Quotient.induction_on
rename_i m r
change f (r • m) = (ResidueField.map (Ideal.Quotient.mk (Ideal.span (S : Set R))))
(IsLocalRing.residue R r) • (f m)
simp only [map_smul]
rfl)
have frk : Module.finrank (ResidueField R) Q = Module.finrank
(ResidueField (R ⧸ Ideal.span (S : Set R)))
(CotangentSpace (R ⧸ Ideal.span (S : Set R))) := by
simp [Module.finrank, rk]
have : Fintype.card (S : Set R) = S.card := Fintype.card_ofFinset S (fun x ↦ Finset.mem_coe)
rw [← frk, ← this, ← finrank_span_eq_card li]
apply Module.finrank_quotient_add_finrank_le
have : ringKrullDim (R ⧸ Ideal.span (S : Set R)) + S.card ≤
(Submodule.spanFinrank (maximalIdeal (R ⧸ Ideal.span (S : Set R)))) + S.card :=
add_le_add_left (ringKrullDim_le_spanFinrank_maximalIdeal _) _
exact ⟨ENat.WithBot.add_natCast_cancel.mp (le_antisymm (ge.trans le) this),
le_antisymm (this.trans ge) le⟩
tfae_have 3 → 1 := by
classical
rintro ⟨reg, dim⟩
simp only [← (isRegularLocalRing_iff _).mp reg, ← Nat.cast_add, ←
(isRegularLocalRing_iff R).mp ‹_›, Nat.cast_inj] at dim
let fg : (maximalIdeal (R ⧸ Ideal.span (S : Set R))).FG :=
(isNoetherianRing_iff_ideal_fg _).mp inferInstance _
have fin : (maximalIdeal (R ⧸ Ideal.span (S : Set R))).generators.Finite :=
Submodule.FG.finite_generators fg
let U := Quotient.out '' (maximalIdeal (R ⧸ Ideal.span (S : Set R))).generators
let _ : Fintype U := (Set.Finite.image _ fin).fintype
use S ∪ U.toFinset
have span : Ideal.span (S ∪ U) = maximalIdeal R := by
rw [Ideal.span_union, ← Ideal.mk_ker (I := Ideal.span (S : Set R)), sup_comm,
← Ideal.comap_map_of_surjective' _ Ideal.Quotient.mk_surjective, Ideal.map_span]
have : Ideal.span (⇑(Ideal.Quotient.mk (Ideal.span ↑S)) '' U) =
Submodule.span _ (maximalIdeal (R ⧸ Ideal.span (S : Set R))).generators := by
simp [U, ← Set.image_comp]
rw [this, Submodule.span_generators, IsLocalRing.maximalIdeal_comap]
simp only [Finset.subset_union_left, true_and, ← (isRegularLocalRing_iff R).mp ‹_›,
Finset.coe_union, Set.coe_toFinset]
refine ⟨le_antisymm ?_ ?_, span⟩
· apply Nat.cast_le.mpr (le_trans (Finset.card_union_le _ _) _)
simp only [Set.toFinset_card, ← dim, add_comm, add_le_add_iff_left]
rw [Fintype.card_eq_nat_card, Nat.card_coe_set_eq]
exact (Set.ncard_image_le fin).trans (le_of_eq (Submodule.FG.generators_ncard fg))
· simp only [← span, ← Set.ncard_coe_finset, Finset.coe_union, Set.coe_toFinset, Nat.cast_le]
exact Submodule.spanFinrank_span_le_ncard_of_finite (Set.toFinite (S ∪ U))
tfae_finish

lemma quotient_span_singleton [IsRegularLocalRing R] {x : R} (mem : x ∈ maximalIdeal R)
(nmem : x ∉ (maximalIdeal R) ^ 2) : IsRegularLocalRing (R ⧸ Ideal.span {x}) ∧
(ringKrullDim (R ⧸ Ideal.span {x}) + 1 = ringKrullDim R) := by
rw [← Nat.cast_one, ← Finset.card_singleton x, ← Finset.coe_singleton x]
apply ((quotient_isRegularLocalRing_tfae R {x} (by simpa)).out 1 2).mp
simpa [← LinearMap.mem_ker, Ideal.mem_toCotangent_ker] using nmem

lemma exist_nat_eq [FiniteRingKrullDim R] : ∃ n : ℕ, ringKrullDim R = n := by
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
have : (ringKrullDim R).unbot ringKrullDim_ne_bot ≠ ⊤ := by
by_contra eq
rw [← WithBot.coe_inj, WithBot.coe_unbot, WithBot.coe_top] at eq
exact ringKrullDim_ne_top eq
use ((ringKrullDim R).unbot ringKrullDim_ne_bot).toNat
exact (WithBot.coe_unbot (ringKrullDim R) ringKrullDim_ne_bot).symm.trans
(WithBot.coe_inj.mpr (ENat.coe_toNat this).symm)

set_option backward.isDefEq.respectTransparency false in
open Pointwise in
theorem isDomain_of_isRegularLocalRing [IsRegularLocalRing R] : IsDomain R := by
obtain ⟨n, hn⟩ := exist_nat_eq R
induction n generalizing R
· simp only [← (isRegularLocalRing_iff R).mp ‹_›, CharP.cast_eq_zero, Nat.cast_eq_zero] at hn
have : maximalIdeal R = ⊥ := by
rw [← Submodule.spanRank_eq_zero_iff_eq_bot, Submodule.fg_iff_spanRank_eq_spanFinrank.mpr
((isNoetherianRing_iff_ideal_fg R).mp inferInstance _), hn, Nat.cast_zero]
exact (isField_iff_maximalIdeal_eq.mpr this).isDomain
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
· rename_i n ih _ _
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
obtain ⟨x, xmem, xnmem⟩ : ∃ x ∈ maximalIdeal R,
x ∉ ⋃ I ∈ {(maximalIdeal R) ^ 2} ∪ minimalPrimes R, I := by
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
by_contra! h
have fin : ({(maximalIdeal R) ^ 2} ∪ minimalPrimes R).Finite :=
Set.Finite.union (Set.finite_singleton _) (minimalPrimes.finite_of_isNoetherianRing R)
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
rcases (Ideal.subset_union_prime_finite fin ((maximalIdeal R) ^ 2) ((maximalIdeal R) ^ 2)
(fun I hI ne _ ↦ Ideal.minimalPrimes_isPrime (by simpa [ne] using hI))).mp h with
⟨I, hI, sub⟩
simp only [Set.singleton_union, Set.mem_insert_iff] at hI
rcases hI with eq|min
· have : IsField R := by
simp only [← subsingleton_cotangentSpace_iff, Ideal.cotangent_subsingleton_iff,
IsIdempotentElem]
exact le_antisymm Ideal.mul_le_right (le_of_le_of_eq sub (eq.trans (pow_two _)))
rw [ringKrullDim_eq_zero_of_isField this, ← Nat.cast_zero, Nat.cast_inj] at hn
exact Nat.zero_ne_add_one n hn
· let _ : I.IsPrime := Ideal.minimalPrimes_isPrime min
rw [← Ideal.primeHeight_eq_ringKrullDim_iff.mpr (le_antisymm (le_maximalIdeal_of_isPrime I)
sub), Ideal.primeHeight_eq_zero_iff.mpr min, ← Nat.cast_zero] at hn
exact Nat.zero_ne_add_one n (Nat.cast_inj.mp hn)
simp only [Set.singleton_union, Set.mem_insert_iff, Set.iUnion_iUnion_eq_or_left, Set.mem_union,
SetLike.mem_coe, Set.mem_iUnion, exists_prop, not_or, not_exists, not_and] at xnmem
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
obtain ⟨reg, dim⟩ := quotient_span_singleton R xmem xnmem.1
simp only [hn, Nat.cast_add, Nat.cast_one] at dim
have ih' := ih (R ⧸ Ideal.span {x}) (ENat.WithBot.add_one_cancel.mp dim)
have : (Ideal.span {x}).IsPrime := (Ideal.Quotient.isDomain_iff_prime _).mp ih'
obtain ⟨p, min, hp⟩ := Ideal.exists_minimalPrimes_le (bot_le (a := Ideal.span {x}))
let _ : p.IsPrime := Ideal.minimalPrimes_isPrime min
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
have eq_smul : p = Ideal.span {x} • p := by
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
ext y
simp only [smul_eq_mul, Ideal.mem_span_singleton_mul]
refine ⟨fun h ↦ ?_, fun ⟨z, hz, eq⟩ ↦ by simpa [← eq] using Ideal.mul_mem_left p x hz⟩
rcases Ideal.mem_span_singleton'.mp (hp h) with ⟨z, hz⟩
use z
simp only [← hz, mul_comm, and_true]
have : z ∈ p ∨ x ∈ p := (Ideal.IsPrime.mem_or_mem ‹_› (by simpa [hz]))
simpa [xnmem.2 p min] using this
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
have pfg : p.FG := (isNoetherianRing_iff_ideal_fg R).mp inferInstance _
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
have := Submodule.eq_bot_of_eq_ideal_smul_of_le_jacobson_annihilator pfg eq_smul
(((Ideal.span_singleton_le_iff_mem _).mpr xmem).trans (maximalIdeal_le_jacobson _))
have : (⊥ : Ideal R).IsPrime := by simpa [← this]
exact IsDomain.of_bot_isPrime R

instance [IsRegularLocalRing R] : IsDomain R := isDomain_of_isRegularLocalRing R

set_option backward.isDefEq.respectTransparency false in
lemma IsDiscreteValuationRing.of_isRegularLocalRing_of_ringKrullDim_eq_one [IsRegularLocalRing R]
(dim : ringKrullDim R = 1) : IsDiscreteValuationRing R := by
Comment thread
Thmoas-Guan marked this conversation as resolved.
have nisf : ¬ IsField R := by
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated
by_contra isf
simp [ringKrullDim_eq_zero_of_isField isf] at dim
apply ((IsDiscreteValuationRing.TFAE R nisf).out 0 4).mpr
have := (isRegularLocalRing_iff R).mp ‹_›
simp only [dim, Nat.cast_eq_one, Set.ncard_eq_one,
← Submodule.FG.generators_ncard (maximalIdeal R).fg_of_isNoetherianRing] at this
rcases this with ⟨a, ha⟩
use a
simpa [← ha] using (maximalIdeal R).span_generators.symm
Comment thread
Thmoas-Guan marked this conversation as resolved.
Outdated

set_option backward.isDefEq.respectTransparency false in
open RingTheory.Sequence in
theorem isRegular_of_span_eq_maximalIdeal [IsRegularLocalRing R] (rs : List R)
(span : Ideal.ofList rs = maximalIdeal R) (len : rs.length = ringKrullDim R) :
IsRegular R rs := by
refine ⟨⟨fun i hi ↦ ?_⟩, by simpa [span] using Ideal.IsPrime.ne_top'.symm⟩
rw [smul_eq_mul, Ideal.mul_top]
classical
have mem : (rs.toFinset : Set R) ⊆ maximalIdeal R := by
simpa [← span, Ideal.ofList] using Ideal.subset_span
have sub : (List.take i rs).toFinset ⊆ rs.toFinset :=
fun x ↦ by simpa using fun a ↦ List.mem_of_mem_take a
have card : rs.toFinset.card = ringKrullDim R := by
apply le_antisymm (le_of_le_of_eq (Nat.cast_le.mpr rs.toFinset_card_le) len)
simp only [← (isRegularLocalRing_iff R).mp ‹_›, Nat.cast_le, ← span, Ideal.ofList,
← List.coe_toFinset rs]
exact le_of_le_of_eq (Submodule.spanFinrank_span_le_ncard_of_finite rs.toFinset.finite_toSet)
(Set.ncard_coe_finset rs.toFinset)
have reg := ((quotient_isRegularLocalRing_tfae R (List.take i rs).toFinset
((Finset.coe_subset.mpr sub).trans mem)).out 0 2).mp (by
use rs.toFinset
simpa [sub, card] using span)
have : IsDomain (R ⧸ Ideal.ofList (List.take i rs)) := by
refine @isDomain_of_isRegularLocalRing _ _ ?_
convert reg.1
<;> exact (List.take i rs).coe_toFinset.symm
apply IsSMulRegular.of_right_eq_zero_of_smul (fun x hx ↦ ?_)
have : (Ideal.Quotient.mk (Ideal.ofList (List.take i rs))) rs[i] ≠ 0 := by
simp only [ne_eq, Ideal.Quotient.eq_zero_iff_mem]
by_contra mem
simp only [← (isRegularLocalRing_iff R).mp ‹_›, Nat.cast_inj] at len
let rs' := (List.take i rs) ++ (List.drop (i + 1) rs)
have span' : Ideal.ofList rs' = maximalIdeal R := by
simp only [← span, rs']
apply le_antisymm
· apply Ideal.span_mono (fun x ↦ ?_)
simpa [or_imp] using ⟨fun a ↦ List.mem_of_mem_take a, fun a ↦ List.mem_of_mem_drop a⟩
· apply Ideal.span_le.mpr
intro x hx
have : rs = List.take i rs ++ (rs[i] :: List.drop (i + 1) rs) := by
rw [List.cons_getElem_drop_succ, List.take_append_drop]
rw [this] at hx
simp only [List.mem_append, List.mem_cons] at hx
simp only [Ideal.ofList_append, SetLike.mem_coe]
rcases hx with l|eq|r
· apply Ideal.mem_sup_left
apply Ideal.subset_span
exact l
· apply Ideal.mem_sup_left
simpa [eq] using mem
· apply Ideal.mem_sup_right
apply Ideal.subset_span
exact r
have : Submodule.spanFinrank (maximalIdeal R) ≤ rs'.length := by
rw [← span']
apply le_trans (Submodule.spanFinrank_span_le_ncard_of_finite rs'.finite_toSet)
apply le_of_eq_of_le _ (List.toFinset_card_le rs')
simp [← (Set.ncard_coe_finset rs'.toFinset)]
simp only [← len, List.length_append, List.length_take, List.length_drop, rs'] at this
absurd this
omega
exact (mul_eq_zero_iff_left this).mp hx
Loading