常见问题解答:使用Sage

如何开始?

您可以试用Sage而无需下载任何内容:

  • CoCalc公司™: 去https://cocalc.com和设立一个免费帐户。

    如果您登录,您将可以访问Sage的最新版本和许多其他程序。

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

  • Sage细胞: Sage的“一次性”版本,可一次进行一次计算。https://sagecell.sagemath.org/

下载 pre-built binary Sage分发、访问http://sagemath.org/download.html然后单击操作系统的二进制文件链接。

这个 源代码 也可供您下载和使用。去http://www.sagemath.org/download-source.html下载Sage任何版本的tar档案。

Sage笔记本电脑在网络浏览器中运行。要启动笔记本,请在终端中发出以下命令,如果 sage 在你的心中 PATH

$ sage -notebook

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

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

您可以获得Sage的完整源代码,以便在自己的Linux或macosx系统上编译它。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的Python识别系统的Tcl/Tk安装?

可能是您安装了Tcl/Tk,并且系统的Python可以识别它,但是Sage的Python没有。要解决这个问题,请安装tcl/tk开发库。在Ubuntu上,这是命令

$ sudo apt-get install tk8.5-dev

或者是一些类似的东西。接下来,重新安装Sage的Python:

$ sage -f python3

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

import _tkinter
import Tkinter

如果他们不提出 ImportError 然后就成功了。

如何将Sage导入Python脚本?

您可以在Python脚本中将Sage作为库导入。需要注意的是,您需要使用与Sage捆绑的Python版本(当前为python2.6.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导入一个名为简单.py有:

load("simple.py")

每次更改文件时重复这个命令简单.py. 但是,如果我们键入:

attach("simple.py")

应用于文件的每个更改简单.py将在Sage中自动更新。

我可以在python3.x中使用SageMath吗?

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

我在一个名为“sage”的文件中看到一个关于“权限被拒绝”的错误-标志.txt".

当sage从源代码构建时,它会跟踪您的CPU支持哪些特殊指令(例如SSE2),并记录这些指令。这样,如果您尝试在不支持这些额外指令的另一台机器上运行代码,您将得到一条合理的错误消息,而不是segfault或非法指令。因为这应该与Sage本身一起存储(而不是用户的 .sage 目录),它必须由具有适当权限的人创建。所以如果你看到这样的事情

Traceback (most recent call last):
  File "/usr/local/sage-4.0.2/local/bin/sage-location", line 174, in <module>
    t, R = install_moved()
  File "/usr/local/sage-4.0.2/local/bin/sage-location", line 18, in install_moved
    write_flags_file()
  File "/usr/local/sage-4.0.2/local/bin/sage-location", line 82, in write_flags_file
    open(flags_file,'w').write(get_flags_info())
IOError: [Errno 13] Permission denied:
  '/usr/local/sage-4.0.2/local/lib/sage-flags.txt'

这可能意味着您将Sage作为一个用户编译/安装,但没有运行它来让它生成 sage-flags.txt 文件。只要运行Sage一次作为任何用户安装它,这个问题应该会消失。通过让Sage作为安装过程的一部分运行一次,这也很容易解决;请参阅 :trac:`6375` 为了这次修复。

我下载了一个Sage二进制文件,它在启动时以“非法指令”崩溃。我能做什么?

解决这个问题的一个方法是完全从源代码构建Sage。另一个选择是通过在 SAGE_ROOT 然后等待大约15到20分钟

$ rm spkg/installed/mpir* spkg/installed/atlas*
$ make

有可能二进制文件是为比您现有的架构更新的架构而构建的。还没有人知道如何构建Sage,这样MPIR和ATLAS可以在所有硬件上工作。这最终会得到解决。感谢任何帮助。

我用Debian/Ubuntu安装sage3.0.5,这个版本有很多错误。我能做什么?

Sage版本,即Sage版本3.0.5,可通过 apt-get 在Debian和Ubuntu中是非常古老的。目前还没有人有时间更新Sage的Debian/Ubuntu版本。非常感谢任何帮助。您应该从 download page . 如果您想帮助更新Sage的Debian/Ubuntu版本,请发送电子邮件至 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.6**2”时,它将返回类似于0.35999999999999999的值。但在Sage中执行相同的操作时,它返回0.360000000000000。要理解Python为什么会这样,请参见 Python Tutorial 特别是“浮点运算:问题和局限性”一章。Sage所做的是“准备”输入并将其转换成这样:

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

那么什么是 事实上 运行是:

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

Sage开发人员(事实上,Carl Witty)决定Sage浮点数字在默认情况下应该只打印已知的正确的十进制数字,这样就避免了Python存在的问题。这个决定有利有弊。请注意 RealNumberInteger 是Sage特有的,因此您不能只在Python中键入上面的内容,并期望它在没有import语句的情况下正常工作,例如:

from sage.all import RealNumber, Integer, preparse

为什么Sage的命令历史不同于岩浆?

使用Sage,您将丢失Magma命令行界面的一个功能。在Magma中,如果您使用向上箭头键输入历史中找到的一行,然后按向下箭头键,则会提取历史中的下一行。此功能允许您在历史中获取任意多个连续行。然而,Sage并没有类似的特征。这个 IPython 命令提示符使用readline库(通过pyreadline),它显然不支持这个特性。Magma有自己的自定义“readline-like”库,它确实支持这个特性。(既然有那么多人请求这个特性,如果有人能想出如何实现它,那么这样的实现肯定是受欢迎的!)

我在使用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 preparser的行为,因此十进制文本是float而不是Sage任意精度的实数,而整型文本是Python int。例如::

sage: RealNumber = float; Integer = int
sage: from scipy import stats
sage: stats.ttest_ind(list([1,2,3,4,5]),list([2,3,4,5,.6]))
Ttest_indResult(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特定的内容。或者将笔记本语言切换为“Python”。

如何保存一个对象,使我不必每次打开工作表时都计算它?

这个 saveload 命令将分别保存和加载对象。在笔记本里 DATA 变量是工作表的数据存储区域的位置。保存对象 my_stuff 在工作表中,您可以

save(my_stuff, DATA + "my_stuff")

为了重新装载,你只要

my_stuff = load(DATA + "my_stuff")

Sage是否包含类似于Mathematica的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/sageu mathematica更多关于Mathematica vs.SageMath的信息。

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

是的,做个档案 $HOME/.sage/init.sage 它会在你启动Sage的任何时候被执行。这假设Sage环境变量 DOT_SAGE 指向隐藏的目录 $HOME/.sage ,默认情况下是这样。

我的Sage升级失败,osx10.4上缺少gmp符号。我能做什么?

移动macosx10.4上的Sage安装,然后升级任何与NTL链接的内容,都会由于缺少gmp符号而导致链接错误。问题在于创建动态NTL的链接模式。有一个修复程序,但仍在验证它是否确实修复了该问题。所有与NTL相关的东西都需要重新编译,即目前的singular和cremona。更令人困惑的是:这在macosx10.5上不是问题。Sage 2.8.15中已经对这个问题进行了修复,因此如果您在更新的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 2.9及更高版本在Linux上编译ATLAS失败。我该怎么解决这个问题?

最可能的原因是启用了电源管理。禁用它应该可以解决问题。根据您的发行风格,这可能是有可能与一些漂亮的GUI工具或没有。在命令行中,以root用户身份对每个CPU执行以下操作:

$ /usr/bin/cpufreq-selector -g performance -c #number CPU

在Ubuntu上,通过

System --> Preferences --> Sessions

在“启动程序”下或使用 cpufreq-set 通过命令行。

当我启动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 .

用于打印三维对象的“显示”命令不起作用。

Sage 6.4+的默认实时三维打印使用 Jmol/JSmol 供查看。从命令行使用Jmol Java应用程序,在浏览器中查看时,使用纯javascript或javaapplet。默认情况下,浏览器使用纯javascript来避免某些不支持javaapplet插件(即Chrome)的浏览器出现问题。在每个浏览器工作表上都有一个复选框,如果用户想使用Java小程序,则必须在生成三维绘图之前选中该复选框(对于复杂的绘图,小程序会更快一些)。

故障最可能的原因是您没有安装Java运行时环境(JRE),或者您有一个比版本1.7更早的版本。如果从命令行运行,另一种可能是你的浏览器没有合适的插件来支持Java小程序(目前,2014年,大多数版本的Chrome都无法使用插件)。确保您已经安装了IcedTea浏览器插件(对于linux,请参阅软件包管理器),请参阅: IcedTea ,或Oracle Java插件请参见: Java .

如果您在web上使用Sage服务器,甚至javascript呈现也不起作用,那么您的浏览器的javascript引擎可能有问题,或者关闭了它。

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

对!当然!基本上 only 约束条件是,如果您对Sage本身进行更改并公开重新发布Sage的这个更改版本,那么您必须使这些更改对我们可用,以便我们可以将它们放入Sage的标准版本(如果我们需要的话)。否则,您可以完全免费使用Sage的任意数量的副本来赚钱等,而不必支付任何许可费。

我想写一些Cython代码,它使用有限域算法,但是“cimport”Sage环有限公司“失败了。我能做什么?

你需要给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??

告诉你更多关于有限域中的乘法单位元素。

我在Mac OS X上遇到奇怪的构建失败。我该如何修复?

搜索生成日志(安装.log)查看是否收到以下日志消息:

fork: Resource temporarily unavailable.

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

limit maxproc 512 2048

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

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

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

sage: plot(sign(x)*abs(x)^(1/3),-1,1)
Graphics object consisting of 1 graphics primitive

这个 原因 这是必要的,Sage返回复数的奇数根时,数字近似,这是一个 standard convention .

Sage:N((-1)^(1/3))0.500000000000000+0.866025403784439*I

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

Sage中的异或运算符是 ^^ . 这也适用于就地操作员 ^^= ::

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 preparser,是:

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

也可以使用关闭Sage preparser preparser(False) 然后 ^ 会像Python一样工作。您可以稍后使用 preparser(True) . 这只适用于Sage命令行。在笔记本中,切换到Python模式。

当我试图在笔记本上使用 Latex 时,它说找不到全文.sty.

一般的答案是,你需要安装 fullpage.sty 在Ubuntu(可能还有许多其他Linux发行版)上TeX.搜索的目录中,应该安装 texlive-latex-extra 包裹。如果不可用,请尝试安装 tetex-extra package . 如果你使用的是macosx,你必须使用你使用的任何TeX分布来获得 fullpage.sty (如果您使用的是MacTeX,它很可能已经安装)。如果您在Windows上使用VirtualBox映像,则需要登录到VirtualBox映像并安装 texlive-latex-extra 在那里。

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

这是因为函数在Sage中是如何定义的 f(x) = expr 使用preparser的符号。还请注意,如果您在 if 声明,你会得到 SyntaxError 在其他事情出问题之前。所以在这种情况下,没有问题。

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

您需要从命令行执行此操作。只要运行这样的命令。

  • Linux(假设您在 /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
    

    用旧的SageNB笔记本:

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

的源代码在哪里 <function> 是吗?

用Python或Cython编写的函数和类通常可以通过IPython命令行使用 ?? 快捷方式:

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

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