循环,函数,控制语句和比较

我们已经见到几个for循环常见用法的例子。Python中,for 循环是缩进的,如

  1. >>> for i in range(5):
  2. ... print(i)
  3. ...
  4. 0
  5. 1
  6. 2
  7. 3
  8. 4

注意for语句结尾处的冒号(不象GAP或Maple,这里没有”do”或”od”),和循环体(也就是print(i))的缩进。缩进是非常重要的。 输入”:”后按enter,Sage会自动为你缩进,像下面这样。

  1. sage: for i in range(5):
  2. ....: print(i) # 这里按两次enter
  3. ....:
  4. 0
  5. 1
  6. 2
  7. 3
  8. 4

符号=用于赋值。 符号==用于比较是否相等:

  1. sage: for i in range(15):
  2. ....: if gcd(i,15) == 1:
  3. ....: print(i)
  4. 1
  5. 2
  6. 4
  7. 7
  8. 8
  9. 11
  10. 13
  11. 14

要记住,缩进决定了if,forwhile语句的结构:

  1. sage: def legendre(a,p):
  2. ....: is_sqr_modp=-1
  3. ....: for i in range(p):
  4. ....: if a % p == i^2 % p:
  5. ....: is_sqr_modp=1
  6. ....: return is_sqr_modp
  7. sage: legendre(2,7)
  8. 1
  9. sage: legendre(3,7)
  10. -1

当然,这不是Legendre符号的一个有效实现,只是为了展示Python/Sage编程的某些方面。Sage中函数{kronecker}通过C语言库调用PARI来有效的计算Legendre符号。

最后我们看一下比较运算符,如==,!=,<=,>=,>,<,如果可能的话, 会自动将两边的数据转换为同一类型:

  1. sage: 2 < 3.1; 3.1 <= 1
  2. True
  3. False
  4. sage: 2/3 < 3/2; 3/2 < 3/1
  5. True
  6. True

对于符号不等式,使用bool函数:

  1. sage: x < x + 1
  2. x < x + 1
  3. sage: bool(x < x + 1)
  4. True

Sage中比较两个不同类型的对象时,多数情况下Sage会尝试强制将对象转换为规范的共同父类。如果成功转换,比较就在转换后的对象间进行;如果转换不成功,对象被认为不相等。要测试两个变量是否指向同一个对象,使用is. 如:

  1. sage: 1 is 2/2
  2. False
  3. sage: int(1) is int(2)/int(2) # py2
  4. True
  5. sage: 1 is 1
  6. False
  7. sage: 1 == 2/2
  8. True

下面两行中,头一行不相等是因为没有规范映射$Q\to F{5}$, 从而没有规范的方法比较$F{5}$中的$1$和$Q$中的$1$. 相反,存在规范映射$\Zeta\to F_{5}$, 所以第二个比较是True. 注意到顺序不影响结果。

  1. sage: GF(5)(1) == QQ(1); QQ(1) == GF(5)(1)
  2. False
  3. False
  4. sage: GF(5)(1) == ZZ(1); ZZ(1) == GF(5)(1)
  5. True
  6. True
  7. sage: ZZ(1) == QQ(1)
  8. True

警告:Sage中的比较比Magma中更严格,Magma中$F_{5}$中的$1$与$Q$中的$1$相等。

  1. sage: magma('GF(5)!1 eq Rationals()!1') # optional - magma
  2. true