后记

为什么选择 Python?

Python 的优势

尽管必须快速执行的代码是用编译型语言实现的,但 Sage 的主要实现语言是 Python(见 [Py] )。 Python 具有以下几点优势:

  • 对象保存 在 Python 中得到了很好的支持。Python 广泛支持将(几乎)任意对象保存到磁盘文件或数据库中。

  • 源代码中对函数和包的 文档 支持非常好,包括自动提取文档和自动测试所有示例。 这些示例会定期自动测试,并保证如预期工作。

  • 内存管理:Python 现有的内存管理器和垃圾收集器设计精巧且强大, 可以正确处理循环引用,并允许文件中的局部变量。

  • Python 拥有许多对 Sage 用户非常有用的 :数值分析和线性代数,2D 和 3D 可视化, 网络(用于分布式计算和服务,例如通过 twisted),数据库支持等。

  • 可移植性:Python 在大多数平台上,只需几分钟即可轻松从源代码编译 Python。

  • 异常处理:Python 拥有复杂且精巧的异常处理系统,即使代码出现错误,程序也能优雅地恢复。

  • 调试器:Python 包含调试器,因此当代码由于某种原因失败时, 用户可以访问详尽的堆栈跟踪,检查所有相关变量的状态,并上下移动堆栈。

  • 性能分析器:Python 拥有性能分析器,它会运行代码并创建一份详细报告,说明每个函数被调用的次数和时间。

  • 一门语言:不同于 Magma、Maple、Mathematica、Matlab、GP/PARI、GAP、Macaulay 2、Simath 等 那样为数学编写一门 新语言,我们使用 Python 语言,它是一种流行的计算机语言, 由数百名经验丰富的软件工程师积极开发和优化。Python 是一个重要的开源成功案例,拥有成熟的开发流程(见 [PyDev] )。

预解析器:Sage 与 Python 之间的区别

Python 的一些数学方面可能会令人困惑,因此 Sage 在多个方面的行为与 Python 不同。

  • 指数运算符的表示法** vs ^。在 Python 中, ^ 表示“异或”,而不是指数运算。因此在 Python 中我们有:

    >>> 2^8
    10
    >>> 3^2
    1
    >>> 3**2
    9
    

    ^ 的这种用法可能略显奇怪,并且对于纯数学研究来说效率不高,因为“异或”函数很少使用。 为了方便起见,Sage 在将所有命令行传递给 Python 之前都会进行预解析, 将不在字符串中的 ^ 替换为 **:

    sage: 2^8
    256
    sage: 3^2
    9
    sage: "3^2"
    '3^2'
    
    >>> from sage.all import *
    >>> Integer(2)**Integer(8)
    256
    >>> Integer(3)**Integer(2)
    9
    >>> "3^2"
    '3^2'
    

    Sage 中的按位异或运算符是 ^^。这也适用于就地运算符对于就地运算符 ^^=

    sage: 3^^2
    1
    sage: a = 2
    sage: a ^^= 8
    sage: a
    10
    
    >>> from sage.all import *
    >>> Integer(3)^Integer(2)
    1
    >>> a = Integer(2)
    >>> a ^= Integer(8)
    >>> a
    10
    
  • 整数除法:Python 表达式 2/3 并不像数学家们所预期的那样:2/3 返回浮点数 0.6666...。 请注意 // 是欧几里得除法,2//3 返回 0

    我们在 Sage 解释器中通过将整型字面量包装在 Integer( ) 中,并使除法作为有理数的构造函数来处理这个问题。例如:

    sage: 2/3
    2/3
    sage: (2/3).parent()
    Rational Field
    sage: 2//3
    0
    
    >>> from sage.all import *
    >>> Integer(2)/Integer(3)
    2/3
    >>> (Integer(2)/Integer(3)).parent()
    Rational Field
    >>> Integer(2)//Integer(3)
    0
    
  • 长整数:Python 原生支持除 C int 类型外的任意精度整数。 这些原生整数的性能显著低于 GMP 所提供的。Sage 使用 GMP C 库来实现任意精度整数。

与某些人为了内部项目修改 Python 解释器不同,我们完全按照原样使用 Python 语言, 并为 IPython 编写预解析器,使 IPython 的命令行行为符合数学家的预期。 这意味着任何现有的 Python 代码都可以在 Sage 中使用。 然而,仍需遵守标准的 Python 规则,以便编写能够导入 Sage 的包。

(例如,要安装在互联网上找到的 Python 库,请按照说明进行操作, 但使用 sage -python 而不是 python。 通常这意味着输入 sage -python setup.py install。)

我想做出一些贡献。我应该怎么做?

如果你想为 Sage 做出贡献,我们会非常感谢你的帮助!贡献可以从实质性代码贡献到向 Sage 添加文档或报告错误。

浏览 Sage 网页以获取开发者信息。你还可以找到一份按优先级和类别排序的 Sage 相关项目列表。 Sage 开发者指南 也有一些有用的信息, 你还可以查看 sage-devel Google 讨论组。

如何引用 Sage?

如果你在论文中使用了 Sage,当引用使用 Sage 的计算时,包含以下内容: 如果你使用 Sage 撰写论文,请将以下内容添加到参考文献中来引用使用 Sage 完成的计算

[Sage] SageMath, the Sage Mathematics Software System (Version 8.7),
       The Sage Developers, 2019, https://www.sagemath.org.

(将 8.7 替换为你使用的 Sage 版本)。此外,请尝试追踪在计算中使用了哪些 Sage 组件, 例如 PARI?, GAP?, Singular?, Maxima? 并引用这些系统。如果你不确定计算使用了哪个软件, 可以随时在 sage-devel Google 讨论组上提问。有关这一点的进一步讨论,请参阅 一元多项式


如果你恰好刚刚读完这篇教程,并且知道花了多长时间,请在 sage-devel Google 讨论组上告诉我们。

祝使用 Sage 愉快!