常见问题解答:使用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++编写的。