循环,函数,控制语句和比较
我们已经见到几个for循环常见用法的例子。Python中,for
循环是缩进的,如
>>> for i in range(5):... print(i)...01234
注意for语句结尾处的冒号(不象GAP或Maple,这里没有”do”或”od”),和循环体(也就是print(i))的缩进。缩进是非常重要的。 输入”:”后按enter,Sage会自动为你缩进,像下面这样。
sage: for i in range(5):....: print(i) # 这里按两次enter....:01234
符号=用于赋值。 符号==用于比较是否相等:
sage: for i in range(15):....: if gcd(i,15) == 1:....: print(i)12478111314
要记住,缩进决定了if,for和while语句的结构:
sage: def legendre(a,p):....: is_sqr_modp=-1....: for i in range(p):....: if a % p == i^2 % p:....: is_sqr_modp=1....: return is_sqr_modpsage: legendre(2,7)1sage: legendre(3,7)-1
当然,这不是Legendre符号的一个有效实现,只是为了展示Python/Sage编程的某些方面。Sage中函数{kronecker}通过C语言库调用PARI来有效的计算Legendre符号。
最后我们看一下比较运算符,如==,!=,<=,>=,>,<,如果可能的话, 会自动将两边的数据转换为同一类型:
sage: 2 < 3.1; 3.1 <= 1TrueFalsesage: 2/3 < 3/2; 3/2 < 3/1TrueTrue
对于符号不等式,使用bool函数:
sage: x < x + 1x < x + 1sage: bool(x < x + 1)True
Sage中比较两个不同类型的对象时,多数情况下Sage会尝试强制将对象转换为规范的共同父类。如果成功转换,比较就在转换后的对象间进行;如果转换不成功,对象被认为不相等。要测试两个变量是否指向同一个对象,使用is. 如:
sage: 1 is 2/2Falsesage: int(1) is int(2)/int(2) # py2Truesage: 1 is 1Falsesage: 1 == 2/2True
下面两行中,头一行不相等是因为没有规范映射$Q\to F{5}$,
从而没有规范的方法比较$F{5}$中的$1$和$Q$中的$1$.
相反,存在规范映射$\Zeta\to F_{5}$, 所以第二个比较是True.
注意到顺序不影响结果。
sage: GF(5)(1) == QQ(1); QQ(1) == GF(5)(1)FalseFalsesage: GF(5)(1) == ZZ(1); ZZ(1) == GF(5)(1)TrueTruesage: ZZ(1) == QQ(1)True
警告:Sage中的比较比Magma中更严格,Magma中$F_{5}$中的$1$与$Q$中的$1$相等。
sage: magma('GF(5)!1 eq Rationals()!1') # optional - magmatrue
