2018年3月~8月の振り返り

春学期のスケジュール

1
2 心のしくみを解き明かす
ニューロサイエンス (春AB)
曲面論演習 トポロジーA 応用体育水泳(春) (春AB)
3 ルベーグ積分 数理統計学I 確率論I
4 曲面論 ルベーグ積分演習
5 プログラム理論 (春C)
6 数学外書輪講II プログラム理論(春C)

授業の振り返り

  • 心のしくみを解き明かすニューロサイエンス: 必修の総合科目。内職してた (そして成績が悪かった)
  • 曲面論: スライドでばんばん数式が出てくるので追うのがつらい
  • 数学外書輪講II: SiegelのLectures on the Geometry of Numbersを読んでいる。なんか8人くらいいる。まえけんがノートを見ずに発表するのですごい
  • 曲面論演習: けっこう楽しかった (点数を取るゲームとして)
  • ルベーグ積分: 今期一番頑張った (レポートなど)。期末テストはあんまり。コメントシートが得点になるので結構細かいことを聞いてしまって申し訳なさ
  • ルベーグ積分演習: 内職してた
  • トポロジーA: 単体的複体とホモロジー。ちゃんとやるなら授業だけではなく本も読む必要あるなあという感
  • 数理統計学I: 前半の点推定は全然わからんという感じだったが後半の区間推定はわかる感じがした
  • プログラム理論: 情報科学類の授業。ホーア論理の証明はもうしばらく書きたくない。あと教室の冷房がきつかった
  • 応用体育水泳: スキンダイビングやシンクロナイズドスイミングをした。あと毎回10分間泳。水泳は好きなので体育の科目水泳選べてよかった
  • 確率論I: 進みが遅いです
  • 数理論理学I: 単位認定されたので履修はしてない。フィルターとイデアルのイメージ図がよかった
  • 計算機数学I: こちらも履修していない。カラツバ法を教わってカラツバさん頭いいなーと思ったり、高速フーリエ変換を学んで分割統治は偉大だ、と感じるなど

筑波大学編入して

編入前の愛媛大学との比較。 良いところは、授業時間が75分と短い (90分は集中力持たない)。無料の保険センターがある (しかしもうすぐ有料になってしまうらしい)。他学類や上回生向けの科目を自由に取れるといったところ。いわゆる「3分の2ルール」(3分の2以上の出席がないと成績を評価しない)のようなものがないのはいいところというか当然だよね。

学生については勉強をする気がない学生はどっちも同じくらい。学年で一番できる学生のできは高くなった。授業のレベルは確実に上がったが、もうちょっと上の内容も扱っていいのになあという感じ。 先生と学生の距離の近さは愛媛大学の方が優れていた。

生活環境は、個人的にはそんなに変わってない気がする。

愛媛にいたときは自主ゼミをしていたが、学部生の間で自主ゼミをする文化はこっちにはあまりないようだ。ロジックの学生(主に院生)が集まる毎週の集まりで記述集合論のゼミを始めた。

放課後や空きコマはセミナー室で同期と一緒に過ごすことが大半であった。これがなかなか楽しい。

3月

新居に引っ越した。 意識さんに筑波大学構内の案内をしてもらうなどした。

玲於奈さんからホワイトボードを頂いた。

twitter.com

ロジックの研究集会 手形 L4 研究集会に参加した(3/26〜3/29)。非常に豪華な先生方と連日の懇親会で話すことができてとてもよかった。

4月

単位読み替えの面談をした。

都数 (都内数学科学生集合)の4月総会に参加した。

4月の終わりごろからセミナー室に同期が集っているのに混じるようになり始めた。

5月

KunenのFoundationsのゼミを始めた。が、忙しくて夏休みまで第2回が出来なかった。

twitter.com

twitter.com

5月31日からMoschovakisの”Descriptive Set Theory”の自主ゼミを始めた。

6月

6月2日と3日、数学カフェ『公理的集合論』回に行った。

6月17日、かが☆みんさんとエヴィン・ラティエさんとオフ会した。

6月24日から数物合宿に備えてアティマクを読み始める。

7月

7月15日、筑波大の有志が開催した「数つくば」というイベントに登壇。「無限ゲームで遊ぼう」というタイトルで発表。

スライド:

https://fujidig.github.io/201807-infinite-games/201807-infinite-games.pdf

二人有限確定完全情報ゲームの必勝方がある理由の証明とか無限ゲームにおける必勝法がある場合の条件とか知れてめちゃくちゃ楽しいプレゼンだった。 #数つくば

でぃぐさんの発表、かなり噛み砕いて頂いたおかげで非常に分かりやすう内容で素晴らしいの一言。 #数つくば

オタフロ(コミケ3日目東V28b) on Twitter: "でぃぐさんの発表、かなり噛み砕いて頂いたおかげで非常に分かりやすう内容で素晴らしいの一言。 #数つくば" オタフロ(コミケ3日目東V28b) on Twitter: "二人有限確定完全情報ゲームの必勝方がある理由の証明とか無限ゲームにおける必勝法がある場合の条件とか知れてめちゃくちゃ楽しいプレゼンだった。 #数つくば"

7月21日は海の日セミナーというのに参加した。

8月

体調悪い日が多かった。数物合宿でハーツホーンをリレーセミナーで読むので、それに向けて代数幾何の勉強をしていた。

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$を表し、それぞれをマウスかタッチで動かすことができます。