常见问题解答:使用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-devel 和 sage-release 邮件列表。帮助Sage开发的一种简单方法是下载最新的开发版本,在您的系统上编译它,运行所有doctest,并报告任何编译错误或doctest失败。
Sage难学吗?¶
Sage的基本功能应该像学习Python的基础知识一样容易学习。网上有许多教程可以帮助你学习Sage。为了充分利用Sage,我们鼓励您学习Python编程语言的一些特性。以下是有关Python的不完整资源列表。可以通过网络搜索找到更多资源。
Building Skills in Python 史蒂文·F·洛特著
Dive into Python 马克·皮尔格林著
How to Think Like a Computer Scientist 杰弗里·埃尔克纳、艾伦·B·唐尼和克里斯·迈耶斯
Python home page and the Python standard documentation
我可以在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所存在的问题。这一决定有利有弊。请注意 RealNumber 和 Integer 是特定于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类型,如 Integer 或 RealNumber 还没有达到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”。
如何保存对象,以便不必在每次打开工作表时都进行计算?¶
这个 save 和 load 命令将分别保存和加载对象。
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,即作为服务?¶
有几种可能性。使用 screen , nohup 或 disown 。
用于打印三维对象的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++编写的。