DOMINE SALVAM FAC REGINAM NOSTRAM VICTORIAM PRIMAM

最近全く進んでませんけど、去年の9月ごろから大学の語学仲間とラテン語を勉強していまして、まぁちょっと訳あって今は休止中なのですが、ついこないだ、そことは全然関係ないコミュニティで「私今年度はラテン語を勉強したい」とか言った方がいたので、じゃぁ私も負けてられないなということと相成りまして、以下省略。

まぁなんとなしにWikipediaで「ビッグ・ベン」を調べた際にラテン語を見つけたので、これを分析してみますか。


DOMINE SALVAM FAC REGINAM NOSTRAM VICTORIAM PRIMAM


DOMINEは「主」を意味するdōmīnusの呼格です。マクロンを振るとDŌMĪNEです。ラテン語の名詞の格変化を覚える際に、さんざこの名詞にお世話になった人も多いでしょう。男性名詞の代表格と同時に、ラテン語の歴史の上では幾度となく口にされている「主」つまり「神」「イエス・キリスト」を意味する単語です。

SALVAMは「安泰な、健全な」という意味の形容詞salvusの女性対格形です。

FACは「する」を意味する動詞facereの命令法二人称単数です。

この"salvum/salvam facere"で「救う」という意味になるんでしょうね。英語ではsaveという動詞が「救う」という意味ですが、これについては小林標ラテン語の世界」中公新書に詳しく書いてあります。

「安泰な, 健全な」を意味するsalvus(英語のsafeの語源)から, 新たにsalvareという動詞(英語のsaveの語源)をわざわざ造って「救う」の意味とし, それの行為者名詞としてさらにsalvatorを造ったわけである. 抽象名詞としてのsalvatio「救済」も造られた. salvare, salvator, salvatio, すべてラテン語辞書にはない単語である. しかし, うっかりするとラテン語作文をするときこれらを古典ラテン語のつもりで使ってしまいそうである. (p236)

REGINAMは「女王」を意味する名詞rēgīnaの対格形です。当然この名詞の性は女性ね。

NOSTRAMは「私たちの」という属格代名詞女性形です。これをカタカナで「ノストラム」なんて書くと、恐怖の大王が云々で世紀末に流行ったノストラダムスを思い出す人がいるでしょうが、このNOSTRADAMUSはnostraとdamusに分けられて「我々の」「貴婦人」、つまり聖母マリアを意味する姓なんですね。そもそものノストラダムスの姓はNostredameであり、このフランス語の姓の読みは「ノートルダム」、パリのノートルダム聖堂は有名でしょうか。

VICTORIAMは、これは人名です。「ヴィクトリア」です。ラテン語では人名さえも格変化しますね。

PRIMAMも、「最初の」を意味するprimusの女性対格形です。

というわけで、無事
DOMINE SALVAM FAC REGINAM NOSTRAM VICTORIAM PRIMAM

The Load, save our Queen Victoria the first
と英訳できたわけです。ちなみにちゃんと長音を区別するためにマクロンを付すると、
DŌMĪNE SALVAM FAC RĒGĪNAM NOSTRAM VICTORIAM PRĪMAM
となりますね。

しかしこの一例を見るだけでも、ラテン語が如何に格にこだわっているかがわかります。
DŌMĪNE SALVAM FAC RĒGĪNAM NOSTRAM VICTORIAM PRĪMAM
と、対格の単語の語尾には全てMがついているのが見てすぐわかります。

コンソール型計算プログラムをつくりたいんだけど part02

実験データまとめるのに飽きたので、ちょっとまたこっち考えます。

数式の構造解析アルゴリズム検討

前回言ったように、与えられた1本の数式を先頭から解析していってはいけません。
1+2*3
という数式を、先頭から解析していき
1+2
から計算してはいけないのと同じです。ここで考えられる対処法は、計算を優先させるオペレータを順に拾っていき、そこから計算していくという方法です。ちょっと長い数式を例にとりますと、
1+2*3-4/5+6
という数式を先頭から解析していくときに、
1+2
まで読むと、オペレータは「+」の1つだけです。しかし更に読み進めていくと
1+2*3
となり、この時点で「+」より「*」を先に計算しなければならないと判断するようにします。更に読み進めて
1+2*3-4/5
まで来たところで、「*」と「/」を優先して計算する必要があることが判断されます。結局最後まで読んだところで
1+2*3-4/5+6
となり、
1+2*3-4/5+6
=1+ 6 -0.8+6
=13.8
と計算できればOKなわけですね。
てな訳で、オペレータの優先順位を決めていく方法としては、

  • 与えられた数式に使われているオペレータを一通りチェックしてから、優先度の高いものから計算していく。

というのが思い浮かびます。ただ、これ以外にも

  • 与えられた数式を先頭から読んでいき、最弱オペレータで式を分割する。

なんて方法もあるでしょう。つまり先の数式を例に挙げると
1+2*3-4/5+6
を最弱オペレータの「+」と「-」で区切り
「1」と「2*3」と「4/5」と「6」
で分け、それぞれの括弧内を計算する。計算し終わったらその結果を元の数式に戻す。そうすれば、最強オペレータは数式を最後まで読まないとわかりませんが、最弱オペレータは「+」と「-」の2つだけですから、先頭から順に処理していくことができるはずです。このかたまりをクラスで組んで、かたまりごとにインスタンスをつくればいいのかなとか考えています。これをここで「部分数式」とでも呼びますと、

  • 部分数式
    • 符号(プラスorマイナス)
    • 数式

でやればOKかと。数式はその中で更に構造分析をするからpublicで、符号は部分数式がこれ以上計算ができない単位になるまで一切変更しないからprivateでいいと思います。

コンソール型計算プログラムをつくりたいんだけど part01

はじめに

件の地震の影響で多少暇ができたので、1年後に控えた就活のために、Webテストで出てくるような分数を含んだ数式をすぐソルヴできるコンソール型の計算機が欲しいなぁと思いまして。まぁRubyIRBとかRでもいいんですけど、分数があると括弧を補充する必要があるじゃないですか、つまり何が言いたいかと言うと:
\frac{7}{13} \div \frac{21}{5}
っていう数式は、1行で書こうとすると
(7/13)/(21/5)
って書かなきゃですよね?*1でもこれを時間がない中、数式の頭から入力していくと
7/13
まで入力したところでこの分数を括弧で括る必要があることがわかり、カーソルを頭に戻して始め括弧を加えることになります。これが
\frac{7}{13} + \frac{21}{5}
なんて数式だったら、これは
7/13+21/5
って書けばいいですよね。これは計算規則で「乗除の計算は加減の計算より先にやらなくてはいけない」という決まりがありますから。と言うわけで、俺が今回つくりたいコンソール型計算プログラムは、

  • 四則計算の記号として「÷」と「/(分数)」の2つを別々に用意する。

そして余力があれば

  • 多項式も方程式も解けるようにする

っていうのもあればいいなと思っています。だってWebテスト、方程式を解けっていうのもありますよね、その両方に対応出来れば尚によろしいので。

数式の分析

で、早速C++で開発を始めたわけです(環境はVC++2008 Express Editionです)が、最初の難関にぶち当たりました。それは数式の分析です。構造言語学みたいなところですね。これって大学の授業でやったようなやってないようななんですよ。なのでひとまずは初心者の素人考えでアプローチしていきます、そのうち本を読みだすかもしれませんし、読まないかもしれません。
数式はオペレータとオペランドの2つから成り立っています。オペレータは演算子と言ったりもしますが、数式では「+」とか「−」とか「×」とか「÷」とか、そう言うのがオペレータです。オペランドはひとまずここではオペレータ以外のもの、ここで扱いたい数式では特に数字だと思ってくれて差し支えないと思います。例えば、
1+2
とあったら、「+」がオペレータで、その両脇にある「1」と「2」がオペランドです。
今自分の中で顕在化している問題は2つありまして、まぁこの2つは結局1つのソリューションで解決できると思うのですが、1つは計算順序の問題、もう一つは括弧の問題です。
プログラムは入力された数式を数式の左から順に分析をかけて行くアルゴリズムで行こうと思っています。なので例えば
1+2*3-4
って数式は、頭から順番に読んでいくのですね。ここで、
1+2*3
まで読んだ段階で、プログラムには「先に2*3を計算して、その計算結果と1を足さなければ」と判断しなければいけないわけです。この判断をどのようにさせるかというのが前者の問題。
後者は、
(1+2)*(3-4)
みたいな数式はどうするかです。まぁこの場合は、数式の()内を内側から拾って行って順番に計算させて戻す、つまり
(1+2)*(3-4)―[1+2=3,3-4=-1]→3*(-1)→-3
という流れかなぁと思っています。この考え方を前者の問題にも応用して、数式の優先オペレータから順に拾っていって計算して戻す、という流れがいいのではないかと思っています。そうするとこれは再起関数を使うことになるでしょうね。

とりあえず今回は以上です。

p.s.:多分IRBにオペレータのオーバーロード機能があると思うから、それで頑張れば今回やりたいことって出来るんだと思うんですけど、まぁこれもC++の手習いなので。前もどっかで書きましたが、Cでやりたいことを書いていって、必要に応じてC++の知識を足していったので、coutとかcinとかまともに使えないんですよ私。なのでC++を一からやり直すつもりでこのプロジェクトをやっていくつもりです。

*1:「(7/13)/(21/5)」と「7/13/21/5」の計算結果が違うというのは、大丈夫ですよね?わからない人はエクセルにでも計算させてみてください。

画面インチと画角の関係

研究でしょっちゅう画面サイズの換算をするんですけど、その度にググるのは大変にだるいので、もうここに書き留めておこうということで、下に色々書いておきます。

TV画面のサイズ - 高精度計算サイト:
http://keisan.casio.jp/has10/SpecExec.cgi?id=system/2006/1208497238

CINEMA4Dのインストール

大学の研究室でMAXONのCINEMA4Dを購入しまして、一緒にLICENSE SERVERも来たのでそれをまずインストールをしたのですがなんか紙で同梱されてた書類に書いてあるライセンス番号を受け付けてくれない。なんでだろうと思って日本オフィスに電話してみたら、どうも文字列ごとそこにペーストしてくれと、そのためにメールをお送りしますということで、メールを見たら

下記のシリアル番号の2行をすべてコピーしてペーストしてください。
よろしくお願い致します。

CINEMA 4D Studio R12 Edu [12-N-NNNN] <>
Multi-Licence (002) [12-N-NNNNNNNNN] <>

とあり、これを丸々コピー&ペーストしたらOKでした(Nは数字、Xはアルファベットでしたが伏せてあります)。
CINEMA4Dってあんまり日本じゃ普及してないからね、情報が足りなくて思いのほか時間を取られてしまいました。

人生設計図

久しぶりに徒然な記事。なりたい自分になるにはどうすればいいのかねぇと。とりあえず
物質的には

  • 欲しいものが必要十分に手に入れられるだけの高給
  • 眺めの良い書斎と広いキッチンを備えたマンション

人間的には

  • 最低限の家事ができ、子どもの全てを任せることができる伴侶*1
  • お互いに刺激し助け合える仲間*2

事業的には

  • 印税の不労所得をつくる
  • 海外を飛んで回りたい

そんなところですかね。さて、これらを手に入れるには何をすればいいのか。
大きくまとめると

  • 金持ちになる
  • 仲間をもつ
  • 海外に飛びまくる

ができればいいんですよね。

金持ちになる

金持ちになることについては色々本を読んでいるのである程度あたりはつけていまして、

  • 自分の収入に左右されない価値観を持つ
  • みんながいるところで金を使う
  • give&give&give&give&give&take
  • おごりおごられる
  • 金持ちが集まりやすいコミュニティに入る
  • 税金対策をする

くらいかな、今ぱっと思いつくのは。上4つはある程度できている気がしますが、下2つが全くできていませんね、税金対策とか、何か勉強しなきゃなのかな。ちなみにこの6つですが、逆のことを書くと、あぁこいつには金は集まらないなぁと思えますよ:

  • 金があるとつい高いものを買ってしまう(いわゆる成金的)
  • 自分のためだけに金を使う
  • 求めるばかりであげることがない
  • 割り勘主義(相手との年齢の関係もありますよ)
  • 周りには金に困っている人ばかり
  • 税金に無頓着

仲間をつくる

次、仲間ですけど、この辺りは最近色々考えるようになりましたね。それまではなるように任せていた節がありましたけど、自分で思いついたこともありますし、本を読んで知ったこともありますし。前半は「恋人をつくる」、後半は「欲しい仲間のいるところに行く」です。「恋人をつくる」はですねぇ、こういう経緯でこの結論に達しました:

  • 自分を好きになってくれる人が多いと色々と捗るし、何よりも人生が豊かになる
  • そのためには、たくさんの人に自分を好きになってもらいたいわけであるが
  • 1人の人間を恋人にできないやつが、そんなことできるのか?
  • じゃぁ恋人をつくってみよう

というわけです。それにね、今まで多くの人に所謂「優しく」接してきたつもりなので、恋人ができたらそういうところは変わるのかなぁどうなんだろうっていう思いもありましたしね。
後半は、先ほどの「金持ちがいるだろうコミュニティに入る」と似ているんですけど、結局、戦略的に出会う必要があるということです。このあたり、今は全く考えてないのですけど、のちのち考えなきゃなぁと思っています。少なくとも、今参加しているコミュニティはいずれもOBとなった後も生かせると思っていますけど、でも具体的にどうするかは考えてないからなぁ。OBの集まりが既にあるところはいいんですけど、そうじゃないところは何とかしないとなぁ。定期的に会えるようにしないと。伴侶のほうは、とりあえず社会人になってからでいいかなと思っているんですけど…遅いですかね?

海外に飛びまくる

これですけど、もちろん仕事がバリバリできるのは前提条件として、そのうえで会社の金で世界中を飛び回れるのがベストですね。つまり、会社から「こいつは海外に行き来させるのがよい人材だ」と思ってもらえるようになる必要があるわけだ。てことはやはり言語ですかねぇ。英語ができるのは当たり前、それ以外の言語もある程度できる必要があると。でもさ、例えば行きたくない国の言語が扱えると、その行きたくない国に飛ばされたりすることになるよね。って考えると、むやみやたらに外国語ができればいいって問題じゃないわけだ。そう考えると、第二外国語がドイツ語っていうのは大正解だったなぁ。言語に関する資格を持っているのは当然として、やはり留学経験があったほうがいいよなぁ、でもそんな金ないしなぁ正直。でも実費旅行はとにかく金かかるからなぁ。うまく人の金で海外に行かないと。その点ではうちの研究室は海外に限らずいろんなところに行かせてくれるので、大変ありがたいです。これからもよろしくお願いします、ちゃんと研究しますので。

*1:家事子育てを全部やれと言っているわけではないですよ、ただ、任せられないのは困る

*2:かつての村社会やご近所づきあいのようにセーフティーネットとして機能する

円の接線の関数を求める際の注意事項(2元1次方程式と2元2次方程式の連立方程式)

3年半ほど、バイトとして個別指導の塾講師をやっているのですが、今日は1対1だったので一緒に同じ数学の問題を解いていたんですね。その中で、円の外部の点から接線を引く問題がありまして、それを解いていましたら、あれ、なんか答えが合わないなぁというので、色々いじってたら今更ながら注意事項に気がついてしまいました、ということで、それを解説しようかなと。
 C: \left( x+3 \right) ^2 + y^2 = 40に、外部の点 A(9,4)から接線を引く。この手の定石は、接点 P(p,q)を考えます。一般的に次の公式が成り立つ:

 \left( x-a \right) ^2 + \left( y-b \right) ^2 = r^2の円周上の点 T(s,t)を接点とする接線の方程式は、 \left( s-a \right) \left( x-a \right) + \left( t-b \right) \left( y-b \right) = r^2で与えられる。

というわけで、これに当てはめると接線の方程式は、

 \left( p+3 \right) \left( x+3 \right) + qy = 40

これが点 A(9,4)を通るので、
 \left( p+3 \right) \left( 9+3 \right) + q \cdot 4 = 40 \quad \Longleftrightarrow \quad 3p+q=1…(1)

となる。また、点 A(9,4)は円 C: \left( x+3 \right) ^2 + y^2 = 40の円周上の点なので、次の式も成り立つ:
 \left( p+3 \right) ^2 + q^2 = 40…(2)

さて、この2式(1)(2)を連立しよう。(1)式を q=1-3pと変形して(2)に代入すると、
 \left( p+3 \right) ^2 + \left( 1-3p \right)^2 = 40
 p^2 +6p +9 + 1 -6p +9p^2 = 40
 p^2 = 3
 p = \pm \sqrt{3}

この式を(2)に代入して、
 \left( \pm \sqrt{3} +3 \right) ^2 + q^2 = 40
 3 \pm 6 \sqrt{3} +9 +q^2 = 40
 q^2 = 28 \mp 6 \sqrt{3}
 q^2 = 27 \mp 2 \cdot 3 \sqrt{3} \cdot 1 + 1
 q^2 = \left( 3 \sqrt{3} \mp 1 \right)^2
 q = 3 \sqrt{3} \mp 1

よって、答えとなる接線は2本あり、それぞれの方程式は、
 \left( \pm \sqrt{3} + 3 \right) \left( x+3 \right) + \left( 3 \sqrt{3} \mp 1 \right) y = 40
 \left( \pm \sqrt{3} + 3 \right) x \pm 3 \sqrt{3} +9 + \left( 3 \sqrt{3} \mp 1 \right) y = 40
 \left( \pm \sqrt{3} + 3 \right) x + \left( 3 \sqrt{3} \mp 1 \right) y - 31 \pm 3 \sqrt{3} = 0

…となったが、実はこの2式、この問題の正しい答えではない。
実際にこの式に通るはずの点 A(9,4)を代入してみると、成り立たないことがわかる。
それは何故か、直接の原因は p = \pm \sqrt{#3}の値を(2)に代入したときの最後の式に問題がある。
 q^2 = \left( 3 \sqrt{3} \mp 1 \right)^2
 q = 3 \sqrt{3} \mp 1

これが嘘なのだ。もう少し、何が嘘なのかを正確に言うと、
 q^2 = \left( 3 \sqrt{3} \mp 1 \right)^2 \quad \Longleftrightarrow \quad q = 3 \sqrt{3} \mp 1

この矢印は、実際は
 q^2 = \left( 3 \sqrt{3} \mp 1 \right)^2 \quad \Longleftarrow \quad q = 3 \sqrt{3} \mp 1

しか成り立たない。これを両矢印で成り立たせるためには、
 q^2 = \left( 3 \sqrt{3} \mp 1 \right)^2 \quad \Longleftrightarrow q = \quad \pm \left( 3 \sqrt{3} \mp 1 \right)

としなければならない。
つまり、求める qの値は
 q = 3 \sqrt{3} - 1 , \quad 3 \sqrt{3} + 1 , \quad -3 sqrt{3} + 1 , \quad -3 sqrt{3} - 1

の4つである。
さて、ではこの4つの解は一体何を意味しているのだろうか。それにはまず、連立された2式の解析幾何的な意味を考える必要がある。

fig.1は y=x-1 y= - \frac12 x + 2のグラフである。この2本のグラフの交点を求めるときは、多くの人は連立方程式を立てそれを解くであろう(華麗に2*2行列で解く人いたらごめんなさい)、こんな風に yを消去して:
 x-1 = - \frac12 x + 2
 2x - 2 = -x + 4
 3x = 6
 x = 2

と、 xの値を求め、これを2式のどちらかに代入して
 y = 1

を求めるのが定石だ。
先程は1次関数同士の交点を求めた。では次に1次関数と2次関数の交点を求める。

fig.2は y = (x-1)^2-1 y = -x +2のグラフである。
基本的にはこれも先程と同様に yを消去して
 (x-1)^2-1 = -x+2
 x^2 -2x +1 -1 = -x +2
 x^2 -x -2 =0
 (x-2)(x+1) =0
 x = 2 , \quad -1

これをいずれかの式に代入して
 (x, y) = (2, 0), \quad (-1, 3)

を得る。もう少し具体的に数式を並べてみれば、 yを消去してできた x2次方程式を解いて得られた値を、 y = -x +2に代入すれば
 x=2のとき:
 y = -2 +2
 y = 0

 x=-1のとき:
 y = -(-1) +2
 y = 3

となる。一方で y = (x-1)^2-1に代入すると
 x=2のとき:
 y = (2-1)^2-1
 y = 0

 x=-1のとき:
 y = (-1-1)^2-1
 y = 3

となり、先ほどと同様の結果になる。
非常に当たり前…のように思うが実はそうでもない。その証拠に、先程は yを消去することから始めた解答を、 xを消去して別解を作ってみよう。別にどちらの文字を消去するかは解答者の勝手である。あえて消すのが難しそうな方を選んだって、解けなくは無いはずだ。
 y = -x +2を変形し x = -y +2とし、 y = (x-1)^2-1に代入する。
 y = (-y +2 -1)^2-1
 y = y^2 -2y +1 -1
 y^2 -3y = 0
 y (y -3) = 0
 y = 3 , \quad 0

さて yの値が求められたので、これを使って xの値も求めてしまおう。 y = -x +2、もとい x = -y +2に代入すると、
 y=3のとき:
 x = -3 +2
 x = -1

 y=0のとき:
 x = 0 + 2
 x = 2

となり、 yを消去していくことで得られた解と同じ
 (x, y) = (2, 0), \quad (-1, 3)

を得られた。
では、今度は得られた y y = (x-1)^2-1に代入することによって解を求めてみよう。
 y=3のとき:
 3 = (x-1)^2-1
 3 = x^2 -2x +1 -1
 x^2 -2x -3 - 0
 (x-3)(x+1) = 0
 x = 3 , \quad -1

 y=0のとき:
 0 = (x-1)^2-1
 x^2 -2x +1 -1 = 0
 x^2 -2x = 0
 x (x-2) = 0
 x = 2 , \quad 0

となり、1つの yの値から2つの xの値が出てきてしまい、合計で4つの解
 (x, y) = (2, 0), \quad (-1, 3) , \quad (0, 0), \quad (3, 3)


が得られたことになった。fig.2を見れば明らかであるが、後半の2つの解はこの問題の解としては相応しくない。ではなぜこれらの解が出てきてしまったのか。
fig.2-1は y = -x +2のグラフと x = 2および x = -1を示したものである。交点はそれぞれ (2, 0) (-1, 3)となるが、つまりこのグラフは、 y = -x +2 x = 2, \quad -1を代入して yを求めている過程を示していると言える。
同様に、fig.2-2は y = (x-1)^2-1 x = 2, \quad -1を代入して yを求めている過程、fig2-3は y = -x +2 y = 3, \quad 0を代入して xを求めている過程をそれぞれ示していることになる。





さて、では問題の y = (x-1)^2-1 y = 3, \quad 0を代入して xを求めている過程である。fig.2-4がそれを示すグラフである。これを見ると、 y = (x-1)^2-1 y = 3および y = 0との交点が2つずつ、合計4つあることが分かり、この交点が正に、不適当な2解を含んだ4つの解
 (x, y) = (2, 0), \quad (-1, 3) , \quad (0, 0), \quad (3, 3)

を示している。これが、不適当な解が出てきてしまった原因である。すなわち、その yを満たす xが2つある2次関数に得られた yの解を代入してしまったために、連立方程式の解―グラフ上では2つのグラフの交点―ではないものも同時に求めてしまったのだ。

この記事の最初の問題に戻る。円の接線の関数を求める問題だ。
 q = 3 \sqrt{3} - 1 , \quad 3 \sqrt{3} + 1 , \quad -3 sqrt{3} + 1 , \quad -3 sqrt{3} - 1

この4つの解の意味について、もう細かく説明する必要はないだろう。問題のグラフはfig.3の通りである。オレンジの線が、 p = \pm \sqrt{3}を示している。この2本の線と円との交点4点が、先程の4つの解を示しているのだ。このうち2つの解は見てわかるように題意を満たしていない。この2つを含んだ4つの解があるなかで、更に \alpha ^2 = \beta ^2 \Longleftrightarrow \alpha = \betaという間違いを犯したことにより、間違った2点を選んでしまったのだ。
ではこの間違いを防ぐにはどうすればよかったのか。理論的には、4つの解についてそれぞれ2つの方程式を満たすかどうかを確かめれば良い(つまり、4つの解を 3p+q=1 \left( p+3 \right) ^2 + q^2 = 40に代入し、満たすかどうかを確かめる)のだが、もっと手っ取り早い方法がある。それは、 p = \pm \sqrt{3}を一次関数 3p+q=1に代入して qの値を求めようとすれば良い。そうすれば、交点は正しい2点しか出てこないからだ。このように、2次以上の連立方程式を解く際には、単純に代入して得られた解が本当に求めたい解なのか、そしてほしい解を得るためにはどちらの式に入れれば良いのかというのを考えながら解く必要がある。このときに、私が描いたようなグラフが解答作成の一助になれば幸いである。