スキップしてメイン コンテンツに移動

投稿

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

以前、 円分体って名前がそもそもどうなんだ という記事を書いた。 雑にまとめると、円分体と呼ばれている体は有限巡回群の有理数を係数とする群環を考えれば良く、その有限巡回群の自己同型群による不変部分環が係数体に一致してしまうし、もう複素数とかそれに引きずられた名称とかいらないだろう、という話だった。 しかし群環という構造はちょっと特殊すぎて応用が利かないので枠組みを広げてみたい、というのが今回のもくろみとなる。 一番重要だったのは群が作用して不変部分環を考えられる部分だったので、有限集合とそこに作用する群があってそれをうまく環の世界に持ち込めれば良い。 そこで、多変数多項式環とその変数の入れ替えという作用を考える。 例としては、すぐに複雑になってしまうので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\) で書けるようになる(具体的な式は...

ヒバとは

檜っぽい葉っぱの植木をヒバと呼んでいたような記憶があって、正確には(分類学的には)何なのだろう、と調べてみた。 図書館で「検索入門針葉樹」という図鑑を借りてきた。 索引を見てもヒバという名前は出てこない。 検索表の方を見ると、D2なる分類(鱗片状の葉に表裏性があり鱗片葉が小型)に、ニオイヒバ・アオノクジャクヒバ・オウゴンクジャクヒバ・カマクラヒバ・オウゴンシノブヒバ・イトヒバと並んでいる。 ヒノキも入っている分類なので見た目的には合っている。 ニオイヒバ Thuja occidentalis Linn. 北米原産「洋風の庭園に植栽されるドワーフコニファー類にこの仲間が多い」 アオノクジャクヒバ・オウゴンクジャクヒバ・カマクラヒバ ヒノキ Chamaecyparis obtusa Sieb. et Zucc. の園芸品種。 オウゴンシノブヒバ・イトヒバ サワラ Chamaecyparis pisifera Sieb. et Zucc. の園芸品種。 これで終わりと思いきや、さらに「針葉樹の世界」という全体を俯瞰した説明のページがあり、そこに家の土台には「ヒノキやヒバ、ベイヒバが使われ」るという表現が登場する。 ベイマツの伝でいけばベイヒバのベイはアメリカを意味する米だと考えられるのだが、本編に登場しない種を説明無しに出してくるのは流石にどうかと思う。 ちなみにこの後に「ヒノキアスナロ(ヒバ)」という表現が登場し、ここではヒノキアスナロの別名だと判明する。 ヒノキアスナロ アスナロ Thujopsis dolabrata Sieb. et Zucc. の変種品種。 (これの説明には「ヒバ」という呼称は無い。) 以上ヒバという植物はなく、ヒノキ科ではあるものの3つの属にまたがる植物にヒバの呼称が使われていることが判った。 結局ヒバとは檜っぽい葉っぱの木以上のものではなかったのかも知れない。

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)\) の係数は根が与えられているので解と係数の関係から計算できる。 そこに現れる根の対称...

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})\) へのトレースになりそれ...

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: retu...