初心者のための Magma 入門
木田雅成
1 この講演の目的
Magma は John Cannon をリーダーとするシドニー大学の計算代数グループで開発され, 頒布
されている代数構造計算のためのソフトウェアである. Magma の簡単な紹介が [5] にある.
マニュアルには, Magma の特徴として,
設計思想 代数学と圏論に基づいて設計されている.
代数構造の明示
統一性
計算をおこなう代数構造を明示的に指定する必要がある.
どの対象においても一般的な構造は統一的に指定できる (商構造, 部分構造, 写像など).
構造の関連 例えば商構造を定義すると元の対象からの自然な射が自動的に定義される.
データベース
効率
有限群, 楕円曲線などのデータベースをもっている.
最速をめざして設計, 実装されている.
があげられている.
この講演では学部四年生程度までの基礎数学, 代数学を題材として Magma の使い方を解説する.
その際に, 上記の特徴がなるべくはっきりとわかるように留意したい. ただしデータベースについ
てはこの講演ではふれることができないので, 松野さん, 千吉良さんにその紹介を譲ることにする.
2 Magma で計算してみる
実際に Magma を使って計算をやってみる. /*
*/ で囲まれた部分はコメントである. 一行だ
けのコメントには // も使う. 以下では, 行末にも必要に応じて日本語のコメントを付け加えてある.
Magma のコマンドはそのほとんどが省略形ではなく, 計算したいものの名詞形がそのまま用い
られている. したがって以下では必要な箇所以外ではコマンド自体の説明を省略する. 長いコマン
ドは入力するのが大変と思われるかもしれないが, コマンドの途中で TAB キーを押すことにより,
入力補完, 候補の表示が行われるので, それほどの苦労はない.
2.1 関数電卓としての Magma
まずは四則演算を中心とした機能をみながら, Magma に慣れていくことにする.
1
> /*
> MAGMA for Beginners
>
at Kyushu University
>
Oct. 9, 2010
>
By Masanari Kida
> */
> 32123*1000;
//
32123000
> 2ˆ
> 20;
//
1048576
> 13/60+1/36;
//
11/45
> q:=2ˆ30 div 17;
//
> r:=2ˆ30 mod 17;r;
//
13
> 2ˆ30 eq 17*q+r;
//
true
文はセミコロン (;) で終わる
途中で改行しても; までは計算されない
有理数の計算は約分されて表示される
230 を 17 で割った商を q に代入. 結果は表示されない
結果を表示するためにこのような書き方も使う
検算. 等号が成立することを調べるには eq を使う
関数電卓にグレードアップしよう.
> Log(2);
// このような値はデフォルトの精度で計算される
0.693147180559945309417232121458
> Arccos(1/2);
1.04719755119659774615421446109
> Pi(RealField())/3;
// Pi は精度つき実数体を引数にとる
1.04719755119659774615421446109
> Pi(RealField(50));
// 精度を変えると
3.1415926535897932384626433832795028841971693993751
> Sin($1/6);
// $1 には直前の結果が代入されている
0.50000000000000000000000000000000000000000000000000
> // この計算はあたえられた精度をもつ実数体で実行される
> ZetaFunction(3);
// このような数論に関係する関数もたくさんある
1.20205690315959428539973816151
この項の最後にちょっと注意.
> a:=54534135111/2*4;a;
109068270222
> Factorization(a);
// 結果は整数に見えるが.....
// 因数分解ができない!
>> Factorization(a);
ˆ
Runtime error in ’Factorization’: Bad argument types
Argument types given: FldRatElt
> Parent(a);
// a はどこの元かと調べると
Rational Field
> Factorization(IntegerRing()!a);
// 明示的に含まれる環を変えると因数分解できる
[ <2, 1>, <3, 1>, <18178045037, 1> ]
2
> RealField(50)!Log(2);
// 別の例
0.69314718055994530941723212145798186356626205936510
このように計算の対象の属する環や体を意識することが大切である.
2.2 集合, 数列, 写像など
Magma を使う際の基礎となる集合, 数列, 写像などの扱いかたをみる. これらがうまく使えるよ
うになれば, Magma が飛躍的に役に立つ道具になる.
> S1:={1,2,3,2,3,3,5,7,7,9};
// 集合を作る
> S1;
// 重複は無視される
{ 1, 2, 3, 5, 7, 9 }
> Random(S1);
// ランダムな元をとる
5
> S2:={ xˆ3 : x in [1..20]};S2;
// 別の方法
{ 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375, 4096, 4913,
5832, 6859, 8000 }
> S1 meet S2;
// 集合の交わり
{ 1 }
> S3:={x : x in [1..100] | IsPrime(x) };S3; // 条件を使った定義 (素数の集合)
{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
89, 97 }
> TP:={[x,x+2] : x in [1..2000] | IsPrime(x) and IsPrime(x+2)}; // 少し複雑
> TP;
// これは双子素数の組
{
[ 461, 463 ],
[ 137, 139 ],
[ 1049, 1051 ],
[ 599, 601 ],
中略
[
[
[
[
[
239, 241 ],
347, 349 ],
59, 61 ],
1427, 1429 ],
1061, 1063 ]
}
> // 順序はバラバラ
> #TP;
// 集合の濃度
61
> L1:=[1,2,3,2,3,3,5,7,7,9];L1;
// 数列 (リスト)
[ 1, 2, 3, 2, 3, 3, 5, 7, 7, 9 ]
> L1[7];
5
> L2:=[1..20];L2;
// 連続する整数のリスト
[ 1 .. 20 ]
> LP:=[x : x in [1..100] | IsPrime(x)];LP; // 素数のリスト
[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
89, 97 ]
> // 簡単な繰り返し文
3
// LP の元に対してオイラー関数を計算する
> for p in LP do
for>
EulerPhi(p);
for> end for;
1
2
4
6
中略
82
88
96
> // 簡単な条件文
> for p in LP do
for>
if IsPrime(p+2) then
for|if>
[p,p+2];
for|if>
end if;
for> end for;
[ 3, 5 ]
[ 5, 7 ]
[ 11, 13 ]
[ 17, 19 ]
[ 29, 31 ]
[ 41, 43 ]
[ 59, 61 ]
[ 71, 73 ]
Magma の集合・リストは通常の数学の書き方と非常に近い形で定義し使うことができる. リスト
をうまく使いこなすと, 複雑な計算を簡単に実行できることが多い. より複雑な集合や組構造の使
い方が宗政さんの講演にあるので参考にしてほしい.
次に簡単な写像の使い方を見る.
> f:=map<Integers()->Integers() | x:->2*x >;
> f(1);
2
> [email protected];
2
> f([1,2,3]);
[ 2, 4, 6 ]
> g:=fˆ5;
> [email protected];
32
//
//
//
f (x) = x2
f (1)
別の書き方
// f (2), f (4), f (6) のリスト
// 写像の合成
この項については, 良くまとまった解説が [1] にある.
2.3 素因数分解
Magma が内部でどのようなことをやっているのかのぞいてみよう. 素因数分解が題材である.
4
> SetVerbose("Factorization",1); // 出力の冗長度を指定
> n:=1550911895824613239674222733740604831910060346940033961446977108703733045296552321
107873005998289021085442480493813775112197024286939278796430189587028111515759385199841
02178816;
> Factorization(n);
Integer main factorization (primality of factors will be proved)
Effort: 3
Seed: 3706546146 66
Number: 1550911895824613239674222733740604831910060346940033961446977108703733045296
552321107873005998289021085442480493813775112197024286939278796430189587028111515759
38519984102178816
Pollard Rho
Trials: 8191
Number: 2316616648442896824810580101804251439783171605295524330506899425233740229588
70415809752076217738879615251
(105 digits)
Factor: 21727894856911 (14 digits)
Cofactor: 10661947067117961789114870291074345630713615031862630703290949593900960465
823539183339042941 (92 digits)
Time: 0.010
Pollard Rho
Trials: 8191
Number: 21727894856911
(14 digits)
Factor: 3726911 (7 digits)
Cofactor: 5830001 (7 digits)
Time: 0.009
Pollard Rho
Trials: 8191
Number: 1066194706711796178911487029107434563071361503186263070329094959390096046582
3539183339042941
(92 digits)
No factor found
Time: 0.009
1 composite number remaining
ECM
x: 106619470671179617891148702910743456307136150318626307032909495939009604658235391
83339042941
(92 digits)
Initial B1: 5000, limit: 858248
Initial Pollard p - 1, B1: 45000
Step 1; B1: 5000 [858248], digits: 92, elapsed time: 0.070
Factor: 146234082633259 (15 digits)
Cofactor: 72910137466770304935106535275228904632898328810503066577055464788170201591
799 (77 digits)
Total ECM time: 0.190
ECM
5
x: 72910137466770304935106535275228904632898328810503066577055464788170201591799
(77 digits)
Initial B1: 5070, limit: 176526
Step 1; B1: 5070 [176526], digits: 77, elapsed time: 0.000
Step 10; B1: 5725 [176526], digits: 77, elapsed time: 0.510
Step 20; B1: 6500 [176526], digits: 77, elapsed time: 1.129
Factor: 6722279202985811 (16 digits)
Cofactor: 10846044215834722665042065816010288453465430807005605353874509 (62 digits)
Total ECM time: 1.490
ECM
x: 10846044215834722665042065816010288453465430807005605353874509
(62 digits)
Initial B1: 6824, limit: 17552
Step 1; B1: 6824 [17552], digits: 62, elapsed time: 0.000
Step 10; B1: 7582 [17552], digits: 62, elapsed time: 0.559
Step 20; B1: 8472 [17552], digits: 62, elapsed time: 1.229
Factor: 75045259055838983 (17 digits)
Cofactor: 144526707646708212356380247022426585248301323 (45 digits)
Total ECM time: 1.449
Total time: 3.220
[ <2, 206>, <67, 2>, <271, 1>, <5351, 1>, <3726911, 1>, <5830001, 1>, <146234082633259,
1>, <6722279202985811, 1>, <75045259055838983, 1>,
<144526707646708212356380247022426585248301323, 1> ]
> SetVerbose("Factorization",0);
// 冗長度をもとに戻す
小さな素数を取り除いたあと, ロー法, 楕円曲線法を繰り返し適用していく様子がわかる.
2.4 多項式環
有理整数環とともに代数学の基礎になる多項式環を扱ってみよう. (x + 1)20 を展開しようとして
> (x+1)ˆ20;
>> (x+1)ˆ20;
ˆ
User error: Identifier ’x’ has not been declared or assigned
となってエラーが出てしまう. Magma では計算の対象となる代数構造をあらかじめ定義しなくて
はならない. いまの場合は,
> PZ<x>:=PolynomialAlgebra(Integers());
によってそれを行う. このコマンドにより有理整数環上の一変数多項式環 PZ(= Z[x]) を定義し, そ
の変数を x とした. その名前 PZ は好きにつけてよいが, 何を表すかがある程度わかるように自分で
名付けの規則を作るのがよい. あとで使う必要がない場合はアンダースコア (_) を使うと, 名前を付
6
けないでおくこともできる. これで x の数学的な意味がはっきりしたので, (1 + x)20 も問題なく計
算することができる.
> (x+2)ˆ20;
xˆ20 + 40*xˆ19 + 760*xˆ18 + 9120*xˆ17 + 77520*xˆ16 + 496128*xˆ15 + 2480640*xˆ14 +
9922560*xˆ13 + 32248320*xˆ12 + 85995520*xˆ11 + 189190144*xˆ10 + 343982080*xˆ9 +
515973120*xˆ8 + 635043840*xˆ7 + 635043840*xˆ6 + 508035072*xˆ5 + 317521920*xˆ4 +
149422080*xˆ3 + 49807360*xˆ2 + 10485760*x + 1048576
> Factorization($1);
// 因数分解して確認
[
<x + 2, 20>
]
以下では次のふたつの多項式 F1, F2 に対していろいろな計算を行う.
> F1:= xˆ3 - 210*xˆ2 + 1223743;
> F2:= 3*xˆ4 + 4*xˆ3 + xˆ2 - 9*x - 3;
> F1+F2;
// たし算
3*xˆ4 + 5*xˆ3 - 209*xˆ2 - 9*x + 1223740
> F1*F2;
// かけ算
3*xˆ7 - 626*xˆ6 - 839*xˆ5 + 3671010*xˆ4 + 4896859*xˆ3 + 1224373*xˆ2 - 11013687*x > Factorization(Discriminant(F1));
// 判別式の因数分解
[ <3, 6>, <17, 2>, <19, 1>, <103, 1>, <109, 2> ]
> F1/3;
3671229
>> F1/3;
ˆ
Runtime error in ’/’: Argument 2 is not a unit
多項式の係数は Z なので判別式は Z の元, よって因数分解は問題なくできる. しかし 1/3 をかける
ことはこの環ではできない.
この問題を解決するためにはいろいろなやりかたがあるが,ここでは有理数体上の多項式環 Q[y]
を定義し, Z[x] から自然な写像 v でこの環に F1, F2 を送る.
> PQ<y>:=PolynomialAlgebra(Rationals());
> v:=hom<PZ->PQ | y>;
//
x を y におくる準同型
> U1:=v(F1);U1;
//
U1 = v(F1)
yˆ3 - 210*yˆ2 + 1223743
> U2:=v(F2);U2;
//
U2 = v(F2)
3*yˆ4 + 4*yˆ3 + yˆ2 - 9*y - 3
> U1/3;
// もちろん計算できる
1/3*yˆ3 - 70*yˆ2 + 1223743/3
> d,s,t:= ExtendedGreatestCommonDivisor(U1,U2);s;t;
// 返り値は 3 個
-14129458682629/20180107766364476035310370*yˆ3 +
8488994468666693/60540323299093428105931110*yˆ2 + 44521/610770131210897559*y +
16490479102509401017/20180107766364476035310370
14129458682629/60540323299093428105931110*yˆ2 5815690424484493/60540323299093428105931110*y +
601977685893436261/60540323299093428105931110
7
> ?ExtendedGreatestCommonDivisor
// オンラインヘルプの参照
4 matches:
1
I
/magma/ring-field-algebra/integer/gcd-lcm/ExtendedGreatestCommonDivisor
2
I
/magma/ring-field-algebra/integer/gcd-lcm/ExtendedGreatestCommonDivisor
3
I
/magma/ring-field-algebra/univariate-polynomial/common/gcd-lcm/ExtendedGreatestCommonDivisor
4
I
/magma/ring-field-algebra/valuation/element/other/ExtendedGreatestCommonDivisor
To view an entry, type ? followed by the number next to it
この例のように Magma には 2 個以上の値を返す関数が多く存在する.
また, システムが適切に設定されていればウェブブラウザーからヘルプが参照できる.
> s*U1+t*U2;
1
> Evaluate(U1,34/21);
11328025267/9261
// 検算
// 値の代入
多項式環のイデアルを定義し, その商環を作ってみる.
> I1:=ideal<PQ | U1>;
// イデアルの定義
> I2:=ideal<PQ | U2>;
> I1+I2;
// イデアルの演算
Univariate Polynomial Ring in y over Rational Field
> I1 meet I2;
Ideal of Univariate Polynomial Ring in y over Rational Field generated by yˆ7 - 626/3*yˆ6
- 839/3*yˆ5 + 1223670*yˆ4 + 4896859/3*yˆ3 + 1224373/3*yˆ2 - 3671229*y - 1223743
> IsPrime(I1);
// 素イデアルか?
true
> IsIrreducible(U1);
// ということは U1 は既約
true
> IsMaximal(I2);
// 極大イデアルか?
false
> IsIrreducible(U2);
false
> Q1<a>:=quo< PQ | U1 >;
// Q1 = Q [x]/(U1)
> aˆ5;
// a には y の自然な像が代入される
8037257*aˆ2 - 256986030*a - 53967066300
> MinimalPolynomial(a);
// 検算
yˆ3 - 210*yˆ2 + 1223743
> IsIntegralDomain(Q1);
// 整域か?
true
> IsField(Q1);
// 体か?
true
> Q2,q2:=quo< PQ | U2 >;
// Q2 = Q [x]/(U2)
> // q2 は Q [x] から Q2 への写像
> IsIntegralDomain(Q2);
false
> IsZeroDivisor((3*y+1)@q2);
// (3y + 1) の q2 による像は零因子か?
true
構造を積み重ねてもっと複雑な環を作ってみる.
8
> _<t>:=PowerSeriesRing(PQ); // Q [y] 上の形式的冪級数環
> 1/(1-y*t)ˆ3;
1 + 3*y*t + 6*yˆ2*tˆ2 + 10*yˆ3*tˆ3 + 15*yˆ4*tˆ4 + 21*yˆ5*tˆ5 + 28*yˆ6*tˆ6 +
36*yˆ7*tˆ7 + 45*yˆ8*tˆ8 + 55*yˆ9*tˆ9 + 66*yˆ10*tˆ10 + 78*yˆ11*tˆ11 +
91*yˆ12*tˆ12 + 105*yˆ13*tˆ13 + 120*yˆ14*tˆ14 + 136*yˆ15*tˆ15
+ 153*yˆ16*tˆ16
+ 171*yˆ17*tˆ17 + 190*yˆ18*tˆ18 + 210*yˆ19*tˆ19
+ O(tˆ20)
> gf:=t*Exp(y*t)/(Exp(t)-1);
// Bernoulli 多項式の母関数
> [PQ!(Factorial(n)*Coefficient(gf,n)): n in [0..10]]; // 係数を取り出す
[
1,
y - 1/2,
yˆ2 - y + 1/6,
yˆ3 - 3/2*yˆ2 + 1/2*y,
yˆ4 - 2*yˆ3 + yˆ2 - 1/30,
yˆ5 - 5/2*yˆ4 + 5/3*yˆ3 - 1/6*y,
yˆ6 - 3*yˆ5 + 5/2*yˆ4 - 1/2*yˆ2 + 1/42,
yˆ7 - 7/2*yˆ6 + 7/2*yˆ5 - 7/6*yˆ3 + 1/6*y,
yˆ8 - 4*yˆ7 + 14/3*yˆ6 - 7/3*yˆ4 + 2/3*yˆ2 - 1/30,
yˆ9 - 9/2*yˆ8 + 6*yˆ7 - 21/5*yˆ5 + 2*yˆ3 - 3/10*y,
yˆ10 - 5*yˆ9 + 15/2*yˆ8 - 7*yˆ6 + 5*yˆ4 - 3/2*yˆ2 + 5/66
]
2.5 体とガロア理論
U1 = y3 − 210y2 + 1223743 に戻って, この多項式の根を Q に添加してできる体のことを調べる
ことにする.
> K1<a1>:=NumberField(U1);
// a1 は U1 のひとつの根
> Degree(K1);
// 次元
3
> a1ˆ10;
// 元の演算
1179802847765165400*a1ˆ2 - 51313174306986797407*a1 - 8633019640022592196410
> S<s1>:=SplittingField(K1);S;
// S は K1 の分解体
Number Field with defining polynomial yˆ6 + 6*yˆ5 - 34*yˆ4 - 266*yˆ3 - 438*yˆ2 + 10*y +
289 over the Rational Field
> _,u:=IsSubfield(K1,S);u;
// u は K1 から S への写像
Mapping from: FldNum: K1 to FldNum: S
> u(a1);
// 原始元を送ってみる
1/10*(-5*s1ˆ5 - s1ˆ4 + 248*s1ˆ3 + 93*s1ˆ2 - 1409*s1 + 176)
> S!a1;
// 別のやりかた
1/10*(-5*s1ˆ5 - s1ˆ4 + 248*s1ˆ3 + 93*s1ˆ2 - 1409*s1 + 176)
体 K1 の Q 上の分解体が S で 6 次の体であるから, S/Q のガロア群は S3 に同型である.
> G,A,tau:=AutomorphismGroup(S);
9
G には S6 の部分群として S3 が代入され, A は S の Q 上の同型写像が入っている. τ は G から A
への写像である.
> G;
Permutation group G acting on a set of cardinality 6
Order = 6 = 2 * 3
(1, 2, 4)(3, 6, 5)
(1, 3)(2, 5)(4, 6)
> G.1;
// 生成元のひとつ
(1, 2, 4)(3, 6, 5)
> G.2;
(1, 3)(2, 5)(4, 6)
> Order(G.1);
// 元の位数
3
> G.1*G.2;
// かけ算
(1, 5)(2, 6)(3, 4)
> G.2*G.1;
// 非可換
(1, 6)(2, 3)(4, 5)
> // A の各元に対して原始元の行き先を調べる
> for g in G do
for>
tau(g)(s1);
for> end for;
s1
1/60*(-s1ˆ5 - s1ˆ4 + 45*s1ˆ3 + 53*s1ˆ2 - 115*s1 - 101)
1/180*(13*s1ˆ5 + 61*s1ˆ4 - 519*s1ˆ3 - 2753*s1ˆ2 - 2213*s1 + 1775)
1/60*(s1ˆ5 + s1ˆ4 - 45*s1ˆ3 - 53*s1ˆ2 + 55*s1 - 79)
1/180*(7*s1ˆ5 + 19*s1ˆ4 - 321*s1ˆ3 - 887*s1ˆ2 + 733*s1 + 1205)
1/9*(-s1ˆ5 - 4*s1ˆ4 + 42*s1ˆ3 + 182*s1ˆ2 + 74*s1 - 176)
> FixedField(S,[tau(G.1)]);
// τ (G.1) で生成される群の固定体
Number Field with defining polynomial yˆ2 + 10*y - 7803 over the Rational Field
Mapping from: Number Field with defining polynomial yˆ2 + 10*y - 7803 over the Rational
Field to FldNum: S
> Subfields(S);
// 部分体を全部求める. tuple の列が帰ってくる
[
<Number Field with defining polynomial yˆ2 - 137*y + 289 over the Rational Field,
Mapping from: Number Field with defining polynomial yˆ2 - 137*y + 289 over the
Rational Field to FldNum: S>,
<Number Field with defining polynomial yˆ3 + 6*yˆ2 - 58*y - 289 over the Rational
Field, Mapping from: Number Field with defining polynomial yˆ3 + 6*yˆ2 - 58*y - 289
over the Rational Field to FldNum: S>,
<Number Field with defining polynomial yˆ3 + 9*yˆ2 - 121*y - 289 over the Rational
Field, Mapping from: Number Field with defining polynomial yˆ3 + 9*yˆ2 - 121*y - 289
over the Rational Field to FldNum: S>,
<Number Field with defining polynomial yˆ3 - 24*yˆ2 + 152*y - 289 over the Rational
Field, Mapping from: Number Field with defining polynomial yˆ3 - 24*yˆ2 + 152*y - 289
over the Rational Field to FldNum: S>,
<Number Field with defining polynomial yˆ6 + 6*yˆ5 - 34*yˆ4 - 266*yˆ3 - 438*yˆ2 +
10*y + 289 over the Rational Field, Mapping from: FldNum: S to FldNum: S>
]
> CS:=$1[2][1];
// ひとつの三次部分体をとる
> CS;
Number Field with defining polynomial yˆ3 + 6*yˆ2 - 58*y - 289 over the Rational Field
10
> FixedGroup(S,CS); // CS を固定する群
Permutation group acting on a set of cardinality 6
Id($)
(1, 3)(2, 5)(4, 6)
Mapping from: GrpPerm: $, Degree 6 to GrpPerm: G
> #$1;
// その位数
2
このようにガロア対応が具体的に計算できる.
2.6 少しだけ整数論
整数論の講演がないので整数論について少しだけここでふれる. 代数的整数論の最初の大切な対
象は Q の拡大体 K に含まれる代数的整数のなす環 OK である. これは K/Q の拡大次数と同じ個数
の基底をもつ自由 Z 加群で, その基底を K の整数底という. OK の可逆元全体を慣用的に K の単数
群という. この群は有限生成アーベル群にになる. OK は一般に一意分解整域ではない. 一意分解整
域からの遠さをはかる群がイデアル類群である. これは有限アーベル群である. これらを計算する
ことが計算代数的整数論の第一目標になる. Magma では次のように計算することができる.
> CS;
// 先ほどの S の三次部分体
Number Field with defining polynomial yˆ3 + 6*yˆ2 - 58*y - 289 over the Rational Field
> O:=MaximalOrder(CS);
// 整数環
> [S!O.k : k in [1..3]];
// 整数環の基底 を S の元として表示
[
1,
1/180*(-17*s1ˆ5 - 77*s1ˆ4 + 705*s1ˆ3 + 3481*s1ˆ2 + 1645*s1 - 3757),
1/180*(-7*s1ˆ5 - 31*s1ˆ4 + 297*s1ˆ3 + 1403*s1ˆ2 + 419*s1 - 1253)
]
> U,fU:=UnitGroup(O); // U は抽象的な単数群. f U は実際の単数群への射
> fU(U.1);
// 単数群の生成元. 整数底での座標表示
[-1, 0, 0]
> fU(U.2);
// 単数群の生成元
[1, 0, 1]
> C,fC:=ClassGroup(O);
// C は抽象的な群.
> I:=fC(C.1);
// イデアル類群の生成元
> IsPrincipal(I);
// 単項イデアルか?
false
> IsPrincipal(Iˆ3);
false
> IsPrime(I);
// 素イデアル
true
> rcf,pi:=ResidueClassField(I);
// O/I を作る
> rcf;
// それは有限体になる
Finite field of size 2ˆ2
> pi(O![1,2,0]);
1
11
2.7 Magma は本当に速いのか
以前 Magma と他のソフトウェアとの実行速度の比較をしたことがある ([4, 1.3 節]). それによれ
ば, Magma は一般に高速であるといってよい. しかし次のような例もある. 2000 番目の Bernoulli
数を Magma の組込みの関数と, 金子さんに教えていただいた Zagier の公式で計算した結果の比
較である.
Zagier の公式を Magma の関数として定義すると
BNByZagier:=function(k)
h:=0;s:=1;c:=k+1;
for n in [2..k+1] do
c:=c*(n-k-2)/n;
h:=h+c*s/n;
s:=s+nˆk;
end for;
return h;
end function;
となる. ここで引数 k は局所変数として扱われる. これを使って, 速さの比較をすると
> time _:=BernoulliNumber(2000);
Time: 8.770
> time _:=BNByZagier(2000);
Time: 0.280
となって Zagier の公式の方が圧倒的に速いことがわかる.
Magma を終了するには
> quit;
とすればよい.
講演では十分にはふれられなかった整数論の計算については [3], [4] を参照してほしい. 後者に
は簡単なプログラムの例ものっている.
参考文献
[1] G. Bailey, Appendix: the magma language, Discovering mathematics with Magma (W. Bosma
and J. Cannon, eds.), Algorithms and Computation in Mathematics, Springer-Verlag, 2006,
pp. 331–356.
[2] W. Bosma, J. Cannon, and C. Playoust, The Magma algebra system. I. The user language, J.
Symbolic Comput. 24 (1997), no. 3-4, 235–265, Computational algebra and number theory
12
(London, 1993).
[3] 木田雅成, 計算代数システム Magma による代数構造の計算, 数理研講究録別冊, vol. B19, 2010,
pp. 107–116.
[4]
, 数論研究者のための Magma 入門, 第 7 回北陸数論研究集会報告集, 2009, pp. 59–79.
[5] 原田昌晃, 木田雅成, Magma, 数学セミナー (2010) 9 月号, 44–47.
182-8585 調布市調布ヶ丘 1-5-1
電気通信大学数学教室
e-mail: [email protected]
13
ダウンロード

報告集原稿