常见问题解答:使用Sage

我该如何开始?

你可以在不下载任何东西的情况下试用Sage:

  • CoCalc™: 访问https://cocalc.com并设置一个免费帐户。

    如果您登录,您将获得访问最新版本的Sage和许多其他程序的权限。

    请注意,本网站是一项独立的商业服务。

  • Sage cell: Sage的“一次性”版本,一次只能进行一次计算。Https://sagecell.sagemath.org/

要下载 pre-built binary 有关Sage发行版的详细信息,请访问http://sagemath.org/download.html并单击适用于您的操作系统的二进制文件链接。

这个 source code 您也可以下载和使用。请访问http://www.sagemath.org/download-source.html下载任何版本的Sage的TAR归档。

Sage Jupyter笔记本可以在Web浏览器中运行。要启动笔记本,请在终端中发出以下命令,如果 sage 在您的 PATH

$ sage -notebook

在我的计算机上安装Sage副本的前提条件是什么?

Sage的大多数依赖项都随Sage本身一起提供。在大多数情况下,您可以下载预构建的二进制文件并使用它,而无需安装任何依赖项。如果您使用Windows,则需要安装 VirtualBox ,可从https://www.virtualbox.org/wiki/Downloads.页面下载安装VirtualBox之后,您需要下载http://www.sagemath.org/download-windows.html.上提供的Sage的VirtualBox发行版确保您按照该页面上的说明进行操作,然后使用VirtualBox软件启动Sage虚拟机。

您可以获得Sage的完整源代码,以便在您自己的Linux或Mac OS X系统上进行编译。Sage位于一个独立的目录中,不会干扰您周围的系统。它附带了开发Sage所需的一切、源代码、所有依赖项和完整的更改日志。在像Debian/Ubuntu这样的Linux系统上,您可能需要安装 build essential 包和 m4 宏处理器。如果您想要从源代码编译Sage,您的系统需要有一个可以正常工作的C编译器。在Debian/Ubuntu上,您可以按如下方式安装这些必备组件:

$ sudo apt-get install build-essential m4

如果您有一个多核系统,您可以选择Sage的并行构建。该命令

$ export MAKE='make -j8'

将为支持并行的构建部分启用8个线程。将数字8更改为适合您系统上的核心数量。某些Sage安装可能具有启用OpenMP的BLAS(和其他)库。OpenMP并行度由环境变量OMP_NUM_THREADS控制;但是,众所周知,它不能很好地处理Python并行性,您可能希望

$ export OMP_NUM_THREADS=1

以防撞车或悬挂。

更多详细信息,请参阅 Installation Manual

如何让Sage的Python识别我的系统的TCL/Tk安装?

可能您已经安装了TCL/Tk,并且您的系统的Python可以识别它,但Sage的Python不能。通常来说,现在几乎不需要构建Sage的Python(Anno 2023),但如果您这样做了,它就在这里。确保您安装了TCL/Tk开发库。在Ubuntu上,这是命令

$ sudo apt-get install tk8.5-dev

或者其他类似的东西。接下来,重新安装Sage的Python:

$ make python3-clean python3-uninstall && make python3

这将自动获取TCL/Tk库。在成功重新安装Sage的Python之后,从Sage命令行界面中发出以下命令:

import _tkinter
import Tkinter

如果他们不提出一个 ImportError 然后它就起作用了。

如何将Sage导入到一个Python脚本中?

您可以将Sage作为一个库导入到一个Python脚本中。需要注意的是,您需要使用与Sage捆绑在一起的版本(Sage 9.2与Python3.7.x一起提供)来运行该Python脚本。要导入Sage,请在您的Python脚本中放入以下内容:

from sage.all import *

当您想要运行脚本时,需要使用选项调用Sage -python 它将使用Sage附带的Python版本运行您的脚本。例如,如果Sage在您的 PATH 变量,则可以执行以下操作:

$ sage -python /path/to/my/script.py

另一种方法是编写一个Sage脚本并使用Sage本身运行该脚本。Sage脚本的文件扩展名为 .sage 或多或少是一个Python脚本,但使用特定于Sage的函数和命令。然后可以运行该Sage脚本,如下所示:

$ sage /path/to/my/script.sage

这将负责为您加载必要的环境变量和默认导入。

如何在Sage会话中重新加载Python脚本?

您可以使用命令在Sage会话中加载Python脚本 load 。例如,我们可以使用Sage导入一个名为imple.py的文件,其中包含:

load("simple.py")

并在每次更改文件imple.py时重复此命令。但是,如果我们键入:

attach("simple.py")

应用于文件imple.py的每一项更改都将在Sage中自动更新。

我可以将SageMath与Python3.x一起使用吗?

自2020年1月发布9.0以来,SageMath一直运行在Python3之上。

我使用XXX安装了Sage X.Y,但该版本出现了很多错误。我能做什么?

您的XXX系统上通过其包管理器提供的Sage版本(即Sage X.Y版)非常旧。目前还没有人有时间更新XXX版本的Sage。如有任何帮助,我们不胜感激。您应该从下载最新版本的Sage download page 。如果您希望帮助更新XXX版本的Sage,请发送电子邮件至 sage-devel 邮件列表。

我应该使用正式版本还是开发版本?

我们鼓励您使用Sage的最新官方版本。开发版本经常在 sage-develsage-release 邮件列表。帮助Sage开发的一种简单方法是下载最新的开发版本,在您的系统上编译它,运行所有doctest,并报告任何编译错误或doctest失败。

Sage难学吗?

Sage的基本功能应该像学习Python的基础知识一样容易学习。网上有许多教程可以帮助你学习Sage。为了充分利用Sage,我们鼓励您学习Python编程语言的一些特性。以下是有关Python的不完整资源列表。可以通过网络搜索找到更多资源。

我可以在Sage中做X吗?

建议您使用Sage的制表符自动完成功能。只需输入几个字符,按下 Tab 键,并查看所需的命令是否出现在选项卡自动完成列表中。如果您有一个名为 mycmd, then type mycmd. 然后打到了 Tab 键以获取该命令支持的功能列表。要阅读的文档,请参阅 mycmd ,类型 mycmd? 并按下 Enter 用于阅读该命令的文档的键。类似地,输入 mycmd?? 然后打到了 Enter 键以获取该命令的源代码。我们还鼓励您搜索Sage库的源代码和文档。要搜索Sage库的源代码,请使用以下命令 search_src("<search-keyword>") 您应该在哪些地方替换 <search-keyword> 找到你要找的关键词。此外,还可以使用以下命令搜索Sage库的文档 search_doc("<search-keyword>")

当我输入“0.6**2”时,Sage到底会做什么?

当您在Python语言中键入“0.35999999999999999**2”时,它会返回类似于0.6的结果。但当您在Sage中执行同样的操作时,它将返回0.360000000000000。要了解为什么Python会这样运行,请参阅 Python Tutorial ,特别是“浮点算术:问题和限制”一章。Sage所做的是“准备”输入并将其转换为:

sage: preparse("0.6**2")
"RealNumber('0.6')**Integer(2)"

那么,什么是 actually 运行方式为:

RealNumber('0.6')**Integer(2)

Sage开发人员(实际上是Carl Witty)决定,Sage浮点数在默认情况下应尽可能只打印已知正确的小数位,从而避免了Python所存在的问题。这一决定有利有弊。请注意 RealNumberInteger 是特定于Sage的,所以您不能只将上面的内容输入到Python中,并期望它在没有导入语句的情况下工作,例如:

from sage.all import RealNumber, Integer, preparse

为什么Sage的指挥历史与岩浆的不同?

使用Sage,您将缺少Magma命令行界面的一个功能。在Magma中,如果您使用向上箭头键输入在历史中找到的行,然后按向下箭头键,则会提取历史中的下一行。此功能允许您根据需要获取任意数量的历史记录中的连续行。然而,Sage没有类似的功能。这个 IPython 命令提示符使用READLINE库(通过pyadline),该库显然不支持此功能。Magma有自己的定制“类似于Readline”的库,它确实支持这一特性。(既然有这么多人要求这个特性,如果有人能想出如何实现它,那么这样的实现肯定是受欢迎的!)

我在使用Sage的SciPy、cvxopt或NumPy时遇到了类型问题。

您正在使用来自Sage的SciPy或cvxopt或NumPy,但您收到了输入错误,例如

TypeError: function not supported for these types, and can't coerce safely to supported types.

当您在Sage中键入数字时,预处理器会将它们转换为基环,您可以通过执行以下操作来查看:

sage: preparse("stats.uniform(0,15).ppf([0.5,0.7])")
"stats.uniform(Integer(0),Integer(15)).ppf([RealNumber('0.5'),RealNumber('0.7')])"

不幸的是,NumPy支持这些高级SAGE类型,如 IntegerRealNumber 还没有达到100%。作为解决方案,重新定义 RealNumber 和/或 Integer 为了更改Sage预编译器的行为,因此小数文字是浮点数,而不是Sage任意精度实数,而整数文字是PythonINT。例如::

sage: RealNumber = float; Integer = int
sage: from scipy import stats
sage: stats.ttest_ind([1,2,3,4,5], [2,3,4,5,.6])
Ttest...Result(statistic=0.0767529..., pvalue=0.940704...)
sage: stats.uniform(0,15).ppf([0.5,0.7])
array([  7.5,  10.5])

或者,明确数据类型,例如::

sage: from scipy import stats
sage: stats.uniform(int(0),int(15)).ppf([float(0.5),float(0.7)])
array([  7.5,  10.5])

第三种选择是使用原始后缀::

sage: from scipy import stats
sage: stats.uniform(0r,15r).ppf([0.5r,0.7r])
array([  7.5,  10.5])

您还可以通过以下方式在代码中禁用预处理器 preparser(False) 。您可以从命令行单独启动IPython sage -ipython 它不会预加载任何特定于Sage的内容。或者将Notebook Language切换为“Python”。

如何保存对象,以便不必在每次打开工作表时都进行计算?

这个 saveload 命令将分别保存和加载对象。

Sage是否包含类似于数学的ToCharacterCode[]的函数?

您可能希望将“巨无霸”之类的ASCII字符转换为ASCII数字,以便进一步处理。在Sage和Python中,您可以使用 ord ,例如:

sage: list(map(ord, "abcde"))
[97, 98, 99, 100, 101]
sage: list(map(ord, "Big Mac"))
[66, 105, 103, 32, 77, 97, 99]

我怎样才能像在数学中那样隐式地写乘法呢?

Sage有一项功能可以实现这一点:

sage: implicit_multiplication(True)
sage: x 2 x  # not tested
2*x^2
sage: implicit_multiplication(False)

这是由Sage准备成Python代码的。它可能在复杂的情况下不起作用。要查看预备器执行的操作::

sage: implicit_multiplication(True)
sage: preparse("2 x")
'Integer(2)*x'
sage: implicit_multiplication(False)
sage: preparse("2 x")
'Integer(2) x'

有关数学数学与圣智数学的更多信息,请参见https://wiki.sagemath.org/sage_mathematica。

我可以让Sage在启动时自动执行命令吗?

是的,只需创建一个文件 $HOME/.sage/init.sage 它将在您启动Sage的任何时候执行。这假设SAGE环境变量 DOT_SAGE 指向隐藏目录 $HOME/.sage ,默认情况下就是这样。

当我编译Sage时,我的计算机会发出蜂鸣声,然后关机或挂起。

编译SAGE对CPU来说是相当繁重的工作。上述行为通常表示您的计算机过热。在许多情况下,可以通过清洁CPU风扇并确保系统正常通风来解决此问题。如果您从未这样做过,请咨询您的系统管理员或专业人士。此类硬件维护,如果不是由熟练的专业人员执行,可能会损坏您的系统。

对于Linux用户,如果您怀疑编译失败是因为资源问题,修复方法可能是编辑您的 /etc/inittab 以便Linux引导到运行级3。该文件 /etc/inittab 通常包含类似以下代码段的内容:

#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have
#   networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

它将引导您的Linux发行版进入图形化登录屏幕。注释掉这行 id:5:initdefault: 并添加以下行 id:3:initdefault: ,这样您现在就拥有了如下内容:

#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have
#   networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
# id:5:initdefault:
id:3:initdefault:

现在,如果您重新启动系统,您将看到一个基于文本的登录屏幕。这允许您从虚拟终端内使用基于文本的会话登录到您的系统。基于文本的会话通常不会消耗与图形会话一样多的系统资源。然后在基于文本的会话中构建您的Sage源代码发行版。在尝试登录到基于文本的会话之前,您需要确保可以首先恢复图形会话。

当我启动Sage时,SELinux抱怨“/Path/to/libpari-gmp.so.2”需要文本重定位。我怎么才能修好它呢?

通过运行以下命令可以修复该问题:

$ chcon -t textrel_shlib_t /path/to/libpari-gmp.so.2

升级Sage很顺利,但现在横幅仍然显示旧版本。我怎么才能解决这个问题呢?

标语是存储的,而不是在每个新的Sage开始时计算。如果尚未更新,这不应阻止Sage正确运行。类型 banner() 在Sage会话中检查真实版本。如果您想要正确的横幅,则需要通过输入以下命令重新构建Sage make build 在航站楼里。

如何在守护程序模式下运行SAGE,即作为服务?

有几种可能性。使用 screennohupdisown

用于打印三维对象的SHOW命令不起作用。

Sage 6.4+的默认实时3D打印使用 Jmol/JSmol 以供观看。从命令行使用JMOL Java应用程序,在浏览器中查看时使用纯Java脚本或Java小程序。默认情况下,在浏览器中使用纯Java脚本是为了避免一些不支持Java小程序插件的浏览器(即Chrome)出现的问题。在每个浏览器工作表上都有一个复选框,如果用户想要使用Java小程序(对于复杂的绘图,小程序速度稍快一些),则必须在生成3-D绘图之前选中该复选框。

故障的最可能原因是您没有安装Java运行时环境(JRE),或者您的JRE版本早于1.7版。如果从命令行运行,另一种可能是您的浏览器没有适当的插件来支持Java小程序(目前,2014年,插件不能与大多数版本的Chrome一起工作)。确保您已经安装了IcedTea浏览器插件(对于Linux,请参阅您的包管理器),请参阅: IcedTea 或Oracle Java插件,请参阅: Java

如果您在Web上使用的是Sage服务器,甚至连javascript呈现都不起作用,那么您的浏览器的javascrip引擎可能有问题,或者将其关闭。

我可以在商业环境中使用Sage工具吗?

是!绝对一点儿没错!基本上就是 only 限制是,如果您对Sage本身进行更改并公开重新分发更改后的Sage版本,则您必须将这些更改提供给我们,以便我们可以将它们放入Sage的标准版本中(如果我们愿意)。否则,您可以完全免费使用任意数量的Sage副本来赚钱等,而无需支付任何许可费。

我想编写一些使用有限域算法的Cython代码,但“cimport sage.rings.Limited_field_givaro”失败了。我能做什么?

您需要给Sage一些提示,让它使用C++(Givaro和NTL都是C++库),并且它还需要GMP和STDC C++库。下面是一个小例子:

# These comments are hints to Cython about the compiler and
# libraries needed for the Givaro library:
#
# distutils: language = c++
# distutils: libraries = givaro gmpxx gmp m
cimport sage.rings.finite_field_givaro
# Construct a finite field of order 11.
cdef sage.rings.finite_field_givaro.FiniteField_givaro K
K = sage.rings.finite_field_givaro.FiniteField_givaro(11)
print("K is a {}".format(type(K)))
print("K cardinality = {}".format(K.cardinality()))
# Construct two values in the field:
cdef sage.rings.finite_field_givaro.FiniteField_givaroElement x
cdef sage.rings.finite_field_givaro.FiniteField_givaroElement y
x = K(3)
y = K(6)
print("x is a {}".format(type(x)))
print("x = {}".format(x))
print("y = {}".format(y))
print("x has multiplicative order = {}".format(x.multiplicative_order()))
print("y has multiplicative order = {}".format(y.multiplicative_order()))
print("x*y = {}".format(x * y))
# Show that x behaves like a finite field element:
for i in range(1, x.multiplicative_order() + 1):
    print("{} {}".format(i, x**i))
assert x*(1/x) == K.one()

要了解更多信息,请键入

sage.rings.finite_field_givaro.FiniteField_givaro.

在Sage提示符下,按Tab键,然后使用 ?? 以获取有关每个功能的更多信息。例如:

sage.rings.finite_field_givaro.FiniteField_givaro.one??

告诉您有关有限域中的乘法单位元的更多信息。

我在MacOSX上遇到了奇怪的构建失败。我如何修复这个问题?

搜索构建日志(install.log),查看是否收到以下日志消息:

fork: Resource temporarily unavailable.

如果是这样,请尝试以下方法。创建(或编辑) /etc/launchd.conf 并包括以下内容:

limit maxproc 512 2048

然后重新启动。看见 this page 了解更多详细信息。

如何绘制负输入的立方根(或其他奇数根)?

这是最常被问到的问题之一。绘图文档中提到了几种方法,但这一种方法最简单:

sage: plot(real_nth_root(x, 3), (x, -1, 1))
Graphics object consisting of 1 graphics primitive

另一方面,请注意,直接的::

sage: plot(x^(1/3), (x, -1, 1))  # not tested

仅为正数生成预期的曲线图 x 。这个 reason Sage在数值逼近时返回负数的奇数根的复数,这是 :wikipedia:`standard convention <Cube_root#Complex_numbers>` 。**

sage: numerical_approx( (-1)^(1/3) )
0.500000000000000 + 0.866025403784439*I

如何在Sage中使用按位XOR运算符?

Sage中的异或运算符是 ^^ 。这也适用于inplace运算符 ^^= **

sage: 3^^2
1
sage: a = 2
sage: a ^^= 8
sage: a
10

如果您定义了两个变量,然后按如下方式求值:

sage: a = 5; b = 8
sage: a.__xor__(b), 13
(13, 13)

还可以执行以下操作:

sage: (5).__xor__(8)
13

括号是必要的,这样Sage就不会认为您有一个实数。有几种定义函数的方法:

sage: xor = lambda x, y: x.__xor__(y)
sage: xor(3, 8)
11

另一个偷偷绕过Sage准备器的选项是:

sage: def xor(a, b):
....:     return eval("%s^%s" % (a, b))
sage: xor(3, 8)
11

您还可以使用以下命令关闭Sage预备器 preparser(False) ,那么 ^ 将会像在Python中一样工作。您可以稍后使用以下命令打开预备器 preparser(True) 。这只适用于命令行Sage。在笔记本电脑中,切换到Python模式。

对于对象a和b以及函数f,我意外地键入了f(A)=b而不是f(A)==b。这返回了一个TypeError(正如预期的那样),但也删除了对象a。为什么?

这是因为在Sage中使用 f(x) = expr 使用预备器的表示法。另请注意,如果您在 if 语句,您将获得一个 SyntaxError 在其他事情出差错之前。因此,在这种情况下,没有问题。

如何在Sage笔记本中使用不同的浏览器?

您将需要从命令行执行此操作。只需运行如下命令即可。

  • Linux(假设您有Sage /usr/bin ):

    $ env BROWSER=opera /usr/bin/sage --notebook
    
  • Mac(假设您位于下载的Sage的目录中)。使用Jupyter笔记本电脑:

    $ BROWSER='open -a Firefox %s' ./sage --notebook jupyter
    $ BROWSER='open -a Google\ Chrome %s' ./sage --notebook jupyter
    

的源代码在哪里? <function>

通常可以在IPython命令行上使用 ?? 快捷方式::

sage: plot??                            # not tested
Signature: plot(*args, **kwds)
Source:
...

但是,内置于Python或IPython中的对象将被编译,并且不会显示。在Sage中有许多函数被实现为符号函数,即它们可以作为符号表达式的一部分未经计算而使用。它们的源代码也可能无法从命令行访问,特别是对于基本函数,因为出于效率的原因,它们是用C++编写的。