担当授業のこととか,なんかそういった話題。

主に自分の身の回りのことと担当講義に関する話題。時々,寒いギャグ。

Feynman が学んだ微分積分学の教科書。

2024-04-10 20:02:23 | mathematics
いやー,ホント,何でもネットで手に入ってしまう時代であることだなあ。

Feynman が自伝的著作 "Surely You're Joking, Mr. Feynman!" の `A Different Box of Tools'(岩波現代文庫版『ご冗談でしょう,ファインマンさん』だと上巻かな?)で,いわば数学者相手に「ファインマン爆撃」をかまし続けたというエピソードの後に,高校時代に Bader 先生から,この本の内容をすっかり理解出来たらまたおしゃべりしてもいいから,と手渡されたのが Woods の "Advanced Calculus" だったという,さらなる過去の回想が述べられている。

それは当時 MIT の教授だった Frederick S. Woods 氏の著書で,1926 年に初版が出たらしい。次いで 1934 年にいくつかの修正が加えられた New Edition が出た。

さて,ここで気になることが一つ。1918 年生まれの Feynman 氏は 1935 年に MIT に入学している。彼が学んだのは Woods の旧版と新版のどちらだったのであろうか?

そして他にも気になることがいくつかある。

Feynman 氏が MIT に在籍していた中で, 著者の Woods 氏と対面する機会はあったであろうか?

もしその夢の対面が実現していたら,Feynman 氏の自伝にそのエピソードが語られているはずである。何しろ彼はすっかりその本の虜になってしまっていたのだから!

残念なことに,ちょうど 1934 年に 70 歳を迎えたであろう Woods 教授は MIT を退職されていたようである。まさに Feynman 氏と入れ替わりであって,夢の対面は実現しなかったものと思われる。

もう一点。`A Different Box of Tools' の締めくくりは,Woods 本で学んだ積分記号下の微分(積分と微分の順序を入れ替える計算操作。俗に Feynman trick と呼ばれることがあるが,Leibniz の積分規則といい,微分積分法の黎明期にすでに編み出されていた古の計算技法である)のおかげで,MIT や Princeton の理系の秀才たちが,彼らが学校で習った標準的なやり方で求められずにウンウンうなっている積分の計算を,自分は積分記号下の微分でたいていうまく求めてしまったものさ,と締めくくっているのだが,出し抜かれた他の秀才たちがなぜその計算技法を知らなかったのか,という疑問である。Woods 本は当時の標準的なテキストではなかったのだろうか?

ちなみに,このエピソードが私にとっては印象的過ぎて,うまくいっているとは思えないが,2 変数関数の微分積分学を教える際に,積分記号下の微分法をほんのわずかでも紹介するよう,意識するように心がけている。

もっとも,このエピソードが語るところは,教師に教わったことなんかよりも,自ら進んで楽しみながら学び取った知識の方が断然役に立つんだもんね,といったことであろうから,私のなけなしの配慮など,何の役にも立っていないだろうという気しかしないのであるが。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

アインスタイン全集(全 4 巻)。

2024-04-10 18:41:46 | physics
先に結論を申し上げると,古書店で入手できるようだが,買うのは見送ることにした,である。


数理論理学の研究者であった前原昭二氏 (1927--1992) の晩年の著書『線形代数と特殊相対論』(日本評論社,1993 年)の巻末の「文献案内」に,1922 年から 1923 年にかけて改造社から出版された『アインスタイン全集』なるものが挙げられているのが目に留まった。

前原氏は,これは非売品であるが,1947 年か 1948 年に古本屋で求めたという。

この非売品というフレーズと,改造社という,聞いたことがあるような内容な出版社名が気になり,まずは国会図書館デジタルコレクションで検索してみた。

その結果,「送信サービスで閲覧可能」というステータスで所蔵されていることが分かった。

訳者の一人である石原純氏はちょうど 1947 年に亡くなっている。前原氏が古本屋で見つけたのは,石原氏の遺品だったのではなかろうか,などとつい妄想を逞しくしてしまう。

ところで,翻訳書の著作権というものがどのような扱いなのか知らないのだが,仮に著作者が石原氏であった場合,死後 70 年が経過しているので,著作権保護期間は満了していそうなものである。けれども,国会図書館の判断は「まだ満了ではない」もしくはその確認が取れていない,ということのようだ。

訳者は他に二名いるので,それらの方々に由来する著作権保護期間満了がまだ先のことなのかもしれない。

あるいは,原著者に相当する Einstein 氏が亡くなったのは 1955 年のことで,著作権者を Einstein 氏に帰するということならば,満了は来年あたりということになりそうである。

非売品であったという話はとある古書店のブログ記事にも記されていた。そこの在庫は売り切れたようであるが,ネットの検索結果によると,4 巻セットが税込みで 25,000 円あたりが相場らしい。税込み 19,800 円というものもあった。ビミョーに手が届くお値段ではあるが,買うのは,うーん,やめておこう。

どうでもいいが,前原氏の『線形代数と特殊相対論』と同時に手に取った本は彌永昌吉氏の『幾何学序説』であるが,前原氏の「文献案内」に『幾何学序説』が挙げられており,氏がかつて彌永氏の,その『幾何学序説』の下地となった講義に出席していたとの思い出が語られている。2 冊とも B5 版であるので,重ねて私のカバンに詰めたのだが,その偶然をこれら二氏の霊はどう感じられたであろうか。

さて,改造社という気になる会社のことも調べたところ,例によって Wikipedia の解説記事に目を通すこととなった。そこには確かに改造社の招きでアインスタイン博士が来日したとある。さらには,湯川秀樹氏がその際にアインスタイン氏の講演を聞き,それがきっかけで理論物理学の道を志したとある。

はて,そんなドラマティックな話だったっけな?

Wikipedia のそのくだりにはなんの出典も示されていない。だが,私は湯川氏の手になる『旅人 ある物理学者の回想』(もとは朝日新聞社から刊行され,現在は角川ソフィア文庫の一冊として出版されている)の「波と風と」の章にアインシュタイン来日の話を記しているが,

アインシュタインが折角京都で講演したのに、私は聞きに行かなかった。

とはっきり述べている。このように当人がはっきり述べているのだから,Wikipedia の記載は明白な誤謬である。それもそのうち正さねばなるまい。

なお,後に三高で湯川氏の同期生となった数学者小堀憲(あきら)氏は講演を聞いたそうである,とも述べているが,そちらはアインシュタイン氏の講演を聞いたにもかかわらず,理論物理学ではなく数学の道に進んだのであるから,講演に感銘を受けた当時の日本の青少年が理論物理学を志すという「アインシュタイン効果」のほどがますます怪しくなってくる。

湯川氏と同世代の物理学者といえば朝永振一郎氏がすぐに思い浮かぶが,幼少期の思い出を記した文を探すのは少し手間がかかりそうであるので,その作業は保留にしたい。

近年,ノーベル物理学賞を受賞した南部陽一郎氏は 1921 年生まれで,アインスタイン博士来日は大正十一年の十一月,つまり 1922 年のことであるから,1 歳ほどの幼児がそもそもアインシュタインの講演を聞いたとは思われない。一般ゲージ理論の生みの親である内山龍雄氏といえども 1916 年生まれで,6 歳,現在でいえばちょうど就学児童になるばかりの頃に講演を聞いて早々に将来の道を決めたとはありそうにないことである。

そんなわけで,日本物理界のどんな大御所が実際にアインスタイン効果を受けたのか,という別の興味が湧いてくるが,今流行りの AI の助けを借りるなどすれば調査がはかどるであろうか。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

場合分けと 2 進数。

2024-04-10 16:19:32 | 情報系
場合分けが複数あるとき,各場合に一意的な識別番号 (id) を割り振って,その id がこれこれのとき,こうしろ,といった具合に作業を整理すると考えやすいように思われる。

そのような番号の割り振りをどう行うかについてであるが,まず,ある状況が,Cnd1 から Cnd N までの N 通りのいずれか一つに当てはまる,といった,あらゆる状況をすべてカバーした場合に分けられているものとする。

そのとき,例えば条件が Cnd 1 から Cnd 4 まであるとして,Cnd 1 と Cnd 3 は成立するが Cnd 2 と Cnd 4 には当てはまらないような場合には 1010 というコードをあてがう。

あるいは,Cnd 4 のみ成立し,他はすべて成り立たない場合は 0001 をあてる。

これは,ちょうど N ビットの 2 進数の,上から数えて k 番目(最上位を 1 番,最下位を N 番とした場合)のビットを,Cnd k が成立するなら 1,成立しないなら 0 と置くやり方である。

このようにすると,N 種類の条件が成立するかしないか,区別できるのは 2N パターンあるわけだが,それらをちょうど N ビットの 2 進数で識別できるようになる。

数学で同じようなアイデアに出会うのは N 個の要素だけを持つ有限集合の部分集合が何通りあるかを数え上げるときである。その集合の各要素につき,それを入れる,入れないの 2 通りの状態が考えられるので,場合の数の積の法則により,部分集合が全部で 2N 個あることがわかる。

今回の作業用の識別子という言い回しで,私はベルトコンベアーに載ったバーコード付きの商品を思い浮かべるのである。

バーコードを機械が自動的に読み取り,その内容に応じて行き先を分岐し,商品は行き着いた先でそれぞれの加工を受ける,といった様子を想い描いているのである。

なお,このようにしておくと,例えば条件 3 が成立しているような場合全体を一括して扱いたい場合は,識別子の上から 3 番目のビットが 1 であるような場合かどうかを調べる,といったシンプルな処理が可能となる。

そもそも機械語あたりで必須と言えるであろう,とある処理の結果や,システムの状態をフラグなるもので表すという発想が,私が言うところの識別子に他ならない。

そんなわけで,ここで述べたようなアイデアはおそらく至る所で使われている,基本的なものに違いない,と期待している。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

CASL II で FizzBuzz る。

2024-04-10 12:03:01 | 情報系

FizzBuzz 問題とは



基礎的なプログラミング能力が身に付いているかどうかを確認する試金石として,次のような問題が知られている。

1 から 100 までの数を順に表示するプログラムを作れ。
ただし,3 の倍数は数字の代わりに Fizz,5 の倍数は Buzz,3 と 5 の両方の倍数のときは FizzBuzz と出力するものとする。

これはもともと,複数人が集まった時に順に数字を言い合う遊びとして知られるものだそうで,2007 年に Imran Ghory という人がブログでブログラマ志望者を篩い分けるのにちょうどよい課題ではないかと提案したのが,プログラミングの世界における FizzBuzz 問題の起こりである。(後述の「起源」の項目を参照のこと。)

この問題を自力で解きたいという方は,以下の「出会い」と「起源」までは目を通していただいても構いませんが,それ以降は読まないことをお勧めいたします。

なお,通常は 1 から唱え始めるもののようだが,0 から始めるとすれば,それは 15 の倍数なのだから,ゲーム名の「FizzBuzz!」を叫んでゲームを開始することになるので,trivial かつ「ど」minor な改変として,「0 から 100 までの数」にすることを提案したい。

FizzBuzz 問題との出会い



私が初めて FizzBuzz 問題というのに触れたのは 10 年ほど前かなと思って自分のブログ記事を検索してみたら,7 年前の秋のことであった。

そこには,十進 BASIC で作った解答が載せてある。

今回はそれをオワコン(号泣)の CASL II で書いてみようというわけである。

なお,十進 BASIC の方は保守が非常に行き届いており,久々に公式サイトを覗いてみると,Mac や Linux (Intel 系?),Raspberry Pi なんていう変わり種にまで移植されていて,オラびっくりこいただよ。

極めつけは Chromebook かな。ちょうど一年前に Chromebook を購入して(使い辛いので全く使っていないが)試した覚えがある。私が買った機種は Arm 系の CPU だということを突き止めるのに小一時間費やしたが,無事に十進 BASIC が稼働して感激したのは懐かしい思い出である。もっとも,Chomebook では設定画面で開発者モードとかそんな感じのをオンにすれば Linux が使えるので,十進 BASIC が Linux に移植された時点で Chromebook もオマケで参加に入ったということであろう。

余談ついでに,CPU の違いは OS が吸収してくれるものではないかと思っていたのだが,そういうものでもないらしい。一番人間に近い側のアプリにおいて OS や CPU の違いを意識せずに済むように,OS が中間管理職よろしく,ヒトとハードウェアの間を取り持つ「被せ物」になっているという私の素朴な認識は正しくないということなのだろう。

ところで,7 年前ならばまだ CASL II が現役でブイブイ言わせていた時代(今となっては晩年と言い表すべきか)なので,そのときに CASL II で FIzzBuzz に挑戦するのが妥当だったであろう。当時の記憶は全く残っていないが,11 月 1 日付けのブログ記事であることから察するに,その季節は例年後期の半ばの大学祭休みで体調を崩すので,そんな中でちょこっとだけ遊んでみたといった程度であったろう。しかるに,ろくにマスターしていないアセンブラ言語なんぞを学び直そうという気力はなかったに違いない。


FizzBuzz 問題の起源



ついでながら,7 年前に参照した Jeff Atwood 氏のブログ記事 "Why Can't Programmers..Program?" の日本語訳が読める日本語で書かれたブログはいくつか健在である。この記事を書いている現在,日本語版の Wikipedia の Fizz Buzz の項目には,FizzBuzz 問題の解答となるソースコードを書けるかどうかでプログラマ志望者を選別する面接手法を Jeff Atwood 氏のブログ記事に由来すると記しているが,それは誤りである。

上に引用した "Why Can't ..." の記事において,Atwood 氏は Reginald Braithwaite のブログ記事 "Don't Overthink FizzBuzz"(「FizzBuzz 問題について深刻に考え込まないようにね」といった意味合いだろうか)を読んだ感想から始めている。

その引用元である Reginald Braithwaite 氏のブログ記事は,Imran Ghory 氏のブログ記事から,自身のジャグリングに関するブログ記事をたどってきた人たちがいることに気付いた,という出だしで始まっている。その Imran Ghory 氏のブログ記事は,かつて Imranontech.com というドメイン名のサイトに掲載されていたと見られ,Atwood 氏と Braithwaite 氏はともにそのサイトへのリンクを貼っているが,2024 年 4 月現在,そのドメインは空き家となっている。代わりに imranghory.org というサイトがあり,そのトップページに,

In 2007 I invented the Fizzbuzz interview question for developer competence.

と記しており,そこに貼られたリンク先には,Fizz Buzz Test というタイトルのまとめ記事(スマホ向けのレイアウト??)があるが,そこで Source として挙げられた元記事 "Using FizzBuzz to Find Developers who Grok Coding" へのリンクは wordpress のブログ記事のように見えるものの,やはり売りに出されている Imran On Tech (imranontech.com) にリダイレクトされてしまうので,現時点で私はこれぞという原典にたどり着けないままでいる。

ただし,Jeff Atwood 氏に FizzBuzz 問題の提唱者を帰している日本語版 Wikipedia の記述は間違っていると判断してよいであろう。それは自称プロオタク (professional geek) の Imran Ghory 氏であると訂正せねばなるまい。なお,とりあえず英語版だけ確認したところ,FizzBuzz 問題の由来に関しては 1 ミリも記述がない。というか,プログラミングにおける FizzBuzz 問題の項目自体に一つも出典が明記されていない。

ところで,FizzBuzz という単語でネット検索をすると様々なプログラミング言語,および,様々な「縛り」を課した下での解答がたくさんヒットする。まさにそのような方法で個別にプログラムを収集することは可能であるが,いろんなプログラミング言語における解答をまとめたサイトがあると面白いかなと思う。先ほど触れた Fizz Buzz Test というサイトはややそれに近い。最近,hello, world プログラムの Wikipedia 記事も読む機会があったが,英語版の方には,サンプルプログラムとして hello, world を挙げている数多くのプログラミング言語の Wikipedia 記事へのリンクリスト (Wikipedia articles containing "Hello, World!" programs) が掲載されているので,それらを覗きに行くだけでもとても楽しいブラウジングができそうである。残念ながら日本語版にはそれがない。手打ちで作成したのだとすると大変だが,そのようなリストを自動生成する方法があるようなら日本語版にも同様のリストを追加したいものである。Wikipedia の書き方のヘルプ項目のうち,リンクの項目を見たとき,「東海大学」のページに対して 4,000 以上のリンクが貼られているなどの話(Wikipedia: リンクのしすぎで危機状態)が載っている項目に行き着いたことがある。それをどうやって調べるかというと,Wikipedia の各項目のページにある「元リンク」というメニューをクリックすると,その記事にリンクを張っている,Wikipedia 内の他のページの一覧が表示されるのである。それをうまく使えば hello, world プログラム一覧が容易く作成できそうな気はしている。が,それをすぐにどうこうというわけではない。

他に,全く別の記事であからさまな誤り(と思しき記述)が記載されている項目もあるのだが,そちらももう少し調査を詰め次第,訂正するつもりでいる。


CASL II で解答を作る際の困難



本題に戻ろう。

仮想アセンブラ言語 CASL II で Fizz Buzz プログラムを作るのは,なかなか大変である。

Fizz Buzz プログラムというのは,1 から 100 までの数を順に表示するプログラムであるが,3 の倍数で 5 の倍数でないときは Fizz,3 の倍数でなく 5 の倍数のときは Buzz,そして 3 と 5 のどちらの倍数でもあるとき,つまり 15 の倍数のときは FizzBuzz と表示せよ,という条件付きである。

それをどう実現するかを,プログラミング志望者は自分が知っているプログラム言語で,与えられた制限時間内にプログラミングしなければならない,というのが,プログラマ採用面接試験でほどよい課題ではないか,という話である。実際に企業等での採用面接現場においてどのくらいこのテストが行われてきたか,もしくは行われているかはわからないが,何がしかのプログラミング言語の基礎的なことを一通り学んだ後での演習問題としては手ごろであると思う。

その理由として私が考えるのは次の通りである。


  1. 番号を 1 から 100 までカウントするのに,通常,for 文のような基本的なループ制御が必要となる。
  2. 番号が 3 の倍数であるかどうかといった判定に,四則演算,特に,ある数がある数の倍数であるかを見分ける方法が必要となる。
  3. 番号が 3 の倍数であって 5 の倍数でなければ Fizz と表示する,といった,if 文のような基本的な条件分岐制御が必要となる。
  4. 条件分岐の際に,あるデータが指定された条件を満たしているかどうかの判定が必要となる。
  5. 結果をモニタ等に出力する,基本的な入出力の方法が必要となる。


かなり細かく分ければこんなところであろうか。

ここで,CASL II というアセンブラ言語において,もっともハードな項目は 5 である。

CASL II では OUT というマクロ命令を使用して標準出力(パソコンなどの画面と考えてほぼ差し支えないが,Windows にしろ Linux や Mac にしろ,実際にはモニタ画面上に表示される「窓」(ウィンドウ)などで結果を表示する,などと述べるのがより正確であろう)に文字列等を表示することができるが,現存するシミュレータの中には OUT 命令をサポートしていないものもあるため,自作プログラムの動作確認があまりお手軽ではない。

そういった環境問題だけでなく,CASL II そのものに由来する大問題が一つある。それは,カウンタ番号を数字として表示するのが一番難しいということである。

実は Fizz だの Buzz だのといった文字列を表示する方が簡単なのである。CASL II では文字定数というものが使えるので,
         OUT F3,LEN
F3     DC 'Fizz'
LEN  DC 4

のような命令群で,標準出力装置に Fizz という文字列を表示することが可能である。

OUT F3,LEN というのは,F3 というラベルが貼られた番地内のデータを,LEN で指定された文字数分だけ標準出力に出力せよ,という命令であって,表示したい文字列そのものを文字定数という形式で 'Fizz' のようにそのまま記述することが許される。

なお,CASL II(の最終版)ではリテラル(直値,即値。イミディエイト (immadiate) とも呼ばれる)という記述方式が認められているので,それを利用すると,先ほどの 2 つの DC 命令の行を省いて

OUT ='Fizz',=4

のように記述することも可能である。これは,先に示したプログラム(の一部なので,プログラム片とでも称すべきであろうか)において,F3 に Fizz という文字列を,LEN のところに 10 進表示の数 4 を代入したものに相当する。CASL II の仕様では,むしろ逆に後に示した 1 行プログラムの方を先に示した 3 行プログラムに相当するものに変換してアセンブルされるものとなっている(IPA 公式の資料■アセンブラ言語の仕様「2.5 機械語命令」参照)。

ただし,OUT 命令は機械語命令ではなくてマクロ命令のグループに属するため,1 行プログラムのようなリテラルを用いた記述を許すのかどうかはグレーゾーンである。したがって,OUT 命令でリテラル形式を認めるかどうかはシミュレータ作成者の判断に委ねられるというのが私の見解である。

Daytime さん作のシミュレータでは,リテラルを用いた次のような 1 行プログラムがちゃんと通る。
TEST START
          OUT ='hello, world',=12
          RET
          END

ただし,その挙動には 1 つの疑問が残る。

それは,RET 命令を書くべきかどうかである。初め,私は RET は不要だと考えて書かなかったのだが,シミュレータは作業の終わりどころが掴めないらしく,しばらく経つと hello, world を 2 行目,3 行目,・・・,と延々と繰り返し書いていくのである。どうやら無限ループになってしまっているらしい。

どうやら,END 命令はプログラムの終わりを定義するものの,プログラムの実行の停止を意味するものではないらしい。

そういうわけで,実質的にプログラムの実行を停止させるのは RET 命令のようである。これは,このプログラム TEST を実行し終えたよ,ということで,プログラムを終了し OS に制御を戻す印である(仕様の「3. プログラム実行の手引」内の「3.1 OS (4)」)。今後は RET を書くのをサボらないように気を付けたい。

CASL II シミュレータを自作したいと常々思っているものの,そうしないでいる要因の一つは,仕様を隅々まで正しく理解できている自信が全くないところである。少なくとも私には公式の仕様だけを頼りに,その仕様の通りに正しく動作するシミュレータを作ることは無理そうである。

話を戻そう。Fizz だの Buzz だのを出力するだけならお安い御用だ,ということは分かっていただけたのではないかと思う。

問題は,普通の数字である。Fizz Buzz ゲームは,もとは数人で順番に 1 から数字を言っていき,3 の倍数が当たったら Fizz という,といったルールの遊びなので,我々が日常的に使用している 10 進表示で標準出力に表示したい。

ところが,カウンタ変数内の数字は内部的には 16 ビットの 2 進数として扱われているので,それを 10 進表示の数に直すのには少なくとも 2 つの工程が必要となる。

まず,16 ビットの 2 進数を 10 進表示に直す。具体的には,その 2 進数を 10 進数に直したときの,100 の位,10 の位,1 の位の数を読み取る。

そして,その読み取った結果を 10 進数に見える数字の並びで出力する。これはつまり,数字を文字列として扱うことを意味する。

CASL II の OUT 命令で出力できるのは文字列である。それは内部的には各文字に対応する文字符号(文字コード)という 2 進数として扱われる。

CASL II では JIS X 0201 という規格で定められた文字の符号表を用いることになっている。したがって,例えば,3 の倍数でも 5 の倍数でもない「普通の」数 31 を表示させるには,
 OUT ='31',=2

のような記述が必要である。これをうっかり
 OUT =31,=2

のように書いてしまうと,=31 は 10 進数の 31 に相当する数値,に相当する文字符号とみなされる。

まず,10 進表示の 31 は 16 ビットの 2 進表示で

0000 0000 0001 1111

となる。これを 16 進表示に直すと,CASL II では 16 進数であることを示すのに,冒頭に # を付ける習わしなので,

#001F

となる。この 1 語(=16 ビット)の上位 8 ビットは,OUT 命令においては OS が無視するので 00 であってもなくてもどちらでもよい。

肝心なのは下 8 ビットの 1F の部分であるが,上位の数字が 1 のときは「制御文字」というゾーンに属していて,数字やアルファベット,記号から外れるため,標準出力にはおそらく何も表示されない。

少なくとも,我々が期待する「31」という,3 という数字と 1 という数字の 2 文字からなる文字列は決して表示されないのである。

このようなわけで,2 進数を 10 進数風に変換する手続きと,10 進数として各桁の数字をちゃんと並べた文字列を出力する機構を自前で用意しなければならない,という苦難を無事に乗り越えなければならない。

そんなわけで,CASL II 学習者にとって,この問題は入門コースの卒業試験としてはいささかレベルが高いように感じられる。初級,もしくは中級の試験問題といってよさそうである。

上級コースの試験はさしずめビット列操作であろうか。それは結局,基本情報技術者試験の問題がそれに相当すると言ってよいであろうが。


暫定案



解答のプランのみを記しておく。

2017 年の自分の十進 BASIC による解答と本質的には同じアイデアに基づく。

というか,その記事を書いたことはすっかり忘れていたのに,CASL II のプログラム案を書き上げた今,その記事を読み直してみると,同じ発想に基づいた解答であることに気付いた。中の人が同じであるから当然とも言えるが,無意識に当時考えたことを思い出したのであろう。

1 から 100 まで,カウンタの値を 1 ずつ増やしていくわけだが,そのメインのカウンタだけではなく,次の 2 つの補助的なカウンタを自前で用意しておく。

  • 1, 2, 0 を繰り返す,周期 3 のカウンタ,かっこよく言うと,メインカウンタの値を 3 で割った余りに相当する,mod3 カウンタ。
  • 1, 2, 3, 4, 0 を繰り返す,周期 5 のカウンタ,名付けて mod5.

ただし,CASL II ではラベル名には英大文字と数字しか使えない(ラベル名の最初の文字は必ず英大文字)。また,CASL II には変数という概念もない。実際に使用するのは汎用レジスタと呼ばれるものであるが,プログラムを作成する際に初めから汎用レジスタのどれをどういった役割のカウンタに使用するか,という割り当てをすると,私はこんがらがってくるので,仮に小文字を用いたラベルの変数をこうして用意しておき,一通りプログラムが完成したら,小文字変数ラベルのところを対応する汎用レジスタ名で置き換えていくと作業がしやすいのではないかな,と考えている。

これらのカウンタは,例えば mod3 の値が 3 になったら,その段階で mod3 の値に 0 を代入してこのカウンタをリセットすることにすれば,「3 で割る」といった操作をどう実現すればよいか,頭を悩ませる必要がなくなる。また,このときは Fizz と表示させることも忘れてはならない。

このように,「3 の倍数であるか」,「5 の倍数であるか」という判定を行うのに,除法を用いず,周期 3 や周期 5 のカウンタを用意することで代用するというのは,CASL II だからこその工夫である。なにしろ,CASL II では除法や剰余(余り)を求める手続き自体,自分で一から組まなければならないのである!

さて,3 の倍数であるかどうかだけを判定し,そうであるときとそうでないときとで異なる出力をするということなら問題は比較的単純なのだが,5 の倍数かどうかも考えねばならず,3 と 5 の公倍数であるときにはまた違った動作が要求される(文字列の結合が手軽に扱えるプログラミング言語であれば,公倍数のときに特別な処理を考える必要はない)。

落ち着いて考えれば,このプログラムは 4 通りの異なる出力を行う必要がある。

3 の倍数でも 5 の倍数でもなければ,カウンタの数字をそのまま出力する。

3 の倍数であって 5 の倍数でなければ Fizz と出力する。

3 の倍数でなくて 5 の倍数であれば Buzz と出力する。

3 の倍数であり,5 の倍数でもあれば FizzBuzz と出力する。

こうして並べてみると(表にまとめるのがもっと分かりやすいが),ちょうど 4 通りであるから,2 ビットの符号をこれらの場合に割り当てて識別するのはどうか,というアイデアに自然と導かれるであろう。

例えば,2 ビットの変数 cases を用意しておき,cases が 2 進表示で 00 のときが数字そのまま,01 のときが Fizz,10 のときが Buzz,11 のときが FizzBuzz のように,cases の値に応じて 4 通りのどの出力を行うかを分岐させればよい。

なお,互いに排反な(どの 2 つの場合も同時には起こり得ない)場合に分けてあるので,どの場合に相当するかの篩い分けをする際,関門は 3 つ用意するだけで済む。

というわけで,例えば次のような部分的な擬似 CASLL II コードを書けば良いことになる。
CPA x,y というのは算術比較という命令で,SF (Sign Flag) と ZF (Zero Flag) という 2 種類のフラグレジスタ (FR) の値が,この順に,

x<y のときは 10 に,
x=y のときは 01 に,
x>y のときは 00 に

セットされる。これは x-y が算術減算とみて負になるか,ちょうど 0 になるか,正になるかということに相当していると考えればよいだろう。

このように比較した結果に応じてそれぞれの場合の処理を行わせるには,分岐命令と組み合わせるのが常道である。

このような,「比較演算」+「結果に応じた分岐処理」というのがプログラミングの要である。

そして分岐処理のうちに「跳躍」(飛躍)が含まれていないと,プログラムが冗長にならざるを得ない(for 文や do loop 文なしで if 文だけで,1 から 100 までの数字の和を求めるような繰り返し処理を実現しようとしたら,非常に長いプログラムになりそうである。そう考えると,同型の処理をまとめておいて,それを繰り返し呼び出して用いる for 文などは再帰的な処理の一種とみてよいのであろう)。

というわけで,識別子 cases の値が 01 のときの処理を記すと,
 CPA cases,=1
 JMI NUM ; cases<1 のとき,つまり cases=0 のときはカウンタの値の数字をそのまま出力する処理(ラベルを NUM とした)に移る。
 JZE F3 ; cases=1 のときは ZF=1 なので,この分岐命令で Fizz のみを出力する処理(ラベルは F3)に移る。
 CPA cases,=2 ; 上の分岐命令で飛ばされていないということは cases=10 または cases=11 のときである。
 JZE B5 ; cases=2 のときは ZF=1 なので,この分岐命令で Buzz のみを出力する処理(ラベルは B5)に移る。
 OUT ='FizzBuzz',=8 ; ここまでの分岐命令で飛ばされずにここまでたどり着くのは cases=11 のときだけであるから,FizzBuzz と出力させる。
 JUMP LOOP ; 一連の繰り返し処理の最初に戻る。 

といった感じになる。もちろん,この数行をシミュレータにコピペしただけではプログラムは動かない。というか,そもそもアセンブルエラーが出て,実行以前の状態に留まるであろう。

また,実際の CASL II プログラムの一部として使用する場合には,cases という変数名のところに,汎用レジスタ GR0 から GR7 までのどれか,他の用途に用いていない,空いているものを当てはめて,そのレジスタ名ですべて置き換える必要がある。

ところで,こういう,アセンブラ言語をほんの少しだけ高級にしたものを,アセンブラを通るような正式のプログラムに直す段階に何か名前はついているのだろうか?

アセンブラ言語で書かれたプログラムを機械語に直すのは「アセンブル」というそうで,それを機械ではなく人間が行う場合は「ハンドアセンブル」などというらしい。

cases を GR3 などと手で書き換えていくのはハンドアセンブルに近いので,なんかそういったカッコイイ呼び方があると嬉しい。

今回紹介したかったのは,場合分けをスムーズに行う場合,各場合に対応する「識別子」を自分で設定して,その識別子に応じた処理を別に考えるとよいのではないか,というプログラミング方針である。

そしてそれは 7 年前,2017 年に一度このブログで同じ話題を取り上げたことがあり,その繰り返しになってしまった,というのがオチである。

ともかく,ここにはソースプログラムを挙げないが,普通の数字の表示をさぼって,3 でも 5 でも割り切れない数字は全て * と表示する簡易版は完成しており,Daytime さんのシミュレータで(おそらく)正しく動作していることを確認した,とだけ報告しておく。

Daytime さんの CASL II 講座の方にも解説があるようだが,2 進数を 10 進表示に直すといったミッションについてはまだ考えていないので,そちらの実装もうまくいったら続編を書くかもしれない(し,書かないかもしれない)。


トホホのホ~ (;´д`)
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

xyzzy に侮られる。

2024-04-05 12:39:58 | 情報系
xyzzy を導入したので,ほんの少しだけ遊んでみた。

とりあえず LaTeX ファイルを編集できるようになったら嬉しいな,と考えて,設定メニューを探していたら,ツールに (>_<) という可愛らしい顔文字があったので,迷わずそれを開いてみる。

すると,ハノイの塔やら五目並べやら,確か本家の Emacs にもあったメニューが並んでいた。

まずハノイの塔を選ぶと,7 段のハノイの塔が,円板がパタパタと移動するアニメーション付きであれよあれよという間に解かれていく。

もしかすると段数もある程度選べるのかもしれないが,それはともかくとして,これらの機能は M-x で実行することができる。

Meta キーという UNIX 系のキーボードに備わっていたキーは Windows 用のものにはついていないが,通常,Alt キーを Meta キーとして使えるような設定(キーバインド)が用いられる。

xyzzy も,もとからそのキーバインドになっている。そこで,M-x と押すと,バッファウィンドウというところに M-x: と表示されるので,そのまま gomoku と打ち込む。

そうすると五目並べ―モードが発動し,小さいポップアップウィンドウ(いうなれば吹き出し)に,英語表記ではあるが,「私に先手を譲ってくれますか?」と対戦相手であるコンピュータからの申し入れが表示される。

仕方がないなぁということで,Yes を選択すると,先手側のコンピュータが嬉しそうに O を打ち込む。

後手の私はカーソルで石を打つ場所を選んで X を打ち込む。

五目並べというのは,私の感想としては,後手が先手に振り回されるゲームである。ちょっとぼんやりしていると両端の空いた「三」が作られ,打つ手を間違えると両端の空いた「四」へと成長し,その次のこちらのターンでこちらが五目を完成させる見込みがなければ,つまり,相手が自分の手を完成させることを優先してこちらのリーチを見逃してくれていないかぎり,相手の「四」が盤面に登場した時点でこちらの負けが確定する。

気を付けて差し手を考えているつもりだったが,あやしい飛び四が現れたときに,その間を埋めれば五目が完成することに気付かず,別のところに指してしまった。

その結果,全部で 10 手もいかないくらいで一局が終了したわけだが,エコー領域と呼ばれる部分に「弱すぎ!」とこちらをディスるメッセージが表示されたのを私は見逃さなかった。

先手は譲ったものの,勝ちまで譲るつもりはなかったのだが,致し方ない。

三×三のマス目に〇と×を交互に並べていくスタイルでおなじみの三目並べは先手と後手が互いに最善手を指し続けると引き分けになる。

これは経験上,誰しも感じていることであろう。

それでは五目並べも同じように引き分けになるゲームなのであろうか。

先ほども述べたが,私にとって五目並べは先手が次々と五目を完成させようと仕掛けてくるのを,後手が神経を削りながら,文字通り後手に回りつつ阻止するゲームであって,後手が先手を出し抜いて下剋上を果たすのは極めて望みが薄いように感じている。

自分が先手であるとき,差し回しが下手だとダラダラと続いてしまうが,ちょっと気を付けいれば後手の企みはことごとく潰すことができる。

逆に自分が後手であるときは,先手が次から次へと対応を迫ってくるため,いつ罠にかけられるかとビクビクして落ち着かない。そんな気色悪さがある。

Wikipedia で確認したところ,禁じ手がないルールだと先手必勝であることが,明治時代,1899 年に黒岩涙香という人が必勝法を発見したことで判明しているとのことである。

そういや,つい最近,オセロは引き分けゲームらしいというのがコンピュータの支援の下で検証されたというニュースがあったっけな。

1899 年といえば,私がすぐ思い浮かべるのは David Hilbert が Grundlagen der Geometrie(幾何学の基礎)という著作を発表した年である,ということくらいである。

それとは関係ないが,Giuseppe Peano が,今日 Peano の公理系の名で呼ばれる,1 のすぐ次の数は 2,2 のすぐ次の数は 3,といったような,カウント(数える)という行為に根差していると思われるスタイルで自然数とはどういう体系であるのかを数学的に明快に特徴付けた理論を Arithmetices Principia という書籍で出版したのが 1889 年,自然数から実数に至るまでの道筋を数学的に示して見せた Richard Dedekind の Was sind und was sollen die Zahlen?(数とは何ぞや,そして其は何であるべきぞや)の 1888 年の登場にタッチの差で及ばなかったところであった。

それもまた別の話。

ところで,本家の GNU Emacs の最新版は 2044 年 3 月 27 日付けの GNU Emacs-29.3 のようだが,あえて xyzzy を利用しようとせず,素直に本家の方を導入する方が良いのではないか,と言われれば,まったくもっておっしゃる通りである。

だが,本家が提供してくれる超高機能な統合開発環境を使い倒すのではなく,ほんのちょっと出来心で Emacs LISP をいじってみたい,という軽い遊び程度なら,日本で生まれた xyzzy がとても手軽でお手頃のように思うのである。

今のところ,xyzzy の設定を elisp ファイルだっけ,そういうのをちゃんと作って行おうとか,本家をインストールして,腰を据えて使おうとか,そこまで大事には考えていない。

春休みがもう終わってしまったので,これから 4 か月ほどは遊べなくなってしまうし。

この春休みは,今年こそじっくり勉強するぞと思っていたのに,何もせずに,何もなせずに,いたずらに時間が過ぎてしまった。毎年繰り返していることは今年も起こる。そうか,それを数学的帰納法と人は呼ぶのだな。

Wikipedia の気になる記事に手を入れてみようとか,日本語版がまだない項目のいくつかを,英語版を翻訳して立ててみようかと夢を抱いていたが,ちょくちょく誤植と思われる個所を訂正したり,リンク切れになっているところを,移動先の URL に貼り直したりといった保守作業をちまちまやっただけで終わった。

最近興味が再燃した CASL II も今やオワコンだし,xyzzy も最後の版から 10 年が経過しているし,それでもどちらも Windows 11 で使えるよ,といった簡単な報告に終始したわけだが,それが私という人間の嘘偽りのない能力そのものなのだから,受け入れることとしよう。

それでは,思い出の一枚を添付して筆を擱く。

xyzzy の編集画面を Ctrl+x 2 で上下 2 段に画面を分割し,上の画面には LaTeX 文書(ファイル名は test.tex)をべた書きし,下の画面で M-x shell で何か(おそらくコマンドプロンプトという名称の,cmd.exe)を起動し,ファイルを編集しているフォルダが作業フォルダとなっているので,そのまま

>platex test

と打ち込んでコンパイルし,コンパイルが通れば test.dvi というファイルが生成されているので,それを

>dviout test

で閲覧すると,DVIOUT というプレヴューアの別ウィンドウが開いてそれが表示される,といった流れである。

xyzzy と DVIOUT のウィンドウを仲良く並べて撮影した記念撮影がこちら。↓
春休み最後の日の思ひ出。
Windows キー+Shift+S で,はい,チーズ!(パシャリ)



あ,積分の中の dx の前に \, で小さな空白を入れるのを忘れていたけど,まあ,五目並べにあっさり負けたくらいぼさっとしているので,ご愛敬ということで。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

xyzzy という Emacs 風のアプリ。

2024-04-04 20:44:36 | 情報系
Windows で LISP を体験してみたい。

人がそんな想いを抱いた時,取るべきアクションは何か。

ブラウザを開いて検索ウィンドウに「Windows LISP」と入力するだけで,あとは検索結果に従えば,しばらくしてその夢は実現するであろう。

平素より私が言葉にできないほどお世話になっている I 先生が Windows で LISP を触ってみたいときにどうすればよいか,という話題になった時に,なんとおっしゃっていたか,記憶はおぼろげである。

だが,キーワードとして

xyzzy という Emacs 風のエディタ,

Maxima(Windows で使うのは wxMaxima という名称である)という数式処理ソフト

が挙がったのは間違いない。

今回は xyzzy が Windows 11 でも動作したよ,というお話である。

20 年以上前,私は学部 4 年生のときに研究室に配属されたのをきっかけに数式組版ソフトの LaTeX を使い始めたのだが,当時は大学で使用されている端末は UNIX と Windows がしのぎを削っており,しだいに Windows が優勢になってきていた時代であった。DEC 10 Prolog と呼ばれるものにちょこっとだけ触れたのも,今にして思えばちょうど最後らへんのことだったようである。その DEC 10 なるものは PDP-10 のことであり,最近,別のルートから PDP-8 だの PDP-11 だのとの関連で再会した名前である。

私が所属した研究室では,ちょうどその狭間のような感じで,広く出回るようになった Linux 環境が提供されていた。

LaTeX の文書は Linux 上で動く究極のエディタ Emacs の支援の下で作成していた。

私も Linux をほんの少しだけかじったが,それは要するに bash だかなんだかのシェルのコマンドをちょこっと学んだというだけの意味であって,kernel だのなんだのをいじったとかそういう話では全くない。

それはともかくとして,やはり時代は Windows の風が吹いており,Windows 上で Emacs 環境が使えたらなぁ,と思っていた矢先,もちろん本家の Emacs も使おうと思えば使えたようだが,Linux で実際にお世話になっていた Mule(ミュール)という日本語が使いやすくなっている多言語拡張版を Windows に移植した Meadow(メドウ,確か Mule for Windows というのが本来の名前であった)が現れたところで,大変お世話になった。

そのころ,今から 20 年ほど前の話なわけであるが,それから今日に至るまでの間,私はずっと Meadow を使っていたわけではない。Meadow の開発は 20 年ほど前のその頃に止まってしまい,こちらはこちらで Windows のバージョンが数年おきに更新され,使う PC もやはり代替わりしていく中で,エディタは別のを使うようになっていった。

といいつつ,実際にその間,どんなので TeX ファイルを作成していたのか,思い出せない。結局海外製の,日本語が編集画面で微妙に文字化けするような,なんかそういうのを使っていたのは覚えている。それは今使用している TeXworks とよく似たものだったが,それそのものではなかったような気がする。そこがはっきり思い出せない。

こんな感じの遍歴をしてきたわけだが,Meadow がうまく使えなくなった時,代替案として xyzzy の利用も検討したのだが,TeX のコマンド補充支援でお世話になっていた YaTeX(野鳥,やてふと読む。Yet Another Tex Mode)がうまく動かないんだったか,M-x のキーバインドがうまく使えなかったんだか,使い辛くて採用を見送った覚えがある。

今回は久々に xyzzy のことを思い出してまだネットに落ちているか調べてみたが,作者の亀井哲弥さんの跡を継いで有志が保守して下さっていたことが判明した。

といっても,それは 2013 年頃までのことだったようで,それから 10 年が経つ今,そのプロジェクトがどうなっているのかは不明である。

窓の杜経由でダウンロードしたバージョン 0.2.2.253 は 2024 年 4 月現在,Windows 11 もちゃんと動くみたいだ,というのが今回一番書きたかったことである。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

「する」モノと「される」モノ。

2024-04-03 17:13:52 | mathematics
数の計算というのは四則演算と呼ばれる,足す,引く,掛ける,割る,という四種類の計算規則が基本ということになっている。

それらはいずれも 2 つの数をそれぞれの意味合いで合わせることで,何がしかの 1 つの数を生み出す操作であるというのが通常の理解の仕方であろう。

それは,2 つの数を入力すると,計算結果の数が 1 つ出力される働きであって,数学ではそのようなものを 2 変数関数と呼ぶ。

今から 30 年ほどの昔,私が学部学生であった頃は,Peano の公理系によって自然数とは何なのかが明確に定められ,それを足掛かりにして,整数,有理数,そして実数へと数の世界を拡張していく,いわゆる「厳密な理論展開」の存在を知り,当時の私には何故だか非常に魅力的な理論体系に思えて強い憧れを抱いたものである。

その憧れは色あせていない。というか,白状すれば,そういったシナリオに従って数体系を拡張していく議論に,その 30 年もの間さぼっていて,真面目に取り組んでこなかった。

まあ,大体のストーリーは抑えているような気がするので,それでひとまず満足してしまっているというのが嘘偽りのない現状である。

当時,大学の図書館で漁った書籍の一冊に,竹内啓さんの『数の構造』(教育出版,1976 年)があった。そのまえがきに,数の演算,例えば加法 a+b を,a と b という二つの数を平等に扱って,それらから生み出された 1 つの数を対応させる,いわゆる「二項演算」とみるのが通常行われていることであるが,これを,a に b を追加する,というような「操作」として扱う立場も大切ではないか,といったような主旨の話が述べられており,同書はその立場で数の体系を論じたものだと書かれていた。

そのまえがきだけに目を通したままであるが,初めて読んだ当時の私は完全に二項演算派であって,「なんでそれをわざわざ a に b を追加する,なんていう見方にするんだろう」と違和感を覚え,竹内啓さんの観点に乗っかって同書を読み進める気が起きなかった。とはいえ,そういう観点があるということをそこで教わったわけであるし,今日に至るまでなんとなくずっと気になってはいる。

ちょうどその本が出版されたちょうどその頃,算数教育において「量の概念」の復権を掲げて日本の初等数学教育をけん引してきた遠山啓さんの健康にかげりが見えていたわけであるが,そんな中,小島順さんが日本放送出版会から『線型代数』という,これまたユニークな本を出版し,それが火種となって日本評論社の『数学セミナー』誌上で「量の問題をめぐって」というリレー連載が始まった。その中で,1978 年 8 月号から 12 月号まで,5 回に渡って同連載を担当されたのが竹内啓さんであった。遠山啓さんは 1979 年に亡くなったが,病床にあってこれらの連載のことをご存じだったのか,また,もしご存じだった場合,そうそうたる執筆者たちが展開する論説をどうご覧になったのか,などが気になってならない。


そのあたりの話は置いておいて,私はこのところ,数の演算について,2 つの数を平等に扱う「二項演算派」から,数直線において,座標 a で示されている点を,数 b が表す量だけ平行移動する,といった幾何学的な運動,つまりは操作という見方に傾きつつある。

日本語では

「a と b を足し合わせる」

と言えば,a と b の間に役割の区別はない平等な二項演算派の下での扱いに感じられるのに対し,

「a に b を加える/足す」

というと,絶対座標 a に,平行移動 +b を施す,といった操作に感じられるのである。

この話は,複素数の積が複素平面において回転操作と解釈できることの意味をじっくり考察したいとここ数年思い始めたことが根っこにあるのだが,その話も置いておいて,アセンブリ言語をかじると 2 つの側面でこういったことを意識してしまうのである。

一つは,命令(コマンド)というものの書式が,例えば英語の命令文と同様の構文になっており,

操作名(間をあけて)操作対象

と記述するのが一般的なのだが,英語では「操作するモノ」を operator,「操作されるモノ」を operand と呼ぶ。ポイントは,こういった言い回しがちゃんとあるという点である。

さて,2023 年 4 月以降の試験問題からさよならしてしまった,基本情報技術者試験午後試験の選択できるプログラミング言語のひとつであった,その試験用に特別に用意された CASL II というアセンブリ言語が実際に動く web 上のシミュレータがいくつか現存しており,ごく簡単なプログラムを作ってみては動作確認をして遊んで春休み気分を思いっきり満喫している今日この頃なのであるが,久々に 1 から 100 までの整数の和を求めるプログラムを試してみようと思いついた。

アセンブリ言語ではプログラムの行にラベルと呼ばれる名称を割り振って,必要に応じてその行に翔んで(さい〇ま)作業をさせる必要がある。CASL II の仕様では,ラベルは英大文字から始め,続きは英大文字と数字のいずれを使ってもよいが,8 文字以内に収めよ,という制約がある。

その中で,カウンタ番号を一つ増やした上で,それをすでに求めてある和にさらに追加する操作を,例えばカウンタ番号が 100 になるまで繰り返させる(100 になった状態で最後に追加してから繰り返し操作を打ち切る)手続きを記述するわけであるが,さて,その繰り返し処理(ループ,ブロック)の入り口などにどんな名前を付けるといいのか,と考えると,カッコイイ,ドンピシャな英単語を知っていれば解決するのだが,私のように知らないと名付けが悩みの種となる。

ちょうどシミュレータをネット上で漁っていた時,異なる言語だったと思うが,それで同じように 1 から 100 までの和を求めるプログラムを書いたらこんな感じになる,といったブログ記事がヒットし,ざっと眺めていたら,確か addend という語が名に入った。

これは,足し算を

(被加数)+(加数)

と捉える見方に由来する呼び名で,a+b の a と b はある意味平等ではなく,a は augend(被加数),b は addend(加数)という役割が割り振られている。

式で表すと

augend + addend = sum(和)

ということであろうが,左辺の各項は summand(加算項)とも呼ばれるそうだ。

operator(operand) の記法にするには,例えば +b(a) とでも書くべきかもしれない。これだとポーランド記法にそっくりだが,その考案者の Łukasiewicz(ウカシェヴィチ)さんは カッコから解き放たれた (parenthesis-free) 数式の記法を編み出そうとしたそうなので,私のようにカッコを付けて書くなどもってのほかであろうが。

掛け算では「乗数」(掛ける数)を multiplier というが,私の専門分野ということになっている解析学畑では Lagrange multiplier とか Fourier multiplier といった名称で馴染み深い。

これは

multiplicand(被乗数)× multiplier(乗数)= product(生成されたモノ,積)

のようになっている。

割り算はと調べると,割る数(除数)が divisor だというのはすぐに見当がつく。割られる数(被除数)の英語名は知らなかったが,dividend だそうである。

数式で表せば

dividend ÷ divisor = quotient(商)

である。引き算 (subtraction) はある意味異質で,

minuend - subtrahend = difference(差)

となる。minus 由来と subtract 由来の語がまぜこぜになっている。

ヨーロッパ言語の特徴なのかどうかは知らないが,英語を習うと動詞の能動態と受動態の区別を意識せざるを得なくなる。

演算を 2 つの数に関する加工作業と考えた場合,動作主(ぬし)と,動作の受け手という役割分担が発生することになる。

足し算は,2 つの箱の中身を一つにまとめる合併という捉え方もできるし,一方の箱の中身を他方の箱にあける,といった追加という捉え方もできる。

こうした話は特に初等教育において数の計算が身近なたとえでいうとどんな場面で生じるか,といったことを教える側があらかじめよく分析しておき,整理して児童に教えようとすると生じるものと思われる。

Newton が著した,当時の数学の最先端技法のひとつであった文字式を立ててさまざまな問題を解決するという,ある意味,数学の実用書のはしりと言ってよさげな Arithmetica Universalis(無理に訳せば普遍算術,万能算術とでもなろうか。幅広く通用する算術,といった気持ちが込められていると勝手に推測している。片仮名で読みを書くと,アリトメーティカ・ウニウェルサーリスかな?)ではそのあたりの解説があるのかないのか,ふとこの書の存在を思い出し,気になった次第である。

英語訳がネットに落ちていたような記憶を頼りに検索してみたら,Cambridge 大学が公開している Newton の直筆草稿 がヒットした。マニア垂涎の代物がこうして惜しげもなくネット上でさらされているとは。誠に僥倖哉!
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ローマ数字の小数表示。

2024-04-01 16:32:02 | mathematics
大学の学部 1 年生に微分積分学を教えるといっても,そもそも理工系の学部・学科であるため,高校の「数学 III」を履修している学生がほとんどである。

にもかかわらず,例えば 50 人のクラスであったとして,そのうちの 1 人か 2 人は「数学 III」をまともに履修していない状態のまま入学する。

そのような学生に対して,入学前に「数学 III」相当の内容を自習するよう,大学側から何らかの指示が出ているという噂は聞いたような気もするが,私のような非常勤講師に公式にそこら辺の事情が伝達されることはない。

私が担当するのは非数学系といおうか,ともかく,いわゆる「数学科」のような数学ガチ勢とは全く異なる工学系のクラスなので,そもそも微分積分学のどういった話題を講義内容として提供し,そのコースを受講する中で身に付けてもらうべきなのか,正直さっぱり分からない。

とりあえず避けるべきは数列や関数の極限の ε-δ 論法的な取り扱いであろう。ε-δ 論法というのは安定的な動作が求められる工業製品づくりには欠かせない哲学というか思想を含んでいるように感じるのだが,その議論の型だけを特訓する科目ならばいざ知らず,メインコンテンツは具体的な関数の微分や積分の計算にあるとするならば,下手に受講生を悩ませ,不安に陥れたり,中途半端な扱いゆえまったく未消化のまま,貴重な講義時間をいたずらに消費しただけで終わってしまうことが目に見えている ε-δ には一切触れずに切り抜けるのが賢い在り方であろうか。

ところがそうすると,題材が 1 変数関数の微分積分に留まる限り,高校の「数学 III」との差別化を図ることが極めて困難になる。

私が長年担当してきた微分積分学の講義においては,高校の「数学 III」に次のように数本毛が生えた程度の話題を提供するにとどまっている。

・有界な単調数列が何らかの極限に収束する(有界単調列は収束列である)ことを実数列が持つ基本性質として認めることにする。

・逆三角関数を明示的に定義し,その導関数を覚えてもらう。

・2 つの関数の積の高次導関数に関する微分公式(いわゆる Leibniz's rule)の紹介。

・べき関数,指数関数,対数関数,三角関数の第 n 次導関数を取り扱う。

・不定形の極限を求める際に便利な de l'Hôpital の規則の紹介。

・関数の Taylor 多項式および MacLaurin 多項式を導入し,関数のべき級数展開について触れる。

・今後,1/√(1-x^2) の不定積分は arcsin(x),1/(1+x^2) の不定積分は arctan(x) と書いていいからね,という許可を出す。

・いわゆる広義積分の入門的な取り扱い。

こうしてリストアップすると結構毛がふさふさになってきた印象であるが,教わる側も,教える側も,これらの知識が学生にとって将来どう必要になるのか何のビジョンも持たぬまま,既存の薄いテキストの内容をさらに味がまったくわからなくなるまで薄めて提供するだけで 14 週の授業を終える。

ただし,教えている側も,教わる側も,その 14 週はジェットコースターのような目まぐるしい日々を駆け抜けることとなる。

学科ごとの特性に合わせて,例えば情報系ならアルゴリズムの計算量を解析的に見積もるなんていうモチベーションでオーダー記法と呼ばれるものを特訓するとか,学生が学科の専門科目ですぐに要求されるであろう数理的な知識や技能の下準備として微分積分学の必要そうな部分に特化して 14 週を過ごすのが合理的とは思うのだが,さまざまな事情でなかなかそういうわけにもいかないのが現状である。

それで何を言いたかったのかというと,かつて月刊誌『数学セミナー』で前原昭二さんが 1971 年 7 月号から 1972 年 8 月号までの 14 回にわたって「基礎講座 数 IV 方式 微分積分」というタイトルで連載されていた。私はそれで「数 IV 方式」なる言葉を知ったのだが,第 1 回の「はじめに」で

数 IV 方式とは不精者の数学である.

という,著者自身がどこかで聞いた言葉として紹介されている。その意味は不精者にも分かるような(やさしい)数学という意味ではなく,高校の「数学 III」で習った知識を前提として,つまり,教える側がそれらの知識の再確認をさぼって,その先に続く内容を大学初年級の学生に教えるという意味で,不精者なのは教師の方だという解釈が付されている。

ところが,当時から「数 IV 方式」なる言葉が世に存在したにも関わらず,本気でそのような路線を推し進めた大学初年級対象の微分積分学の教科書を著者は見たことがなく,そのため,試みにこんな内容であろうかという試論を連載で展開してみる,といった話である。

なお,その記念すべき初回の内容は,部分積分を繰り返して関数のテイラー級数展開を得るもので,部分積分にはそんな使い方があるんだと学生の興味を引き立てるだけでなく,それから「超高校級」であるテイラー展開という大学微分積分学の花形ともいえる重要な内容にすぐ手が届くところがミソであるように思う。

その後の展開はというと,テイラー展開ときたら複素関数論でしょ,といわんばかりで,結局は 1 変数の複素関数論への入門コースといった内容になっている。

とはいえ,途中で定積分の台形公式やシンプソンの公式の誤差評価を試みたり,テイラー展開を通じて Euler の公式 e=cosθ+isinθ を導き,それを単振動の微分方程式と絡め,複素平面上での質点の運動を論じ,中心力場での 2 体問題を解き,平面曲線の曲率について触れている。そして最後に再び Euler の公式に戻って逆三角関数と対数関数の話に戻り,Riemann 面の話まであと一歩,というところで連載を終えている。

思い返してみると私の高校時代は「数学 II/数学 III」ではなくて「基礎解析/微分・積分」だった時代なのだが,ともかくまだ微分方程式の初歩,特に変数分離形の解法と,「水の問題」に代表されるような文章題から自分で微分方程式を立てて解くことは正規の課程の一つであったし,「微分・積分」の教科書には台形公式がコラムで紹介され,教科書傍用の問題集にはシンプソンの公式までもが参考として記載されていた。ただし,複素(数)平面の扱いはなく,それは私の数年後の代から,確か「数学 B」の一分野として復活した。

前原昭二さんの「数 IV 方式 微分積分」は,ご本人曰く,最終回の記事の末尾に,「いつの間にか <複素数&rt; の宣伝文書みたいになってしま」ったとか,「とりとめのない話」と自己批判というか反省の弁を述べられているが,「数学 III」で学んだであろう微分方程式や複素平面とのつながりを大学初年級の学生に披露することは,彼らがその後,さらなる(解法中心の)微分方程式論や複素関数論(の初歩)を学ぶであることを考えると,新入生向けのオリエンテーション的な科目という位置付けならばうってつけの話題の選び方であろう。

ある意味,高校の「数学 III」ではそこまで持っていきたいけれども,さすがにそれは無理かと断念せざるを得なかった,目の前にあるのに手の届かない話題のオンパレードであって,高校と大学の橋渡し的な講義はあるべき健全な姿であるようにも思うのである。

似たような試みは前原先生以前からも,またその後も今日に至るまで多くの大学教師が模索してきたであろうが,寡聞にしてこれといった決定打に出会ったことはないような気がする。

今回,日本評論社の公式サイトで提供されている検索サービスで前原先生の記事を調べようとしたが,「数 IV 方式」というキーワードではうまく引っかからなかった。
仕方がないので著者名で検索してようやくたどり着いたのだが,日本評論社のデータベースではタイトルが「数4方式 微分積分」のようにローマ数字の IV ではなくてアラビア数字(のいわゆる全角であろう)4に変更されている。それが検索がうまくいかなかった原因のようである。

ちなみに,同社から 2016 年に出版されている三町勝久氏の『微分積分講義 [改訂版]』という書籍の内容紹介に「数 IV 方式」という言葉が含まれていたため,それが検索でヒットしたのだが,そちらは「高校の数 III で 1 変数関数の微分積分は十分学んだでしょ」ということで,多変数関数の微分積分に進むという方向性のものであるようだ。

私が学部 4 年生のときに所属した研究室の先輩にも同様の方針を実践している方がいたのを思い出す。理工系の大学 1 年生相手に 1 変数関数の微分積分を繰り返しても教わる側にとっては新鮮味が欠けていてモチベーションが上がらないでしょ,といったような理由で,いきなり偏微分の話からかましていくスタイルで,三町氏のテキストの出だしと同じである。

道草ついでにいうと,偏微分の計算は 1 変数関数の微分そのものだから,そこはスムーズに接続できるとしても,全微分という,1 変数関数の微分概念の多変数関数版の正統後継者と考えられる「線形写像による 1 次近似」へと話を進めるのはどうやるのであろうか。実はそもそも 1 変数関数のグラフの接線が何故接線と呼ばれる代物であるのかといったことは高校の「数学 III」でもスルーされるような,観念的なお話であるので,その辺の話をゴチャゴチャやって,しかも多変数の線形(もしくは比例)関数とはなんぞや,といった話も一席ぶつとなると,途端に内容の難易度が跳ね上がる。そのため,全微分なるものをバッサリ大学初年級の微分積分の課程から放逐するのも一つの手なのかもしれない。さすがに私はそこまで思い切った簡略化を推し進める勇気は今のところないが,今後の可能性の一つとして真剣に検討すべき選択肢の一つであるような気がしてならない。

とにもかくにも,4 月になってしまったので間もなく新学期が始まる。

20 年教え続けてきたが,今年度も私が教える内容は「数 IV」には手が届かず,その半歩手前の「数 IIIS」に留まる予定である。

III と IV の中間,つまり 3.5 に相当する数字をローマ数字で表せるのか気になってググってみたら,ローマ数字に関する Wikipedia の日本語版でまず小数表示が存在することを知り,より詳しい内容については英語版 (Roman_numerals#Fractions) を参照した。それによるとローマ数字の流儀では分数はなぜか 12 進法になるそうだが,1/2,つまり 6/12 は half を意味する semis の頭文字を取って S と表すそうだ。

そういえば,私の専門は非線型偏微分方程式論ということになっているが,非線形性があまり強くない場合は古くは semi-linear,現在では semilinear と英語で綴られ,「半線型」という訳語が充てられている。また,発展方程式と呼ばれるタイプの場合,半群的な取り扱いというものが用いられることがあるが,「半群」は semigroup である。代数方面では「半単純」 semisimple という用語を見かけたこともある。解析学では「半連続」 semicontinuous というのがあったのも思い出した。

球面を赤道で切った半分も仲間かなと思ったのだが,それは hemisphere という。訳語は「半球面」であるが,semi ではなくて hemi である。

hemi の方はギリシャ語由来で,それがラテン語版になると semi に変化するそうで,両者は無関係なわけではないらしい。

気になったのでもうちょい調べたら,demi というのも出てきた。ギリシャ神話でおなじみの半神は英語だと demigod になる。ファンタジー系のマンガなどで亜人なるものが出てくることがあるが,それをデミヒューマン (demihuman,半人) なんて呼んだりしているな。

それはともかく,semi- という接頭辞が「半分」を意味しているらしいことは私にとってはかなりなじみ深かったはずなのだが,今の今まですっかり忘れていた。そうかー,semis が語源なのねー。



ということで,数 III と数 IV の間に位置する,極めて中途半端な内容の「微分積分学」の講義は「数 IIIS 方式」と称することを提案したい。これが本記事の主旨である。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

CASL II/COMET II メモリアル。

2024-03-26 21:37:26 | 情報系
独立行政法人 情報処理推進機構 (IPA) が実施している基本情報技術者試験という国家試験がある。

私は十数年前にその資格を取得したが,そのとき,午後試験には具体的なプログラミング言語の問題があり,その中に IPA が独自に定めた CASL II というアセンブリ言語があった。

同じく IPA が最低限必要な部分について仕様を定めた仮想マシン COMET II 上で動作する,試験用というか教育用というようなアセンブリ言語である。

私は当時 CASL II に憧れ,それを少しだけかじって受験言語に選んだ。

その想いは今日にいたるまでくすぶり続けており,最近も思い出して仕様を読み返したり,過去問に挑戦したりしようとネットで検索してみた。

すると,悲報が・・・!

2023 年 4 月以降の試験でプログラミング言語の出題分野が丸ごと廃止されてしまったのである。当然のことながら CASL II も消えてしまった。

まさか,ちょうど思い出したタイミングで廃止になってしまっていたとは・・・。

それでも,探せば公式の過去問題は十分すぎるほど(平成 21 年度 (2009) から)残っているし,有志が個人的に運営しているサイトでももっと古い過去問をうかがい知ることができる。

そして,もともと IPA から Java で書かれた公式のシミュレータ(エミュレータというべきか?)が公開されていたため,CASL II の学習にはそれで十分という側面がなきにしもあらずであったが,これも有志が個人的に作成したシミュレータがいくつかネットで公開されており,それらは今でもネット上に残っている。

試験用語 Ver.4.3

あるいは,そのうち「参考資料」の 2 ページを除いた前半の 6 ページは試験の問題冊子の末尾に採録されている。

(なお,試験用語の Ver.5.0 からプログラミング言語の項目がなくなる。)

ただし,今回用があるのはその「参考資料」に記載されている,「4. プログラムの例」である。

そこではただ 18 行のプログラムが掲載されているだけである。もっとも,プログラム中の注釈(コメント)でどういった機能のものなのかは推測できる。

GR1 という汎用レジスタの中に格納されている,0 と 1 からなる 16 ビットのビット列の中に,いくつ 1 があるか,その個数を GR0 という別のレジスタ内に記録するプログラムである。

英語では 1 になっているビットのことを set bit というそうなので,英語でこんな言い回しかなと思い浮かべつつ検索した結果,期待した検索結果がヒットするのは

count [the number of] set bits

のようなフレーズである。カッコ [ ] の中身は面倒ならば省略しても検索結果にほとんど違いはない。

なんでそんなものを検索したかというと,この例題は機械語だのアセンブリ言語だのを学ぶ際の定番の問題と思われるので,参考になりそうな解説がネットに落ちてたらいいなぁと夢を見たからである。

さて,試験用語 Ver.4.3 に示された例(サンプルプログラム)の話に戻ろう。

それを解読するだけでもかなり CASL II の勉強になると思うのだが,やはりまずはそのお題で自分だったらどうコーディングするか,自分で同じ機能を実現するプログラムを作りたいではないか。

サンプルプログラムの解析は,いわば自分のプログラムと見比べる,一種の答え合わせのイベントとしてとっておきたい。

ただし,これが可能なのは,すでにいくつかの別の CASL II プログラムを読み書きした経験がある者に限られるであろう。アセンブリ言語に関する知識や経験がほとんどない状態で,試験用語の仕様を読んだだけでビット列内の 1 を数えるプログラムを,しかもちゃんとその通りに動作するであろうまっとうなプログラムを書くのは至難の業と思われる。

というわけで,私は昔取った杵柄を思いっきりぶんぶん振り回しながらサンプルプログラムに挑戦しているわけであって,CASL II をこれから初めて学ぶという初学者にこういった取り組み方を押し付けたり,勧めたいわけではない。その点,ご了承いただければ幸いである。

それで,約 2 日間かけてようやく期待通りに動く自作プログラムができたので,その喜びをこうしてブログ記事の形式で世に知らしめようとしているわけである。

私がこの機能を実現する方法として考えたのは次の二通りである。


方法 1. 与えられたビットを論理左シフトという操作で 1 ビットずつ全体のビットの内容を左にずらしていく。その際,最高位のビットからあふれた 1 はフラグレジスタの一つである OF (OverFlow register) に格納されることを想定している。

ところが,CASL II で書かれたプログラムを実行する装置である COMET II の仕様には

OF にはレジスタから最後に送り出されたビットの値が設定される。

と書かれている(「1.2 命令 (8) その他」の後に記された(注)FR の設定 〇*2 )ものの,この「レジスタから最後に送り出されたビット」なるものが何を意味するのか,この言明だけ見てもはっきりしない。

それを補うのが「参考資料 3. シフト演算命令におけるビットの動き」であって,それを見ると,論理左シフトの場合,最高位(15 番目)のビットの数字はシフト操作の一番最後に「左に」送り出されるという,こちらの想定でよさそうである。

そんなわけで,いわばカウンタ変数 GR0 に溢れた 1 を逐次加算していく,というイメージである。

ただし,フラグレジスタが保持している値を他のレジスタに加算できるかどうか,これを書いていてふと疑問に思ったのだが,それは仕様をじっくり読まないと分からなさそうである。

基本的にフラグレジスタの値は分岐命令 (JUMP 何々) を用いた制御に使うだけであって,フラグレジスタが保持している 0 や 1 の値を数値とみて計算に使うというのがアリなのかナシなのか (※),今の自分には分からない。それが許されるようならプログラムがもうちょい簡潔になりそうな予感はしている。

さて,

方法 2. さらに別のレジスタ GR3 というのに,ある特定のビットだけが 1 で他は全部 0 という「マスク」を納入し,そのマスクと GR1 とのビットごとの論理積と呼ばれる演算を行い,その結果が 0 ならば GR1 のその位置のビットは 0 であるからカウンタは増やさず,その結果が 0 でなければその位置のビットは 1 だということだから,カウンタを 1 つ増やす,という考え方。

これは,GR1 が 16 軒並んだ部屋(いやな例えだが,トイレの個室という設定でもよい)であり, GR3 内の 1 の位置が「ノックして在室確認をする部屋の位置」に相当するので,いうなればセールスマン的,もしくは点呼方式とでも呼びうるものである。


方法 1 の方はところてん的に GR1 のビットを左に押し出し,1 がぽろっと落ちてきたら受け止めて袋に詰める。

方法 2 の方は GR1 のデータの方は一切動かさず,調査員の方が移動して各戸をノックして 0 か 1 かを確認していく。

大きく分けてこの 2 つの流儀があるように思う。


この記事もいい加減長くなりすぎたので,結論を急ごう。

まず,現存している CASL II/COMET II のシミュレータはいくつかあるが,それらはすべて古いといえば古い。

そんな中,Daytime さんという方がまだ web 上で公開して下さっている CASL シミュレータ(CASL II 対応) は動作確認が

IE 6/7, Firefox 2, Opera 9

の時代で止まっているのだが,2024 年現在,Windows 11 マシン上での Google Chrome および Microsoft Edge(いずれもきっと最新バージョン)のどちらでもちゃんと動作するよ,という報告と,私が作ったプログラムを実行してみたところ,方法 1 の方は手直ししないといけない致命的な不備がある(最高位のビットが 1 だと,実際の 1 の個数よりも 1 個余分にカウントされてしまう,初心者にありがちなミス)ようだけれども,気を取り直して方法 2 で作ったものは(試行錯誤の末)期待通りに動いたよ,という報告である。

現在利用可能っぽい他のシミュレータに比べて,Daytime さんのは OUT 命令もサポートして下さっているので,実行結果として仮想端末画面に 1 の個数を表す 10 進数を表示する機能を実装することもできそうである。

まだそこまで作業を進めていないが,方法 1 のプログラムの修正,公式のサンプルプログラムの解読と併せて,次にやるべき目標の一つである。




(※) 一度本記事を投稿/公開したのち,今一度試験用語 ver.4.3 の仕様を読み返してみて,フラグレジスタ OF の値を演算の引数として直に利用出来たらラクなのにな~という夢が儚く散ったことをここに報告しておく。

結論を先に述べておくと,算術加算命令の引数にフラグレジスタを指定することはできない。これに尽きる。

以下,私が仕様のうちこの件に関与する部分をどのように解読したかを参考までに詳述する。

例えばカウンタ GR0 の値を一つ増やすのに,プログラムの終わりを表す END より前のどこかに

ONE DC 1

のように記述して,ADDA GR0,ONE のようにしなければならない。

この算術加算 ADDA (ADD Arithmetic) の仕様は,システム COMET II の仕様 1.2 命令 (2) にあるが,それは

ADDA r1,r2

もしくは

ADDA r,adr [,x]

のいずれかの形式で記述することになっている。

ここで,命令 ADDA の引数に現れる r1,r2,r などは 4 種類あるレジスタのうち,汎用レジスタ GR (General Resiter) のことで,それぞれ第 1 引数の r1 や r の内容が演算結果に更新される。通常のプログラミング用語としての使い方とは異なるかもしれないが,私はこのような演算前のレジスタの内容を保持せず,計算結果を代入して更新してしまうことを勝手に「破壊的代入」の名で呼んでいる。

さて,第一形式 ADDA r1,r2 の方では,足す方の数値を格納している第 2 引数は r2 と記されているので,ここに書けるのは汎用レジスタのみであって,種類の異なるフラグレジスタ FR (Flag Resister) を置くことはできない。

第二形式 ADDA r,adr [,x] の方は,第二引数は増分の数値が格納されている主記憶(倉庫街)上の「語」(一つの倉庫)の番地(アドレス)を記すことを意味する。COMET II が実行するコードは 0 と 1 の羅列からなる機械語が想定されているが,ここに ONE と記すと,COMET II の動くシステム上で ONE というラベルの付けられた番地が主記憶上のどこかに確保され,DC(仕様にはどのような英単語の略であるか記されていないが,常識的にみて Define Constant の略語と思われる)の後に記した 10 進数定数 1 が ONE というラベルの付いた番地の倉庫内に格納されている内容として使用されて,

ADDA GR0,ONE

のように記すと,GR0 ← GR0+1 という演算が実行されることとなる。

付けても付けなくてもよい [,x] という第三引数は指標レジスタというもので,指標は index なので,この単語の末尾の x が記号の由来と見られる。この指標レジスタは COMET II では汎用レジスタのうち,GR1 から GR7 までのレジスタが代わりを務める。

そういうわけで,第二引数 adr と第三引数 x のどちらにもフラグレジスタの一つである OF を指定することはできない。

したがって,

GR0 ← GR0 + OF

みたいなことを実現するには,

OF=1 ならば ADDA GR0,ONE を行い,

OF=0 ならば何もせずに(GR0 の値を変更せずに)次の作業へと移る

といった分岐処理を,COMET II が備えている分岐命令のうち,OF の値を参照する唯一の命令であるオーバーフロー分岐 JOV (Jump on OVerflow) を利用して行う必要があるのである。

[March 27, 2024]
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

麺がたくさんあると針になる。

2024-03-25 18:27:07 | もじりあーの。
言葉遊び。


英語で,foot の複数形は feet であり,

goose の複数形は geese である。

ゆえに,noodle の複数形は needle である。■ ←(証明完了を表す記号,halmos の代用。)


応用例:Google がお家騒動などで分裂すると複数の Google 系企業が生じる。そのグループを指す言葉として複数形が欲しい。

そう,Geegle と呼べばいいんじゃね?!

Google の語源と見られる googol は 10100 を意味する言葉であるが,2×10100 は two geegol, 3×10100 は three geegol, のように言い表すことを提案したい。

googol という語の誕生から 100 年以上が経過した今,名付け親の Milton Sirotta 氏の承認を取り付けるのは望むべくもないであろうか。

なお,googol が初登場する書籍 Mathematics and the Imagination では,googol に関する脚注に

not even approximately a Russian author

とある。

ん?なんで急にロシアの文豪がどうのって話が出てくるの・・・?

と数秒フリーズしてから Aha! 体験を味わう。

まさか,ゴーゴリのことを言っているんじゃないよね・・・?

Wikipedia でゴーゴリの項を確認してみると,ゴーゴリはウクライナ系で,ウクライナ風だとホーホリと読むらしい。

ということで,googol と Гoгoль(ロシア語版の表記)は実際には読み方がかなり異なるようなので,耳で聞いても両者はかけ離れていて,間違える心配はなさそうである。


・・・と思ってゴーゴリの英語表記を見たら Gogol だった。あー,これは紛らわしいわー。


他愛のない思い付きのクイズから始まって,まさか現在のロシア・ウクライナ戦争にまで思いを馳せることになるとは。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする