2023年も色々あったので振り返りたい。去年の記事:
続きを読む「日記」カテゴリーアーカイブ
さようなら、Evernote
Evernoteがまた改悪するらしい。
- Evernote、無料アカウントは「最大50個のノートと1つのノートブック」に – ケータイ Watch
- Update: Evernote Free accounts will have fifty notes and one notebook
この前に値上げのニュースがあって、Personalプランが年額5200円から9300円に値上がりする。流石にこの値上げ幅はきつい。私の次回更新は数日後なので、PersonalをやめてFreeプランにするつもりだった。Freeプランでは同期できる台数にきつい制限があるので、どのみちEvernoteは常用をやめるつもりだ。過去のノートの参照には使うかもしれない。
私がEvernoteを使い始めたのは2010年だったらしい。13年間の長い付き合いだった。
Evernoteのデスクトップアプリを使うとノートをエクスポートできる。Freeプランは今回の改悪後も参照はできるようだが、念の為、HTMLにエクスポートした。
ノートテイキングアプリは何が便利だったか。私が求めるのは
- 気軽に記入できること
- 検索できること
- 複数端末で同期できること
あたりだろうか。Evernoteにはノートブックという分類の仕組みがあるが、最近はあまり活用していない。ユーザーに分類させるのはユーザーの時間を消費するので、分類はAIがやるか、検索機能を強力にする等で対応するべきだと思う。
今後何を使うか。最近流行りなのはNotionというやつだろうか。しかし、いまいち新しいサービスを試す気力が湧かない。
登山計画書など、他人と共有する必要のある文書は最近はGoogleドキュメントで書いている。個人用のメモもGoogleドキュメントで良いのではないか。しばらくGoogleドキュメントを常用してみて、「気軽さ」「検索性」を確かめてみたい。
Appleのメモアプリというのもある。iPhoneの購入により手持ちの端末が大体Apple製になったのでこれもアリだ。しかしいざという時のエクスポートの容易性はよくわからない。
やりたいことリスト(2023年10月)
数ヶ月前にやりたいことリストという記事を書きましたが、相変わらず(?)やりたいことに対して時間が少なく感じます。
プログラミング
LunarML
そろそろv0.1をリリースしたいです。記事も準備しています。
ただ、ClutTeXで必要な最低限の機能は揃えてからリリースしたい気もします。直近ではClutTeXで欲しくなったので BinIO
と String.isSubstring
を実装しました。
10月中にリリースできなくても、11月にはリリースするようにしたいです。
ClutTeX
BibTeX関連で具体的な修正箇所が判明したので直しています。
直したらリリースするべきですが、GitHubの方に来ているPRを先にマージした方が良いのか悩んでいます。まあこまめにリリースすればいいんですけど。
Standard MLへの書き換えも気が向いた時に進めていて、手足となるモジュールは大体移植した(あるいはLuaコードのラッパーをSMLで書いた)と思います。あとは一番大事なメイン部分です。
Haskell関連
SIMD周りの作業は休止中です。
32ビットArm向けのクロスコンパイラーをビルドしようとして遭遇した問題を(原因をある程度特定した上で)バグ報告したりしました。
執筆物
書きたい記事はいくつかあります。
- 新しくプログラミング言語を作るとしたら文法をどうするか
- 型クラスとインターフェースの比較
- x86のVEX/EVEXプリフィックスとAPXについて
勉強したいこと
Handbook of Constructive Mathematicsは気になった章をつまみ食い的に読んでいます。
それで、構成的数学のモデル(?)みたいなものをもっとちゃんと勉強するべきだと思って、SGLを読んでみようかと思っています。しかしどうやって時間を捻出するかが問題です。
アウトドア
10月に入ってから安達太良山に行きましたが、若干物足りなかったので、もう少し秋山に行きたいです。しかし泊まりで行くと大掛かりになるので、近場で済ませるかもしれません。
欲しいもの
ミラーレス一眼が欲しいけど先送りにするのは前の記事に書きました。当面は一眼レフを使い続けます。
ただ、一眼レフで使っているレンズが、保管環境の管理をサボっていた時期があったせいか、像が微妙な感じになっている気がします。なので新しいレンズを入手したいのですが、一眼レフの全盛期が過去のものになったせいか、レンズのラインナップが以前と比べて減っている気がします。どうしたものか。
どっちみち今年は色々大きな出費があった(iPhone、登山靴、ミニPC)ので、出費を躊躇しています。
時間とお金の捻出
前の記事で言及したGitHub Sponsorsを始めてみましたが、まだ勝手がよくわかりません。まあどっちみちあまり期待はしていないのですが。
この記事は20分で書きました。
夏の終わり/蔵王山と八ヶ岳
今年の夏はいくつか山行を立てた。この記事ではそれらを簡単に振り返りたい。
続きを読むやりたいことリスト
Je n’ai pas le temps
Évariste Galois
最近、やりたいことが急速に増大しており、時間の不足を感じます。この記事では私のやりたいことを列挙してみます。
目次
プログラミング関連
LunarML
別の記事でも書きますが、そろそろリリースしたいです。
ClutTeX
放置気味です。
GitHubにIssueとPRがいくつか届いていますが、対応できていません。
TeX Live 2023になってBibTeX関連の機能が壊れたような噂をキャッチしています。それもなんとかしなければなりません。
ClutTeXは現在Luaで実装されていますが、型がなくて改修が辛いです。そこで、ClutTeXの実装に使う言語をStandard MLに置き換えることを考えています。ソースはStandard MLで書いて、LunarMLを使ってLuaにコンパイルする計画です。
書き直しのためにはまとまった時間が欲しいです。
Haskell関連
最近はGHCのSIMDプリミティブをもうちょい活用できないか考えています。
コンパイラーの用意するプリミティブがへぼいから使われないのか、誰も関心がないからコンパイラーに機能追加されないのかわかりませんが、とにかく何かしたいです。もったいない精神ってやつ?
できることはいくつか考えられて、
- x86 NCGでSIMDを扱えるようにする。
- LLVM backendでAArch64 (ASIMD) 向けコードを生成できるようにする(現状はx86だけ)。
- WebAssembly backendでSIMDを扱えるようにする。
- プリミティブ関数を充実させる。現状はsqrtやabsやビット演算がない(LLVMの最適化を当てにすれば回避方法はあるが)。あと比較演算とかselect系の型と命令もあると良さそう。
- FFIで使えるようにする。
などがあります。
このうち、x86 NCGについては先人が(確か)Summer of Codeで実装したパッチがありますが、一旦取り込まれた後不具合によりrevertされたという経緯があります。レジスターアロケーション周りだったかな?とにかく、モノはある程度できているので気合いがある人が時間をかければ修正できるかもしれません。
LLVM/AArch64の対応は難しいところをLLVMがやってくれるので比較的楽です。なので試しにパッチ(マージリクエスト)を作ってみました。まだ十分テストされているとは言えないのでDraft扱いですが。
テストのためにはSIMDを使うアプリケーションが必要です。ベクトルの内積なら誰でも書けますが、もっと複雑な例が欲しいです。N体問題とかハッシュの計算とかですかね。私は高性能計算に興味はありますが実力も動機付けも伴っていない人間なので、こういう時弱いです。
数学文書システム
既に何回か書いている気もしますが、Webと相性のいいやつを何か作りたいです。
執筆物
数学科のためのHaskell入門
数学とコンピュータの絡みに興味がある人間として、「数学科のためのHaskell入門」みたいな記事(本?)を書きたいです。
勉強したいこと
構成的数学をやりたいというのは4月の記事に書きました。
その時やっていた勉強は、本のUFDの定義が間違っていたことで精神力を消耗し、中断したままです。
そういえば親戚から誕生日のお小遣いを頂いたので、Handbook of Constructive Mathematicsをポチりました。足りない分は自腹です。海外からの取り寄せなので、いつ届くかはわかりません。
アウトドア
夏山に行きたいです。登山靴も新しいのを買ったし。
行きたい山は色々ありますが、今気になっているのは剱岳です。若いうちに登っておきたいです。
欲しいもの
自分の持っているWindowsマシンがIvy Bridge世代でいい加減古いので、新しいのをポチりました。高性能GPU搭載は諦めて、ミニPCです。それともeGPUできるのだろうか?(調べてない)
CPUはAMDのZen 4世代のやつです。AMDのCPU/GPUも触ってみたいなと思ってそれにしました。
ミラーレス一眼も欲しいですが、今年は色々大きな出費があった(iPhone、登山靴、ミニPC)ので先送りでいいかなと思っています。
写真の管理
自分の持っている写真の管理をどうにかしたいです。現状はApple謹製の写真アプリを使っていますが、自分に万が一のことがあった時に残された人がアクセスできません。
そこで、バックアップも兼ねて、これまでの写真をブルーレイに焼いてみようかと思っています。とりあえず結婚式の写真・動画をBD-R(2層)に焼こうとしています。他の写真はどうするか未定です。
スマートフォンで撮った写真はGoogleやAppleのクラウドストレージに流し込んでいますが、保存容量にはお金が必要なので、引き揚げたいです。iCloud Driveは現在月額400円の200GBプランですが、月額130円の50GBプランにならないかと思っています。
時間もお金も欲しい
やりたいことが多いと、なんとかして時間を捻出したいです。睡眠時間を削るのはやりたくないです。そうすると、日中の活動時間の多くを占めるのは労働なので、これに目が行きます。
もしも自分のやりたいこと(LunarMLやClutTeXや執筆活動)でそれなりのお金、例えば月10万円をコンスタントに稼げるようになれば、労働時間を削ってやりたいことをやることも考えられます。しかしまあ現実的ではないです。GitHub Sponsorsをやったところでどれだけ集まるでしょうか。
「時間がない」という記事を書くくらいならその時間をやりたいことに充てろ、と言われそうですね。この記事を書くのにかかった時間は50分くらいです。50分と「記事にして吐き出すことによるスッキリ感」のどちらに価値を見出すか、という話です。
代数構造の「マグマ」と、定義の動機づけ
マグマ
「マグマ」という代数構造がある。
マグマとは、集合とその上の二項演算の組である。
普通の代数構造だと、二項演算について結合法則や単位元の存在など、なんらかの法則を課すことが多いが、マグマは何の法則も課さない。
続きを読む登山道具:ヘッドライトと登山靴
新しい季節がやってきたので、また山に行きたい。
私の登山道具は大学に入った12年前に揃えたものが多く、一部はすでに買い替えたりしているが、12年前から使っているものの中には不調が来ていて対策が必要なものもある。
続きを読むiPhoneを買った
今更ながらiPhoneを買った。これまでの私の携帯電話はガラケーやAndroid端末だった。
私は高校の頃から15年ほどMac、つまりApple製品を使っている(iPod touchやiPadも使ってきた)。なのでこれまでiPhoneを使っていなかったと言うと意外に思われるかもしれない。
なぜiPhoneじゃなかったか、特に深い理由はないのだが、強いて言うならパソコンやタブレットと違って携帯電話に高いお金をかける気にならなかったというのはあるだろう。これまで使っていたAndroid端末も中古だったりミドルレンジのものだった。
転機となったのは、これまで使っていたPixel 3aのOSアップデートが降ってこなくなって新しいスマホを買う必要性が生じたこと、ボーナスでまとまったお金が入ったこと、などだ。
というわけでiPhone 14 Proを買った。ProにしたのはLiDARを試したかったからだ。本体のサイズは大きすぎないのが好みなのでMaxにはしなかった。
なんだかんだ言って私はiPod touchもiPadも使ってきたからiPhoneはそんなに目新しくない……と言いたいところだが、妻によると触っている時のにやつきは抑えられなかったようだ。
続きを読む2022年振り返りと来年に向けて
2022年も色々あったので振り返りたい。
続きを読む2^53+1 は素数か
ふと \(2^{53}+1\) が素数かどうか気になりました。
短い答え:No
Linuxだと factor
コマンドで素因数分解できます。
$ factor $((2**53+1)) 9007199254740993: 3 107 28059810762433
macOSだとHomebrewやMacPortsでcoreutilsを入れる必要があります。
筆者のMacには factor
コマンドは入っていなかったので、最初はMaximaで確認しました:
$ maxima Maxima 5.45.1 https://maxima.sourceforge.io using Lisp SBCL 2.2.9 Distributed under the GNU Public License. See the file COPYING. Dedicated to the memory of William Schelter. The function bug_report() provides bug reporting information. (%i1) factor(2^53+1); (%o1) 3 107 28059810762433
というわけで、 \(2^{53}+1\) は\[2^{53}+1=3\times 107\times 28059810762433\]と素因数分解でき、素数ではありません。
暗算でもできるのでは?
今回調べたいのは \(2^{53}+1\) という形の数です。ちょっと頭を使えば、この数が3で割り切れることがわかります:\begin{align*}2^{53}+1&=2^{53}-(-1)^{53}\\&=(2-(-1))(2^{52}+\cdots+2^{52-i}\cdot(-1)^i+\cdots+(-1)^{52})\end{align*}と因数分解できます。
一般化すると、\(2^{2m+1}+1\)の形の整数はすべて3で割り切れることがわかります。つまり、\(m\neq 0\)で\(2^{2m+1}+1\)が3よりも大きくなる場合はこの形の数はすべて合成数です。
もっと一般化
もっと一般に、\(2^n+1\)の形の整数が素数となるのは\(n=0\)または\(n=2^k\ (k\geq 0)\)の場合に限られます。
\(n=2^k(2m+1)\)とおくと、\begin{align*}2^n+1&=2^{2^k(2m+1)}+1\\&=\left(2^{2^k}\right)^{2m+1}+1\\&=\left(2^{2^k}\right)^{2m+1}-(-1)^{2m+1}\\&=\left(2^{2^k}-(-1)\right)\left(\left(2^{2^k}\right)^{2m}+\cdots+\left(2^{2^k}\right)^{2m-i}\cdot(-1)^i+\cdots+(-1)^{2m}\right)\\
&=\left(2^{2^k}+1\right)\left(\left(2^{2^k}-1\right)\left(2^{2^k}\right)^{2m-1}+\cdots+\left(2^{2^k}-1\right)\left(2^{2^k}\right)^{2(m-i)+1}+\cdots+\left(2^{2^k}-1\right)\cdot 2^{2^k}+1\right)\\
&=\left(2^{2^k}+1\right)\left(\sum_{i=0}^{m-1} \left(2^{2^k}-1\right)\left(2^{2^k}\right)^{2i+1}+1\right)\end{align*}と因数分解できます。
\(k\geq 0\)なので、\(2^{2^k}+1\geq 3\)であり、最初の因数は非自明です。そして、2番目の因数に登場する\(2^{2^k}-1\)は1以上で、\(m\geq 1\)ならば2番目の因数も非自明です。
よって、\(2^{2^k(2m+1)}+1\)の形の数が素数となるのは\(m=0\)の場合に限ることがわかりました。
フェルマー数
\(2^{2^k}+1\)の形の数はフェルマー数と呼ばれています。\(k=0,1,2,3,4\)の場合はこれは素数となり、フェルマー素数と呼ばれています。
ところでなんで \(2^{53}+1\) を調べたかったのか
一部のプログラミング言語では、倍精度浮動小数点数型を唯一の数値型として提供しています。BigInt以前のJavaScriptや、5.2までのLuaなど。
こういう言語では、絶対値が\(2^{53}\)以下の整数は正確に表現できます。そして演算結果の絶対値がそれを超えると、丸めが発生して正しい答えが返ってきません。JavaScriptで試してみましょう:
$ node Welcome to Node.js v17.9.1. Type ".help" for more information. > 2**53 - 1 9007199254740991 > 2**53 9007199254740992 > 2**53 + 1 9007199254740992 > 2**53 + 2 9007199254740994 > 2**53 + 3 9007199254740996
2**53 + 1
を表現できておらず、「表現可能な最も近い値のうち、仮数部の末尾が偶数な方」が表示されています(最近接偶数丸め)。
では、演算結果が「正確に表現できる範囲」を超えたかどうかはどうやったらわかるでしょうか?まず、演算結果の絶対値が\(2^{53}+2\)以上であれば間違いなく超えています。
では、演算結果の絶対値が\(2^{53}\)以下なら結果は正確と言えるでしょうか?否ですね。2**53 + 1
の演算結果は\(2^{53}\)以下であるにも関わらず、不正確です。
一方、演算結果の絶対値が\(2^{53}-1\)以下であれば結果は正確であることが保証されます。この範囲、\([-(2^{53}-1),2^{53}-1]\)はJavaScript界隈ではsafe integerと呼ばれています。
さて、筆者が作っているStandard ML処理系、LunarMLでもsafe integerに相当する整数型を提供できると便利です。提供するとするとビット数は符号ビットも含めて54ビット、 Int54
みたいなものになります。
ですが、Standard MLの固定長整数は2の補数表現を仮定しており、表現できる範囲は\([-2^n,2^n-1]\)の形である必要があります。これとsafe integerを比べると、\(-2^{53}\)がはみ出ます。
なので、LunarMLで Int54
を提供するには、演算結果が\(-(2^{53}+1)\)の場合を何らかの方法で検出し、オーバーフロー例外を起こさなければなりません。この時、\(2^{53}+1\)が素数だったなら乗算の場合に演算結果が\(-(2^{53}+1)\)になる可能性を考慮しなくてよかったのに、現実は残酷でした、という話です。