[ 新着記事
| 数学・プログラミング
| 天文・暦
| シリア語・Unicode・詩
| ジョーク
| 漫画・アニメ
| 字幕
| 哲学・ファンタジー
| 全記事 ]
チラ裏コーナー(過去のチラ裏)
2021-01-19 arccos の分かりにくさを何とかしたい
cos(コサイン)の一つの解釈は「与えられた角度 x について、一定の三角形の底辺の長さ z を調べること」。コンセプトは難しくない。入力 x は容易に実数全体に拡張され、さらにオイラーの公式を経由して複素数全体にまで拡張される。問題はその逆算。z が与えられたとして「cos に何を入れると z になるか?」
これも意味は分かりやすいが、文献・資料に不透明な記述が多い。一例として、これを書いている時点で、ウィキペディア英語版・フランス語版・日本語版がそれぞれ独自の主張をしている。
英語版の主張 acosE(z) = −i log (z + √1 − z2) <これは間違い>
フランス語版の主張 acosF(z) = −i log (z + √z2 − 1)
日本語版の主張 acosJ(z) = −i log (z − i√1 − z2)
日本語版は多値関数として正しいが、平方根の符号の選択に疑問があり、書きかけの注釈のようなものが付いている。フランス語版は多値関数として最も素直で、これを主値にしたいくらいだが、現実の事実標準はこの形ではなく、次のようになる。
事実標準 arccos(z) = −i log (z + i√1 − z2)
なぜかというと、単に「その方が便利だから」。具体例で検証しながら、その意味を整理してみたい。
【1】 オイラーの公式から z = cos x = (eix)/2 + (e−ix)/2 = (eix)/2 + 1/(2eix) と書ける。当たり前の変形のようだが、厳密に言うと、−1 が整数だから e−ix = (eix)−1 = 1/(eix) が成立するのである。
eix を A とすると z = A/2 + 1/(2A)。両辺を 2A 倍すると 2Az = A2 + 1、つまり A2 − 2zA + 1 = 0。この2次方程式を解くと:
A = (2z ± √4z2 − 4) / 2 = z ± √z2 − 1
A を eix に戻すと eix = z ± √z2 − 1
両辺の対数を取ると ix = log (z ± √z2 − 1)
両辺を −i 倍すると x = −i log (z ± √z2 − 1)
…ここまでは紛れの余地はない。
【2】 z = cos x の逆算は、2パターンあることが分かった:
x = f(z) = −i log (z + √z2 − 1)
x = g(z) = −i log (z − √z2 − 1)
f(z) は、前記フランス語版 の acosF(z) であり、根号について「プラス・マイナス2個の値を取る多値関数」と解釈すれば、数学的にはこれで問題解決。数値計算のため、便宜上、プラス版の f とマイナス版の g に分けておく。
簡単な具体例で確かめてみよう。cos 30° = cos (π/6) = √3 / 2 = 0.866… なので、直観的には逆関数に z = 0.866… を代入すると π/6 = 0.523… に戻ってほしい。z = √3 / 2 のとき z2 = 3/4, z2 − 1 = −1/4。その平方根の主値は i/2。従って:
f(√3 / 2) = −i log (√3 / 2 + i/2)
= −i log [cos (π/6) + i sin (π/6)]
上記の log は「e を何乗すると cos (π/6) + i sin (π/6) になるか?」という値だが、オイラーの公式から eiπ/6 = cos (π/6) + i sin (π/6) なので、その一つの答えは iπ/6 = 0.523… × i。この値を使うと:
f(√3 / 2) = −i × iπ/6 = π/6
めでたく π/6 に戻ってくれた! 今使った複素数 iπ/6 は、対数関数の主値。話を簡単にするため、対数関数についてはとりあえず主値だけを考える。上記と同様に:
g(√3 / 2) = −i log (√3 / 2 − i/2)
= −i log [cos (−π/6) + i sin (−π/6)] = −π/6
この値も cos に入れれば同じ √3 / 2 なるので、cos の逆算としては間違っていない。しかし正でも負でもいいのなら、普通は正を主値とする。実数の範囲の arccos の常識的な定義であり、異論はないだろう。
【3】 では f(z) を arccos の主値と定義とすれば、複素数の範囲でも、全て丸く収まるのか? 問題はそこなんだよねぇ…。具体例として cos i = 1.543… を考えてみる。この値は z = cosh 1 = (e + 1/e) / 2。直観的には、これを arccos に入れると i に戻ってほしい。z がこの値のとき、簡単な計算によると:
z2 − 1 = (sinh 1)2 = 1.381…
√z2 − 1 = sinh 1 = (e − 1/e) / 2 = 1.175…
z + √z2 − 1 = e
f(z) = −i log e = −i × 1 = −i
何たることか、i に戻ってくれない…。一方:
z − √z2 − 1 = 1/e
g(z) = −i log (1/e) = −i × (−1) = i
こっちの枝なら i に戻ってくれる…。
【4】 f(z) を主値とすると、【3】で見たように arccos (cos i) = i にならない。だからといって g(z) を主値とすると、【2】で見たように実変数・実数値の場合、符号が直観と逆になり、ますます都合が悪い。主値というのは、もともと便宜上の取り決めで、(実数の範囲では常識的に決まっているとはいえ)数学的な必然性があるわけではない。主値ばかりにこだわると、多値関数 arccos の全体像を見通せなくなり、数学的にむしろ有害ですらある。応用上も「与えられた z について、z = cos x を満たす x を一つ見つければ十分」という状況では、どの値を選ぼうが(主値が何であろうが)構わない。
とはいうものの、とりあえず主値を定義しないと、数値計算ができない。数学上は f(z) で主値を定義しても差し支えないのだが、そうすると上記のように arccos (cos i) = i にならず、感覚的な問題がある。そこで…
x = arccos(z) = −i log [z + (z2 − 1)1/2] ☆☆
= −i log {z + [(−1) × (1 − z2)]1/2} ☆
= −i log [z + (−1)1/2 × (1 − z2)1/2] ★
= −i log [z + i(1 − z2)1/2] ★★
☆☆は既に得ている f(z) だが、それを★★の形に書き換えてみる。数学的には☆☆のままでいいのに、なぜそれをわざわざ少し複雑な形に書き換えるのか?
【5】 まず形式的な面をチェックしよう。☆は (z2 − 1) を (−1) × (1 − z2) と書き直しただけ(複素数の範囲でも常に成立)。★は、多値バージョンの「2分の1乗」に限って成立する変形。主値バージョンの平方根では、必ずしも成り立たない。例えば、3 = 91/2 = [(−1)(−9)]1/2 と書くまでは問題ないが、それを = (−1)1/2 × (−9)1/2 = i × 3i = −3 とすれば矛盾。上記では「2分の1乗」(平方根)を多値関数と考えることで、この変形が許される。
理屈としては ★★の i の先頭にも±が付くはずだが、その複号は (1 − z2)1/2 の「2分の1乗」によって既に含意されている(これは多値バージョンなので)。
☆☆と★★は、多値関数としては同等なので、問題は主値の選択に関わっている。【2】【3】で見たように、主値バージョンを「感覚的に好ましく」するためには f の枝と g の枝を使い分ける必要があるが、実は★★の形にすると、この使い分けが「自動化」される。つまり、主値として☆から★の変形が成立するなら、★★は f(z) と等価、成立しないなら、★★は g(z) と等価。この切り分けが、都合よく「感覚的に好ましい使い分け」と一致してくれる。(さらにボーナス特典として、★★を使って主値を選ぶと、実数の範囲の基本公式 arcsin z + arccos z = π/2 が、複素数の範囲でも維持される。)
【6】 以上のように、☆☆を★★に変形することにはメリットがあるのだが、教科書ではその辺が説明されていないことが多い。多値関数としてはどちらでも同じなのだから「変形していけない」ということはないのだが、一見しただけでは「変形しなければならない」というモチベーションも感じられない。その点が不満足であり、不透明に感じられる。再び具体的な数値例で検証してみよう。
主値として☆から★に行けるか?というのは、要するに
√z2 − 1 = i √1 − z2 (♪)
が成り立つか?という問題。z が実数で絶対値が1以下なら、これが成り立つのは明白。従って最初の例【2】の z = √3 / 2 = 0.866… について、★★は f(z) と同じであり、都合がいい。一方、z が実数で絶対値が1より大きいとき、(♪)の左辺は正、右辺は負になり、この等式は成り立たない(符号が逆になる)。よって【3】の z = 1.543… の場合、★★と f(z) は符号が逆。これは★★が g(z) と同じという意味であり、【3】で見たように、その方がむしろ都合がいい。
主値の選択は便宜的なもので「証明」できるようなことではないが、このように具体例を考えることで、★★の定義が好都合であることが実感されるだろう。
2021-01-14 変てこ38面体 「アルキメデスの立体」13種の一つ
怪人二十面相なるものがあるが、この子は三十八面体。「ねじれ立方体」などと呼ばれるもの。
立方体も弾けたい!
立方体の6面がそれぞれ独立して、向きを保ったまま、中心から離れるように少し動いたとする。分離して宙に浮かぶ6面(正方形)。どれもちょっとだけ、時計回りにひねる。…うまく加減すると「もともとの立方体で一つの辺だった2辺」を2個の正三角形で連結できる状態になるので、連結しよう。各正方形の4辺のどれからも、それを底辺とする正三角形が生え、全部ピッタリはまった!
以上で正方形6、正三角形24だが、これだと、まだ正三角形の穴が残っている。それは「どの正方形とも辺を共有してないが、3個の正方形の頂点を結ぶのに必要な正三角形」。
これらの穴にも正三角形をはめ込む。穴埋めで追加された正三角形は、「天井」の正方形の各頂点に接する4カ所、「床」の正方形の各頂点に接する4カ所。「側面」には穴がないので、これで38面体(正方形6、正三角形32)の出来上がり…。
この多面体のいろいろな値(例えば体積)には、なぜかトリボナッチ(トライボナッチ)定数 1.83928… が絡んでいる。アルキメデスの立体の中で、トップクラスの複雑さ…。頂点の数は、正方形6個の頂点の総数24に等しい。辺の数は、面から考えると 6 × 4 + 32 × 3 = 120 だが、どの接合部でも2辺が一つになっているので、実際にはその半分60。頂点の数も、面から考えると120だが、各頂点で5辺が接しているので、実際には5分の1の24。…双対多面体は、「三等辺・二等辺・四等角・左右対称の五角形」から成る24面体。正五角形は黄金比を含んでいるので、五角形から成る多面体に「黄金比の3次元版」が現れる…というのは、あり得る話に思える。
ところで「ねじれ立方体」には、鏡像関係の2バージョンがある。最初の画像は「左」バージョンらしい。
Image credits: Snub cube (Left) = CC-BY-4.0 by Watchduck; Snub cubes (Left/Right) = CC-BY-3.0 by Frankee 67.
補足 前回は、カルダノ版をちゃんと最後まで簡約せず、数値が出せたところで放り出してしまった。
x = 3√19/27 + √11/27 + 3√19/27 − √11/27 + 1/3 = 1.839286755…
根号内の分母を全部なくし、全体を 1/3 でくくれる。実際、√11/27 = √(11 × 27)/(27 × 27) = √11 × 3 × 9 / √27 × 27 = 3√33 / 27 なので、上記1個目の立方根は 3√(19 + 3√33) / 27 = 3√(19 + 3√33) / 3√27 = 3√19 + 3√33 / 3 に等しい。2個目の立方根も同様。結局:
三角関数で表すと [4 triscos (19/8) + 1] / 3
…ここで triscos θ = cos [(arccos θ)/3]
103/56 はシンプルで優秀な近似分数(誤差=約100万分の1)。この分数を得るには、実際に1万以下の範囲のトリボナッチ数列を書いてみて、最後の2項の比 5768/3136 を約分すればいい。(31461/17105 はさらに優秀だが、シンプルではないし、実際の数列からも生成できない。)
Map
の長所、splice
より速い要素挿入法も紹介。 〔最終更新: 2016年4月10日〕bdi
要素と Unicode 6.3 の新しい双方向アルゴリズム (2012-12-04)dir
属性は落とし穴が多い。HTML5 の <bdi>
は役立つ。近い将来、「ユーザー入力欄などの語句は、このタグで隔離」が常識になるかも。 〔最終更新: 2014年4月27日〕fad()
は濁りやすい。各種の代替手段を紹介。msystem.waw.pl
/ videolan.org