第七章 计算机代数 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[ ]