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