2017年振り返り

1月~3月

1月に数学科合宿に参加した。iok先生の作った補完多項式とベルンシュタインの多項式の問題を解いた。僕以外のチームメンバーはオタク四天王のうちの3人。最優秀賞をとれたのでうれしい。 合宿後、ベルンシュタインの多項式をアニメーションで見せるものをDesmosで作ったりした。

twitter.com

位相と線形代数の自主ゼミが終わった。位相は松坂和夫の『集合・位相入門』を位相の章の最初からウリゾーンの補題まで読んだ。線形代数は齋藤正彦の『線型代数入門』を線形空間の章から読み始めて、ジョルダン標準形をやり、第7章2節「行列の冪級数」まで読んだ。

4月~7月

前期の授業スケジュール

1
2 情報数理学I (1Q)
確率統計I (2Q)
複素解析学I(1Q)
幾何学I(2Q)
電磁気学II 情報数理学I (1Q)
確率統計I (2Q)
幾何学I(2Q)
3 微分方程式論I (1Q) 量子力学演習I
4 数学セミナーI 量子力学I 複素解析学I(1Q) 微分方程式論I (1Q)
5

OCamlC言語インタプリタを作った。

twitter.com 詳しくは以下

p進数を構成する話を理学ゼミ講演会でやった。

数学セミナーの授業でルベーグ積分のセミナーをやり始めた。参加者は僕含めて4人。教科書は吉田信生の『ルベーグ積分入門』。当初ルベーグ積分をフビニまでやって確率論の本に進む予定だったので、週2回という忙しいペースでやった。結局、フビニまでは行けなかったが、とても充実したセミナーだった。

twitter.com セミナーの案内プリントにこんなことが書かれていた。なるべくこれを実践したつもりだったが、むずかしい。

情報数理学の授業でDurand-Kerner法を勉強した。それをビジュアライズするプログラムをJavaScriptで書いた。

twitter.com twitter.com

去年の4月からやっていたCooperの“Computability Theory”のセミナーが終了した(5/12)。Part 1をすべて読んだ。帰納的関数の定義から初めて、不完全性定理、ペアノ算術の決定不可能性をやり、決定可能な公理系にも触れたところで終了。

5月頃からけみすとくんとジョセフくんと大学のトレーニングルームに行き始めた。最初はベンチプレスの25kgですらきつかったが、35kgを上げれるようになった。しかし、最近は行けてない…。

TOEICの試験を受けた(5/21)。前回490点だったところ、675点をとれたのでうれしい。あまり勉強したつもりではなかったので何かの間違いじゃないのかと思った。次は800点を目指したい。

けみすと邸で餃子パーティ(6/9)。たのしい

twitter.com twitter.com

編入学試験を受けにつくばに行った(7/15~16)。今までつくばは未来都市!ってイメージあったけど案外普通だった。ただし、自動運転のつくばエクスプレスはすごかった。 試験と同じ日にAtCoderのコンテストがあり、ネカフェから参加した。水色コーダーになれた。試験もうまくいったしこんなに調子の良い日はない。

数学セミナーの発表会で発表した(7/24)。先生方からよく理解しているとか明快な発表とかコメントシートでコメントしてくださって嬉しい。質問タイムにH出先生から「リーマン積分はできるけどルベーグ積分できない関数はあるの?」との質問を受け「有界区間ならないけど、そうでないときは勉強していないので知らない」と答えた。あとで教科書を確認したら非有界なら反例があることを知った。

twitter.com

電磁気学と集合の自主ゼミをしていたのだけど前者は僕の忙しさのため、後者は参加者の都合のため終わることになった。

8月-9月

イベントに参加しすぎた。

数物セミナーでは可換代数班になり、“A Term of Commutative Algebra”のセミナーをした。 僕が担当したのは第5章「Exact Sequences」と第6章「Direct Limits」。時間配分を完全にミスり、第5章だけで1日目をつぶしてしまった。結局、各人が2つ章を担当する予定が1つだけ担当となり、それぞれの配分時間も尻すぼみになってしまった。申し訳ない。 しかし、第6章の予習で初めて圏論に触れ、とても楽しかった。

夜ゼミにて、計算論についての発表をした。満足。

twitter.com

10月-12月

後期の授業スケジュール

1 統計力学演習I
2 自然のしくみ (3Q)
歴史を考える (4Q)
統計力学I 複素解析学II (3Q)
3 複素解析学II (3Q)
4 数学セミナーII
5

数物セミナー談話会が愛媛で開かれたので参加&発表した。

twitter.com

発表のTogetterは以下

発表PDFは以下

たくさんツイッターで実況してもらえたのでとてもうれしい。ほかの発表もとても面白いものだった。

藤田先生にモデル理論のゼミを見ていただくことになった(9/26~)。教科書は『ゲーデルと20世紀の論理学(ロジック)〈2〉完全性定理とモデル理論』。途中から難しくなってきて3回くらいゼミをお休みさせてもらった。今年度でゼミを終わりにせざるを得ないので、終わりまでに量化記号消去を読めたらいいなあ。

数学セミナーⅡの授業としてノイキルヒの『代数的整数論』を読み始めた。2節が重かった。指導教官のO下先生と授業時間後も議論することしばしば。ありがたい。

Y内先生の4回生+院生向けの位相の授業を聴講し始めた。ストーンチェックコンパクト化などを扱う。とても面白い。

数学とコンピュータⅡ Advent Calendar 2017に参加した。

twitter.com

Math Advent Calendar 2017 - Adventarにも参加登録したのだが、記事が書けていない…。時間を見つけて書ければいいなあ

おわりに

充実した1年になった。あと少しで愛媛を離れることになる。残りの3か月も頑張っていこう。 離れる前にけみすと達ともう一度くらい飲み会 or パーティ or カラオケがしたいなあ。

CのサブセットをJSで実装した

f:id:fujidig:20170403225601p:plain

CのサブセットをJavaScriptで実装しました。

以下のページで動かせます。

ソースコードは以下

実装している機能は以下の通り。

  • 型は多倍長整数型のみ (それをintと書いている)
  • 変数代入、参照
  • 各種演算子
  • if, else, while
  • 関数呼び出し, return

たとえば

int fib(n) {
    if (n <= 1) return 1;
    return fib(n - 2) + fib(n - 1);
}
int main() {
    int i = 0;
    while (i < 20) {
        print(fib(i));
        i = i + 1;
    }
}

を実行すると次を得ます。

1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765

整数型が多倍長であるため次のようなプログラムを動かすと簡単に2の1000乗を出力できます。

int main() {
    print(1 << 1000);
}
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

また、コードを自然数に符号化する機能を搭載しています。

さらにCのサブセット自身で実装したCのサブセットのインタプリタがついています。

これにより、Cのサブセット in 「Cのサブセット in JS」ができます。

やってみましょう。

int main() {
    int a = 233, b = 377, c;
    int n = 1;
    while (n <= 5) {
        c = a + b;
        a = b;
        b  = c;
        print(c);
        n = n + 1;
    }
}

再帰フィボナッチは遅いので変更しました。また、フィボナッチ数の途中から5項を表示するよう変更しました。

これを実行すると

610
987
1597
2584
4181

が得られます。

実行する代わりにEncodeボタンを押すと

2151370312757585239013893921680792355662486752412569148118764178423124275394560545515699620618390679749954365463276712440703239868128831904427466606016571762297213794979160614374073563745430656004482516317773057589341025004447961146147390127286244343288796934705377531463089162718506253985211455134666431223509512551974414474343672462798521790265803007504943944452569884958093931851114825905529277320800919509394108815581895937704399123986982191200330618144264490236450820715210311575386269331510535250444367316207434769401257253036824832178335578381245463684416737106182236342817759700301368800684649996332165657549447346233743185772934210938808280331980784115355655494351600163821670576622405334837112429337898494085760016249953010029070098290452099149093585994645858969474021323699095659397804178564149616100171888900802875821501165465628689469074724933056047927805153388198042811328724820317873906070961308820216848154752868246705991047232511137406181737589847980927438034993293142569425322534863372670621084881997309475592027063848468052474819497979418075183190689400892317362249982654264328698779198933832859573184531758281526678767231853049237813637063306722059557355922220218076338507472883800169331749000288864555086756341752671027190130207526809765937180

が得られます。

これをc-subset.cのmain関数内のevalの第一引数に指定します。

int main() {
    return eval(2151370312757585239013893921680792355662486752412569148118764178423124275394560545515699620618390679749954365463276712440703239868128831904427466606016571762297213794979160614374073563745430656004482516317773057589341025004447961146147390127286244343288796934705377531463089162718506253985211455134666431223509512551974414474343672462798521790265803007504943944452569884958093931851114825905529277320800919509394108815581895937704399123986982191200330618144264490236450820715210311575386269331510535250444367316207434769401257253036824832178335578381245463684416737106182236342817759700301368800684649996332165657549447346233743185772934210938808280331980784115355655494351600163821670576622405334837112429337898494085760016249953010029070098290452099149093585994645858969474021323699095659397804178564149616100171888900802875821501165465628689469074724933056047927805153388198042811328724820317873906070961308820216848154752868246705991047232511137406181737589847980927438034993293142569425322534863372670621084881997309475592027063848468052474819497979418075183190689400892317362249982654264328698779198933832859573184531758281526678767231853049237813637063306722059557355922220218076338507472883800169331749000288864555086756341752671027190130207526809765937180
, 0, 0);
}

int eval(int code, int nodeid, int vars) {
    int type = node_type(code, nodeid);
....

これを実行すると

610
987
1597
2584
4181

が得られます。Cのサブセット in 「Cのサブセット in JS」ができました!

さて、Cのサブセット in 「Cのサブセット in JS」ができたらCのサブセット in 「Cのサブセット in 「Cのサブセット in JS」」もできそうですね。

出来ます。

上のコードをエンコードすると

5980329765610774127525245562340339041698066219641944319743934783175611745424082081909469512081526404990329327307663133360222179842204167878590696763364369328310595163512492390306181732744829222117518824617582650725740141952748499132995210154143453650196442366092313540868501218530765785202077459350045124230485161555127015535579281731237549416807088489950668251201877691301786506164869080335350936836780724474957976693965274738312936528413281682587340098367064230914323095122080804227660640366503916932207643381263729480625878251063342344491321746310705742164611935632444361598814398154552165339705969745088135940227990524875871445306557373704956903790714486847060660398146659416808412916342257564327042373789893508885075423093377342769000461009027832643305332470849028124039319790277321370911576608973742123713974755184012440142143498846118718870205865840232155186970509391712672169731177405233(中略)510598683619980655730447704072561755011557496861802213363042657146272152051448253232537222993284478241218521508753627807397667295345210321588828661028882576723361390442917570826740418840091727961426165295412166642922565427783394382300102978854750486841360479884360285646613836830334791874344769258423639706904789757288203770209076874980661725022227457454699592036668175729583056522607392923069630915743528982026403631785420924844469140930747327055844004757819140600689335892552518129228445853661349397832112260734508951124297567328771727350631899147423428097500075927570655026017406849604335337201966560953461194685273199307383470572710728285812162887665935977834511174577930840561717165020285218028369094475113108152679840829208807917849465770186516199998023505234400192250998515347296598256278102675603598662702878579009777455897033506640154580988505799442586296556106438320022128549948147421815478517853957228970488937248269631079685300035177024830468421766270037213040053707234917678845100597776938552755275192861496

という37957桁の自然数が得られます。 これをc-subset.cのmain関数内のeval呼び出し部分に入れて実行してみましょう。

時間がかかります。

f:id:fujidig:20170403232236p:plain

ブラウザがこのようなアラートを出すほど時間がかかりますが待ちましょう。

結果、次の出力が得られます。

610
987
1597
2584
4181

Cのサブセット in 「Cのサブセット in 「Cのサブセット in JS」」が出来ました! 私の環境だと実行を終えるのに61秒かかりました。たくさん時間がかかるとはいえ、間違いなく実現できています。よかったですね。

不定形の極限であって収束するが,ロピタルの定理を使っては極限値を求められない例

$$ \lim_{x \to 0} \frac{\int_{t=0}^x \sin (1/t) dt}{x} $$ は不定形の極限($0/0$型)であり,この極限は$0$に収束する. 一方で分母分子をそれぞれ$x$で微分したものの極限 $$ \lim_{x \to 0} \sin (1/x) $$ は発散する. よって最初の極限の値はロピタルの定理を使っては求められない.

XorShiftの一例が周期最長になることを確かめるPari/GPプログラム

XorShiftと呼ばれる疑似乱数のうち状態ベクトルが64ビットである例を一つとり、これが最長の周期2^64-1を達することを確認する。

\\ determine that order of g equals to n
isprimitive(g, n, e=1) = {
  my(factors, p);
  if (g^n != e, return(0));
  factors = factor(n);
  for (i = 1, matsize(factors)[1],
    p = factors[i, 1];
    if (g^(n/p) == e, return(0)));
  return(1);
}
\\ identity matrix
E = matid;
\\ right & left shift matrix
R(n, k) = { return(matrix(n, n, i, j, i + k == j)); }
L(n, k) = { return(R(n, -k)); }
\\ convert to matrix on F_2
to_f2(mat) = { return(matrix(matsize(mat)[1], matsize(mat)[2], i, j, Mod(mat[i, j], 2))); }

n = 64;
T = to_f2((E(n) + L(n, 17)) * (E(n) + R(n, 7)) * (E(n) + L(n, 13)));
print(isprimitive(Mod(x, charpoly(T, x)), 2^n - 1));

参考:

自然数の定義

順序数

以下の条件を満たす集合$x$を順序数と呼ぶ。

  1. $x$のどんな要素も$x$の部分集合である
  2. $x$は属する($\in$)という関係において整列順序集合である

順序数の間には属するという関係で全順序が定まる。そこで順序数$\alpha, \beta$に対して$\alpha \in \beta$のことを$\alpha < \beta$と書く。

0

空集合$\{\}$は順序数である。そこでこれを$0$と書く。

後続数

順序数$\alpha$に対して $$ S(\alpha) = \alpha \cup \{\alpha\} $$ を$\alpha$の後続数という。

後続順序数

順序数$\alpha$に対して、$\alpha = S(\beta)$となるような順序数$\beta$が存在するとき$\alpha$を後続順序数という。

自然数

順序数$\alpha$は、$\alpha$以下の任意の順序数$\beta \ne 0$が後続順序数であるとき自然数と呼ぶ。

参考文献

  1. Kenneth Kunen (1980) Set Theory - An introduction to independence proofs, North Holland

コメント

自然数とは有限の順序数である、という定義だと有限集合の定義と循環してしまうよなーと思って調べました。

自然数とは$\omega$より小さい順序数である、$\omega$とは($0$を除いて)最小の極限順序数である、という定義でもよさそうですね。

一次分数変換を試すプログラム

f:id:fujidig:20150830162334j:plain

f:id:fujidig:20150830162528p:plain

複素平面上の変換$z \to \frac{z - \alpha}{z - \beta}$を試すプログラムです。赤丸が$\alpha$, 青丸が$\beta$を表し、それぞれをマウスかタッチで動かすことができます。

ミンコフスキーの定理と線形合同法の多次元疎結晶構造

この記事は次の場所へ移動しました。

http://fujidig.github.io/articles/minkowski-and-lcg.html