Test
Notes on Atiyah's Commutative Algebra
(ii):类似的手段,证明
(iii):取
(iv):
(i)
(iii)
(ii)
注:此题中(i)推(iii)也可以通过如下引理得到
中的幂等元可以被提升为 中幂等元,这里
假设存在
(iii):假设
另证:依
(iv):只需证Hausdorff,而这是因为Boole环中素理想皆极大(
反过来的验证和说明这两个对应关系互逆的证明同样循规蹈矩。
反过来如果弱零点定理成立,那么对真理想
我们也可以这么考虑:任何
Notes on Commutative Algebra 4
基本性质
直观上来讲,双线性和对应着“乘法”,例如
如果模
模
唯一性由始对象的特质给出,也就是假设有两个张量积
存在性考虑
注:上面证明存在性处的具体构造除证明张量积存在以外毫无用处。
对一般非交换环情形,比如说对右
映射
只需验证
满足 的泛性质,而 出发的双线性映射相当于一对 和 出发的双线性映射之和,从而用 和 泛性质得到一对线性映射加起来即可。同样的道理,注意到
出发的双线性映射和 出发线性映射相同。
考虑
注:
由于
而反过来,乘法给出双线性映射
更一般的,用同样的手段我们可以证明
考虑乘法定义的映射
注:这个命题也可依靠张量积的右正合性证明,具体来说考虑
考虑双线性映射
取某个
Reading: Section 2.2
Exercises: 2.4
张量积与正合列
如果
与tensor上
对反过来的
比如说对
同样对
注:事实上
从正合列
注:上面证明中的自然同构告诉我们
这种右正合性可以用于计算张量积,具体来说比如说对于
张量积和余极限
与之类似的有用性质是张量积保持direct limit
两个锥
它可以被构造为诸
而关于张量积,
Reading: Section 2.2
Exercise: 2.13
Calculate Hom(M,N) and the tensor products of M, N over the ring k[x] for all pairs M,N of modules each of which is isomorphic to k(x), k[x], or k[x]/(fn) where f is an irreducible polynomial.
平坦模
平坦模的概念由Serre在20世纪50年代引入,此后被Grothendieck证明在代数几何中具有极其基本的地位。直观来讲,
用构造局部化环完全相同的手段,我们可以定义局部化模
考虑正合列
我们把
我们可以定义映射
对一些比较好的情况我们可以探测到一些平坦模的结构。例如
对
因为局部化正合,所以只需证明
想说明
注:如果把
Reading: Section 2.2
Exercises: 2.20
平坦扩张
环同态
不过如果
其中横行皆正合,有
(i) 若
(ii)
考虑以如下路线追图
取
, 被 打到 ,一方面来说 在 中的像是 ,另一方面 满,所以存在 打到 , 被 打到 ,而 单,所以 在 中的像是 ,从而存在 被 打到 。 被 打到 , 与 在 中有相同的像,于是存在 在 下的像是 ,由 满,取 的像是 ,由交换性 的像是 ,于是 的像是 。的追图则更简单。假设
被 打到 ,那么 被 打到 ,由 单知 在 中的像被打到 ,于是由正合性存在 被 打到 , 在 中的像是 , 被打到 于是存在某个原像 ,由于 满所以有原像 , 被 打到 ,但 单,所以 被打到 ,而 被打到 ,于是 。
记
Reading: Section 2.2
Exercises: 2.12, A3.11 (page 641)
Solution to Serre's Finite Group
如题
另证:令
关于Python流程控制、错误处理与文件操作
流程控制
For
for循环形如
1
2for VAR in ITERABLE:
BLOCK
如若ITERABLE中元素为tuple,也可以有如
1
2for VAR1,VAR2 in ITERABLE:
BLOCK
enumerate(ITERABLE)
将一个可遍历的数据对象组合为一个索引序列(类型为enumerate),其元素为形如(index, item)
的tuple。
range(start, stop[, step])
生成可迭代的序列(类型为range),start默认为0,step默认为1。
Python有List
comprehension(列表推导式),形如[expression for item in iterable if condition == True]
其中if条件默认为全部True。此外可以有[expression1 if condition1 else expression2 for item in iterable]
的写法。
break
可以结束最近的一个for或者while循环。
continue
则是直接进入下一轮循环。
pass
为空操作。
错误处理
raise [exceptionName [(reason)]]
会抛出异常,名称为exceptionName而描述为reason,形如exceptionName: reason
。raise
会抓取最近的报错信息(如在上一层try中被抛出的,try中异常被处理结束之后便不会再抛出),如果没有默认RuntimeError。
try
和except
可以不让程序报错的情况下尝试执行一段代码并就相关异常抛出进行处理,具体来说形如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15try:
# ...some error prone code...
code block 1
except:
# ...do something with the error...
code block 2
except Exception_Name_1:
# ...do something with the error...
code block 3
else:
# ...to do when there is no error...
code block 4
finally:
#...some clean up code...
code block 5
如果出现异常(exception),那么将进入except:
处理,默认任何异常都会进入except,而except Exception_Name_1
只处理错误名称为Exception_Name_1的情形。finally:
无论如何都会被执行。
文件操作
基本I/O
电脑向python程序输入数据可以通过电脑键盘(keyboard)和输入文件(input data file)来输入,输出数据可以通过the monitor screen和输出文件来输出。
variable_name = input([prompt])
prompt用于提示用户,从屏幕上输入的内容总是str类型。
print(..., end = str)
可以使print输出...后再输出str,默认str为换行。
文件可以被大体分为binary files (二进制文件)和text files (文本文件),文本文件存储的是ASCII码。二进制文件一般包含headers以标识其文件内容,如果header无效则supporting programs可能不会打开这个二进制文件或者报告其损坏。二进制文件相对来说读取和存储速度更快,更少限制性而且更具安全性,但更容易损坏。
基于unix的操作系统中文件路径分隔符(delimiters)用/
,对大小写敏感。而Windows则是\
,对大小写不敏感。带有.
或..
的文件路径为相对路径,如..\langur.txt
定位当前目录的父目录中名为langur.txt
的文件,而..\langur.txt
则定位当前目录,..\..\langur.txt
定位父目录的父目录。
OS模块
Python中os模块处理与操作系统的接口,需要import os
。
os.getcwd()
将返回当前工作目录的路径string。
os. listdir(dir)
返回一个list,其中元素是dir中每个文件名称的string。dir默认是当前工作目录(string类型)。
os.remove(file)
删除名为file的文件(file为string类型)。
os.rename(source, destination)
将source重命名为destination。
os.mkdir(path)
创建一个新目录path。
os.path.join(path, *paths)
把一串路径串联成一个大路径。
os.path.exists(path)
、os.path.isfile(path)
和os.path.isdir(path)
返回bool值判断是否存在如path所述的路径、目录和文件。
os.path.getmtime(path)
返回path最新一次被修改的时间。
os.path.split(path)
返回一对string,(head, tail)
,其中tail为字符串直至最末分隔符的后缀,其余在该分隔符前部分为head。
读入/写入文件
open ( file, mode, .. )
会返回一个文件句柄,file为文件目录,可以绝对可以相对,mode是字符串以描述这个文件会如何被处理,具体来说的mode如下:
模式 | 描述 |
---|---|
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w |
打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。文件不存在时会报I/O错误。 |
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
w+ |
打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
.read(n)
将从文件中读入n个字节的内容,默认全部读入(不推荐)。.readline(n)
将从文件读取整行包括换行符\n
,如果指定了一个非负数的参数,则返回指定大小的字节数,包括\n
字符。如果已经到文件末尾(碰到结束符EOF)则会返回空字符串。.readlines()
返回一个list,每个元素都是文件中的一行。如果碰到EOF则会返回空字符串。for i in f
,其中f为读入文件句柄,可以按行迭代文件内容。
读入的结尾需要关闭文件,即.close()
。
with statement可以自动关闭文件,它形如:
1
2
3with open(file, mode) as file_handler:
Statement_1
Statement_2
with open(file, mode, encoding='')
将确定读入时选择的编码。如encoding='ascii'
、encoding='utf-8'
分别对应ascii码和utf-8编码的情况。python3默认为utf-8。
file.write(byte)
可以向file_handle对于文件中写入string。write不会自动补上换行符。与read时类似的也有file_handle.writelines(list)
。(同样不会默认加\n
)
常见文本文件格式
.txt / .tsv文件用Tab制表符\t
分隔,CSV(Comma Separated
Values)文件用,
分隔。
import csv
可以调用CSV模块。
csv.reader(file, delimiter='')
返回一个reader
object,可以按行迭代csvfile文件中读取内容(每行都返回为string),csvfile可以是文件或文件对象,也可以是类似文件的对象(如StringIO对象)。delimiter为分隔符,默认为逗号,也可以改为如'等。类似地,csv.writer
返回将数据写入
CSV 文件的写入器对象
在csv文件中写入内容可以考虑
1
2
3csvwriter = csv.writer(csvfile, delimiter='')
csvwriter.writerow(row)
csvwriter.writerows(rows)
delimiter默认为逗号。row是一个列表,rows则是每行对应列表之列表。writerows会自动换行。
csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
会返回一个类似reader的reader
object,但将每行中的信息映射到一个字典,该字典的keys由可选的fieldnames参数给出。fieldnames参数是一个序列。如果省略字段名,则文件f第一行中的值将用作字段名,并将从结果中省略。如果提供了字段名,将使用它们,并且第一行将包含在结果中。无论字段名是如何确定的,字典都会保留它们的原始顺序。例如csv.DictReader(f, fieldnames=['a', 'b', 'c'])
则对应的keys是a,
b, c,而默认则是csv文件第一行对应内容。
如果一行的字段多于字段名,则将剩余的数据放入列表中,并使用由restkey指定的字段名(默认为None)存储。如果非空白行的字段少于字段名,则用restval的值(默认为None)填充缺失的值。
类似地还有csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
。它将创建一个对象,其操作方式与常规写入器类似,但将字典映射到输出行。fieldnames参数是一个键序列,用于标识传递给writerow方法的字典中的values写入文件f的顺序。它的用法例如
1
2
3
4
5
6
7
8
9
10import csv
with open('names.csv', 'w', newline='') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
Pickle模块
在程序生命周期中创建的所有变量都临时存储在内存中,并在程序终止时消失。而pickle模块是Python专用的持久化模块,也就是让数据持久化保存。 “Pickling” 是将 Python 对象层次结构转换为字节流的过程,而 “unpickling” 是逆操作。
pickle.dump(pythonObject, pickleDestination, pickle_protocol=None, *, fix_imports=True)
将python对象pythonObject转换成写入pickleDestination的字节流。类似地可以用pickle.load(f)
。用pickle.dump和pickle.load读写文件时要用wb
和rb
模式。
pickle.dumps(pythonObject)
返回pythonObject转换而来的二进制串。pickle.loads(bytes_object)
有类似功用。
Booleans, Integers, Floats, Strings, Tuples, Lists, Sets, Dictionaries
均能被pickle。
Notes On Commutative Algebra
Borcherds交换代数网课的笔记
关于环与模
burnside多项式
对一般的不含幺环,我们某种意义上有办法把它变成一个含幺环,也就是“硬塞”一个新的单位元
注:unitization具有函子性,并且是
取
模
代数不变量
另一种观点是考虑群
也即
令
- 作为模或者理想有限生成
- 作为
上代数有限生成 - 作为域有限生成
诺特环
Reading Section (Eisenbud'c Commutative Algebra): 1.4
Exercises: 1.1, 1.3, 1.4, 1.5
1.
2. 任何
3.
注意到
多元多项式环中理想的生成元数量并不能被未定元数控制。例如
Hilbert基定理
Reading: Section 1,4
Exercises: 15.15 a
对
对
这涉及到无穷多次求和的操作,但注意到其中
证明 中一样将单项式列出,横轴为诸
注:5.3的证明对任何有限生成的自由Abel群均适用。
事实上上面证明了
不变量的有限生成性
Reading: Section 1.5
利用基定理可以证明一些不变量的有限生成性,至少是对有限群
注1:
注2:对满足
分裂,从而
现在回到6.1的证明:取
注1:此处的论证适用于一大类分次环。对分次环
注2:一般分次环中
应当注意到Reynolds算子对任意群和任意域并非总是存在,例如
此外对非紧群
而这套论证在无穷维时则会基本失效,此时
诺特模
Noether对定理6.2中
Reading: Section 1.7 (似乎实则应当1.11(?
Exercises: 1.22, 1.23
与诺特环的情形一致,我们有:
是诺特模- 任何
子模组成集合都有包含意义下的极大元 - 任何子模的包含升链稳定
只需证
诺特环上
令
事实上这还能进一步推广:
证明则是完全相同的。
这里的自由解消并不保证有限,也不保证唯一,但Hilbert证明了对一些特定环和其上的模,自由解消总是有限而且某种意义上几乎唯一,可以从分次自由解消中取出某种“最小”解消,然后其它自由解消就相当于在其基础上加上如
则Hilbert的定理可以被陈述为:
这种消解的“几乎唯一”性给出了许多
不变量的有限生成性(续)
诺特证明了任意特征域上的
令
注:诺特的证明相比Hilbert对特征零情形的证明,难以推广到无限群的情形。
对更一般的情形,我们有定理:
在有限生成 -代数上作用的不变量总是有限生成 -代数 是约化群(reductive group)- 如果
在线性空间 上作用有非零的不动向量 ,则存在 作用下不动的多项式 使得
注1:Nagata证明了3推1,1推2某种意义上也是因为Nagata找到了一个G不是约化群时候不变量并非有限生成的例子,Haboush证明了2推3。
注2:条件3某种意义上在说存在一个非线性的Reynolds算子。在特征零的情况下,
注3(Borcherds猜测):
Notes On Fulton's Algebraic Curves
包括但不限于关于Fulton的Algebraic Curves中卡过我的/感觉有意思的/可能需要经常查看的/无端决定写在这里的东西。
1.1
考虑固定前
1.2
1.
2.
3.
对于1,假设存在多项式
1.3
注意到
反过来把
事实上此中有一些神奇的对应。不难证明
设
事实上我们也有
注意到我们考虑这种代数集和其理想之间的对应时完全没有用到多项式本身的性质。事实上
1.4
对
1.5
1.
2.
注意到
1.6
1.7
Hilbert弱零点定理可以被等价地叙述为如下定理的逆命题:若对
零点定理则可以被重述为如果
b.
2.2
Notes On MIT18.875
2024.10.6开始依Kato的数论I以及MIT18.875自学代数数论,这里主要是MIT18.875中的gap和problem set答案
Lec 1&2
注意到特征
- 在试图证1.5的时候我发现
等等,再考虑到仿照 的想法得到如下证明:由 |-y|=|y| ,有 同理 ,若 则可知 。 - 注意到有将
映到 的 嵌入。
- 如果
即 ,则欲证 只需证 ,即 。现在只需证 推出 ,而假若不然 时, ,但因为 左边是右边的高阶无穷大,矛盾。
关于Python数据结构与一些内置函数
中英对照
statement 语句
expression 表达式
operands 操作数(如6*7中的6)
declare 声明
assignment 赋值
Compound assignment operators 复合赋值运算符(如+=)
identifier
标识符(变量名,必须从字母或_开始,不能从数字开始,只能有字母数字下划线)
immutable 不可变的
calling function 调用函数
asterisk 星号
数据类型
type()
可判断数据类型。
float
round()
四舍五入取整,math.ceil()
/math.floor()
上/下取整(需import math
)
string
字符串不可修改。
用'
、"
、'''
、"""
之一括起来。
用+
可连接两个string,用*(数字)
可重复(数字)次。
用in
或not in
可判断字符串是不是另一个字符串的子串。
字符串可按ASCII码下字典序比较。
len()
可以给出字符串长度。
从后往前遍历字符串可以用负数下标(如s[-1]
是最后一个元素)。string_x [start: stop: step]
可以给出子串,具体来说是start,start+step,...,step取负数可以反向字符串(如s[::-1]
为翻转字符串),此时start大于等于stop才能取出子串。
string.lower()
/string.upper()
可以进行大写→小写/反之的操作。
string.replace(oldvalue, newvalue, count)
返回把count个oldvalue替换为newvalue的string,默认全替换。
string.count(value, start, end)
统计[start,end)中子串value的出现次数。
string.find(value, start, end)
返回[start,end)中子串value第一次出现的位置,如无则返回-1。
string.split(separator, maxsplit)
返回把string中按子串separator切分最多maxsplit次成的list。separator默认空格,maxsplit默认-1即全部切分。
string.startswith(value, start, end)
/string.endswith(value, start, end)
返回bool值,判断string是否以子串value起始/结尾。start/end默认是全序列。
string.strip(characters)/.lstrip(characters)/.rstrip(characters)
返回string去除了起始和结尾/起始/结尾连续的字符characters的串,如果characters是字符串,那就去除全部起始结尾连续字符属于set(characters)中的串。characters默认为空格。
string.join(sequence)
为将字符串的序列sequence中字符串连接起来,每两个相邻字符串中间插上一个string。
string.format(s1,s2,...)
可用于格式化字符串,具体来说string中的{n}
会被替换为sn,如果每一个括号都不填数那么默认从0开始依次增加(要么都填要么都不填)。
字符串有许多前缀。
| 前缀 | 功能 | 示例 | 说明 |
|---|---|---|---|
| r
| 原始字符串字面量,阻止字符串中字符被解释为转义字符。
|
r'C:\Program Files\Python'
便会使得字符串原样成为C:\Program Files\Python
|
| b
| 字节字符串字面量,表示字符串以字节序列的形式存储。 |
b'hello'
| 主要用于处理二进制数据,例如文件I/O。 |
| f
| f-字符串 (Formatted String
Literals),允许在字符串中嵌入表达式。 |
f'{name} is {age} years old'
|
使用花括号{}
将表达式嵌入到字符串中,并进行格式化。 |
list
list的+
,*
的用法与string相同,但list可以修改。
del a[i]
可用来删去list中index为i的项,类似的也可以删去片段。
sum(list), max(list), min(list)
返回list的求和、最大值、最小值
list.append(elmnt)
将elmnt加入到list结尾
list.extend(seq)
将列表seq放在list结尾
list.insert(pos, elmnt)
在pos位插入elmnt(原list[pos]向后移动)
list.pop(pos)
删去list[pos]并将其返回。默认pos=-1,即删结尾元素。
list.remove(elmnt)
将elmnt在list中第一次出现的位置删去,不返回值。
list.count(value)
list.index(elmnt)
返回elmnt在list中第一次出现的位置
list.sort(reverse=True|False, key=myFunc)
默认reverse=False,key为自定义的比较函数(默认<)
list.reverse()
翻转list
Tuple
tuple有序且不可变,有通常的指标、切片、+*操作。
elmnt in/not in tuple
是bool值,表达elmnt在/不在tuple中。
len(),sum(),min(),max(),sorted(),count(),index()
对于tuple均照常(sorted返回list)。
Tuple可以一次将多个分量以坐标形式(如pos = (x, y, z)
)packing起来,也可以按分量分别赋值给以逗号分隔开的多个变量(如x, y, z = pos
)。
zip()
可将多个list/tuple/string等打包成按分量的tuple并返回一个tuple的迭代器,用如list()
可将之list化,合并按最短的那个为准(如list(zip([1,
2], [1, 2, 3]))是[(1, 1), (2, 2)])
Set
Set无序而且不包含重复元素,可以包含unchangeable
objects(如number,string,tuple),但不能包含changeable
objects(如list,dictionary)。
用大括号如正常数学中那样可以创建一个集合。
Set中有照常的in
、not in
、len()
、sorted()
(sorted返回list)。
set1 & set2
或set1.intersection(set2)
是交集运算(均为返回交集但不修改原集合),同理|
和.union()
并,-
和.difference()
差,^
和.symmetric_difference()
是对称差。
set.add(elmnt)
添加elmnt。
set.remove(item)
删去item,如果不存在会报错。
set.discard(value)
删去value,如果不存在不会报错。
set(list/string)
可以将list/string转换为set
x.issubset(y)/.issuperset(y)
判断x是否是y的子集/父集
Dictionary
Dictionary是无序的查找表,由(key,value)对组成,key只能是不可变对象,一key不可重复,value可以重复。
Dictionary可以通过如{ key1 : value1, key2 : value2, key3 : value3 }
的大括号创建,也可通过如dict(a = 'a', b = 'b', t = 't')
的用法创建,也可通过如dict([('one', 1), ('two', 2), ('three', 3)])
的方式创建(里面dict()内小中括号并无区别,list和tuple都一样)。
dictionary_name[key] = value
可以在dict中加入或更新key的value。
del dict[key]
可以remove掉key,没有时会报错。
in
和not in
可以key判断在或不在字典中。
dict.keys()/.values()/.items()
返回dict的key/value/(key,
value)的tuple组成的list。
dict.get(keyname, value)
返回keyname对应的值,如不存在返回value。value默认为None
。
dict.update(iterable)
用可迭代的iterable来更新dict,可迭代的如某个dictionary或者(key,value)的list等等。
dict.pop(key)/.popitem(key)
romove掉key并返回其value/(可以看作随机remove)remove掉并返回最后一个key-value对,没有时会报错。
内置函数
print
以特定格式输出可以考虑modulo operator %,format()和f-strings。
sorted
sorted(iterable, cmp=None, key=None, reverse=False)
对任何可迭代对象iterable排序并返回排序后的可迭代对象。例如sorted(list, reverse=True/False)
返回list排序后的序列,默认从小到大排序(默认reverse=False),事实上迭代器都可以(如
reversed
和sorted同理。
map
map(function, iterable, ...)
对参数序列iterable中每一个元素调用function。
eval()
eval(expression[, globals[, locals]])
用于执行一个字符串表达式expression。
next()
next(iterable[, default])
返回迭代器的下一个项目。default可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发
StopIteration 异常。