第七章 计算机代数
Computational Algebra
Symbolic Manipulation
Machine Algebra
……
§ 7. 1 引言
数值计算系统
Fortran 语言
例: ……
X=1
Y=2
Z=X+Y
……
非数值计算系统
Mathematica 语言
例: 勒让德多项式定义
(1) LegendreP[n,x] 给出勒让德多项式
()
n
Px
.
(2) LegendreP[n, m, x] 给出伴随勒让德多项式
() ( )() ()
/2
2
11
m
m
m
m
nn
m
d
Px x Px
dx
=? ?
也可以由用户采用递推公式定义:
P[n_, x_]:=
module[{temp}, temp=0;
If [n==0, temp=1 ,
If [n==1, temp=x ,
If [n > 1,
temp=((2n-1) x P[n-1, x]-(n-1) P[n-2, x])/n , Null
], Null ], Null
]; temp
]
递推公式
() () ()
01 1 2
1, , [(2 1) ( ) ( 1) ( )] /
nnn
Px Px x Px n xP x n P x n
??
== =???
表面上来看 , 数值计算语言应当与计算机代数语言是
本质上迥然不同的两种语言。 其实, 两者在本质上是完
全一致的 。 这 是因为目前我们使用的计算机仍然是一种
二进制的数字计算处理机。 文 字、 字符或符号都只能通
过二进制编码才能用计算机进行处理。
由于这种本质联系 , 所有的数值算法语言经过改造加
工以后, 都可以 发展为计算机代数语言, 或 者说可以具
有非数值处理功能。
所谓计算机代数处理系统实际上是指硬件和软件的
综合。
常用的计算机代数系统:
1. MACSYMA。它是用 LISP 语言的一种功能 很强的方言
Franz Lisp 写成的。 它是一个通用的计算机代数系统。
( 2) REDUCE。它是由赫恩 (A.C. Hearn)设计的。该
语言是 用 SLISP (Standard LISP)写成的 ,通用的代
数处理系统 , 具有相当广泛的基本代数处理功能 , 并
能处理高能物理的计算问题。
( 3) Mathematica。 该系统是美国 Wolfram 公司开发
的一个功能强大的计算机通用数学系统。 其 基本系统
主要是用 C 语言 开发的。 它是当前运用十分广泛的符
号代数处理系统。
(4) Maple. 这是一个商 业 产品。 其 优点是 使用图 形用户
界面并支持一些复杂运算, 如 : 因 式分解, 积分或求和。
缺点是 Maple 不适用于处理大量数据。
(5) GiNaC: 这是用 C++的符号 计 算库。 它 的主要 特 征是
具备以面向对象的方式实现用户自己的算法的能力。 它
能处理大量数据, 在 基准测试下, 其运算速度可与下面
的 FORM 相当。
(6)SCHOONSCHIP。 这是很著名的粒子物理研究用的计算
机代数系统。 它 也能做一般的代数运算, 是 目前为止运
行速度最快的系统。 该程序是用 CDC 型 60 位计算机和
6800 系列计算机的 汇编语言 写成的,因而大大限制了
它适用的机型。
(7)FORM: 优点是运算速度高和具有处理大量数据的
能力。 它被广泛运用于高能物理和涉及大型中间表达式
的程序。 人们普遍认为它是 SCHOONSCHIP 系统的后继程
序
计算机代数系统的发展历史 :
null 二十 世纪六十年 代 最早的计 算机代数系 统几乎完全 是基于 LISP
表处理语言 .它是用 来处理表链的。它对于早期符号计算程序的
重要性, 就好比同一时期处理数值计算的程序 FORTRAN 系统。 在
这个阶段, REDUCE 程序对高能物理已经表现出一些特殊的用途。
null SCHOONSCHIP 是 M. Veltman 用 汇编语言 写的, 专门应用于粒子物
理领域 。 汇编代码的应用导致了难以置信的高速计算程序 (相 对
于最初的解释代码) ,从而使计算更复杂的高能物理散射过程成
为可能 。 由于人们逐渐认识到这个程序的重要性 , 因而, 1998 年
M.Veltman 因此获得了诺贝尔物理奖。
null 同时值得一提的是基于 Franz LISP 的 MACSYMA 系统,它引发了
算法的重要发展。
null 从 1980 年以来 ,新的计算机代数系统开始采用 C 语言编写 。这
样的系统与解释语言 LISP 相比 , 能够更好的利用计算机资源 ,
并能保持程序的可移植性,而这正是解释语言所做不到的。
null 这个 时期 还出 现了 最早 的 商业 计算 机代 数系 统 ,其 中
Mathematica 和 Maple 最为著名 。 另 外 , 少量的专用程序也出现
了, J.Vermaseren 编写的 FORM 就是一个用于粒子物理研究的程
序。它是可移植的,并认为是 SCHOONSCHIP 系统的后继程序。
null 近几年 ,有 关 大型 程序 可维护 性的 问题 变得 越来 越 重 要 。全部
的设计 范例 都由过 程设 计变到 了面 向对象 设计 。反映 在编 程 语
言上从 C 变到 C++。这 样 GiNaC 库随之发展起来, 它支持 C++环
境下的符号计算。
§ 7.2 粒子物理研究中计算机代数的应用
null 利用计算机代数系统使微扰计算步骤自动化。
null 粒子物理 是应用 计算机代数 的 一个重要领域 , 它充 分发
挥了计算机代数系统的潜力。
SCHOONSCHIP, REDUCE, Mathematica,
FORM和GiNaC
null 采用计算机代数系 统来计算的复杂量子场论问 题可 以
分为两类:
(1)第一类问题是仅仅只需要系统的基本支持的计算。
(2)复杂的计算方法。 既可以采用标准化的非局部操作
也可以采用针对特定问题的计 算算法,如采用由用户
发展起来的专用算法。
有关粒子物理研究中微扰计算的计算机代数算法 :
一、图形产生
Thomas Hahn, FeynArts
以 FeynArts 程序包 为例:使用 时 , 首先加 载该程序包 :
<<FeynArts.m (或 init.m 文件)
一 旦 用 户给定 初、 末态粒 子, 微扰计 算 的 阶数, 适当 的 模
型, 利用 FeynArts 就 可以得到非 零贡献的费 曼图。 用如 下
函数的操作指令就可以得到费曼图 .
( 1)
],[log eliesCreateTopo
产生
l
圈
e
个外腿的拓扑。
( 2)
,...}]2mod,1{mod,,[ >?ModelexttopdsInsertFiel
将
2mod,1mod
,…模型
中的场加到外腿数为 ext 的拓扑 top 中去。
( 3)
]int[exp rPa
在屏幕上画出 InsertFields 输出 expr 的
费曼图形。
二、费曼幅度和指标收缩计算
FeynArts 程序包中,采用函数
CreateFeynAmp[expr]
将 InsertFields函数输出 expr的一组费曼图产生对应
的解析幅度。
图形与幅度的转换过程是 按 照费曼图图形技术中
所对应的规则进行的:
外线 对应自由 波函数 , 内线对 应着传播 函数 , 顶点
对应相互作用顶点。
例 :协变规范中的 胶子传播函数 的规则和 夸克 -胶
子作用顶点 的规则:
()
ab
k
kk
g
k
i
δξ
νμ
μν
?
?
?
?
?
?
?
?
??
?
=
22
1
a
ij
Tig
μ
γ=
由上面的费曼规则得到的不变振幅的表达式中将包
含了重复指标求和。
例如 :洛仑兹指标的收缩可以通过不断运用以下几个
规则来实现:
ρ
μ
νρ
μν
ggg =
,
μ
ν
μν
ppg =
,
μ
μ
μν
γγ =g
,
Dg =
μ
μ
,
pqqp =
μ
μ
,
pp
/
=
μ
μ
γ
,
D=
μ
μ
γγ
如果要对一串狄拉克 ( Dirac) 矩 阵乘积的重复指标收
缩,例 如
μ
νμ
γγγ
,我们可以先用狄拉克矩阵的反对易关
系
{}
μννμ
γγ g2, =
, 使 两 个狄拉 克矩阵用 同一个指 标 , 然后 再
用上面公式化简。
在振幅平方的计算中,一般有狄拉克矩阵的求阵迹计
算。由于结果是相对论性不变量,所以人们很少有必
要去研究公式中各个矢量的分量,而只研究这些矢量
的标积。这样计算就没有原来那么复杂了。原则上这
个计算方法是很明确的:
null 奇数个狄拉克矩阵的阵迹是零;
null Tr1=4;
null 偶数 (2n)个
γ
矩阵的 乘积的阵迹计算可以用公
式:
将 (2n)个
γ
矩阵的乘积的阵迹计算转变 为对 (2n-2)的
γ
矩阵的乘积求阵迹。理论上反复运用上式, (2n)个
狄拉克矩阵的阵迹会产生 (2n-1)(2n-3)…
3· 1=(2n-1)!!项。这个数目 随 n 增加而指数增长。如
果在指 标
12
,...,
n
μμ
之间没有别的关系 , 则这实际上就是
(2n)个
γ
矩阵的乘积的阵迹最后结果的项数。
FORM 程序是处理费曼幅度化简、洛仑兹指标收缩
和
γ
矩阵阵迹的最好工具之一。运用ˊ t Hooft-
Veltman 方案对狄 拉克代数的计算在 TRACER 程序中得
以实现。
三、单圈积分函数计算和 Passarino- Veltman 化简
Passarino 和 Veltman 已经首先给出了一圈标量
和张量积 分函数系统的算 法。 其计算 的 基本思 想 就是
将张量积分计算化解为标量积分函数的计算, 而 标量
积分函数最终化为 Spence 函数的计算。
例: 介绍 张量圈 积分化简 到一个标量 圈 积分的 集
合。以下面的三点积分计算为例,
()( )
3
22/2
2
112
D
D
dk kk
I
i
kkp kp p
μν
μν
π
=
???
∫
其中 1
p
和 2
p
表示 外 线动量 。 Passarino 和 Veltman 采用
将 3
I
μν
写成最 一般的形 式,即用 形状因子 乘以外部 动 量
和 (或) 度规张 量 表示的 形 式 。 在 以 上我们 的 例子里 ,
我们将该张量积分写为
{}
242321222221113
, CgCppCppCppI
μννμνμνμμν
+++=
.
这里
{}
μννμνμ
122121
, pppppp +=
。然后 通过方程 两边与外 部动量
{}
νμμννμ
211221
,,, pppppp
和度规张量
g
μν
收缩,来解出形状因 子
21 22 23
,,CCC
和 24
C
。 左 边 的结果 是 按照传 播 子重写 成 圈动量
k
μ
与和外部动量之间的标量乘积的形式,例如:
()
2
1
2
1
2
1
2 ppkkkp +??=?
.
右边的前两项消去了传播子, 而最后一项根本与圈动
量无关。 接着得到线性方程求 解形状因子。 在这一步,
我们会遇到计算 Gram 行列式
2
221
21
2
1
3
4
ppp
ppp
?
?
=?
.
这个算法的缺点就在出现在 对这个行列式的计算上
面。 如果在一个 1
p
和 2
p
共线的 相空间域中, Gram 行列
式趋向与零, 这时稳定的数值计算程序就变得十分困
难。目前已经有对 Passarino- Veltman 算法的改进
的方法,这在很大程度上避免了 Gram 行列式出现。
近年来出 现了解析或数值 计算一圈图 的 一点、 二 点、
三点、 四 点, 甚 至 五点积 分 函数的程 序包。 LoopTools
就是这样 一个计算标量和 张量单圈积 分 的程序 包 。 由
于多点单圈图的动量积分具有可以最终归结为
Spence 函数 计算的共 性 , 因而这样的积分是可以用计
算机代数 系统来解决复杂 计算的困难 。 然而二圈以上
的动量积 分计算就不再具 有这一共性 , 不具备 统 一的
算法,因 此用计算机代数 系统来解决 复 杂计算 还 存在
困难。
四、高阶量子修正计算的计算机代数程序
目前比较著名的 , 用于高阶 电弱和 QCD理论微扰计算,
基于计 算机代数的 程序包有以下四组。 每组 中的 不同程
序包大都有相同的语法,它们还可以鏈接起来使用。
(1) FeynArts, FeynCalc, FormCalc, LoopTools,
TwoCalc 和 s2lse。
(2) GEFICOM,QGRAF,MATAD 和 MINCER。
(3)DIANA,QGRAF 和 ON-SHELL2,
(4)xloops 和 GiNaC。
如前面所列举的高阶精确计算程序包表明: 计算机代数
系统与其余程序部份间的有效交流是极为重要。 这些外 部
程序可能是数值计算, 文 字处理, 数据库, 专家库类型 的
程序包, 也可能是特别适合问题的某一部份计算的计算 机
代数系统。 将来人们会更多地强调对程序集成的某种程 度
的标准化, 以及要求具备不同系统间数据传递功能。 随 着
将来硬件和软件的发展, 计 算机代数系统功能的扩展会 向
两个不同方向发展: 一方面 , 计算机代数系统可以进行 远
远超出现在水平的非常复杂的计算, 另一方面计算机代 数
系统越来越成为解决常规问题的软件环境中的一部份。
§ 7. 3 Mathematica 语言编程
单词,词汇 ---null 语句,文章
1. 过程
一般形式为:
Module[{<局部变量名表 >},表达式 1;表达式 2; …表达式 n]
例如:
unit[x_, y_, z_] := Module[{len}, len = Sqrt[x^2 + y^2 + z^2];
N[{x/len, y/len, z/len }] ]
Block[{<局部变 量名表 >},表达式 1;表达式 2; …表达
式 n]
2.控制选择
( i) 顺序控制 分号“ ; ”
( ii) 条件控制
If 语言结构 。
If[逻辑表达式,表达式 ]
If[逻辑表达式,表达式 1,表达式 2]
If[逻辑表达式,表达式 1,表达式 2,表达式 3]
例如:
f[x_] := If[(x > 0) || (x=0) , N[Sqrt[x]], Print[“x is negative。 ”],
Print[“x is not numerical.”]
Which语句结构 。
Which[条件 1,表 达 式 1,条 件 2,表 达 式 2, …, 条件
n,表达式 n]
例: Which[ 2= =3,x,3= =3,y ]
其结 果为 y。这 是由于条件 2==3的结 果为 False,而条
件 3==3的结果为 True.
Switch语句结构 。
Switch[判别表达式, 模式 1, 表达式 1,模 式 2,表 达
式 2, …, 模式 n,表达式 n]
例: i=1
Switch[i^2,0,x,1,y,2,z]
最后结果为 y。
( iii)循环控制
Do语句结构
Do[表达式, {循环描述 }]
例: Do[ Print[2^i],{i,1,5} ]
该指令的结果是循环打印出
i
2
, ( i=1,2,3,4,5)的值 2,
4, 8, 16, 32。
For语句结构
For[初始表达式,条件,步进表达式,循环表达式 ]
例如: For[ i=0,i<=10,++1,Print[i] ]
值为 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10。
While语句结构
While[条件,循环表达式 ]
例如:
i=0
While[ i<=10,Print[i];i++ ]
3.程序包结构
一般的程序包具有如下的基本框架:
BeginPackage[“程序包名称 ’ ”]
名称: : usage=“字符串, 程序包中定义在包外可以使用
的函数、变量等的名字和使用说明。 ”
……
Begin[“
''
Pr ivate
”]
……
程序包主体 .(包括外部可用的函数及变量 ,一些内部
函数变量的定义 .)
……
End[ ]
EndPackage[ ]