...

数論研究者のためのMagma入門

by user

on
Category: Documents
70

views

Report

Comments

Transcript

数論研究者のためのMagma入門
数論研究者のための Magma 入門
木田雅成∗
1 Magma の紹介
Magma は John Cannon をリーダーとするシドニー大学の計算代数グループで開発さ
れ,頒布されている代数構造計算のためのソフトウェアである.Pari/GP, KANT/KASH
などの数論を専門とするソフトウェアとは異なり,代数にかかわる非常に広汎な分野の計
算をカバーしている.その分野の中には,群論1 ,線形代数,加群,可換環論 (グレブナー
基底を含む),非可換環,代数的整数論,楕円曲線,超楕円曲線,保形形式,符号理論など
がある.また有限群や楕円曲線のデータベースも内蔵されている.Maple, Mathematica
といった数式処理ソフトとその用途において重なる部分もあるが,Magma は代数学に特
化したシステムであって,さらに,これらの数式処理システムが学部一年生でもある程度
使えるのに対し,Magma を使うには使用目的に応じた代数学の知識が必要になり,それ
なしで使うことはほぼ不可能である.その意味ではプロのためのシステムということもで
きるであろう2 .
Magma は MS Windows をはじめ,Mac OS X, Linux など通常使われているほとんど
の OS 上で動作する3 .また,Magma のウェブサイトでの記述によれば,1994 年頃に開
発が始まって以来,すでに 2000 以上の論文に引用された実績がある.
Magma の名前は Bourbaki の Algèbre [3] の最初のページにある次の定義に由来する.
この講演では代数体の計算を中心に Magma の使い方を説明する.
∗
この研究は文部科学省科学研究費補助金基盤研究 (C) (No. 16540014) の援助をうけて行われています。
Magma は群論のソフトウェアである Cayley を前身としており,伝統的に群論に非常に強い.
2
使いこめば,使いこむほど,手になじみ使いやすくなるという意味でもプロ用の道具とよぶにふさわしい.
3
計算の速度,信頼性から考えて,この中でお薦めなのは Linux 版である.これは,多倍長計算のライブ
ラリーが Linux をよくサポートしていること,それと,たぶん開発者のうちの多くが Linux 上で開発してい
ることによると思われる.
1
1
2 Magma で計算してみる
実際に Magma を使って整数論の計算をやってみよう./*
*/ で囲まれた部分はコメ
ントである.一行だけのコメントには // も使う.以下では,行末にも必要に応じて日本
語のコメントを付け加えてある.
2.1
基本的な演算と文法
> /*
> MAGMA for number theorists
>
In Kanazawa
>
Dec. 26, 2008
> */
> 32123+1000;
// 文はセミコロン (;) で終わる
33123
> 2ˆ > 20; // 途中で改行しても; までは計算されない
1048576
> $1*$2+$2/$1; // $1 には直前の$2 にはその前の結果が代入されている
36419123646857571/1048576
> q:=2ˆ30 div 17;
// 230 を 17 で割った商を q に代入.結果は表示されない
> r:=2ˆ30 mod 17;r; // 結果を表示するためにこのような書き方も使う
13
> 2ˆ30 eq 17*q+r; // 等号が成立することを調べるには eq を使う
true
> // 素数のリストを作る
> [p : p in [1..1000] | IsPrime(p) ];
[ 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, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163,
途中省略
877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983,
991, 997 ]
> #$1;
// リストの元の個数
168
> [[p,p+2] : p in [1..1000] | IsPrime(p) and IsPrime(p+2)]; // 双子素数
[
[ 3, 5 ],
[ 5, 7 ],
[ 11, 13 ],
[ 17, 19 ],
[ 29, 31 ],
[ 41, 43 ],
[ 59, 61 ],
[ 71, 73 ],
途中省略
[ 881, 883 ]
]
2
Magma のリストは通常の数学の書き方と非常に近い形で定義することができる.リスト
をうまく使うと,複雑な計算を簡単に実行できることが多い.
2.2
一変数多項式の演算
代数体を定義するには多項式を扱う必要がある.ここでは基本的な多項式の扱いを説明
する.
(x + 1)20 を展開しようとして
> (x+1)ˆ20;
>> (x+1)ˆ20;
ˆ
User error: Identifier ’x’ has not been declared or assigned
となってエラーが出てしまう. Magma では計算の対象となる代数構造をあらかじめ定義
しなくてはならない. いまの場合は,
> PQ<x>:=PolynomialAlgebra(Rationals());
によってそれを行う.このコマンドにより有理数体上の一変数多項式環を定義し,その変
数を x とした.その名前 PQ は好きにつけてよい4 .あとで使う必要がない場合はアンダー
スコア (_) を使うと,名前を付けないでおくこともできる.これで x の数学的な意味がはっ
きりしたので,問題なく計算することができる.
> (x+1)ˆ20;
xˆ20 + 20*xˆ19 + 190*xˆ18 + 1140*xˆ17 + 4845*xˆ16 + 15504*xˆ15 + 38760*xˆ14 +
77520*xˆ13 + 125970*xˆ12 + 167960*xˆ11 + 184756*xˆ10 + 167960*xˆ9 +
125970*xˆ8 + 77520*xˆ7 + 38760*xˆ6 + 15504*xˆ5 + 4845*xˆ4 + 1140*xˆ3 +
190*xˆ2 + 20*x + 1
> Factorization($1);
// 因数分解して確認
[
<x + 1, 20>
]
> f:= xˆ3 - 210*xˆ2 + 1223743;
> IsIrreducible(f);
// 既約性判定
true
> Discriminant(f);
4898568580677
Magma のコマンドはそのほとんどが省略形ではなく,計算したいものの名詞形がそのま
ま用いられている.したがって以下では必要な箇所以外ではコマンド自体の説明を省略す
る.長いコマンドは入力するのが大変と思われるかもしれないが,コマンドの途中で TAB
キーを押すことにより,入力補完,候補の表示が行われるので,それほどの苦労はない.
それよりもコマンド名を覚える労力が少なくてすむ利点の方が多いと感じる.
4
もちろん何を表すかがある程度わかるように自分で名付けの規則を作るのがよい.
3
> Factorization($1); // 多項式の判別式の因数分解
>> Factorization($1);
ˆ
Runtime error in ’Factorization’: Bad argument types
Argument types given: FldRatElt
f が Q 係数の多項式でなので,その判別式は有理数体の元になる.有理数体は UFD では
ないので,このエラーがおこるのである.このようなときは !を使って,明示的に有理整
数環 (Integers())) の元に変換する必要がある.
> Factorization(Integers()!$1);
[ <3, 6>, <17, 2>, <19, 1>, <103, 1>, <109, 2> ]
となって UFD である Z の元として無事に因数分解ができる.
2.3
代数体の計算
この講演の中心の話題である代数体の計算にはいろう.
> C<a>:=NumberField(f);
// 代数体の定義.原始元を a とした
> MinimalPolynomial(a) eq f;
// a は f の1つの根である
true
> aˆ5;
// 体 C での四則
8037257*aˆ2 - 256986030*a - 53967066300
> 1/a;
1/1223743*(-aˆ2 + 210*a)
> GaloisGroup(C);
// ガロア群は S3 に同型
Symmetric group acting on a set of cardinality 3
Order = 6 = 2 * 3
(1, 2, 3)
(1, 2)
[ -8065*$.1ˆ2 + 6274*$.1 - 8251 + O(7ˆ5), -919*$.1ˆ2 - 6163*$.1 - 1228 + O(7ˆ5),
-7823*$.1ˆ2 - 111*$.1 - 7118 + O(7ˆ5) ]
GaloisData over Z_7
> S<b>:=SplittingField(C);S;
// S は C の最小分解体
Number Field with defining polynomial xˆ6 + 6*xˆ5 - 34*xˆ4 - 266*xˆ3 - 438*xˆ2 +
10*x + 289 over the Rational Field
> OS:=RingOfIntegers(S);
// 整数環
> Basis(OS);
[
OS.1,
OS.2,
OS.3,
OS.4,
OS.5,
OS.6
]
> S!OS.1;
// S の元としてみてみると
4
1
> S!OS.2;
1/180*(13*bˆ5 + 49*bˆ4 - 543*bˆ3 - 2237*bˆ2 - 1061*b + 1727)
> Index(OS,EquationOrder(S)); // 整数環の中での Z[a] の指数
10800
> Different(OS);
Ideal of OS
Basis:
[
1
0
0
2 1419 1078]
[
0
1
0 1096 1129 1419]
[
0
0
1 1096 861 1955]
[
0
0
0 1957
0
0]
[
0
0
0
0 1957
0]
[
0
0
0
0
0 1957]
> Factorization($1);
// 共役差積のイデアルとしての分解
[
<Prime Ideal of OS
Two element generators:
[19, 0, 0, 0, 0, 0]
[6, 1, 1, 1, 0, 0], 1>,
<Prime Ideal of OS
Two element generators:
[19, 0, 0, 0, 0, 0]
[7, 1, 1, 1, 0, 0], 1>,
<Prime Ideal of OS
Two element generators:
[19, 0, 0, 0, 0, 0]
[9, 1, 1, 1, 0, 0], 1>,
<Prime Ideal of OS
Two element generators:
[103, 0, 0, 0, 0, 0]
[45, 1, 1, 1, 0, 0], 1>,
<Prime Ideal of OS
Two element generators:
[103, 0, 0, 0, 0, 0]
[69, 1, 1, 1, 0, 0], 1>,
<Prime Ideal of OS
Two element generators:
[103, 0, 0, 0, 0, 0]
[95, 1, 1, 1, 0, 0], 1>
]
> Norm($2);
// 共役差積のノルム
7495014493
> Discriminant(OS);
// それは判別式と一致する
7495014493
> // イデアルとその剰余体
> d7:=Decomposition(OS,7);d7;
// 7 の分解
[
<Prime Ideal of OS
Two element generators:
[7, 0, 0, 0, 0, 0]
[96, 49, 56, 40, -1, 6], 1>,
<Prime Ideal of OS
5
Two element generators:
[7, 0, 0, 0, 0, 0]
[95, 51, 58, 42, -1, 6], 1>
]
> P7:=d7[1][1];
// P7 は 7 の上の素イデアル
> Degree(P7);
3
> r7,m7:=ResidueClassField(P7);r7;
// P7 による剰余体
Finite field of size 7ˆ3
この例のように Magma には 2 個以上の値を返す関数が多く存在する.ここでは r7 には剰
余体が m7 には整数環から剰余体への標準的な準同形写像が入っている.ここで単に r7:=と
書いた場合は 2 番目以降の返り値は捨てられる.
> Order(r7.1);
// r7.1 は剰余体の生成元
342
> m7(OS![0,1,2,3,4,5]);
4*r7.1ˆ2 + r7.1 + 4
> r7.1 @@ m7;
// 原像
[0, 1, 0, 0, 0, 0]
S/Q は S3 拡大であるから,2 次部分体 k を含むはずである.それを求めてみよう.そのた
めにまず自己同型を求める. GS には抽象的な群が,phi は GS から実際の自己同型群への
写像が代入される.
> GS<s,t>,_,phi:=AutomorphismGroup(S);GS; // s,t は GS の生成元
Permutation group GS acting on a set of cardinality 6
Order = 6 = 2 * 3
(1, 2, 4)(3, 6, 5)
(1, 3)(2, 5)(4, 6)
> Order(s);Order(t);
3
2
> phi(s)(b);phi(t)(b);
// phi(s) による S の原始元 b の像
1/60*(-bˆ5 - bˆ4 + 45*bˆ3 + 53*bˆ2 - 115*b - 101)
1/180*(13*bˆ5 + 61*bˆ4 - 519*bˆ3 - 2753*bˆ2 - 2213*b + 1775)
> k:=FixedField(S,sub<GS|s>);k;
// これが 2 次部分体
Number Field with defining polynomial xˆ2 - 116*x + 1407 over the Rational Field
> Discriminant(RingOfIntegers(k));
1957
√
> // k = Q ( 1957) である
sub は一般に部分構造を定義するコマンドで,今の場合 sub<GS|s>によって,s で生成さ
れる群 GS の部分群が定義される.
ちなみに,ここにでてきた 1957 は,中野伸さん,市村文男さんの誕生年だそうだ.
つぎに S の単数群およびイデアル類群を計算する.これも最初の返り値は (抽象) 群で,
2 番目に実際の対象への準同型が入っている.
> US,fu:=UnitGroup(S);US;fu;
// 単数群の計算
6
Abelian Group isomorphic to Z/2 + Z (5 copies)
Defined on 6 generators
Relations:
2*US.1 = 0
Mapping from: GrpAb: US to RngOrd: OS
> fu(US.1);
// 実際の生成元.これは torsion unit −1
[-1, 0, 0, 0, 0, 0]
> fu(US.2);
// 整数底による表示
[1, 1, 0, 0, 0, 0]
> S!fu(US.2);
// S の元としての表示
1/180*(13*bˆ5 + 49*bˆ4 - 543*bˆ3 - 2237*bˆ2 - 1061*b + 1907)
> MinimalPolynomial(fu(US.6)); // 最小多項式は整係数で定数項が 1
$.1ˆ6 - 2*$.1ˆ5 - 220*$.1ˆ4 + 1150*$.1ˆ3 - 950*$.1ˆ2 + 88*$.1 + 1
> Regulator(S);
424.7200453888621910481589841656144707112633049830039794315335895924381443685383
93570384196106520040657299401578343166639168244687111922878492860469700501765017
80885526
> // イデアル類群の計算
> CS,fc:=ClassGroup(S);CS;fc;
// (2, 2) 型のアーベル群
Abelian Group isomorphic to Z/2 + Z/2
Defined on 2 generators
Relations:
2*CS.1 = 0
2*CS.2 = 0
Mapping from: GrpAb: CS to Set of ideals of OS
> Id1:=fc(CS.1);Id2:=fc(CS.2);Id1;Id2; // これらが実際の生成元
Ideal of OS
Two element generators:
[2, 0, 0, 0, 0, 0]
[2, 1, 0, 1, 0, 0]
Ideal of OS
Two element generators:
[2, 0, 0, 0, 0, 0]
[3, 0, 1, 1, 1, 0]
> IsPrincipal(Id1);IsPrincipal(Id1ˆ2); // 位数が 2 であることを確かめる
false
true
> #CS;
// 類数
4
S のヒルベルト類体を計算する.まずは S 上の相対拡大 (複 2 次拡大) として計算されるの
でそれを絶対代数体に変換し,あらためて k 上の相対拡大としてとらえ直す.
> H:=HilbertClassField(S);H;
Number Field with defining polynomial [ $.1ˆ2 + 1/90*(-5*bˆ5 - 11*bˆ4 + 228*bˆ3 +
523*bˆ2 - 449*b - 1024), $.1ˆ2 + 1/60*(-3*bˆ5 + 7*bˆ4 + 185*bˆ3 - 241*bˆ2 2415*b - 2393)] over S
> IsPrincipal(ideal<RingOfIntegers(H)| Generators(Id1)>); // 単項化
true
> AbsoluteField(H);
Number Field with defining polynomial xˆ24 - 234*xˆ22 + 15933*xˆ20 - 368890*xˆ18
+ 2964540*xˆ16 - 9957102*xˆ14 + 16994301*xˆ12 - 15958466*xˆ10 + 8330897*xˆ8 2321012*xˆ6 + 317504*xˆ4 - 17472*xˆ2 + 256 over the Rational Field
7
> Hk:=RelativeField(k,H);Hk;
Number Field with defining polynomial $.1ˆ12 + (-k.1 - 59)*$.1ˆ10 + 1/2*(67*k.1 +
315)*$.1ˆ8 + (-64*k.1 - 534)*$.1ˆ6 + 1/2*(75*k.1 + 1265)*$.1ˆ4 + (-6*k.1 198)*$.1ˆ2 + 16 over k
> Discriminant(RingOfIntegers(Hk));
// k 上の整数環の判別式
Ideal
Basis:
[1 0]
[0 1]
> // H/k は不分岐拡大
> GHk:=GaloisGroup(Hk);GHk;
Permutation group GHk acting on a set of cardinality 12
Order = 12 = 2ˆ2 * 3
(1, 2, 5)(3, 4, 6)(7, 8, 11)(9, 10, 12)
(1, 6, 11)(2, 9, 4)(3, 10, 8)(5, 7, 12)
> // ガロア群は A4 に同型.これを確かめる
> A4:=Group<a,b | aˆ2,bˆ3,(b*a)ˆ3>;
// よく知られた表示
> #A4;
12
> Homomorphisms(A4,GHk);
// 単射準同形の計算
[
Homomorphism of GrpFP: A4 into GrpPerm: GHk, Degree 12, Order 2ˆ2 * 3 induced
by
A4.1 |--> (1, 4)(2, 12)(3, 9)(5, 11)(6, 8)(7, 10)
A4.2 |--> (1, 2, 5)(3, 4, 6)(7, 8, 11)(9, 10, 12),
Homomorphism of GrpFP: A4 into GrpPerm: GHk, Degree 12, Order 2ˆ2 * 3 induced
by
A4.1 |--> (1, 4)(2, 12)(3, 9)(5, 11)(6, 8)(7, 10)
A4.2 |--> (1, 5, 2)(3, 6, 4)(7, 11, 8)(9, 12, 10)
]
以上で H/k が非可換なガロア群をもつ不分岐拡大であることがわかった.実は H は k の
第 2 ヒルベルト類体になっているのである.このような体の例は山村健さんによってたく
さん見つかっている ([10]).
2.4
虚アーベル体の相対類数の計算
次に本研究集会のテーマである虚アーベル体の相対類数の計算をやってみる.この計算
は Magma の関数だけではできないので,いくらかプログラムを書く必要がある.プログ
ラムの実例を紹介することも,ここでの目的である5 .実際のプログラムは別のファイル
(今の場合 abel.mag6 ) にエディター7 で書いておいて,Magma から
load "abel.mag";
ただし私はプログラムを系統的に勉強したこともないし,マニュアルすら通読しないので,プログラミン
グの素人である.まあ素人でもこれくらいのことができるのが Magma の良さだと思う.数学者を数学に集
中させてくれるのである.なおここにあげたプログラムはこの研究集会のために作ったもので十分なテスト
をしているとは言いがたい.使用は自己責任でお願いします.
6
拡張子は mag に決まっているわけではない.勝手に決めてよい.
7
UNIX でよく使われているエディター emacs では Magma のプログラムが書きやすい magma-mode を
使うことができる.
5
8
と読み込んで使う.
√
√
ここでは複 2 次体 L = Q( −2, 79) を例に計算をおこなう.
> L:=AbsoluteField(NumberField([xˆ2+2,xˆ2-79]));L;
Number Field with defining polynomial xˆ4 - 154*xˆ2 + 6561 over the Rational
Field
まず CM 体かどうか調べるために次の関数を用意する.
IsCMField:=function(K)
r1,r2:=Signature(K);
if (Degree(K) eq 2) and (r1 eq 0) then
return true, NumberField(Rationals());
end if;
if not (r1 eq 0) then
return false,_;
end if;
SK:=Subfields(K);
if exists(t)t[1] : t in SK |Signature(t[1]) eq r2 then
return true,t;
else
return false,_;
end if;
end function;
もし CM 体であれば,2 番目の返り値として,最大実部分体が得られる.
> b,Lp:=IsCMField(L);b,Lp;
true Number Field with defining polynomial xˆ2 - 164*x + 6408 over the Rational
Field
次は単数指数である.[9, Theorem 4.12] の証明を見て,次のようなプログラムを書いて
みた.
UnitIndex:=function(K)
b,Kp:=IsCMField(K);
if not b then
error "not a CM field";
end if;
OK:=RingOfIntegers(K);
UK,fu:=UnitGroup(OK);
T,ft:=TorsionUnitGroup(OK);
cc:=[s : s in Automorphisms(K) | (s(K.1) ne K.1) and (Kp!(s(Kp.1)) eq Kp.1)][1];
// if Kp=Q, the parents of s(Kp.1) and Kp.1 are different
h:=hom<UK->OK | x:-> OK!(K!fu(x)/cc(K!fu(x)))>;
im:=sub<UK|[Inverse(fu)(h(u)) : u in Generators(UK)]>;
if #im eq # T then
return 2;
else
return 1;
end if;
end function;
9
このプログラムでは単数群の生成元をすべて計算しているので,体の次数が高くなれば計
算は困難になる.ハッセが [4] の中で,様々な条件の下でこの指数を理論的に決定しよう
としたことは,この計算上の困難を乗り越えるための必然であったと考えられる.
今考えている複 2 次体 L では,この計算には問題はない.
> UnitIndex(L);
2
次は対応するディリクレ指標の群の決定である.L の導手を f とするとき,L の Q(ζ f ) へ
の埋め込み得られれば計算が簡単であるが,これを計算するには一般に非常に時間がかか
る.そのため (Z/ f Z)× の位数 [L : Q] の部分群を求め,それらに対して,対応する群に
なっているかの判定をする.ただし f が多くの素因子を含むと候補が多くなり判定に時間
がかかる.ハッセのように,あらかじめ指標の群で体を決めることにすれば,このコスト
のかかる計算を回避することができる.
CorrespondingDirichletGroup:=function(K)
if not IsAbelian(GaloisGroup(K)) then
error "not an abelian field";
end if;
P<x>:=PolynomialAlgebra(Rationals());
f:=Norm(Conductor(AbelianExtension(K)));
Cf<z>:=CyclotomicField(f);
R:=ResidueClassRing(f);
A,phi:=UnitGroup(R);
ord:=EulerPhi(f)/Degree(K);
cand:=[u‘subgroup : u in Subgroups(A) |u‘order eq ord];
if #cand eq 1 then
fix:=cand[1];
else
for H in cand do
F:=NumberField(MinimalPolynomial(&+[zˆ(Integers()!phi(a)): a in H]));
if (Degree(F) eq Degree(K)) and IsSubfield(K,F) then
fix:=H;
break;
end if;
end for;
end if;
Cv:=CyclotomicField(EulerPhi(f));
G:=DirichletGroup(f,Cv);
H:=[];
for chi in Elements(G) do
if foralls: s in fix | Evaluate(chi, Integers()!(phi(s))) eq 1 then
Append(˜H,chi);
end if;
end for;
return H;
end function;
Magma にはディリクレ指標の群を計算する関数があるので,このように簡単なプログラ
ムが書ける.
10
> X:=CorrespondingDirichletGroup(L);X;
[
1,
$.1*$.2,
$.1*$.3ˆ39,
$.2*$.3ˆ39
]
ここで$.1 と $.2 は (Z/ f Z)× のディリクレ指標の群の生成元を表す.
ここまでくればゴールは目前である.一般ベルヌーイ数を定義して,それをそれを対応
するディリクレ指標に関してかけ合わせればよい.
GeneralizedBernoulliNumber:=function(n,chi)
// Washington Prop.4.1
f:=Conductor(chi);
chi:=FullDirichletGroup(f)!chi;
B:=BernoulliPolynomial(n);
return fˆ(n-1)*(&+[Evaluate(chi,a)*Evaluate(B,a/f): a in [1..f]]);
end function;
RelativeClassNumber:=function(K)
// Washington Thm 4.17
w:=#TorsionUnitGroup(RingOfIntegers(K));
Q:=UnitIndex(K);
Xodd:=[chi : chi in CorrespondingDirichletGroup(K) | IsOdd(chi)];
return Q*w*(&*[-1/2*GeneralizedBernoulliNumber(1,chi) : chi in Xodd]);
end function;
∑ fχ
ここで注意する必要があるのは,Magma では χ , 1 であっても i=1
χ(a) = 0 が成立しな
いことである.成立するようにするには改めて FullDirichletGroup(f) の元と考える必
要がある.最終的な計算は次のようになる.
> [GeneralizedBernoulliNumber(1,chi) : chi in X];
[
1/2,
-1,
0,
-8
]
> RelativeClassNumber(L);
8
> ClassNumber(Lp);
// 最大実部分体の類数
3
残念ながら,このような手作りの関数を作るより,一般的なアルゴリズム ClassNumber(L)
を使ってしまう方が実際は高速である8 .
円分体のように単数指数やディリクレ指標の群が簡単に求まるものであれば別仕立てで
次のような関数を書けばよい.
8
プログラムを書くのは楽しく勉強になるのは確かだが.
11
CyclotomicFieldRelativeClassNumber:=function(K)
if not (Category(K) eq FldCyc) then
error "not a cyclotomic field";
end if;
w:=#TorsionUnitGroup(RingOfIntegers(K));
f:=Conductor(K);
if #Factorization(f) eq 1 then
Q:=1;
else
Q:=2;
end if;
Xodd:=[chi : chi in Elements(FullDirichletGroup(f)) | IsOdd(chi)];
return Q*w*(&*[-1/2*GeneralizedBernoulliNumber(1,chi) : chi in Xodd]);
end function;
これだと,比較的大きな導手の体でもそこそこの速さで計算できる.
> CyclotomicFieldRelativeClassNumber(CyclotomicField(47));
695
最後に平林さんと中島さんの講演に出てきた吉野さんによる反例を計算しておこう.
>
>
>
1
>
2
>
2
>
4
2.5
K:=AbsoluteField(NumberField([xˆ2+1,xˆ2-2,xˆ2-17*3]));
Ktilde:=AbsoluteField(NumberField([xˆ2+1,xˆ2-2*17*3]));
UnitIndex(K);
UnitIndex(Ktilde);
RelativeClassNumber(K);
RelativeClassNumber(Ktilde);
生成的多項式
ここでは,私が実際の研究で Magma を使った例を紹介しよう.[6, Example 4.2], [5,
5.4] の中の C3 多項式の計算例である.この多項式はある代数的トーラスの自己準同形か
らクンマー理論を通じて得られるものである.詳細は書かないが,何層にも積み重なった
構造の上で多項式を計算していることをみていただきたい.
>
>
>
[
[
>
>
s
M<v>:=NumberField(xˆ2+3);
//
F<s,t>:=FunctionField(M,2);
Z:=Matrix(F,[[1,v],[1,-v]]);Z;
1 v]
1 -v]
A:=Z*Matrix(F,[[s],[t]]);
a1:=A[1,1];a2:=A[2,1];a1;a2;
+ v*t
12
v=
√
−3 ;
s - v*t
> PF<X>:=PolynomialAlgebra(F);
> QQ<e2>:=quo<PF| Xˆ3 - a1*a2ˆ2>;QQ;
Univariate Quotient Polynomial Algebra in e2 over Multivariate rational function
field of rank 2 over M
Variables: s, t
with modulus e2ˆ3 + -sˆ3 + v*sˆ2*t - 3*s*tˆ2 + 3*v*tˆ3
> circ:=Matrix(Integers(),[[2,-1],[-1,2]]);
// この行列が同種写像を決める
> Her,Tra:=HermiteForm(circ);
> W:=[];
> W[1]:=e2ˆ(-Her[1,2])*A[1,1]ˆ(Tra[1,1])*A[2,1]ˆ(Tra[1,2]);
> W[2]:=e2;
> ZZ:=Matrix(2,2,[QQ!c : c in Eltseq(Z)]);
// Base change
> MM:=ZZˆ(-1)*Matrix(QQ,[[W[1]],[W[2]]]);
> x1:=MM[1,1];x2:=MM[2,1];x1;x2;
1/2/(s - v*t)*e2ˆ2 + 1/2*e2
-1/6*v/(s - v*t)*e2ˆ2 + 1/6*v*e2
> _<T>:=PolynomialAlgebra(QQ);
// 名前は不要
> g:=(T-x1)*(T-(-1/2*x1-3/2*x2))*(T-(-1/2*x1+3/2*x2));g;
Tˆ3 + (-3/4*sˆ2 - 9/4*tˆ2)*T + -1/4*sˆ3 - 3/4*s*tˆ2
この g が求めるものである.g はある商環上の多項式として得られているが,実際は Q 上
の 2 変数の有理関数体 Q(s, t) 上の多項式環の元になることがわかっている.Magma では,
この係数に直すことは,構造の深い部分を変えることになるので,不可能ではないが,面
倒である.そこで,ここでは安易にコピーして定義し直すことにした.
>
>
>
>
FF<s,t>:=FunctionField(Rationals(),2);
_<X>:=PolynomialAlgebra(FF);
g:=Xˆ3-3/4*(sˆ2+3*tˆ2)*X-1/4*(sˆ3+3*s*tˆ2);
GaloisGroup(g);
GaloisGroup(
f: Xˆ3 + (-3/4*sˆ2 - 9/4*tˆ2)*X - 1/4*sˆ3 - 3/4*s*tˆ2
)
In file "/usr/local/magma/package/Ring/GaloisGrp/GalFldFun.m", line 793, column
21:
>>
K := FunctionField(f);
ˆ
Runtime error in ’FunctionField’: Transcendence degree must be 1
このように 2 変数の関数体上の多項式のガロア群の計算はサポートされていない.そこで,
初等的な方法で Gal( f ) が C3 に同型であることを確かめる.
> Discriminant(g);
81/16*sˆ4*tˆ2 + 243/8*sˆ2*tˆ4 + 729/16*tˆ6
> Factorization(RingOfIntegers(FF)!Discriminant(g));
[
<t, 2>,
<sˆ2 + 3*tˆ2, 2>
]
13
こうして得られた多項式は数論のよくわかる多項式になっている.次の例でわかる通り
√
s + t −3 をわる素イデアルと 3 の上の素イデアルしか分岐しない.
> u:=2+3*v;
> Norm(u);
31
> Eltseq(u);
[ 2, 3 ]
> PQ!Polynomial([Evaluate(a,Eltseq(u)): a in Coefficients(g)]);
xˆ3 - 93/4*x - 31/2
> Factorization(Discriminant(RingOfIntegers(NumberField($1))));
[ <31, 2> ]
√
さらに Q( −3) の 3 乗数からパラメータを作ると可約になる.
> Random(M,100)ˆ3;
1/1331*(180*v + 143)
> PQ!Polynomial([Evaluate(a,Eltseq($1)): a in Coefficients(g)]);
xˆ3 - 352947/7086244*x - 1529437/857435524
> IsIrreducible($1);
false
楕円曲線の計算例は [7] にあるので,興味のある方は参考にしていただきたい.
この節を読んで Magma が使ってみたくなったら,
http://magma.maths.usyd.edu.au/calc
にある Magma Calculator を使ってみるのがよい.実行時間が 20 秒以内の計算をオンラ
インで実行することができる.
3 Magma は速いか
他のシステムと比べて Magma は速いのだろうか.ここでは [8] を参考に簡単な速度比
較を行う9 .比較の対象としては Pari/GP と Maple を選んだ.行う計算は次のとおりで
ある.
A
B
(10000 + j)!
, ( j = 1, . . . , 2000)
(9000 + j)!
106
∑
1
i=1
i
C gcd((13 · 17 · 31 · 37 · 43)(i mod
2534) , (13
· 19 · 29 · 41 · 47)(i mod
D ベルヌーイ数 B2000
9
厳密な比較ではなく,たんなる目安である.
14
2595) ),
i = 1, · · · , 2000
50
∑
E
i=1
50
∑
F
i=1
ixyi
(x + iy)i
ixyi
(x + |25 − i|y)i
G gcd((x2 − 3xy + y2 )98 (3x − 7y + 2)101 , (x2 − 3xy + y2 )102 (3x − 7y − 2)97 )
H 200 次のヒルベルト行列 H の行列式
I 200 次のヒルベルト行列 H の逆行列
J HH−1
√
K 2 次体 Q( 2500001900000357) の類数
L x9 − 7x8 + 5x7 − 13x6 + 405x5 − 619x4 − 506x3 + 724x2 + 352x − 64 で定義される代数体
の類数
M x9 + 4x8 + 12x7 − 37x6 − 443x5 + 555x4 + 2969x3 − 3873x2 − 6256x + 9959 で定義される
代数体の単数群
N Q[x, y, z] のイデアル hx7 + y5 + z3 − 1, x4 + y6 + z − 1, x5 + y3 + z2 − 1i の辞書式順序に
よるグレブナー基底
すべての計算は Intel Xeon 2.66GHz, 3GB メモリーをもつ PC で Vine Linux 4.2 の上で
行った.使ったソフトウェアのバージョンは Magma が 2.14.14, Pari/GP が 2.3.3 である.
Maple は Version 11 をコマンドラインで実行した.単位は特に指定がない限り秒である.
テスト
A
B
C
D
E
F
G
H
I
J
K
L
M
N
Magma
Pari/GP
Maple
21.970
16.730
7.170
8.810
7.860
3.690
2.740
3.200
2.360
1.700
2.060
6.800
2.550
0.600
0.092
917
81.29
0.008
NA
NA
NA
4050
42.36
7.973
0.008
0.092
0.101
NA
23.75
33.85
8.51
7.99
0.00
0.00
0.00
32.91
80.40
21.66
NA
NA
NA
8.17
少し説明をしておく.
15
• Maple は結果を整理しないで表示するので E,F については,非常に速い.共通分母
を整理させるとそれぞれ 534.60 秒, 77.69 秒かかる.
• Maple は入力された多項式を入力された形で記憶しているので G が高速である.いっ
たん展開してから計算すると,16.30 秒かかる.
• Magma は D のベルヌーイ数の計算に母関数の冪級数展開を使っている.これを
Zagier による二重和公式10 に置き換えると,0.290 秒ですむ.Pari/GP はゼータ関数
の近似計算を利用している11 .Magma でもこれを利用すれば,より高速になると思
われる.
• Pari/GP のコマンド qfbclassno では,どれだけメモリーの量を増やしても K が計
算できなかった.この場合は quadclassunit を使えば計算できる12 .
• テスト L, M の計算では Pari/GP はデフォルトではミンコウスキー定数よりもはる
かに小さい上界を採用しているのでこのように小さくなる.この定数は GRH を仮
定して得られるバッハ定数よりもさらに小さいものである.同じ定数を仮定して,
Magma で L の計算を行うと, 0.600 秒まで時間が短縮される.
• Pari/GP の有理数計算の遅さが際立つ.木村巌さんによれば,Pari/GP は有理数を
計算するごとに gcd をとっていることからこのような現象が起こるようである.
総合的に Magma は高速なシステムであるといえるのではないだろうか.
4 Magma に関する情報源
Magma についてより詳しく知るためには以下にあげるようなものを利用するのがよい.
4.1 Magma の web page
MAGMA Computational Algebra System:
http://magma.maths.usyd.edu.au/magma/
では Magma の購入,ダウンロード,更新についての情報はすべてこのページから得るこ
とができる.Online Help からはマニュアルも参照できる.
4.2 Magma のマニュアル
Magma を購入,ダウンロードすると,html, pdf 形式13 のマニュアルがついてくる.
Magma にはコマンドラインから使えるヘルプも存在するが非常に使いづらい.例えば,
プロンプトから
金子昌信さんに教えていただいた.
木村巌さんに教えていただいた.
12
木村巌さんに教えていただいた.
13
pdf 版は 4000 ページを超えるボリュームがあって,印刷すると大変なことになってしまう.私が経験者
です.
10
11
16
> ?CyclotomicField
とすればコマンド CyclotomicField の説明がみられるのだが,コマンド Order について
調べようとすると,
> ?Order
211 matches:
1
S
/magma/aggregate/sequence/detail/Boolean/order
2
S
/magma/geometry/elliptic-curve/point/point-order
Order
途中省略
To view an entry, type ? followed by the number next to it
と大量に候補が表示され,特に初心者には必要な情報を引き出すのは難しいと思われる.
そこで,html または pdf を利用するのがよい. html のマニュアルを開いて作業するのが
おすすめである.このマニュアルは読みやすくはないけれども,多くの例が理解を助けて
くれる.
先に述べたように Magma はプロ仕様のソフトウェアであるから,ある程度の習熟が不
可欠である.その意味でも実際に操作をしながら,マニュアルのはじめの部分を通して読
むのがよいと思う.具体的に初めに読むべきところ14 は
Overview Language, Magmas, System features
The Magma langage Statements and expressions, Input and output,
Sets, Sequences, Mappings Sets, Sequences, Lists, Mappings
Basic rings and linear algebra Sparse matrices を除くすべて
といったところである.あとは,自分の研究分野,興味にしたがって読めばよい.数論に
関係が深い章は次のようなところである.
Lattices and quadratic forms
Global arithmetic fields 代数体,関数体,類体論,ガロア理論
Local arithmetic fields 局所体
Algebras 結合代数,四元数環,リー代数
Commutative algebra グレブナー基底,不変式論
Algebraic geometry 代数曲線
Arithmetic geometry 楕円曲線,超楕円曲線
Modular arithmetic geometry モジュラー曲線,モジュラー形式
14
あくまで私見である.コンピュータ言語を学ぶときに文法から徹底的にやらないと気がすまない人向けで
はない.
17
4.3
本
Wieb Bosma と John Cannon が編んだ [1] には実際の数学研究の現場での Magma が
どのように使われているかをかいま見せるような論文が集められている.
4.4 Magma conferences
1993 年以来,何度かにわたって Magma に関する国際会議が開かれている.計算数論
に関する研究集会と併催する形が多いようである.私もベルリンで開かれた Magma 2006
conference15 に参加したが,Magma の開発の話や,Magma を使った研究,その他の計算
数論の話題など面白い話題が多かった.
最後に,日本でも Magma のユーザーが増え,やがては開発にも貢献できるようになる
ことを願って筆を擱く.
参考文献
[1] W. Bosma and J. Cannon (eds.), Discovering mathematics with Magma, Algorithms
and Computation in Mathematics, vol. 19, Springer-Verlag, Berlin, 2006.
[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 (London, 1993).
[3] N. Bourbaki, Éléments de mathématique. Algèbre. Chapitres 1 à 3, Hermann, Paris,
1970.
[4] H. Hasse, Über die Klassenzahl abelscher Zahlkörper, Akademie-Verlag, Berlin, 1985
(reprint of the 1952 edition).
[5] 木田雅成, 冪根を含まない体のクンマー理論について, 第 5 回北陸数論研究集会報告
集, 2007, pp. 87–94.
[6] M. Kida, Descent Kummer theory via Weil restriction of multiplicative groups, Preprint
(2008).
[7] 木田雅成, 計算代数システム Magma による代数構造の計算, 「代数的整数論とその
周辺」, 京都大学数理解析研究所, 2008, Preprint.
[8] R. H. Lewis and M. Wester, Comparison of polynomial-oriented computer algebra systems, SIGSAM Bull. 33 (1999), no. 4, 5–13.
[9] L. C. Washington, Introduction to cyclotomic fields, second ed., Graduate Texts in
Mathematics, vol. 83, Springer-Verlag, New York, 1997.
15
このときは ANTS VII と併催であった.
18
[10] 山村健, 導手の小さい 2 次体の最大不分岐拡大の Galois 群, 第 4 回北陸数論研究集会
報告集, 2006, pp. 53–68.
(2008 年 12 月 26 日講演)
182-8585 調布市調布ヶ丘 1-5-1
電気通信大学数学教室
e-mail: [email protected]
19
Fly UP