Magma简单介绍
一历史和背景简介
Magma是一个为解决纯理论数学中的计算难
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
而生的软件, 最初由Allan Steel和John Canon开发. 它本质上是一个巨大的软件包, 这个软件包能够解决组合, 几何, 代数和数论中的计算难题. 他最初的名字是Cayley(1973), 在1993年被改名Magma. 最初的软件是免费的. 当时它的主要理念是解决数学中, 特别是代数, 数论和几何方面的符号计算技术. 后来被澳大利亚研究理事会注入基金, 其后使用者被要求提供注册资金.
目前Magma拥有12 个雇员, 其中9个是全职雇员, 4个拥有硕士文凭, 5个拥有博士文凭, 另外3个是访问学者. 它的运行年预算大概在一百万美元左右, 其中百分之八十以上用于支付12个雇员, 同时每年还有近七万美元用于支付访问学者的费用. 另外16万美元用于举办各类会议. (我曾经在2010年二月底参加加拿大蒙特利尔举行的p进L函数会议并作
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
, 这个会议就是由Magma出钱组织的.)
目前Magma主要涉足以下领域的计算问题:群论;基本的环,模以及线性代数;交换代数;代数,表示理论,同调代数,李理论;代数数论;代数几何;算术几何;编码理论,密码,等。
Magma目前是由悉尼大学John Canon教授领导的计算代数小组维护。Magma的数学观点是重视代数和几何结构及其之间的映射。所有的程序理念都是从全局代数和范畴理论中中得来。
目前保守估计, 全球大概有2000名使用者. 目前一个版本大概500美元左右. 具体的价格可以咨询悉尼大学的Magma网站:
Magma和Maple都致力于解决一些纯理论计算问题, 但是Maple的重点是让使用者更加方便和轻松地使用. 因此Maple拥有的使用者更多, 可能超过两百万. 而Magma反其道而行之, 创造了一套和理论研究平行的语言, 因此使用起来比较困难, 但是极为接近各个方向的研究前沿.
我最初接触Magma的时间是2009年9月. 当时我在英国剑桥大学牛顿研究所访问, 主要靠自己捉摸, 同时也受到剑桥大学T.A. Fisher教授的指点和博士生李纯阳的帮助. 此外我也得到了悉尼大学M. Watkins博士的指导。本文只是努力将我所知道的Magma知识写出来, 以帮助更多的初学者尽快熟悉使用Magma. 由于我是代数数论方向的,所以所写内容或者例子都比较靠近数论。不过读者完全可以通过阅读达到触类旁通的目的。
作为一个简单介绍,本文将尽量写的初级和简单易懂。如果读者想更深入的研究使用Magma,可以到Magma的网站去咨询,比方说队与下一章Magma程序设计的更详细的介绍可参看Magma在线帮助的OVERVIEW这一章,内容远远超出我们所涉及到的内容。
读者如果想更快上手,还可以越过第二章直接看实例。我刚开始使用Magma的时候也没有系统学习用法,基本上是需要什么就去看什么,这样上手更快。
二Magma程序设计
(一)启动
在Windows系统中启动Magma只需要直接点击Magma应用程序即可。在Linux系统中启动Magma, 只需要在命令传口中输入
Magma
然后按回车即可。
(二)寻求帮助
在使用一个软件的时候,最常使用的指令是帮助。
在Magma中,帮助是通过?+要帮助的名词实现。
例假设我们要咨询Magma中如何查询save指令
输入“?save”
然后按回车键,将得到以下内容:
2 Matches:
1 O /system/save-restore
2 I /language/IO/workspace/save
这意味着Magma中和save有关的内容有两处,右边的是目录。如果我们想知道1 处的
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
,我们只需要接着输入
“?1”,
那么就会出现我们需要的内容。
我们还会在以下的内容中看到help的使用。
另外一种寻求帮助的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
是到Magma的在线帮助上去找。那里有最新的Magma的各类函数包。
值得一提的是,在各种软件报上,我们都可以找到这个软件报的作者。
例二,椭圆曲线。
我们再现搜索关键词elliptic curve,得到一些搜索到的结果,点击
elliptic-curve :: ELLIPTIC CURVES,我们进入相关椭圆曲线的内容的网页。这时候我们点击Acknowledgements 我们会看到椭圆曲线的软件报是由以下几个人写的
G. Bailey, N. Bruin, S. Donnelly, D. Kohel, M. Watkins。
值得一提的是他们也是现在椭圆曲线领域比较活跃的人物,其中M. Watkins就是p进L函数会议的组织者。我们有什么程序上的问题,甚至于索要源代码,均可以和这些人具体联系。互相交流是最好的学习方法。
(三)程序语言
(1)表达式:用+,-,*,/,()连接起来的式子
例:
>2+3-1;
4
(2)定义
Magma中的定义方法如下。
例:输入”a:=1”, 我们就赋予a一个值1。
> a:=1;
> a;
1
> a+:=1;
> a;
2
这和C++中的语法类似,也和Maple,sage,parigp的赋值方法完全一样。
和一般的程序语言不一样的是Magma中引入了对于范畴,集合等的定义。由于范畴适用非常广泛,我们这里也举一个例子。
例:定义有理数域
> Q := RationalField();
> print Category(Q);
FldRat
例:定义在有理数域Q上的6维向量空间。
> V := VectorSpace(Q, 6);
> print Category(V);
ModTupFld
> print Category(V ! [5/6, 2, 0, 1, 46/5, -6]);
ModTupFldElt
上例的语法比较复杂,我们现在不做具体解释。
(3)布尔值和比较语句
布尔值只有两个:true 和false。
比较语句有:ge(意思是大于等于),gt(意思是大于),le(意思是小于等于),lt (意思是小于),eq(意思是等于),ne(意思是不等于)。
例:
> a:=2;
>b:=1;
>a gt b;
true
>a lt b;
false
> not a ge b;
false
>IsPrime(26);
false
(4)条件语句if
条件语句的组织
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
和一般程序语言的条件语句类似。语法如下
if 表达式then
语句;
elif 表达式then
语句;
…
else
语句;
end if;
”
例: 输入
>if 2 gt 1 then a:=1; else a:=2; end if;
>a;
(5)循环语句(遍历语句)
for语法结构:
for i:=表达式to 表达式by 跳跃do
语句;
end for;
for i in S do
语句;
end for;
例:计算1+2+...+100
>result:=0;
>for i:=1 to 100 by 1 do
> result:=result+i;
>end for;
>result;
5050
>result:=0;
>for i in [1,100] do
> result:=result+i;
>end for;
>result;
5050
while语法结构
while 条件do
语句;
end while;
例(3n+1)问题
> n := Random(1, 100);
> while n gt 1 do
> print n;
> if IsEven(n) then
> n div:= 2;
> else
〉 n := 3*n+1;
> end if;
> end while;
13
40
20
10
5
16
8
4
2
(6)函数
函数的语法结构如下:
函数名称:=function(x1,...,xn)
local w1,...,ws;
语句;
return z1,...,zr;
end function;
例:给定正整数N, 返回满足N - 1 = 2^s * d的s和d.
> evenexp_odd := function(N)
> s := 0; d := N;
> q, r := Quotrem(d, 2);
> while r eq 0 do
> s +:= 1;
> d := q;
> q, r := Quotrem(d, 2);
> end while;
> return s, d;
> end function;
> print evenexp_odd(2^8 * 35);
8 35
进程的语法结构稍微复杂一点,我们这里不做详细介绍了。
(7)递归函数(Recursive functions)
Magma也编写了独立的递归结构。这里只举一例。
例:假设i是一个整数,返回i+(i-1)+...+1+0
> f := func< i | i le 0 select 0 else i + $$(i-1) >;
> f(100);
> 5050
(8)集合和序列定义。
集合定义的语法结构有两种。第一种是枚举,结构如下:
{ 域|元素}
例:定义一个由整数3,7,2组成的集合
> S:={Integers()| 3,7,2}
例:定义空集
>{UNIVERSE| }
或者
>{ }
后者是一个没有规定任何范畴的空集。
第二种是属性定义,结构如下:
{U| x的表达式: x的属性刻画}
这个比较复杂,我只举一个例子。
例在有限域F_10007中有多少个本原元素
> proots := {@ z : z in GF(10007) | IsPrimitive(z) @};
> print #proots;
5002
> print proots[17];
41
集合的运算如下
?#S (S的元素个数)
?S join T (S与T的并集)
?S meet T (交集)
?S diff T, S sdiff T (差和对称差)
?Universe, IsNull, IsEmpty (是否全集或者空集)
?in, notin, subset, notsubset, eq, ne (属于,不属于,子集合,非子集合,等于,不等于)
?Include, Exclude, Min, Max(包含,不包含,最小,最大)
序列定义如下:
例:>S:=[3,7,2];
当然我们也可以规定元素所在的范畴。
例:>S:= [ Integers() | 3, 7, 2]
它也有和集合类似的操作。
例:在有限域F_10007中有多少个本原元素
> proots := [ z : z in GF(10007) | IsPrimitive(z) ];
> print #proots;
5002
> print proots[17];
41
(8)映射
映射的语法如下:
f:=map<集合A-〉集合B |映射定律>.
假设x属于A,那么f(x) 的语法是x@f.
例:定义集合[1,2,3,4]到四个元素的有限域之间的一一对应。
> Z4 := Integers(4);
> F4
:= FiniteField(4);
> m := map< Z4 -> F4 | <0, 0>, <1, 1>, <2, w>, <3, w^2> >;
> print 2@m;
w
(9)输入和输出
当我们需要进行比较规模比较大的编程时,便需要把数据写入和输出。
数据写入的命令是:
load "文件目录"
例:载入目录"D:/John Coates/mf1.txt"的命令
>load "D:/John Coates/mf1.txt";
这样我们就可以把程序编写在外部文件里面了。
输出命令:
PrintFile(文件目录,变量);
注意到PrintFile在输出变量到指定文件时,并不覆盖原有的数据。因此PrintFile命令可以连续输出。
二实例
这一章主要将我学习的几个实例写出来。也请读者跟我一起探索Magma的用法.
(一)计算最小的d使得椭圆曲线簇y^2=x^3-dx的解析秩为3。
这个计算来源于实际需要。目前对于秩大于等于2的椭圆曲线的BSD猜想研究
甚少,John Coate和我有一个兴趣点是应用Iwasawa理论数值验证这类椭圆曲
线的BSD猜想。我们已经验证了两条秩大于等于2的椭圆曲线的BSD猜想的某
些部分成立。接下来我们对需要找一条导子最小的秩为3的定义在有理数域上
的带复乘椭圆曲线。
首先,我们来找椭圆曲线的定义。
在Magma主页在线搜索上面查找elliptic curve,我们得到一系列常常的和椭圆
曲线相关的结果。比如第一条是
2-selmer-group :: The 2-Selmer Group (HYPERELLIPTIC CURVES)
这显然不是我们想要找的结果。经过浏览我决定点击
elliptic-curve :: ELLIPTIC CURVES ,
这时出现的页面是椭圆曲线的主页面。网页上部有up字样. 我们可以点击up
去看看, 发现椭圆曲线这一个内容包含在Arithmetic Geometry里面. 好了,回到
椭圆曲线的目录, 找到Creation functions链接, 点击进去. 我们会发现椭圆曲线
有如下几种定义方式:
EllipticCurve([a, b]);EllipticCurve([a1, a2, a3, a4, a6]);等等.
所以我们要创建的椭圆曲线的方程的代码时是
EllipticCurve([-d, 0]).
输入
>EllipticCurve([-1,0])
界面上会返回说我们创建了椭圆曲线y^2=x^3-x.
其次,我们需要找到计算椭圆曲线的秩的函数. 让我们首先来查找rank. 经过搜索后我们发现了函数AnalyticRank.
>AnalyticRank(EllipticCurve([-1,0]));
这表示椭圆曲线y^2=x^3-x的解析rank是0!
接下来简单了. 我们已经介绍了for循环语句. 当然读者也可以搜索for的用法.
我们写一个小程序片断, 让d从-1000变到1000, 计算rank.程序如下:
>rk4list := [];
>for d in ([-10^4..10^4]) do
> E := EllipticCurve([0,d]);
> rk := AnalyticRank(E);
> if rk gt 2 then
> print rk,d;
> Append(~rk4list,d);
> end if;
> end for;
我们把这段代码保存到目录"D:/a.txt"里面(注意删掉>), 然后打开Magma, 输入代码
>load "D:/a.txt";
很快我们便会发现最简单的秩为3的椭圆曲线. 这条曲线为y^2=x^3-82x. 当我把运行结果告诉John Coates, 他非常惊讶. 因为他一直以为y^2=x^3-226x是最简单的秩为3的椭圆曲线呢!
读者阅读刚才的程序片断时, 可以注意到循环命令for和条件命令if的用法. 还可以学习我的建立数组rk4list保存数据的方式. 其中在数组中增加一个数的命令是
Append(数组,数);
不管怎么样, 第一步的成功总是让人欣喜. 也就是自此之后, 我向John Coates 宣布, 我懂得怎么使用Magma了.
(二)证明椭圆曲线y^2=x^3-82x上的BSD猜想的第一部分成立.
我们已经知道E:y^2=x^3-82x的解析秩为3, 那么它的Model-Weil秩(俗称代数秩)为多少呢? 经过简单搜索, 我们发现了几组分子分母比较小的解P1= [-9,3];P2 :=[-8,12];P3 :=[-1,9]. 出于无巧不成书的想法, 我猜想这就是y^2=x^3-82x的代数生成元. 那么我们需要作以下的事情来证明这一点:
1 证明P1, P2, P3在整数上线形无关(按照椭圆曲线的加法), 这样椭圆曲线的代
数秩就大于等于3.
2 证明P1, P2, P3是E/[2]E的生成元, 这样椭圆曲线的代数秩就小于等于3.
3 证明P1, P2, P3就是椭圆曲线的Model-Weil群的生成元.
其中第二三步可以用Decent理论来完成. 那么我们现在眼编写一个程序来完成第一步, 也就是计算这三个点的Regulator. 经过查找Height, 我们找到了我们的程序如下:
>C := EllipticCurve([-82, 0]);
>P1 :=C![-9,3];
>P2 :=C![-8,12];
>P3 :=C![-1,9];
>Determinant(HeightPairingMatrix([P1,P2,P3]));
10.6423642927
值得注意的是P1,P2,P3的定义方式, 只有这样定义Magma才能够认为这三个点在椭圆曲线上, 并且同意运行HeightPairingMatrix函数.
目标矩阵行列式非零表明这三个点确实线形无关.
三后记
关于Magma的简单介绍就下到这里. 我希望读者看完以后能够亲自动手尝试Magma. 但是问题是很多人没有购买Magma. 没有关系, 网页提供Magma的在线计算.
当然还有人不满足, 应为毕竟网页上的程序运行时间规定不得超过20秒. 如果读者并不舍得花钱购买Magma, 何不在google上搜索"Magma数学下载". (绝对不要搜索"Magma下载", 否则的话你会发现更多有意思的事情, Magma数学软件除外!)幸运的话, 能够下载到一个免费版本哦. 虽然版本低了一点, 但是对付绝大多数的计算已经足够了!
大家如果确实有什么问题, 或者需要运行比较tough的程序, 都可以和我联系. 我可是会得了我的邮箱是liangzhb@gmail.com.请大家在邮件的标题上著名Magma讨论字样.
希望大家使用Magma愉快!