2021年12月7日火曜日

不変式論のお勧めの本はありますか?

以前、円分体って名前がそもそもどうなんだという記事を書いた。 雑にまとめると、円分体と呼ばれている体は有限巡回群の有理数を係数とする群環を考えれば良く、その有限巡回群の自己同型群による不変部分環が係数体に一致してしまうし、もう複素数とかそれに引きずられた名称とかいらないだろう、という話だった。 しかし群環という構造はちょっと特殊すぎて応用が利かないので枠組みを広げてみたい、というのが今回のもくろみとなる。

一番重要だったのは群が作用して不変部分環を考えられる部分だったので、有限集合とそこに作用する群があってそれをうまく環の世界に持ち込めれば良い。 そこで、多変数多項式環とその変数の入れ替えという作用を考える。 例としては、すぐに複雑になってしまうので3変数多項式環 \(K[X_1, X_2, X_3]\) と3次巡回群 \(C_3\) を取ろう。 係数は \(K\) と書いたが標数が \(0\) の体で、変数たちは \(K\) に入らないとする。 では不変部分環 \(A = K[X_1, X_2, X_3]^{C_3}\) がどうなるかをみよう。

不変式はいくつもある。 基本対称式 \[I_1 = X_1 + X_2 + X_3\] \[I_2 = X_1 X_2 + X_2 X_3 + X_3 X_1\] \[I_3 = X_1 X_2 X_3\] の他に、 \[I_4 = (X_1 - X_2)(X_2 - X_3)(X_3 - X_1)\] がある。 \(I_4\) は対称性を見易くするためにこの形で書いたが、差積 \((X_1 - X_2)(X_2 - X_3)(X_1 - X_3) = -I_4\) を選んでもいい。 さらに、 \[I_5 = X_1^2 X_2 + X_2^2 X_3 + X_3^2 X_1\] \[I_6 = X_1 X_2^2 + X_2 X_3^2 + X_3 X_1^2\] など、色々な形の式を取ることができる。

簡単に見て取れるように \(I_1\), \(I_2\), \(I_3\) から各 \(X_i\) は \(X^3 - I_1 X^2 + I_2 X - I_3 = 0\) の解である。 また \(I_4\) は2乗すると対称式になって \(I_1\) から \(I_3\) で書けるようになる(具体的な式は省略)。 同様にというかより簡単に \(I_5 + I_6\) が対称式なのでこれも \(I_1\) から \(I_3\) で書ける(\(I_5\), \(I_6\) それぞれは書けない)。 不変部分環は有限生成というのが Hilbert を有名にした(?)定理であり、ここでは生成系としては多分 \(I_1\) から \(I_4\) だけあればいいはず。

環ではなく体について語りたいのだが \(A\) が体になるかというと疑わしいので、以降 \(L\) を \(A\) の商体とする。

\(L[X_1]\) には \[X_2 + X_3 = I_1 - X_1\] と \[X_2 - X_3 = -I_4 / (X_1^2 - (I_1 - X_1) X_1 + I_3 / X_1)\] が含まれるので、これらの和や差によって \(X_2\) と \(X_3\) も含まれていることが判る。 つまりガロワ拡大で、各 \(X_i\) が \(X^3 - I_1 X^2 + I_2 X - I_3 = 0\) の解だったから、\(L[X_1]\) は \(L\) の3次巡回拡大体ということになる。

おまけで \(I_4\) が不変式に含まれていない場合を考えてみよう。 この場合は \(C_3\) ではなく \(S_3\) が作用していて、不変式は基本対称式で尽きるという状況になっている。 \(F\) を \(K[X_1, X_2, X_3]^{S_3}\) の商体としたとき、 \(F[X_1]\) には \(X_2\), \(X_3\) が含まれず、\(F[X_2]\), \(F[X_3]\) も同型ではあるが別の \(F\) の3次拡大になる。 ただし、たとえば \(X_1\), \(X_2\) の2元を含めば \(F[X_1, X_2]\) の中に \(X_3 = I_1 - X_1 -X_2\) はいるので、それ以上大きな体は出てこない。 また \(F[I_4]\) も異なる体だが、当然この \(F[X_1, X_2]\) の部分体になっており、\(F[I_4]\) から見れば、\(F[X_1, X_2]\) が3次巡回拡大体になる。

まとめ

複素数体の中にある方程式の解を添加するのではなく、多項式環に群を作用させて不変部分環(の商体)を取ることでガロワ理論的なことはだいたい語れるのではないか。 複素数はむしろ不変式を具体的な数に置き換える特殊化の結果として登場するのではないか。 といった見方は、聞いたことはないのだけれど、当然すぎて語られていないだけなのか。

ところで不変式論のお勧めの本はありますか。 考えてみたら、不変式論は暗黒通信団でしか入門していないので。

2021年11月24日水曜日

ヒバとは

檜っぽい葉っぱの植木をヒバと呼んでいたような記憶があって、正確には(分類学的には)何なのだろう、と調べてみた。

図書館で「検索入門針葉樹」という図鑑を借りてきた。 索引を見てもヒバという名前は出てこない。 検索表の方を見ると、D2なる分類(鱗片状の葉に表裏性があり鱗片葉が小型)に、ニオイヒバ・アオノクジャクヒバ・オウゴンクジャクヒバ・カマクラヒバ・オウゴンシノブヒバ・イトヒバと並んでいる。 ヒノキも入っている分類なので見た目的には合っている。

ニオイヒバ Thuja occidentalis Linn. 北米原産「洋風の庭園に植栽されるドワーフコニファー類にこの仲間が多い」

アオノクジャクヒバ・オウゴンクジャクヒバ・カマクラヒバ ヒノキ Chamaecyparis obtusa Sieb. et Zucc. の園芸品種。

オウゴンシノブヒバ・イトヒバ サワラ Chamaecyparis pisifera Sieb. et Zucc. の園芸品種。

これで終わりと思いきや、さらに「針葉樹の世界」という全体を俯瞰した説明のページがあり、そこに家の土台には「ヒノキやヒバ、ベイヒバが使われ」るという表現が登場する。 ベイマツの伝でいけばベイヒバのベイはアメリカを意味する米だと考えられるのだが、本編に登場しない種を説明無しに出してくるのは流石にどうかと思う。 ちなみにこの後に「ヒノキアスナロ(ヒバ)」という表現が登場し、ここではヒノキアスナロの別名だと判明する。

ヒノキアスナロ アスナロ Thujopsis dolabrata Sieb. et Zucc. の変種品種。 (これの説明には「ヒバ」という呼称は無い。)

以上ヒバという植物はなく、ヒノキ科ではあるものの3つの属にまたがる植物にヒバの呼称が使われていることが判った。 結局ヒバとは檜っぽい葉っぱの木以上のものではなかったのかも知れない。

2021年9月18日土曜日

Aurifeuille 恒等式の計算方法 (Brent)

Brent による Aurifeuille 恒等式の計算方法を紹介していく。 Brent によれば Stevenhagen の方法は互除法の係数爆発が起きるので次数の大きな円分多項式には適用できないとのことである。 Stevenhagen の方法は実質的に「\(\sqrt{k\zeta_n}\) が \(\mathbb{Q}[\zeta_n]\) に入っているならば、\(\zeta_n\) の多項式で表せる」という事実しか使わなかったが、Brent の方法ではもう少し特殊事情を考えて多項式の係数を決定していく。

あまり複雑な一般化は省いて、 平方因子を持たない \(3\) 以上の奇数 \(k\) に対し、\(n\) を \(k\equiv 1\pmod 4\) ならば \(k\)、そうでなければ \(2k\) とする。 \(\zeta = \zeta_{2n}\) とすると \(\mathbb{Q}[\zeta]\) の \(\mathbb{Q}\) 上のガロワ群は \(\left(\mathbb{Z}/2n\mathbb{Z}\right)^{\times}\) と同型である。 \(\mathbb{Q}[\zeta]\) に含まれる実2次体 \(\mathbb{Q}[\sqrt{k}]\) に対応する指数 \(2\) の部分群 \(H\) を見つけられる。 具体的には \(H=\left\{\pm a \in \left(\mathbb{Z}/2n\mathbb{Z}\right)^{\times} | 1 \leq a \leq n \land (\frac{k}{a})=1\right\}\) だ。

\[L(X) = \prod_{a\in H}(X - \zeta^a)\] を考えると実は \[L(X) = F(X^2) - \left(\frac{2}{k}\right) X\sqrt{k} G(X^2)\] となることが Schinzel によって示されているそうだ(論文を参照できていないので伝聞)。 つまり、偶数次の項を拾うと \(F\) が得られて奇数次の項を拾うと \(G\) が得られるのだ。 具体的な係数を得るには次のように考えればいい。 \(L(X)\) の係数は根が与えられているので解と係数の関係から計算できる。 そこに現れる根の対称式はその冪和で書き表せる(Newton の恒等式)。 \(1\) の冪根の冪和はガロワ群の作用を考えると簡単に表せる(ガウス周期)。

ガロワ群の元 \(b\) は \(\zeta\) に対し \(\zeta^b\) として作用する。 \(L(X)\) の根の冪和を \[p_b = \sum_{a \in H} \zeta^{ab}\] と書くことにしよう。 \(L(X)\) の根の和 \(p_1 = \sum_{a\in H} \zeta^a\) はもちろん \(H\) の各元の作用で不変である。 また、\(p_1^2 = k\) であるから、\(p_1 = \sqrt{k}\) と考えて良い。 一方、\(H\) のコセットの各元の作用では \(-p_1\) に移る。 これらが \(1 \leq b \leq 2n\) の内、\(2n\) と互いに素な \(b\) による \(b\) 乗和に相当する。 残る \(2n\) との最大公約数 \(\Gamma_{b} = (b, 2n)\) が \(1\) より大きい場合で、\(b\) が偶数ならば \[p_b = \sum_{a \in H} \zeta^{ab} = \mu(2n/ \Gamma_b) \phi(\Gamma_b / 2) \in \mathbb{Z}\] となることが知られている。 \(b\) が奇数ならば \(0\) になる。 以上で根の冪和が決定できた。

奇数冪に現れる \(\sqrt{k}\) を最初から括って、残りの整数係数部分だけを考える。 \(F\) と \(G\) は相反多項式なので半分の次数まで計算すればいい。 といった工夫により、整数の計算だけを行えばいいことになる。

先に \(d=\phi(n)/2\) とおいて \(F\) と \(G\) を \[F(X) = \sum_{j=0}^{d}f_j X^{d-j}\] \[G(X) = \sum_{j=0}^{d - 1}g_j X^{d-j-1}\] と表すことにしよう。 モニックであることは判っているので \(f_0 = g_0 = 1\) である、ということは後ほど使う。 目標は \(f_j\), \(g_j\) を求めることだ。

ステップ1では、根の冪和に相当する(\(\sqrt{k}\) の因子は取り除いた)数として、\(q_j\) を求める。 必要なのは \(1 \leq j \leq d\) の範囲だ。 \(j\) が奇数の時 \(q_j = \left(\frac{k}{j}\right)\)、偶数の時 \(q_j = \mu(2n/\Gamma_j)\phi(\Gamma_j/2)\) とすれば良い。

ステップ2では、Newton の恒等式から導かれる次の漸化式を \(j = 1\) から次数の半分まで順に解く。 \[f_j = \frac{1}{2j}\sum_{i=0}^{j-1}\left(k q_{2j-2i-1} g_i - q_{2j - 2i} f_i \right)\] \[g_j = \frac{1}{2j+1}\left(f_j + \sum_{i=0}^{j-1}\left(q_{2j-2i+1} f_i - q_{2j - 2i} g_i \right)\right)\] 初期値は上で述べた \(f_0 = g_0 = 1\) だ。

ステップ3(最後のステップ)では、相反多項式であることを利用して \(F\), \(G\) それぞれの次数まで \(f_j = f_{d-j}\), \(g_j = g_{d-j-1}\) を求める。 これで計算終了だ。

例として前回と同じ \(k=7\) を計算しよう。 \(n = 14\), \(d=\phi(14)/2 = 3\) となる。

ステップ1。\(q_1=1\), \(q_2 = 1\)、\(q_3 = 1\)。

ステップ2は \(d/2 = 3/2\) なので \(f_1\), \(g_1\) を計算すれば十分。 \[f_1 = \frac{1}{2} \left(7 q_1 g_0 - q_2 f_0\right) = \frac{1}{2} (7 - 1) = 3\] \[g_1 = \frac{1}{3} \left(f_1 + q_3 f_0 - q_2 g_0\right) = \frac{1}{3} (3+1 - 1) = 1\]

ステップ3。\(f_2=f_1=3\), \(f_3=f_0=1\), \(g_2=g_0=1\)。

したがって、 \[\Phi_{14}(X)= (X^3 + 3 X^2 + 3 X + 1)^2 - 7X (X^2 + X + 1)^2\] が得られた。

確かに Stevenhagen の方法より無駄が少なそうだ。

参考文献

Richard P. Brent "Computing Aurifeullian Factors" in Computational Algebra and Number Theory, Mathematics and its Applications Vol. 325, 1995, Pages 201-212

2021年9月4日土曜日

Aurifeuille 恒等式の計算方法 (Stevenhagen)

この Aurifeuille シリーズは2年ほどブランクがあって3回目。 前2回は Aurifeuillian 因数分解Aurifeuille 恒等式 について書いた。 今回は計算方法の一つを紹介する。

簡単にするためにあまり複雑な一般化は省いて、 平方因子を持たない \(2\) 以上の整数 \(k\) に対し、\(n\) を \(k \equiv 1 \pmod{4}\) ならば \(k\)、そうでなければ \(2k\) とする。 このときある整数係数多項式 \(F\) と \(G\) により円分多項式 \(\Phi_n(X)\) を \(F(X)^2 - kX G(X)^2\) という形(Aurifeuille 恒等式)に書ける。 この \(F\) と \(G\) を求める方法を見ていきたい。

\(k=5\) の時のように整数 \(\Phi_n(k)\) の因数分解をして \(k\) 進数展開から求めるのは、いろいろ問題がある。 整数の因数分解自体が難しいし、\(k\) 以上の係数や負の係数が必要になると破綻してしまう。 一般的に使える方法は、もっと代数的な議論だ。

前に見たように \(k\zeta_n\) が \(\mathbb{Q}[\zeta_n]\) で平方数になっているというのがキーだった。 ここで紹介する Stevenhagen の方法は、\(\sqrt{k\zeta_n}\) が \(\mathbb{Q}[\zeta_n]\) に入っているならば、\(\zeta_n\) の多項式で表せるという事実に基づいている。

具体的な \(\sqrt{k\zeta_n}\) を表す \(\zeta_n\) の多項式が \[H(X) = \sum_{1 \leq a \leq 2n \land (a, 2n) =1 \land (\frac{k}{a})=1} X^{(a+1)/2}\] と与えられる。実際 \(X\) に \(\zeta_n\) を代入すると、 \(1/2\) 乗は \(\zeta_n\) を \(\zeta_{2n}\) にし、 \(+1\) の分の \(\zeta_{2n}\) で括った残りは \(\mathbb{Q}(\zeta_2n)\) から \(\mathbb{Q}(\sqrt{k})\) へのトレースになりそれは値として \(\sqrt{k}\) だから結局 \(\zeta_{2n}\sqrt{k} = \sqrt{k\zeta_n}\) となる。 この \(H\) と \(\Phi_n\) にユークリッドの互除法を適用する。 余りの次数が段階的に下がっていくが、最初に \(\phi(n)/2\) 以下になった多項式を \(f\) とし、次の段階の多項式を \(f^*\) とする。 このとき、\(f^*\) の定数項を \(f\) の適当な有理数 \(\alpha\) 倍で消したもの \(f^*-\alpha f\) を \(Xg\) とおくと、 \(f\) を先頭項係数 \(c\) で割ったものが \(F\)、逆にその \(c\) を \(g\) に掛けたものの符号を調整すると \(k G\) となる。 という形で \(F\) と \(G\) が求められる。

最後の部分が不思議な感じなのでもう少し補足しておく。 補助的な多項式 \(\gamma_i\) を \(\gamma_0 = 1\), \(\gamma_1 = 0\) から始めて、 \[ \Phi_n = \begin{vmatrix} 1 & H \\ 0 & \Phi_n \end{vmatrix} = \pm\begin{vmatrix} \gamma_i & f_i\\ \gamma_{i+1} & f_{i+1}\end{vmatrix}\] とユークリッドの互除法を行変形と見ていくと、行列式は符号を除いて一定である。 定数項を消す処理も行変形なので \[ \Phi_n = \pm\begin{vmatrix} \gamma & f\\ \gamma^* & f^*\end{vmatrix} = \pm\begin{vmatrix} \gamma & f \\ \gamma' & Xg \end{vmatrix}\] が得られる。 一方 Aurifeuille 恒等式は \[ \Phi_n = \begin{vmatrix} cG & cF \\ c^{-1}F & c^{-1} X k G\end{vmatrix}\] と表現できる。 最後の二つの式の右辺の要素同士が(符号を除いて)等しいことが言える(詳しくは参考文献を)ので上のようなアルゴリズムとなる。

例として \(k=7\) としてみよう。\(n=14\) だ。 \(1\) 以上 \(28\) 以下かつ \(28\) と互いに素かつヤコビ記号 \(\left(\frac{7}{a}\right)\) が \(1\) という条件を満たすのは \(a \in \{1,3,9,19,25,27\}\) なので、 \[H_{14}(X) = X + X^2 + X^5 + X^{10} + X^{13} + X^{14}\] だ。 この \(f_0=H_{14}\) と円分多項式 \(f_1=\Phi_{14}\) にユークリッドの互除法を適用する。 \[f_2(X) = f_0(X) \bmod f_1(X) = X^4 - 2 X^3 + 2 X^2 + 2\] \[f_3(X) = f_1(X) \bmod f_2(X) = -X^3 - 3 X^2 - 3 X - 1\] \[f_4(X) = f_2(X) \bmod f_3(X) = 14 X^2 + 14 X + 7\] ここで \(f_3\) の次数が \(\phi(14)/2=3\) 以下なので、\(f = f_3\) 、\(f^* = f_4\) とする。 \(f^*\) の定数項 \(7\) を \(f\) で消すために \(\alpha=-7\) とする。 \[f^*(X) - \alpha f(X) = -7 X^3 -7 X^2 -7 X\] これを \(X\) で割って \[g(X) = -7 X^2 -7 X -7\] を得る。 \(f\) の先頭係数は \(-1\) なので、 \[F(X) = -f(X) = X^3 + 3 X^2 + 3 X + 1\] \[G(X) = -g(X) / 7 = X^2 + X + 1\] よって \[\Phi_{14}(X) = (X^3 + 3 X^2 + 3 X + 1)^2 - 7X (X^2 + X + 1)^2\] を得る。

参考文献

P. Stevenhagen "On Aurifeullian factorizations Indagationes Mathematicae (Proceedings), Volume 90, Issue 4, 1987, Pages 451-468

2021年7月7日水曜日

functools.cache とフィボナッチ

フィボナッチ数を計算する関数を再帰で素直に書く。

def fib(n):
    if n < 0:
        return n
    return fib(n-1) + fib(n-2)

このままではものすごく遅いので、メモ化すると良い。 というのは一般常識の内だろう。

Python には 3.9 からデコレーター functools.cache があるので、簡単だ。

from functools import cache

@cache
def fib(n):
    if n < 0:
        return n
    return fib(n-1) + fib(n-2)

もう少し前のバージョンを使わなければならない人も安心して欲しい。 デコレーター functools.lru_cache が 3.2 から存在していて、lru_cache(maxsize=None) と書けば実質的に cache と同じことをしてくれる。 実は上のフィボナッチ数を計算するプログラムは functools 公式ドキュメントの lru_cache 使用例から持ってきたものだ。

話はちょっと飛ぶのだが、昔やっていた NZMATH というプロジェクトをもう一度動かそうという動きがあるとかないとか。 いや動きがあるとは聞いているのだが、実際に動き出したかどうかはまだ見えていない。 そんな NZMATH にもフィボナッチ数を計算する関数 nzmath.sequence.fibonacci があった。

FIBONACCI = {0:0, 1:1}
def fibonacci(n):
    """
    param non-negative integer n
    return the n-th term of the Fibonacci
    effect FIBONACCI[n] = fibonacci(n)
    """
    if n < 0:
        raise ValueError("fibonacci(n)  0 <= n  ?")

    if n in FIBONACCI:
        return FIBONACCI[n]

    m = n >> 1
    if n & 1 == 0:
        f1 = fibonacci(m - 1)
        f2 = fibonacci(m)
        FIBONACCI[n] = (f1 + f1 + f2) * f2
    else:
        f1 = fibonacci(m)
        f2 = fibonacci(m + 1)
        FIBONACCI[n] = f1 ** 2 + f2 ** 2

    return FIBONACCI[n]

注目したいのは2点、計算方法とメモ化だ。 計算方法は、大体半分ぐらいのところの値を使って計算するという仕組になっている。 何を参考に書いたのか判らないが、線形再帰数列の一般論から出てくるはずだ。 あるいはフィボナッチ数に特化した話としてリベンボイムの「素数の話」に書いてあったのから取ったのかもしれない。 定義通りの計算はメモ化しても O(n) 項計算するのを避けられないが、この方法は O(log n) 項の計算で済む。 一方のメモ化だが、キャッシュに使う辞書 FIBONACCI を自前で準備している。 (当時対象バージョンは Python 2.5 だったので、まだ functools.lru_cache は登場していなかった)

今ならばこの自前のキャッシュを止めて、functools.cache を使ってより簡潔に書ける。

@cache
def fibonacci(n):
    if n < 0:
        raise ValueError("fibonacci(n)  0 <= n  ?")
    if n < 2:
        return n

    m = n >> 1
    if n & 1 == 0:
        f1 = fibonacci(m - 1)
        f2 = fibonacci(m)
        return (f1 + f1 + f2) * f2
    else:
        f1 = fibonacci(m)
        f2 = fibonacci(m + 1)
        return f1 ** 2 + f2 ** 2

速さに違いがあるか timeit を仕掛けてみた、が、考えてみたら2回目以降の呼び出しはただの辞書からの読み出しだから大して意味は無いかも。 一応書いておくと、fibonacci(1000) を計算させて、元のバージョンは "2000000 loops, best of 5: 145 nsec per loop" なのに対し、 デコレーター cache を使った方は "5000000 loops, best of 5: 59.8 nsec per loop" だった。 ちなみに定義通りに書いた方はもっと手前で再帰が最大回数まで使い果たしてエラーが出る。 再帰させる行の足し算を逆転するとちょっと限界が伸びるけどね。

@cache
def fib(n):
    if n < 0:
        return n
    return fib(n-2) + fib(n-1)

2021年5月15日土曜日

たとえ話

最近、YouTube で何の動画を見たからなのか、高校数学と大学数学のギャップについて語っている動画をおすすめされることがある。 何本か見てみたが、高校まで数学が好きでそのまま大学の数学科に進むと、思っていたのと違うというような経験をするものらしい。 私自身はそういうタイプではなかったので、こういうことなんじゃないの、と傍観者的に思ったことを書いてみたい。

数学をサッカーにたとえてみると、ボールに親しもうという子供時代から少しずつ難しい技術を覚えて、 高校ではミニゲームが主な練習になっている、というような成長段階なんだと思う。 そして高校数学が好きというタイプはそのミニゲームで得点を取るのが上手な子だったりするのだろう。

大学の数学で、初めてフルコートでサッカーをする感じになる。 そのためにもう一回ルールをおさらいして、フルコートを走り回れる体力を付け、ロングボールを蹴れるようになるといった今まで必要なかった能力も要求され、フリーキックに対し壁を作るといった新しいテクニックを身につける必要が出てくる。 そして、FW・MF・DF といったポジションごとに違った思考をするようになる。

たとえが先行しすぎて数学の話に聞こえなくなってきたかもしれないが、論理や集合論といった基本を復習して、長い証明を読み書きする力を身に付け、分野を横断するような発想を理解するように要求され、今まで使わなかったような語彙を習得しないといけない、というようなことだ。 そして、解析・幾何・代数といった分野ごとに特有のスタイルを知っていくことになる。

要するに、高校数学が数学だと思っていたら大学数学にギャップを感じるというのは、ミニゲームがサッカーだと思っていたらフルコートに面食らうだろう、というぐらい当然な現象なのだ。 そして大学で勉強する数学もフルコートで行うとは言え所詮練習に過ぎず、本当に試合をするのは研究と名前が変わってからだと言って良いだろう。 教授達は試合をするプロのプレイヤーなのだが、試合の様子をなかなか覗くことができないのがちょっとイメージしづらくさせている部分かと思う。 とりあえず適当なノンフィクション的なものなんかを読んでみて世界観を漠然とでも掴んでから数学を志した方がいいのかも。 ミニゲームでの巧さはそれなりのセンスを意味するだろうから恐れずに進んでいって欲しいとは思う。

2021年5月7日金曜日

プロサイドという会社が昔あった

TL;DR: 今はもう廃業しているらしい。

プロサイドという会社は、伝説的な会社ソードを作った椎名堯慶(たかよし)氏が創業した会社で、PC/AT 互換機やサーバー機器を主に扱っていた。 ちなみにソードはソフトとハードを合わせた造語、と初めて聞いたときに感心したら、それを教えてくれた人に鼻で笑われた。 その人は確かプロサイドの社員で、私はアルバイトだった。 前世紀の末のころだ。

Wikipedia によると、プロサイド社は

現在はPC/AT互換機などの製品保守・保証サービス部門を株式会社HITとの合併会社であるHPCシステムズへ移管し、通信事業やコンサルタント事業を行っている。

とのことであるが、このページの会社サイトへのリンクは切れている。 事業移管先であるHPCシステムズ のマザーズ上場時の報告書にある沿革によれば、この移管が行われたのは2006年9月のことであった。 ちなみに現在の社長やCTOもプロサイド出身者である。

調べてみると、マウスコンピュータなどを子会社にもつ MCJ 傘下に入る話があったのが同じ2006年だったので、事業整理をしたい時期だったのだろう。

その後の動向は全然見えなくなる。 辛うじてヒットしたのはこれだけ。

プロサイドではなく社長の名前で検索してみたら Facebook に行き着いた。 そこにはこうあった。

Proside had closed business at march on 2010

2021年3月12日金曜日

植木算?

英語で(イギリス英語でかな)階数の数え方は日本語の1階が ground floor、2階が first floor、以下同様に直訳すると1階ずつずれた感じがする。 最初に聞いたときはおかしな数え方だと思ったが、 「0 は自然数」派として今やイギリス人がうらやましくすら感じる。

地下は地下1階から数えるので、日本語には0階は存在しない。 地下\(n\)階を\(-n\)階と感覚的には置き換えて計算したいが、普通の整数として計算できない。 イギリス人がさらにうらやましくなる。

同様の関係は西暦1年と紀元前1年にも現れる。 洋の東西を問わず、というかこれはヨーロッパのものだ。

今回はこういうのを無理矢理解釈してみたい。 1 と -1 が隣り合わせに並ぶ現象がなぜ発生するのか、だ。

実際のところ、マイナスだと思うからおかしく見えるだけだ。 地上1階と地下1階は別々のものをそれぞれ1から数えている。 西暦1年と紀元前1年は別々のものをそれぞれ1から数えている。 隣接はしていても連続はしていないのだ。 一体の整数という描像が後からの押しつけなのだ。

そうは言ってもどこかに 0 を見出したい。 一体の整数という描像からどうにか理解したい、という気持ちも無視できない。 そして実際可能である。 0 は -1 と 1 の間にある。 ただし質の違うものとして。

紀元前1年と西暦1年との間には年の変わる瞬間がある。 そこが 0 である。 年ではなく年の変わる瞬間の列に一体の整数を見出すことができる。

同じように階の変わる高さの列を地面を出発点として一体の整数とみれば、 その間に地上と地下の階がある。

言うなれば植木算である。 年の変わる瞬間が5回あったら、その間は何年間ですか? というような。

余談: 今回は割と 1 から自然数を始める気持ちに寄り添って説明してみたけど、やっぱり面倒くさいので新しく暦を始めるときは 0 年始まりにして計算しやすくしてください。 たとえば1970年をUNIX暦0年とするのは賛同してくれる人が多いかと期待している。

2021年1月10日日曜日

lsp-mode と python-language-server と pipx

長く Emacs でプログラムを書いている。 最近は(?)時代遅れ扱いされがちな Emacs ではあるが、特に乗り換えたいというほどのものがなく、何となく使い続けている。 他の環境で使えるようになった良さげな機能があって食指が動いても、それ Emacs でもできるよ、と言われると、じゃあいいかとなる。

今回、導入してみたいのは python-language-server である。 LSP (language server protocol) 自体は、VS Code のためにか何か Microsoft が作ったものだそうだが、 プロトコルの規定なので結局それを Emacs だったり Vim だったりから使えるようにする人が現れて、事実上の標準になっている。 昔何か別のコード補完のパッケージを Emacs に入れたときは重すぎて使い物にならず、 いままで dabbrev 以外の補完は使ってこなかったのだが、これはどうだろうか。

導入に際して引っかかるのは、python-language-server のインストール先である。 だいたい、Python のプロジェクトは、少し前まで Python 2 と 3 を使うものが混在していたために必要に迫られて、 pipenv で環境を切り分けて依存から何から別々に持つ、という方針で扱ってきたので、 その方針でいくとプロジェクトごとかもしれない、と最初は考えた。 しかし、Emacs でこれを使う lsp-mode の設定はパスを一つ指定する必要があるようだ。 どうしよう、と、ここで1ヶ月は放置していたと思う。

そんなある日 pipx というものを知った。 Python で書いたコマンドを隔離した環境にインストールするという。 要するに1つのコマンド用に venv を切ってインストールしてパスを通す、みたいなことをコマンド一発でやってくれるというわけだ。 これだわ。

ということで、インストール方法は

  1. pipx をインストールする。たとえば mac なら brew install pipx でいける。
  2. pipx install python-language-server
  3. Emacs に lsp-mode を入れる。普通に package-list-packages から選択。
  4. .emacs (などの Emacs の設定ファイル)に、次のように書く
    ;;; lsp-mode (language server protocol)
    (use-package lsp-mode
      :hook
      (python-mode . lsp)
      :init
      (setq lsp-keymap-prefix "C-c l")
      :config
      (setq lsp-pyls-server-command (expand-file-name "~/.local/bin/pyls"))
      :commands lsp)
    

となる。 ちなみに ~/.local/bin が pipx がインストールしたコマンドのリンクをおいてくれるパス。

また今回も、Emacs で使えるなら移行しなくていいか、となるパターンのようだ。

2021年1月3日日曜日

2020年の読書

昨年の読書を振り返る。 2020年は通勤という読書時間がなくなったので、前年よりさらに読書冊数が減少した。 読書メーターの記録に依ればマンガも入れて100冊ぐらい。 以下、印象に残ったものをピックアップして紹介する。

新しく内田洋子という作家を知った。 立て続けに3冊読んだのが記憶にも残っている。 「イタリアからイタリアへ」「モンテレッジォ 小さな村の旅する本屋の物語」「もうひとつのモンテレッジォの物語」 題材はどれもイタリア。

科学的な本では、チャールズ・コケル「生命進化の物理法則」とスコット・アーロンソン「デモクリトスと量子計算」が印象に残った。 前者は、物理法則に従って最適な生命形態を探すと今ある生物の作りに落ち着くだろう、という主張が意外だった。 後者は、タイトルの訳が不思議な感じ("since Democritus" がなぜ"デモクリトスと"になるのやら)だが、計算量理論と物理学が量子力学を接点として繋がってくるわくわくする世界。

マンガは基本的に以前から読んでいる続き物を追っているだけだが、2020年は数年溜まっていた「OL進化論」がまとめて出たので5冊も読んだ。

※本のリンクはamazonアフィリエイトです。