« 2009年6月 | トップページ | 2009年8月 »

2009年7月30日 (木)

追加とおまけ

位数36に1つ追加しました。

おまけとして、maximaとgeomviewの組み合わせで描ける3Dグラフィックの例を1つあげておきます。

以下のコマンドを実行すると、三つ葉結びを3D化した物体が描かれます(かなり長いですが)。

set_plot_option([plot_format,geomview]);

plot3d(
[(3-cos(3*u))*cos(2*u)+(-3*sin(2*u)*cos(3*u))/sqrt(13*cos(3*u)^2-24*cos(3*u)+36)*cos(v)*0.5+((6*sin(2*u)*cos(3*u)-18*sin(2*u))*sin(3*u)-13*cos(2*u)*cos(3*u)^2+24*cos(2*u)*cos(3*u)-36*cos(2*u))/sqrt(52*cos(3*u)^4-408*cos(3*u)^3+1305*cos(3*u)^2-1944*cos(3*u)+1620)*sin(v)*0.5,
(3-cos(3*u))*sin(2*u)+(3*cos(2*u)*cos(3*u))/sqrt(13*cos(3*u)^2-24*cos(3*u)+36)*cos(v)*0.5+((18*cos(2*u)-6*cos(2*u)*cos(3*u))*sin(3*u)-13*sin(2*u)*cos(3*u)^2+24*sin(2*u)*cos(3*u)-36*sin(2*u))/sqrt(52*cos(3*u)^4-408*cos(3*u)^3+1305*cos(3*u)^2-1944*cos(3*u)+1620)*sin(v)*0.5,
sin(3*u)+(2*cos(3*u)-6)/sqrt(13*cos(3*u)^2-24*cos(3*u)+36)*cos(v)*0.5+(9*cos(3*u)*sin(3*u))/sqrt(52*cos(3*u)^4-408*cos(3*u)^3+1305*cos(3*u)^2-1944*cos(3*u)+1620)*sin(v)*0.5],
[u,-%pi,%pi],[v,-%pi,%pi],['grid,160,40]);

| | コメント (0) | トラックバック (0)

2009年7月29日 (水)

追加

位数36に1つ追加しました。

それから、GNU Octaveの画像関連の機能について少し調べています。量子化学とも有限群ともあまり関係のない分野に関連してなのですが。

| | コメント (0) | トラックバック (0)

2009年7月28日 (火)

位数36

位数36の群のデータの追加を始めました。

それから、少し前の話なのですが、maximaからgeomviewを呼び出して3Dの描画をさせると、一時ファイルとして、maxout.geomviewというファイルができます。これをうまく加工すると(ちょっと手間がかかったと思いますが)、VRMLに変換することが可能です。

実はこうやって作った、水素原子の断面の電子密度のVRMLなどがあるのですが、サイズが大きいので、アップしたものかどうか思案中です。

| | コメント (0) | トラックバック (0)

2009年7月27日 (月)

指標表から有限群を構成してみる(3)

行列表現から対応する置換表現を求めたいわけですが、そのためには、(C4 x C2) : C2 を両方で生成して共役類と指標表を求め、対応する共役類の代表元同士を関連付けて、置き換えるといいようです。

これで無事、(C2 x C2).(C2 x C2 x C2)が求まり、位数32が完成しましたので、更新しておきました。

次は位数36に進みます。

ところで、現在先の方では位数48を計算していて、C2.S4を同じ方法で求めてみようと思ったのですが、まだうまくいきません。何かほかにまだカギとなる点があるのかもしれません。

それからUbuntuでのmaximaとgeomviewですが、maximaからのgeomviewの呼び出しがうまくいかないようです。おそらく、該当部分のmaximaのソース(Lisipで記述されたコード)を書きかえられればなんとかなるのではないかと思うのですが、ちょっと今のところ手を出す余裕がありません。

| | コメント (0) | トラックバック (0)

2009年7月26日 (日)

指標表から有限群を構成してみる(2)

さて、昨日の方針に従って

a:=[[0,-1],[1,0]];
b:=[[0,E(4)],[E(4),0]];
c:=[[0,1],[1,0]];

というふうにいくつか生成元を取り、

g:=Group(a,b,c)

としてみると、位数16にしかなりません((C4 x C2) : C2)。

これ以上当てはまりそうな生成元を増やしてみても、どれもこの群に含まれてしまい、これ以上位数は大きくなりません。

ここで最後の行の表現をよく見ると、単位元以外のところに2が出てきています。この最後の行の表現は忠実ではないわけです。

それで他の既約表現を取ってきて、それとの直和で構成することを考えます。下から2番目の行は最後の行と実質的に同じ表現なので、下から3番目の行を使うことにします。ここで出てくるのはやはり2とか-2とかAなので、前と同じような同じ2行2列の行列を当てはめてみて、前に作った表現との直和を取ってみると、正しく構成できる組み合わせが見つかりました。

最後にこれを、置換表現に置き換えることを考えてみるわけです。

| | コメント (0) | トラックバック (0)

2009年7月25日 (土)

指標表から有限群を構成してみる(1)

久しぶりに有限群の話です。

位数32のうち、ひとつだけ構成できずに残っていたのが(C2 x C2).(C2 x C2 x C2)だったのですが、実は、GAPは群としてのそのデータを持っているということに気付きました。指標表を表示できるからです。

ll:=AllSmallGroups(32);

とすると、位数32のすべての群のリストを取得できます。

List(ll, StructureDescription);

とすると、具体的な表示になります。数えてみると、(C2 x C2).(C2 x C2 x C2)は32番目にあるようなので、

g:=ll[32];
StructureDescription(g);

とすると、確かにそうであることが分かります。

ct:=CharacterTable(g);
Displya(ct);

で指標表が表示できるわけですが、これから、生成元を置換として求めてみようというわけです。

指標表が示しているのは行列表現のトレースなので、まずは行列表現として求めてみることを考えます。通常、下に行くほど情報が多いので、一番下の表現の列を見てみると、指標として2, -2, Aなどがあります。Aはここでは-2iということになっています。

その左端は必ず単位元の表現で、その指標が2になっているということは、この行は2次元表現です。そうすると、指標が-2なら、

[[-1,0],[0,-1]]

-2iなら、

[[-i,0],[0,-i]]

ということになります。ピリオドになっているところは指標が0というわけですから、位数が2なら、

[[1,0],[0,-1]],[[0,1],[1,0]], [[0,i],[-i,0]]

など、位数が4なら

[[0,1],[-1,0]], [[0,i],[i,0]], [[i,0],[0,-i]]

などがあり得ます。これを、指標表の上の、べき乗がどの共役類に移るかを示す行の表示と比べ合わせて、矛盾のない仕方で組み合わせることにより、行列表現を構成しようというわけです(続く)。

| | コメント (0) | トラックバック (0)

2009年7月24日 (金)

さらにまたoctave

さて、3Dプロットのための式は大体できたのですが、高さを適切にするために定数倍してやる必要があります。これには、極大をとる値を式に入れてやればいいのですが、maximaは数値計算には向いていないようなので、octaveを使ってみることにします。

octaveはいくつかバージョンがあるのですが、ここでは、

#apt-get install octave3.0

として、3.0の方を入れてみましょう。

octaveを起動して、関数を定義します。

octave:1> function [v]=f(r)
> v= (e^(-r/6)*(r^5-90*r^4+2700*r^3-32400*r^2+145800*r-174960))^2*r^2
> end
octave:2> f(59.024)
v = 5.5618e+10
ans = 5.5618e+10

極大値はこれくらいなのですが、全体の表示にはプロット幅も関係してくるので、かけるべき定数は

octave:3> 83.4725/f(59.024)/2
v = 5.5618e+10
ans = 7.5040e-10

となっています。ただ、

plot3d(
[p, q,
(exp(-sqrt(p*p+q*q)/6)*(((sqrt(p*p+q*q) -90) * (p*p+q*q) + 2700 * sqrt(p*p+q*q) - 32400) * (p*p+q*q) + 145800 * sqrt(p*p+q*q) - 174960))^2*(p*p+q*q)*0.000000000744904*0.5],
[p,-83.4725,83.4725],[q,-83.4725,83.4725],['grid,160,160]);

と比べてみると、さらに0.5かけてあります。なんでだったか覚えてないのですが、実際の表示を見て加減したのでしょう。それから定数が少し違いますが、このときは確かEcxelで求めたのだったと思います。

| | コメント (0) | トラックバック (0)

2009年7月23日 (木)

再びmaxima

今日は、昨日書いたorbの出力をもとに、plot3dのプロット範囲をどう決めるか、書いてみます。

6Sに対応するorbの出力は、こうでした。

$ ./orb 6 0
[1,-90,2700,-32400,145800,-174960]

これを基に、こういう式を作って、maximaに代入してみます。

diff((exp(-r/6)*(r^5-90*r^4+2700*r^3-32400*r^2+145800*r-174960))^2*r^2,r);

こういう結果になります。

2 5 4 3 2 2 - r/3
r (r - 90 r + 2700 r - 32400 r + 145800 r - 174960) %e
(%o1) - -----------------------------------------------------------------
3
5 4 3 2 2 - r/3
+ 2 r (r - 90 r + 2700 r - 32400 r + 145800 r - 174960) %e
2 4 3 2
+ 2 r (5 r - 360 r + 8100 r - 64800 r + 145800)
5 4 3 2 - r/3
(r - 90 r + 2700 r - 32400 r + 145800 r - 174960) %e

ちょっと見にくいので、ratsimp(%);と入力して整理してみます。

12 11 10 9 8 7
(%o2) - (r - 216 r + 19440 r - 955800 r + 28285200 r - 523480320 r
6 5 4 3
+ 6101205120 r - 44026934400 r + 188484408000 r - 442158912000 r
2 - r/3
+ 489776025600 r - 183666009600 r) %e /3

ペーストしたらべき乗の数値がずれているようなので、ずらして読みなおしてください。

なにをやっているのかというと、関数が極大、極小になるを求めるために、微分してみたわけです。

それで、このrの多項式の部分が0になるところを求めたいのですが、exp(-r/3)が余計なので、exp(r/3)をかけることにして、

realroots(%o2*exp(r/3));

と入力してみます。これは多項式のの実数解を求める関数です。こうなります。

24395313 62112359 130477793 212698117
(%o4) [r = --------, r = --------, r = ---------, r = ---------,
33554432 33554432 33554432 33554432
330139973 464141663 643351957 845477765 1118977307
r = ---------, r = ---------, r = ---------, r = ---------, r = ----------,
33554432 33554432 33554432 33554432 33554432
1435468975 1980516091
r = ----------, r = ----------, r = 0]
33554432 33554432

最後の、r:=0の前のものが求めたい極大の場所(6Sだと一番外側のリングのところ)になっています。やっぱりペーストすると、すっかりずれますね。

maximaは数値計算は苦手なようなので、r=1980516091/33554432を、電卓なり表計算なりで求めてみると、

59.023979

くらいになります。ただ、これをプロット範囲にすると、リングのてっぺんで描画が切れることになるので、ルート2くらいをかけてやって、

83.472512

が適当でしょう。

plot3d(
[p, q,
(exp(-sqrt(p*p+q*q)/6)*(((sqrt(p*p+q*q) -90) * (p*p+q*q) + 2700 * sqrt(p*p+q*q) - 32400) * (p*p+q*q) + 145800 * sqrt(p*p+q*q) - 174960))^2*(p*p+q*q)*0.000000000744904*0.5],
[p,-83.4725,83.4725],[q,-83.4725,83.4725],['grid,160,160]);

のp,qのプロット範囲は、こうやって求めていたわけです。

| | コメント (0) | トラックバック (0)

2009年7月22日 (水)

少し量子化学に近い話:さらにHaskell

さて、昨日まで書いたような電子密度のグラフィックを描くためには、水素電子の波動関数が必要です。いろいろな参考書に出ているとは思うのですが、主量子数の高いところまではあまり出ていません。

とりあえず動径方向の関数の係数を計算したいと思って、Haskellでプログラムを書きました(マイナー過ぎますか)。

こんな感じです。

import System

main = do args <- getArgs
print $ reverse $ gcd1 $ ratio (read (head args)) $ reduce (2 * (read (head (tail args))) + 1) $ reduceExp $ orb ((read (head args)) + (read (head (tail args))))

orb :: Int -> [Integer]
orb n = (replicate n 0) ++ [1]

reduceExp :: [Integer] -> [Integer]
reduceExp xs = reduceExp1 ((length xs) - 1) xs

reduceExp1 :: Int -> [Integer] -> [Integer]
reduceExp1 n xs = if (n > 0) then (reduceExp1 (n-1) (reduceExp2 xs)) else (xs)

reduceExp2 :: [Integer] -> [Integer]
reduceExp2 xs = zipWith (-) (zipWith (*) [1..] ((tail xs) ++ [0])) xs

reduce :: Integer -> [Integer] -> [Integer]
reduce n xs = if (n > 0) then (reduce (n-1) (reduce1 xs)) else (xs)

reduce1 :: [Integer] -> [Integer]
reduce1 xs = zipWith (*) [1..] (tail xs)

ratio :: Integer -> [Integer] -> [Integer]
ratio n xs = zipWith (*) (ratio1 (length xs) n 2) xs

ratio1 :: Int -> Integer -> Integer -> [Integer]
ratio1 l x y = if (l == 1) then [1] else [x * (head (ratio1 (l-1) x y))] ++ (map (\n -> n * y) (ratio1 (l-1) x y))

gcd1 :: [Integer] -> [Integer]
gcd1 xs= gcd2 xs (gcd3 xs)

gcd2 :: [Integer] -> Integer -> [Integer]
gcd2 xs m = map (\n -> div n m) xs

gcd3 :: [Integer] -> Integer
gcd3 (x:xs) = if (xs == []) then x else (gcd x (gcd3 xs))

これをorb.hs(Orbitの略のつもり)として保存します(しばらく前に書いたものなので、今読みなおしても、何やってたんだかあまりよく理解できません)。

もちろん、先にHaskellシステムのインストールが必要でした。Glasgow Haskell Compilation Systemを入れることにして、

#apt-get install ghc6

としてインストールします(もちろんDebianとかの場合)。

コンパイルは以下の通り。

$ ghc orb.hs -o orb

でできたorbプログラムに、主量子数と軌道量子数を引数として与えて計算させます。

$ ./orb 3 0
[-2,18,-27]

こんな感じです。これは3Sの動径方向の関数の係数に対応します。

後、全体の係数とプロット範囲とかも求めなければならないのですが、それはまた後で。

こうやって作った6S軌道を載せておきます。

#6S

plot3d(
[p, q,
(exp(-sqrt(p*p+q*q)/6)*(((sqrt(p*p+q*q) -90) * (p*p+q*q) + 2700 * sqrt(p*p+q*q) - 32400) * (p*p+q*q) + 145800 * sqrt(p*p+q*q) - 174960))^2*(p*p+q*q)*0.000000000744904*0.5],
[p,-83.4725,83.4725],[q,-83.4725,83.4725],['grid,160,160]);

さっきのorbの出力はこうでした。

$ ./orb 6 0
[1,-90,2700,-32400,145800,-174960]

では今日はここまで。

| | コメント (0) | トラックバック (0)

2009年7月21日 (火)

少し量子化学に近い話:maximaとgeomviewで遊ぶ(2)

maximaは本来、外部の3Dグラフプロット用アプリケーションとしてgnuplotを使用するはずなのですが、geomviewを使用するように指定すると、結構きれいな表示になるので、私はもっぱらこれを使っています。

さて、昨日のmaxima用コマンドを再掲します。

plot3d(
[p, q,
(exp(-sqrt(p*p+q*q)*0.5)*(sqrt(p*p+q*q)-2))^2*(p*p+q*q)*3.4273*0.5],
[p,-7.405,7.405],[q,-7.405,7.405],['grid,160,160]);

私もドキュメントをちゃんと読んだわけではないのですが、とりあえずこういうことだろうと思います。

plot3d(): :外部3Dプロットコマンドを呼び出す。

[p, q,...], :プロットする点を3次元座標で指定。この場合、縦横はp,qですが、高さがかなりややこしくなっています。

[p,-7.405,7.405],[q,-7.405,7.405], :前の3次元座標で、パラメータとして変化させる変数と、その範囲を指定。

['grid,160,160] :上の範囲を160x160のグリッドとして分割。

グリッドはもちろんもっと細かく分割できでしょうが、あまり細かくすると表示までの時間がかなり長くなります。

| | コメント (0) | トラックバック (0)

2009年7月20日 (月)

追記

>「少し量子かが口に買い話」

よく読むと、わたしが入力ミスをしたみたいですね。

ついでに修正。

2Pxの最後の行が間違っていました。本当はこうです。

[p,-7.405,7.405],[q,-7.405,7.405],['grid,160,160]);

ついでながら、今は訳あってUbuntuから書き込んでいます。Ubuntuにもxmaximaとgeomviewはあるようです。後でインストールして、テストしてみます。

| | コメント (0) | トラックバック (0)

少し量子化学に近い話:maximaとgeomviewで遊ぶ

またMS IMEが「少し量子かが口に買い話」というような変換をしました。

さて趣向を変えて、題の通り、maximaやgeomviewを使ってみます。

maximaは数式処理プログラムで、geomviewは(gnuplotとかの代わりに)それから呼び出すことのできる、3Dグラフィックプログラムです。

私の環境はDebian Lenny(ただしWindows上のVMware上)ですが、もしDebianのユーザーで、同じことを試してみたい方は、とりあえずインストールしてみてください。

#apt-get install xmaxima
#apt-get install geomview

maximaのXフロントエンドとしてはwxMaximaというのもあるのですが、私はxmaximaの方が使いやすいように感じています。

他のディストリビューションとしては、Fedoraにもこれらは入っています。Gentooでは、現在は分かりませんが、x86アーキテクチャではgeomviewはマスクされていて、インストールできませんでした。

xmaximaを起動したら、まず次のように入力します。

set_plot_option([plot_format,geomview]);

これで、外部3Dグラフィックアプリケーションとしてgeomviewが呼び出されます。

で、ためしに次のように入力してい見てください。

plot3d(
[p, q,
(exp(-sqrt(p*p+q*q)*0.5)*(sqrt(p*p+q*q)-2))^2*(p*p+q*q)*3.4273*0.5],
[p,-7.405,7.405],[q,-7.405,7.405],['grid,160,160]);

CPUパワーにもよりますが、少し待たされた後、別ウィンドウが開いて、何か同心円状の図形が表示されると思います。これは、ウィンドウの中をドラッグすると、いろいろな向きに回転させることができます。

これは2Sの波動関数を表したものです(ただし二乗して電子密度にしてあり、さらに見やすいようにr2をかけてあります)。

ひとつだけだとさびしいので、もう少し載せておきます。これらの求め方や説明については、また明日にでも。

#2Px

plot3d(
[p, q,
(exp(-sqrt(p*p+q*q)*0.5)*p)^2*(p*p+q*q)*1.1167*0.5],
[p,-47.405,7.405],[q,-7.405,7.405],['grid,160,160]);

#3S

plot3d(
[p, q,
(exp(-sqrt(p*p+q*q)/3)*(2*(p*p+q*q)-18*sqrt(p*p+q*q)+27))^2*(p*p+q*q)*0.02616*0.5],
[p,-18.49,18.49],[q,-18.49,18.49],['grid,160,160]);

#3P

plot3d(
[p, q,
(exp(-sqrt(p*p+q*q)/3)*(sqrt(p*p+q*q)-6)*p)^2*(p*p+q*q)*0.0738*0.5],
[p,-18.49,18.49],[q,-18.49,18.49],['grid,160,160]);

#3D

plot3d(
[p, q,
(exp(-sqrt(p*p+q*q)/3)*(p*p-q*q))^2*(p*p+q*q)*0.0140*0.5],
[p,-18.49,18.49],[q,-18.49,18.49],['grid,160,160]);

#4S

plot3d(
[p, q,
(exp(-sqrt(p*p+q*q)*0.25)*((sqrt(p*p+q*q)-24)*(p*p+q*q)+144*sqrt(p*p+q*q)-192))^2*(p*p+q*q)*0.000648*0.5],
[p,-34.8152,34.8152],[q,-34.8152,34.8152],['grid,160,160]);

| | コメント (0) | トラックバック (0)

2009年7月19日 (日)

Lie型の群(8)

さて、Chevalley底からはそれと同じ数の随伴表現ができるわけですが、その1つをAとします。それから

A0 + A*t + A2/2*t2 + A3/6*t3

というようなものを作ると、これはexpAで、しかもその成分は整数係数のtの多項式になります。

このtにF(p)の生成元を代入すると、これは希望するLie型の群の生成元(の1つ)になります。

少し前の投稿で、

L:= SimpleLieAlgebra( "A", 1, Rationals );
AdjointMatrix( Basis( L ), Basis( L )[1] );

などというものを書きましたが、2行目の方を

A:=AdjointMatrix( Basis( L ), Basis( L )[1] );

としてやれば、これまでに書いたことが実行できるわけです。

もっとも、線形群、回転群(直交群)、Symplectic群(斜交群)を作るのであれば、GAPにはそれ用の関数があるので、特にこうする必要はありません。一方、例外型の群については、特にそのような関数が用意されてはいないようなので、この方法で構成してみることはある程度意味があるかもしれません。

ちなみに、ここまでで説明した方法は、Chevalleyがのちに自分の名前の付いた一連の群を構成するために使った方法(のはず)です。もっとも、具体的に一つ一つ構成したわけではなく、この方法で構成できることを示して、その意数の公式を与えたり、それらが単純であることを証明したりした、ということのようです。

この方法については何箇所かで読んだのですが、なぜこれでよいのかということが納得がいかず(特にexpAの成分が有限項で済むのか、ちゃんとn!で割れるようになるのか、という点)、今回具体的に計算してみて、確かににこれでうまくいくのだとわかったことは、私自身にとっては収穫でした(本当は計算しなくても証明できることだったのでしょうが)。

この話は、とりあえずここまでで一段落です。

| | コメント (0) | トラックバック (0)

2009年7月18日 (土)

Lie型の群(7)

昨日、暑さでぼんやりしていたせいか、操作ミスで、Windowsの起動ディスクの内容をバッサリと消してしまいました。

おかげで、Windows 7を待たずに、Vistaの再インストールをする羽目になりました。

ただ、なぜか、動作がもたついていたMS Wordの動作がスムースになりました。怪我の功名というべきでしょうか。

さて話の続きですが、Lie代数の基底を取り直し、Chevalley底と呼ばれるものにします。これには、基底相互のLie積が、他の基底の整数倍、およびそれらを加えたものになるという面白い性質があります。

さて、このChevalley底を基に、Lie代数の随伴表現を作ります。そうするとなお都合のよいことに、この随伴表現は何乗かすると必ず0になります。つまりexpAを展開すると、有限項で切れることが保証されます(実際には高々3次までのようです)。

さらに、そのべき乗の中に出てくる係数は、2次だと2、3次だと6で割り切れるものになるので、expAの係数も必ず整数になります。

それで、これを使うわけです(もうちょっとだけ続く)。

| | コメント (0) | トラックバック (0)

2009年7月17日 (金)

Lie型の群(6)

ここでLie代数とLie群の関係を考えます。これはすべてというわけではなかったと思いますが、Lie群の一部の元については、たとえばそれをaとすると、Lie代数の元Aが存在して、

a=expA

という関係が成り立ちます。このようにしてできたaの元を有限体の元で置き換えてみれば、という考えです。

ところでこれだけではまだ、Lie群の元を有限体から取ったものを作ることはできません。というのは、Tailor展開に相当するものがこの場合にも成り立ち、

expA=E + A + (1/2!)A2 + (1/3!)A3 + ...

ということになるのですが、有限体の元を任意の数で割るわけにはいかない(特に標数kであればkでは割れない)ということや、果たしてこの展開は有限の項で切れるのか、といったことが問題になるからです。

それでさらに工夫が必要になります。

| | コメント (0) | トラックバック (0)

2009年7月16日 (木)

Lie型の群(5)

連続群というかLie群には、その基本となる半単純なものがあり、それらはAn、Bn、Cn、Dn、E6、E7、E8、F4、G2というように分類されています。

これらのうちAnは線形群、BnとDnは回転群、Cnは斜交群というものに対応するのですが、それ以外のものは例外型Lie群と呼ばれる特殊なものになります。

ところで線形群についてはその要素を実数とか複素数ではなく有限体Fpから取れば有限群ができるのはわかりやすいのですが、それ以外のものについては、どういうふうにすれば対応する有限群ができるだろう、というのはなかなか難しい問題です。回転群でさえ、どういう置き換えをしたらいいのかすぐにはわかりません。

ここで工夫が必要になります(続く)。

| | コメント (0) | トラックバック (0)

2009年7月15日 (水)

Lie型の群(4)

昨日は投稿をさぼってしまいました。

ところでその間にGAPのマニュアルを読んでいて、面白い機能に気が付きました。

http://www.gap-system.org/Manuals/doc/htm/ref/CHAP061.htm

でLie代数について書かれていていて、さらに61.9のところで随伴表現(The Adjoint Representation)の求め方が出ています。たとえばA1の随伴表現の最初の要素は、

L:= SimpleLieAlgebra( "A", 1, Rationals );
AdjointMatrix( Basis( L ), Basis( L )[1] );

で求められるようです。

今まで手作業やプログラミングで随伴表現を求めていたのですが、これで簡単に求まります。もっとも、G2型は苦労してもう少しでできそうなところだったので、ちょっと複雑な気分です。

ついでにテスト。

A2

普通にhtmlのタグ使えるんですね。早く気がつけばよかった。

(MS IMEは最初に「葉や茎がつけばよかった。」と変換しました。おもしろかったので記録に残します。)

| | コメント (0) | トラックバック (0)

2009年7月13日 (月)

Lie型の群(3)

今日は、B2型を載せてみようかと思っていたのですが、G2型を調べているうちにもっと簡単な構成方法があることに気づいたので、ちょっと後にします。

GAPの長いプログラムを載せて、説明をあまりしないのも何だと思うので、ちょっと書いてみておきます。資料はどこかにあるのですが、今すぐには見つからないので、とりあえず記憶で書いてみて、あとで必要であれば修正します。

基本的には、連続群からそれに対応する有限群を作ってみたいというところから始まったのでしょう。

実数または複素数上の一般線形群GL(2,R)またはGL(2,C)は、g::=[[a,b],[c,d]];という形で書けるのですが、このなかのa~dを実数または複素数の代わりに有限体から取れば、有限群ができるだろうというわけで、実際そうなのですすが、こう単純な置き換えではすまない連続群もあり、それらからどうやって有限群を作ったらいいのかということが問題となった、ということのようです。

(続きます)。

| | コメント (0) | トラックバック (0)

2009年7月12日 (日)

Lie型の群(2)

今日はA2です。

生成元は6つできるのですが、5つでいいみたいです。

e0の前までは、それ以降のa1とかのデータを作り出すためのプログラムなので、e0以降だけの入力でも問題ありません(入力はもちろんGAPに)。

e0のところから最後近くのzzの前までが下準備です。下準備の部分を入力したら、zzのところをいろいろ変えて(Z(3)とかZ(5)とか)、その行を含めてそれ以降を入力してください。

その後 Size(g); とかStructureDescription(g); とかで、どんな群ができたか確かめてみてください。

この後はひたすらプログラムが羅列されています(最後まで)。

m:=[1..9];

m[1]:=[[0,1,0],[0,0,0],[0,0,0]];
m[2]:=[[0,0,1],[0,0,0],[0,0,0]];
m[3]:=[[0,0,0],[0,0,1],[0,0,0]];
m[4]:=[[0,0,0],[1,0,0],[0,0,0]];
m[5]:=[[0,0,0],[0,0,0],[1,0,0]];
m[6]:=[[0,0,0],[0,0,0],[0,1,0]];
m[7]:=[[1,0,0],[0,-1,0],[0,0,0]];
m[8]:=[[0,0,0],[0,1,0],[0,0,-1]];
m[9]:=[[-1,0,0],[0,0,0],[0,0,1]];

x:=[[0,0,0],[0,0,0],[0,0,0]];
y:=[[0,0,0],[0,0,0],[0,0,0]];
xy:=[[0,0,0],[0,0,0],[0,0,0]];
z:=[[0,0,0],[0,0,0],[0,0,0]];
c:=0;


for i in [1..9] do
x:=m[i];
Print("[");
for j in [1..9] do
y:=m[j];
Print("[");
xy:=x*y-y*x;
for k in [1..9] do
z:=m[k];
c:=0;
if xy= 2*z then c:= 2; fi;
if xy= z then c:= 1; fi;
if xy=-z then c:=-1; fi;
if xy=-2*z then c:=-2; fi;
Print(c);
if (k < 9) then Print(","); fi;
od;
if (j < 9) then Print("],\n"); fi;
od;
if (i < 9) then Print("]\n"); fi;
Print("]\n");
od;

e0:=[
[1,0,0,0,0,0,0,0],
[0,1,0,0,0,0,0,0],
[0,0,1,0,0,0,0,0],
[0,0,0,1,0,0,0,0],
[0,0,0,0,1,0,0,0],
[0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,1,0],
[0,0,0,0,0,0,0,1]
];

a1:=[
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,1,0,0,0,0,0,0],
[0,0,0,0,0,0,1,0],
[0,0,0,0,0,-1,0,0],
[0,0,0,0,0,0,0,0],
[-2,0,0,0,0,0,0,0],
[1,0,0,0,0,0,0,0]
];

b1:=[
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,-1,0,0,0,0,0],
[0,0,0,0,0,0,1,1],
[1,0,0,0,0,0,0,0],
[0,-1,0,0,0,0,0,0],
[0,-1,0,0,0,0,0,0]
];

c1:=[
[0,-1,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,1,0,0,0,0],
[0,0,0,0,0,0,0,1],
[0,0,1,0,0,0,0,0],
[0,0,-2,0,0,0,0,0]
];

d1:=[
[0,0,0,0,0,0,-1,0],
[0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,-1,0,0,0],
[0,0,0,2,0,0,0,0],
[0,0,0,-1,0,0,0,0]
];

e1:=[
[0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,-1,-1],
[0,0,0,-1,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,1,0,0,0],
[0,0,0,0,1,0,0,0]
];

zz:=Z(2);
a:=e0+a1*zz+(a1^2)/2*zz^2;
b:=e0+b1*zz+(b1^2)/2*zz^2;
c:=e0+c1*zz+(c1^2)/2*zz^2;
d:=e0+d1*zz+(d1^2)/2*zz^2;
e:=e0+e1*zz+(e1^2)/2*zz^2;

g:=Group(a,b,c,d,e);

| | コメント (0) | トラックバック (0)

2009年7月11日 (土)

追記

ついでながら、前の記事のa2. b2はそれぞれ(a1^2)/2, (b1^2)/2になっています。

それから、GAPではZ(p^n)は、有限体Fp^nの乗法群の生成元です(のはず)。

そして、明日か明後日あたり使うと思うのですが、E(n)は円分体の生成元のようです(E(4)を虚数単位の代わりに使います)。

| | コメント (0) | トラックバック (0)

Lieタイプの群

ちょっと趣向を変えてみます。

GAPのプログラムに手を出したところで、以前手作業でやって中断していた、Lieタイプの有限群の構成を再開してみようかと思っています。

手始めに最も単純な例の1つとして、Bi型の計算の例を示します。

e:=[
[1,0,0],
[0,1,0],
[0,0,1]];

a1:=[
[0,0,0],
[0,0,2],
[1,0,0]];

a2:=[
[0,0,0],
[1,0,0],
[0,0,0]];

b1:=[
[0,0,-2],
[0,0,0],
[0,-1,0]];

b2:=[
[0,1,0],
[0,0,0],
[0,0,0]];

bs:=Z(5);
a:=e+a1*bs+a2*bs^2;
b:=e+b1*bs+b2*bs^2;

g:=Group(a,b);

のような感じで行います。

bs:=Z(5)のところをZ(11)とかすると、PSL(2,11)などが得られます。Z(5)やZ(7)だと、同型の別の名前の群で出るようです。

| | コメント (0) | トラックバック (0)

2009年7月10日 (金)

ちょっと追加

位数32にちょっと追加しました。

C4.D8の因子団(の一例)は、うまく求まったようです。次は(C2 x C2) . (C4 x C2)をチェックしてみます。

| | コメント (0) | トラックバック (0)

2009年7月 9日 (木)

GAPのインストールなど

昨日、「Windows版のGAPではStructureDescriptionが動作しない」と書きましたが、改めてチェックしてみたところ、最新版(4r4p12)では動作することを確認しました(以前ダウンロードしていた4r4p3では確かに動作しませんでした)。

ついでですので、GAPのインストールについて書きます。

Windows版としてはzipファイルが用意されているので、それをダウンロードして展開すればいいでしょう。展開して出てきたフォルダはC:のルートに置いてください。これは、実行ファイルを起動するためのバッチファイルがそのことを想定しているためです。

これらのバッチファイルは、全体のフォルダの中のbinフォルダ内にあります。いくつかありますが、少しずつ動作環境が違うようです。とりあえずgap.batでいいと思うのですが、他のバッチファイルも試してみるといいでしょう。

Debian Linuxではパッケージが用意されているので、インストールはもっと楽です。まず、

# apt-cache search gap

でgap関連のパッケージに何があるか確認し、必要と思うものを

# apt-get install gap

などどしてインストールします。実行はターミナルから

$ gap

です。

なお、C4.D8の因子団のチェックは、だんだん妥当と思われる結果に近づいてきましたが、まだ完全にチェックを通ってはいません。

| | コメント (0) | トラックバック (0)

2009年7月 8日 (水)

追記

前の記事を書いてみてから、ページの方を確認してみたら、(C8 x C2) : C2 の(4) をアップし忘れていました。今アップしました。

| | コメント (0) | トラックバック (0)

現在の環境

位数32に1つ追加しました。

C4.D8の因子団のチェックは、まだうまくいきません。何か勘違いしているのかも。

今日は、現在の環境についてちょっと書きます。

メインのOSはVistaなのですが、その上でVMWareを動かし、Debian Lennyを動作させて、GAPを使用しています。

GAP自体はWindows版もあるわけですが、以前試したときに一部の機能(StructureDescriptionなど)がうまく動作しなかったので、試してみてうまくいった、Linux版の方に移りました。もっとも、Windows版も十分使い込んだわけでなないので、私の勘違いかもしれません。

VMWareではLinuxのいくつかのディストリビューション(Fedora、Vine、Gentooなど)を試してみていましたが、現在使用しているのはほぼDebianのみです。これは、GeomViewの存在が大きいです(Fedoraにもありました)。

GeomView自体はGAPとは関係ありませんが、Maximaと組み合わせると、計算結果をかなりきれいな3Dグラフィックで表示できたりします。

以前、これでもって水素原子の波動関数の断面を3Dグラフ化したものを作ったりしていました。公開したい気持ちもあるのですが、ファイルサイズが大きいので、ちょっと迷っています。

| | コメント (0) | トラックバック (0)

2009年7月 7日 (火)

因子団のチェック中

C4.D8 に関して求められた因子団のチェックを行っています。

正しければ、ある等式を満たすはずなのですが、パラメータの関係で実質512通りのチェックを行わなければならず、やはりGAPのプログラムを書いて実行してみました。

まだ、ちゃんとした結果が出ていないのですが、書いてみたGAPのプログラムに間違いが見つかったので、修正中です。もう少し時間がかかりそうです。

| | コメント (0) | トラックバック (0)

2009年7月 6日 (月)

GAPでプログラム

C4.D8と、関連する群の乗積表を GAP のプログラムにより作ってみました。

手計算でのものも間違っていないことを確認できました。その後の解釈に問題があるようです。

ついでながら、使ったプログラムを載せておきます。

%
% generators for C4.D8
%

a:=(1,2,3,4,5,6,7,8)(9,10,11,12,13,14,15,16)(17,18,19,20,21,22,23,24)(25,26,27,28,29,30,31,32);
b:=(1,9,17,25,5,13,21,29)(2,16,18,32,6,12,22,28)(3,15,19,31,7,11,23,27)(4,14,20,30,8,10,24,26);

%
% prepare a list that contains elements of the group
%

ij:=[1..32];

for j in [0..3] do
for i in [0..7] do
ij[8*j+i+1]:=a^i*b^j;
od;
od;

%
% a function for table lookup
%

f:=function(xy)
local r;
r:=0;
for n in [1..32] do
if ij[n]=xy then r:=n;
else;
fi;
od;
return r;
end;

%
% make the product table
%

x:=();
y:=();
xy:=();

for j in [1..32] do
x:=ij[j];
for i in [1..32] do
y:=ij[i];
Print(f(x*y),"\t");
od;
Print("\n");
od;

%
% end of the program
%

| | コメント (0) | トラックバック (0)

2009年7月 5日 (日)

分解しない拡大の例をチェック中

Q8はとりあえずうまくいったようなので、もっと大きい例、C4.D8 とかをチェックしてみていたのですが、うまくいきません。

乗積表を手計算で出していたので、どこかでミスがあったのかも。

GAPのプログラム機能をもっと十分に活用しないといけないかもしれません。

途中で、C4.D8 のもっと簡潔な関係式を見つけました。後で直しておきます。

| | コメント (0) | トラックバック (0)

2009年7月 4日 (土)

分解しない拡大の構成方法について

Q8が分解しない拡大の例となっているようだということは、昨日書きました。

今、拡大を構成する群が与えられたときに、その置換による生成元をどのように構成できるかを考えています。

具体的に言うと、(C2 x C2) . (C2 x C2 x C2) なのですが、位数32の群については、これ以外はすべて、置換による生成元は得られています。ただ、Q32 とかは別として、他に2つ、分解しない拡大もあるのですが、これらの生成元は、偶然見つかったものです。まだ系統的に構成する方法がよくわかりません。

結構難しいような気もします。

| | コメント (0) | トラックバック (0)

2009年7月 3日 (金)

有限群の図形的な表現(2)

あと、わかりやすいものとしては、対称群Snと交代群Anがあります。もっとも、わかりやすいと言っても、n個の点がすべて相互に等距離に配置された図形を考えることになり、次元の高いユークリッド空間 (n-1次元とか) でないと収まらないので、ちょっと想像しにくいかもしれません。

ともかく、A4は正4面体の回転操作、S4はそれに鏡映操作を加えたものとして表現することができます。

さらに、A5については、正12面体の回転操作として理解することができます。ただ、どのような対応関係になっているのかは多少わかりにくくなっています。

ところで、話は変わります。Q8はC4とC2の単なる直積や半直積になっているわけではないので、もしかしたら分解しない拡大の小さな位数での例になっているのではと気がつき、乗積表をチェックしてみたところ、確かにそう解釈できそうだと思えてきました。このことを、因子団も含めてわかりやすく例証する方法がないか、考えているところです。

でもこれ、私が気がつかなかっただけで、自明なことだったんでしょうか。

| | コメント (0) | トラックバック (0)

2009年7月 2日 (木)

有限群の図形的な表現(1)

有限群の図形的な表現について、しばらく考えてみようと思います。

まず思いつくのは巡回群で、Cnは正n角形の回転とみなすことができます。
次に二面体群D2nは、やはり正n角形なのですが、裏返す操作が入ります。
これらの直積については、独立した正多角形をいくつか用意して、独立して操作できる状況を想像すればよいでしょう。

ところで、D2nは半直積の一種なので、(Cn : C2に相当)、一般の半直積についても似たようなことを考えられないわけでなないのですが、あまり直感的な表現にはなりません。

次回はちょっと違う種類のものを考えてみたいと思います。

| | コメント (0) | トラックバック (0)

2009年7月 1日 (水)

あまり関係のない、ちょっとしたこと

昨日はココログのトラブルで、結局投稿できませんでした。

有限群の方は、特に書いてはいませんでしたが、時間がまたできてきたので、位数32の群の追加や、生成元の書き換えはちょこちょこ行っていました。

さて、今のメインマシンは5年ほど前に組んだもの(Pentium 4の3GHz)で、メモリ1GBでVistaを使用していたのですが、最近ディスクアクセスの多さが気になりだしていました。

これはどうも、メモリ不足で仮想メモリ関係のディスクアクセスが頻繁に発生していたのでは、と感じるようになったので、メモリを2.5GBまで増設しました。確かに、動作がかなりスムーズになりました。

増やした状態でメモリ使用量が50%を超えていることがあるので(Yahooウィジェットのメモリーゲージで見ています)、やはりメモリ不足だったのでしょう。

それから、PCの筐体を開けた時にずいぶんほこりがたまっていることに気付きました。組み立て以来内部の掃除はしておらず、とくにCPUのファン(手動で回転数を可変できる、ちょっと特殊なものを使っています)のところにびっしりついていたので、掃除しました。これで冷却効率も戻ったらしく、CPUファンの回転数を上げなくても、CPU温度が50℃を超えることがほとんどなくなりました(CPU温度はSpeedFanで見ています)。

気がつけば、結構年季の入ったマシンになっていましたが、これで今年の夏は快適に使用できそうです。

| | コメント (0) | トラックバック (0)

« 2009年6月 | トップページ | 2009年8月 »