ノートG

注Gは、チャールズ・バベッジの発明した解析機関のスケッチに掲載されたものです。

注釈 G [ a ]は、エイダ・ラブレスが書いたコンピュータアルゴリズムであり、仮想解析機関を使用してベルヌーイ数を計算するように設計された。注釈 G は、コンピュータに特化した最初のアルゴリズムであることが一般的に認められており、[ 1 ] [ 2 ] [ 3 ] [ 4 ] 、その結果としてラブレスが最初のコンピュータプログラマーであると見なされている。 [ 5 ] [ 6 ] [ 7 ] [ 8 ]このアルゴリズムは A から G までとラベル付けされた一連の注釈の最後のものであり、彼女はこの注釈を、トリノ大学でのチャールズ・バベッジの解析機関に関する講義「Notions sur la machine analytique de Charles Babbage」(「Elements of Charles Babbage's Analytical Machine」)のルイジ・メナブレアによる1842 年のフランス語転写の英訳に伴う視覚的な補助として使用した。[ 7 ] [ 9 ]彼女のノートと翻訳は1843年に出版されました。[ 10 ] [ 6 ] [ 7 ]

注釈Gに記載されたプログラムは、解析エンジンが完成しなかったため、ラブレスの生前にはテストされていませんでした。現代では、より容易に利用できる計算機器とプログラミングリソースのおかげで、ラブレスのアルゴリズムは現代のプログラミング言語に「翻訳」された後にテストされています。これらのテストは独立して、除算演算で2つの変数が入れ替わるという軽微な誤植が原因でスクリプトにバグがあったという結論に達しました。 [ 11 ] [ 12 ]

起源

エイダ・ラブレス
エイダ・ラブレス

1840年、チャールズ・バベッジはトリノで解析機関に関するセミナーを行うよう招かれたが、 [ 13 ]これは彼が解析機関について公に説明した唯一のものであった。[ 14 ]バベッジの講義中に、数学者ルイージ・メナブレアは解析機関についてフランス語で説明した。[ 13 ]バベッジの友人チャールズ・ホイートストンは、貢献するためにラブレースにメナブレアの説明を翻訳するよう提案した。[ 13 ] [ 15 ]バベッジは付録で説明を補うことを提案し、彼女は翻訳の最後にAGと名付けられた7つの「メモ」シリーズとしてまとめた。彼女の翻訳は1843年8月に[ 13 ]テイラーの科学回顧録に掲載され、[ 15 ] [ 16 ]ラブレースの名前は「AAL」と署名された。[ 13 ] [ b ]これらのメモの中で、ラブレスはバベッジの解析エンジンを計算に使用した場合の能力について説明し、バベッジ自身が考えていたよりも野心的なエンジンの計画を立てました。[ 3 ] [ 16 ] [ 17 ]

ラブレスの論文ノートは論文本文の3倍の長さであった。[ 18 ]最初のノートで彼女はバベッジが機械に抱いていた数値的野心を超えて探求し、音楽、グラフィックス、 [ 19 ] 、言語の領域を扱うために機械が計算を利用できる可能性があることを示唆している。[ 8 ] [ 20 ] [ 21 ]

また、数以外のものにも作用する可能性がある。その対象が、抽象的な演算科学の相互作用によって表現され、かつ、エンジンの演算記法や機構の作用に適応可能なものであれば、それは可能だろう。例えば、和声学や音楽作曲の科学における音高の基本的な関係がそのような表現や適応の対象となると仮定すれば、エンジンはどんなに複雑で広範囲であっても、精巧で科学的な音楽作品を作曲できるかもしれない。

— エイダ・ラヴレース、翻訳者エイダ・オーガスタによる回想録「チャールズ・バベッジの発明した解析機関のスケッチ」に関する注釈、注釈A

彼女は読者に、解析機関がバベッジの以前の差分機関とは別のものであることを説明し、[ 22 ]その機能をジャカード機械になぞらえている。ジャカード機械は、機械語を表すためにバイナリパンチカードを使用していた。 [ 23 ]注釈Cでは、機械が同時かつ反復的なアクションを実行できるという事実によってこの点がさらに強化され、単一の問題の解決に任意のカードまたはカードのコレクションを複数回使用できることが保証され、[ 21 ]本質的に現代の制御フローとループの手法を予見している。[ 18 ] [ 24 ]これらのアイデアは最後の注釈Gで頂点に達し、そこでラブレスは計算の例を示そうとした。

注: G は、加算、減算、乗算、除算の 4 つの算術演算のみを使用しており、これはバベッジのビジョンの実現です。

この目的が達成される過程をここで説明するのは不可能であるため、算術における最初の四つの演算、すなわち加算、減算、乗算、除算は、機械の介入によって直接実行できると認めるにとどめておく必要がある。これが認められれば、機械はあらゆる種類の数値計算を実行できることになる。なぜなら、そのような計算はすべて、最終的に、先ほど挙げた四つの演算に帰着するからである。

— チャールズ・バベッジ、「チャールズ・バベッジが発明した解析機関のスケッチ」

また、これは、ディスクの列に情報を保存するというバベッジの考え方を採用しています。各列は(変数の場合)と、参照されている列を示す 下付き数字で表されます。V{\displaystyle V}

関数

ラヴレースはベルヌーイ数を計算するために再帰方程式を用いた[ 13 ]。彼女は方程式の前の値を次の値を生成するために用いる。彼女の方法は以下の通りである[ 25 ]。

Bn=k=0n1n!(n+1k)!k!Bk=k=0n1(nk)Bkn+1k{\displaystyle {\begin{aligned}B_{n}&=-\sum _{k=0}^{n-1}{\frac {n!}{(n+1-k)!\cdot k!}}B_{k}\\&=-\sum _{k=0}^{n-1}{\binom {n}{k}}{\frac {B_{k}}{n+1-k}}\end{aligned}}}

ここで二項係数は、 (nk){\displaystyle {\binom {n}{k}}}

(nk)=n!k!(nk)!{\displaystyle \displaystyle {\binom {n}{k}}={\frac {n!}{k!(n-k)!}}}

ベルヌーイ数は様々な方法で計算できるが、ラブレスはこのエンジンの威力を示すために、あえて複雑な手法を選択した。注Gで彼女は次のように述べている。「本稿の最後に、このエンジンがベルヌーイ数を計算する手順を詳細に述べる。これは(これから導出する形では)このエンジンの威力を示すかなり複雑な例である。」[ 21 ]ラブレスが注Gで用いた特定のアルゴリズムは、8番目のベルヌーイ数(彼女が最初に から始めたため と表記)を生成する。[ 25 ]B7{\displaystyle B_{7}}B0{\displaystyle B_{0}}

表記

アルゴリズムの表は、各コマンドを順番に並べています。各コマンドは、2つの項に対して実行される1つの演算を表します。2列目は、使用される演算子のみを示します。変数は「 」、[ c ]で表記されます。上付き文字は変数に割り当てられている異なる値の数を表し、下付き文字は変数の割り当て順序、つまりどの変数であるかを表します。(例えば、 は変数番号4の2回目の割り当てを示します。これまで定義されていない変数には、上付き文字0が付きます。)変数は から始まる番号が付けられます。3列目は、実行されているコマンドをコンピュータに正確に伝えます(例えば、1行目では、実行されるコマンドは「 」です。つまり、変数2の最初の反復が変数3の最初の反復で乗算されます)。また、1行につき2つの項の間には1つの演算のみが組み込まれています。4列目の「結果を受け取る変数」は、3列目の演算結果がどこに格納されるかを示します。この方法では、この列のどの変数の上付き番号も、毎回 1 ずつ増加します。 (たとえば、1 行目では、 の結果が変数、、およびに割り当てられます。) V{\displaystyle V}2V4{\displaystyle {}^{2}V_{4}}V0{\displaystyle V_{0}}1V2×1V3{\displaystyle {}^{1}V_{2}\times {}^{1}V_{3}}1V2×1V3{\displaystyle {}^{1}V_{2}\times {}^{1}V_{3}}V4{\displaystyle V_{4}}V5{\displaystyle V_{5}}V6{\displaystyle V_{6}}

5列目は、コマンドの処理で使用された変数のいずれかが変更されたかどうかを示します。中括弧で囲まれた2行のコマンドでは、元の変数が等号の左側に、新しい変数が反対側に配置されます。つまり、変数が変更された場合は上付き文字が1つ増加し、変更されていない場合は変更されません。(例えば、3行目では の結果を変数 の2回目の反復に代入しており、5列目ではこれを次のように表しています。) 1V5+1V1{\displaystyle {}^{1}V_{5}+{}^{1}V_{1}}V5{\displaystyle V_{5}}

{1V5=2V51V1=1V1}{\displaystyle {\begin{Bmatrix}{}^{1}V_{5}={}^{2}V_{5}\\{}^{1}V_{1}={}^{1}V_{1}\end{Bmatrix}}}

V5{\displaystyle V_{5}}変わったようで、変わっていない。 V1{\displaystyle V_{1}}

6列目の「結果の説明」には、4列目の変数 に代入された結果が、それ以前に代入された2つの項の値に基づく正確な値で示されています。(例えば、1行目では、は最初に に設定され、 は変数に設定されました。したがって、は数学表記です。)この列は明らかにエンジンによって計算されるのではなく、むしろプログラムの手順をわかりやすくし、読者が理解しやすくするためのものと思われます。(例えば、5行目では分数を2で割っていますが、おそらく一貫性と入れ子になった分数の表記上の複雑さを考慮して、半分を掛けると表記されています。)また、プログラム外部では別の変数表記法であるおよび変数が使用されており、これらを順次掛け合わせて最終値 を求めています。したがって、次のようになります。[ 11 ]1V2×1V3{\displaystyle {}^{1}V_{2}\times {}^{1}V_{3}}V2{\displaystyle V_{2}}2{\displaystyle 2}V3{\displaystyle V_{3}}n{\displaystyle n}1V2×1V3=2n{\displaystyle {}^{1}V_{2}\times {}^{1}V_{3}=2n}A{\displaystyle A}B{\displaystyle B}B7{\displaystyle B_{7}}

B7=1(A0+B1A1+B3A3+B5A5){\displaystyle B_{7}=-1(A_{0}+B_{1}A_{1}+B_{3}A_{3}+B_{5}A_{5})}

これ以降、各列は、与えられた変数の値を時間の経過とともに表示します。変数の値が変化したり、現在のコマンドの用語としてその変数が存在することでその値が重要になったりするたびに、その値がそれぞれの列に記述または再記述されます。それ以外の場合は、無関係であることを示すために省略記号が付けられます。これはおそらく、コンピュータが関連する情報のみを必要とすることを模倣し、プログラムが解析するにつれて変数の値を追跡していると考えられます。[ 11 ]

方法

このプログラムは、現代の慣例により8番目のベルヌーイ数として知られる数を計算しようとした。ラブレスはから数え始める[ 25 ]B7{\displaystyle B_{7}}B0{\displaystyle B_{0}}

エラー

演算4では、除算は変数に格納される「 」で行われるはずです。しかし、「結果の説明」には、除算は次のように行われるべきであると記載されています。 2V5÷2V4{\displaystyle {}^{2}V_{5}\div {}^{2}V_{4}}1V11{\displaystyle {}^{1}V_{11}}

2n12n+1{\displaystyle {\frac {2n-1}{2n+1}}}

実際のところ、この除算は逆になっています。は、操作 2 でわかるように、の 2 回目の反復です。同様に、 は、操作 3 でわかるように、の 2 回目の反復です。したがって、操作 4 は ではなくになります。このバグは、エンジンがこのアルゴリズムをこの状態で実行すると、ベルヌーイ数を正しく生成できず、最終目標値( 8 番目のベルヌーイ数)が になることを意味します。 2n1{\displaystyle 2n-1}V4{\displaystyle V_{4}}2n+1{\displaystyle 2n+1}V5{\displaystyle V_{5}}2V5÷2V4{\displaystyle {}^{2}V_{5}\div {}^{2}V_{4}}2V4÷2V5{\displaystyle {}^{2}V_{4}\div {}^{2}V_{5}}130{\displaystyle -{\tfrac {1}{30}}}25621630{\displaystyle -{\tfrac {25621}{630}}}

現代的な実装

ラブレスのプログラムは現代のプログラミング言語で実装できますが、前述の誤りのため、そのまま書き写すと の最終値が不正確になります。元のプログラムを擬似コードで一般化すると、次のようになります。 B7{\displaystyle B_{7}}

V[1] = 1 V[2] = 2 V[3] = n /* ラブレスのプログラムではn = 4 */ V[4] = V[4] - V[1] /* 変数は初期値ゼロ、下記参照 */ V[5] = V[5] + V[1] V[11] = V[5] / V[4] V[11] = V[11] / V[2] V[13] = V[13] - V[11] V[10] = V[3] - V[1] V[7] = V[2] + V[7] V[11] = V[6] / V[7] V[12] = V[21] * V[11] V[13] = V[12] + V[13] V[10] = V[10] - V[1] V[6] = V[6] - V[1] V[7]= V[1] + V[7] //後で終了 

擬似コードでの実装は、コンピュータ言語が変数をスタック上で定義するという事実を強調しています。これにより、変数の現在の反復を追跡して指定する必要がなくなります。さらに、Lovelace のプログラムでは、以前に定義された変数である 2 つの項に対して加算減算乗算、または除算を実行することによってのみ、変数を定義できました。現代の構文では、それぞれの計算をより簡潔に実行できます。この制限は 4 行目 ( ) ですぐに明らかになります。ここで Lovelace は、これまで定義されていなかった変数 ( ) をそれ自体で定義し、それによってすべての未定義の変数が自動的に 0 に等しいと想定しています。この場合、ほとんどの現代のプログラミング言語はエラーを返します。彼女が意図したのは " " でしたが、変数を項としてのみ使用するように制限していました。同様に、10 行目 ( ) では、2 を 2 として定義するために、Lovelace はその値 (0) を自分自身に(2) を加えた値に代入するため、2 項算術の厳密な表記が煩雑になります。このように定義されるのは、この制限的な表記法によるものです。 V4=V4V1{\displaystyle V_{4}=V_{4}-V_{1}}V4{\displaystyle V_{4}}0V1{\displaystyle 0-V_{1}}V7=V2+V7{\displaystyle V_{7}=V_{2}+V_{7}}V7{\displaystyle V_{7}}V2{\displaystyle V_{2}}V7{\displaystyle V_{7}}

注記

  1. ^正式タイトルは「ベルヌーイ数の計算エンジンによる図」だが、換喩的に「G音」として知られて
  2. ^回想録では彼女のイニシャルが「ALL」と誤記されている[ 15 ]
  3. ^これらの変数は技術的には円盤の列を指し、バベッジはそれをそのように表記すべきだと示唆した。 [ 21 ]

参考文献

  1. ^デミング、アンナ. 「エイダ・ラブレース」 .ニューサイエンティスト. 2022年6月1日閲覧
  2. ^クリサ、ジョアシア。エイダ・ラブレス - There Never was a Note G.
  3. ^ a b「エイダ・ラブレス、最初のテクノロジービジョナリー」ニューヨーカー、2013年10月15日。 2022年6月2日閲覧
  4. ^ヘルツ 2009、59ページ。
  5. ^ “Celebrating Ada Lovelace: the 'world's first programmer' - Short Sharp Science - New Scientist” . 2009年3月27日. 2009年3月27日時点のオリジナルよりアーカイブ。 2022年6月1日閲覧
  6. ^ a b「Ada Lovelace | Babbage Engine | Computer History Museum」www.computerhistory.org . 2022年6月1日閲覧
  7. ^ a b c「エイダ・ラブレス|伝記、コンピューター、そして事実」ブリタニカ百科事典2022年6月1日閲覧
  8. ^ a b「エイダ・ラブレス:最初のコンピュータプログラマー」メンタルフロス2015年10月13日。 2022年6月2日閲覧
  9. ^スタイン1984、44ページ。
  10. ^ Menabrea, LF (1843). 「チャールズ・バベッジ氏が発明した解析機関のスケッチ」 .リチャード・テイラー編著『科学回顧録』第3巻. AALロンドン訳. pp.  666– 731.
  11. ^ a b c「エイダ・ラブレスのプログラムは実際何をしたのか?」 twobithistory.org . 2022年6月1日閲覧
  12. ^ “Ada Lovelace and the Story of Note G” . 2021年5月11日時点のオリジナルよりアーカイブ
  13. ^ a b c d e f「エイダ・ラブレスの解析エンジンに関するメモがいかにして最初のコンピュータプログラムを作成したか」 BBCサイエンスフォーカスマガジン2022年6月1日閲覧
  14. ^ 「チャールズ・バベッジ1840年にトリノにコンピュータプログラムを残しました。ここにあります」。Wired。ISSN 1059-1028 20226月1日閲覧 
  15. ^ a b c「数学の宝庫:エイダ・ラブレスの解析エンジンに関するノート」アメリカ数学会2024年6月30日時点のオリジナルよりアーカイブ2024年6月30日閲覧
  16. ^ a bラブレスとバベッジと1843年の「ノート」の誕生
  17. ^スタイン1984、46ページ。
  18. ^ a b「エイダ・ラブレース」伝記2014年4月2日。 2022年6月2日閲覧
  19. ^ツール、ベティ・アレクサンドラ(2004年9月23日)「バイロン、(オーガスタ)エイダ(結婚後の姓は(オーガスタ)エイダ・キング、ラブレース伯爵夫人)(1815–1852)、数学者、コンピュータのパイオニア」オックスフォード国立人名辞典第1巻(オンライン版)。オックスフォード大学出版局。doi: 10.1093 / ref : odnb / 37253。ISBN 978-0-19-861412-8(定期購読、Wikipedia ライブラリへのアクセス、または英国の公共図書館の会員資格が必要です。)
  20. ^ 「エイダ・ラブレース - 伝記、事実、写真」 。 2022年6月2日閲覧
  21. ^ a b c d「解析エンジンのスケッチ」 www.fourmilab.ch . 2022年6月2日閲覧
  22. ^ウーリー 1999 .
  23. ^ 「Celebrating Ada Lovelace」 MIT Press、2016年10月11日。 2022年6月2日閲覧
  24. ^ 「エイダ・ラブレス」 . History . 2021年2月26日. 2022年6月2日閲覧
  25. ^ a b c「Ada Lovelace's Note G | Project Lovelace」 . projectlovelace.net . 2022年6月1日閲覧

出典