コンピュータの最近のブログ記事

シェルピンスキのガスケットに続き、その姉妹版である、シェルピンスキのカーペットを作成した。以下のとおりである。エキゾチック感はシェルピンスキのガスケットの方があるが、これはこれで安定感があってよく、本当にカーペットのデザインに使えそうである。

なお、シェルピンスキのガスケットのフラクタル次元(位相次元)は、log(3)/log(2) = 1.58496... であり、シェルピンスキのカーペットのフラクタル次元(位相次元)は、log(8)/log(3) = 1.89279...なので、カーペットの方が次元が高い。これは目で見た直観とも一致する。

また、シェルピンスキのガスケットも、シェルピンスキのカーペットも、中抜きして自己同型縮小写像を再帰的に適用しているところに意味があり、中抜きしないと次元は2、すなわちベタっと塗りつぶすことになってしまう。

以下に、C++ビルダのソースコードを示す。
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void Fracta(double p1x, double p1y, double p2x, double p2y, double p3x, double p3y,
 double p4x, double p4y,int level);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Close();    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Canvas->Pen->Color = clBlack;
 double a = 20.0;
 double b = 20.0;
 double d = 400.0;
 // 初期位置のセット

 Fracta(a,b, a + d,b,  a + d, b + d, a, b + d,1); 
}
//---------------------------------------------------------------------------

void Fracta(double p1x, double p1y, double p2x, double p2y, double p3x, double p3y,
 double p4x, double p4y,int level)  {
 double a,b,d;
 int depth = level;
 if ( depth > 8 ) return;
 depth++;	

 d = (p3x - p1x)/3.0; 
 
 Form1->Canvas->MoveTo(p1x,p1y);
 Form1->Canvas->LineTo(p2x,p2y); 
 Form1->Canvas->LineTo(p3x,p3y);
 Form1->Canvas->LineTo(p4x,p4y);
 Form1->Canvas->LineTo(p1x,p1y);
 
 a = p1x;  b = p1y;
 Fracta(a,b,a + d,b,a + d, b + d, a, b + d, depth);
 a = p1x + d;  b = p1y;
 Fracta(a,b,a + d,b,a + d, b + d, a, b + d, depth);
 a = p1x + 2.0 * d;  b = p1y;
 Fracta(a,b,a + d,b,a + d, b + d, a, b + d, depth);
 a = p1x;  b = p1y + d;
 Fracta(a,b,a + d,b,a + d, b + d, a, b + d, depth);
 a = p1x + 2.0 * d;  b = p1y + d;
 Fracta(a,b,a + d,b,a + d, b + d, a, b + d, depth);
 a = p1x;  b = p1y + 2.0 * d;
 Fracta(a,b,a + d,b,a + d, b + d, a, b + d, depth);
 a = p1x + d;  b = p1y + 2.0 * d;
 Fracta(a,b,a + d,b,a + d, b + d, a, b + d, depth);
 a = p1x + 2.0 * d;  b = p1y + 2.0 * d;
 Fracta(a,b,a + d,b,a + d, b + d, a, b + d, depth);
 return;
}

フラクタルを勉強していると、最初の方に、シェルピンスキのガスケットというのが出てくる。それは結構有名であるが、画像で示すと以下のようなものである。シンプルながら、なんとなく神秘的な雰囲気もあるこの描画が私は好きである。

最初にフラクタルのことを知った時、シェルピンスキって誰だろうとさえ思いもしなかったが、志賀浩二著「無限からの光芒 - ポーランド学派の数学者たち」日本評論社を読んだとき、シェルピンスキがポーランド学派の偉い数学者の一人であることを知った。

シェルピンスキは1882年に、ワルシャワの有名な医師の息子として生まれた。二つの世界大戦を含む激しい騒乱を生き延びて1969年に87歳で亡くなるまで、ポーランドの大学で数学の顕著な業績を挙げた。その業績には整数論なども含まれるが、なんといってもシェルピンスキを特徴づけるのは、カントールを嚆矢とする無限論、あるいは連続体仮説の掘り下げである。「無限からの光芒 - ポーランド学派の数学者たち」から、例えば、シェルピンスキが証明した次のような定理を掲げてみる。

連続体仮説は、次の命題と同値である:平面R2は、共通点のない二つの部分集合A、Bの和として表される。すなわち、R2 = A∪B ここで、Aはx軸と平行な任意の直線と高々加算個しか交わらず、Bはy軸と平行な任意の直線と高々加算個しか交わらない。

この定理の意味を考えていたら気が遠くなりそうになってきたので、戻ってシェルピンスキのガスケットの表示にもちいたプログラムのソースコードを示しておくことにする。シェルピンスキのガスケットは、私が三十代の前半だった歳の頃もプログラムを作成したが、πの多倍長計算などと比較しても簡単で、ほとんど苦労した記憶はない。なので今回も楽勝かとプログラミングしようとしたら、なんと、正三角形の頂点を結ぶ直線を引く計算でさえ、ええとどうだったっけ、と迷う有様で、この程度のプログラミングもほとんど半日がかりだった。ともかく、動いたC++ビルダのコードを示す。

あ、もう一つ付け加えると、数学セミナー2017年3月号のフラクタル特集号の、梶野直孝氏の「フラクタル上の解析学」と題する記事によると、シェルピンスキのガスケット上でディリクレ形式やラプラシアンが論じられるのだという。ううん、こちらの方もまた気が遠くなりそうである。

//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const double pi = 3.14156;
double PosX = 300.0;
double PosY = 300.0;
void Fracta(double p1x, double p1y, double p2x, double p2y, double p3x, double p3y, int level);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Close();    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Canvas->Pen->Color = clBlack;
 double P1x, P1y, P2x, P2y, P3x, P3y, Angle;
 double L = 250.0;
 double InitAngle = pi;
 double OffsetAngle = 2.0*pi/3.0;
 Angle = InitAngle;
 P1x = L*sin(Angle);  P1y = L*cos(Angle);
 Angle += OffsetAngle;
 P2x = L*sin(Angle);  P2y = L*cos(Angle);
 Angle += OffsetAngle;
 P3x = L*sin(Angle);  P3y = L*cos(Angle);
 Fracta(P1x, P1y, P2x, P2y, P3x, P3y, 1); 
}
//---------------------------------------------------------------------------

void Fracta(double p1x, double p1y, double p2x, double p2y, double p3x, double p3y, int level)  {
 int depth = level;
 if ( depth > 9 ) return;
 depth++;	

 Form1->Canvas->MoveTo(p1x + PosX,p1y + PosY);
 Form1->Canvas->LineTo(p2x + PosX,p2y + PosY);
 Form1->Canvas->LineTo(p3x + PosX,p3y + PosY);
 Form1->Canvas->LineTo(p1x + PosX,p1y + PosY);

 Fracta(p1x, p1y, (p1x + p2x)/2.0, (p1y + p2y)/2.0,(p1x + p3x)/2.0, (p1y + p3y)/2.0,depth);
 Fracta(p2x, p2y, (p2x + p1x)/2.0, (p2y + p1y)/2.0,(p2x + p3x)/2.0, (p2y + p3y)/2.0,depth);
 Fracta(p3x, p3y, (p3x + p1x)/2.0, (p3y + p1y)/2.0,(p3x + p2x)/2.0, (p3y + p2y)/2.0,depth);
 return;
}

パソコン・トラブルはとりあえず克服したつもりだが、まだ以下の不足が残っていた:

  • マイクロソフト・エクセル
  • エンバカデロのC++ Builder XE4 Starter Edition
  • 将棋ソフト激指10

私はもともと、マイクロソフトのオフィス製品は好きでないので、なるべく買わないで済ませてきた。好き嫌い以前に高すぎるということもある。それで、再就職の際の履歴書をエクセル形式で作成する必要がでてきたときも、オープンオフィスの表計算アプリを使って作ってみたのだが、どうもレイアウトが崩れてしまう。そこで仕方なくアマゾンでエクセル2010を買ったが、これは就職活動だけでなく、その後のエクセルの練習にも役に立った。そして、パソコンを再セットアップした後、エクセルを導入しようとしたら、どうしても媒体がみつからない。これはきちんと保管しておいたはずなのだが、自分の杜撰さには困ったものである。まあとりあえず、買わないで様子をみることにする。

エンバカデロのC++ Builder XE4 Starter Editionは、絶望視していたのだが、ダメもとで、購入したベンダの翔泳社にメールで問い合わせてみた。するとなんと、4年近く前にメールで通知されたダウンロード用のURLから今でもダウンロード可能なのだという。ええっ、そうなのかと怪訝になりながら、こんなこともあろうかとキープしておいたそのメールからダウンロードを試みたらまだインストーラをダウンロードできた。インストーラを起動したらライセンス番号を入力するようにプロンプトするが、ライセンス番号は送られてきたメールに書かれているので、それを入力すると、確かにインストーラは走り始めた。しかし、インストーラはかなりの量のコードをウェブからダウンロードするらしく、随分時間がかかる。それだけではない、何度も通信が切れて何度も再開ボタンをクリックしなくてはならなかった。それでもともかくもうすぐ導入完了というところまで到達したのだが、ここで恐ろしいことが起きた。急に画面がブルースクリーンになり、パソコンがフリーズしてしまったのである。ええっ、折角のC++ Builder XE4がフイかと思いつつ、ここはレジリエントにパソコンを立ち上げ直し、再度インストーラを起動すると、再度ライセンス番号の入力は求められたが、導入はすでに導入されているところから開始されたので、比較的すぐに完了し、ついにエンバカデロのC++ Builder XE4 Starter Editionをリストアできた。これで思い残すことはないといいつつ、C++ Builder XE4 Starter Editionを立ち上げると、Develpers Networkのログインが必須だという。これを入れないと30日間しか使えない。それでログインのアカウントを作ろうしたら、どうしてもうまくいかない。どうも以前作成したアカウントが残っていたらしい。そこで、パスワードの再発行手続きを行うことで、なんとかDevelpers Networkにログインでき、なんとか正式にC++ Builder XE4 Starter Editionが使えるようになった。

将棋ソフト激指10の導入用媒体も見つからなかったが、これはもともと買い換える予定だったので、迷わず将棋ソフト激指14をアマゾンで購入した。激指10は、アマ名人より強く、プロ二段くらいだと思っていたが、激指14は、おそらくponanzaには負けるが、プロの最高峰と同じくらい強いのだという。そこで激指14の最高レベルと平手で指してみた。すると、あれっ、意外に強くない。むしろ、激指10の方が手ごたえがあった。と思ったら、終盤、あっという間に一気に寄せられてしまった。どうも自分より隔絶して強いというのは、強さがよく分からないということが改めて分かった。

で、C++ Builder XE4 Starter Editionでブルースクリーンをみた意外はとりあえず問題はなさそうであるが、再びブルースクリーンに出会ってしまった。それは、Windows Updateをかけてみて、でてきたWindows 7品質ロールアップとかいうのを導入したときである。これの導入が終わって、立ち上げなおすと、再びブルースクリーンが出た。これは再現性はないのだが、どうもまだ不安が払拭できないのだった。

いまさら言うほどのことではないが、パソコンを使っているとどうしてもトラブルというか障害は避けられない。私は長年、会社でシスタンとして自分だけでなく他人のパソコンのトラブルにも対応してきたので、そういう場数だけは踏んでいる。

私は精神力がないので、シスタンとして最初の頃は、トラブルに出会うたびに動転したが、流石に経験を積むと知識が増えてきて、ああ、あのトラブルならこういう手順を踏めばよいとか、次第に熟練してきた。それでも、過去の経験が必ずしも活きないのは、ハードウェアもソフトウェアも日進月歩だからである。

そんな私だが、最近、いつになくパソコン・トラブルで精神的ダメージを受け、回復に時間がかかってしまった。鉄人モードに書いたように、私はめったに風邪を引かないが、ついに風邪を引いてしまい、なかなか鼻水が止まらなくなったほどの精神的ダメージだった。

で、その症状と、それに対して採った策を淡々と?述べてみる。それは、私が日々使っているVAIOパソコンでのものである。そのVAIOパソコンは特に今年になってから、ディスクアクセスの頻度が増えた。パソコン起動後、10分くらいずっとディスク・アクセス・ランプがついたままで、アプリを起動したり、キー入力もままならないということがよくあったが、ウイルスチェック・ソフトがチェックしているのだろうくらいに安易に考えていたりした。その原因がもっと前にわかっていたら、もしかして対処の仕方もあったかもしれない。

そして、ついに決定的な障害が発生したのは、水曜日の早朝のことである、Windows Updateがくる予定なので、出勤のため出かける前の時間にWindows Updateを済ませておこうと思った。そしてパソコンを立ち上げると、例によってディスク・アクセス・ランプがついたままなのであるが、Windows Updateのウインドウを立ち上げようと左下のスタート・ボタンを押し、すべてのプログラムというところをクリックしようとした。ところが反応がないばかりでなく、「エクスプローラは動作を停止しました」という画面と「エクスプローラを再起動しています」という画面が交互に出て、まったく操作不可能である。

会社に行く時間が近づいたので、ともかくパソコンを閉じて出勤した。そして会社の昼休みにウェブで調べてみると、「エクスプローラは動作を停止しました」という画面と「エクスプローラを再起動しています」という画面が交互に出るエラーは世間ではよくあることで、なんでもチェック・ディスクをすると直ることがあるらしい。ううん、そうなのかと思った。私は長いシスタン生活でこのエラーには出会ったことはなかった。

そこで帰宅してパソコンを立ち上げなおしたが、依然として「エクスプローラは動作を停止しました」と「エクスプローラを再起動しています」というエラーがでる。そこでチェック・ディスクをしようにも、まったくキーやマウスの入力を受け付けないのだから話にならない。そこで、SAFEモードでパソコンを立ち上げなおすことにした。

ところがなんと、SAFEモードで立ち上げなおしてもやはり、同様の症状が出て、依然として操作できない。そこで、ああ、と気づいた。コマンド・プロンプトのSAFEモードで立ち上げなおしすればいいのだと。そこで、コマンド・プロンプトでchkdsk /fと入れた。これは直ちにチェック・ディスクを開始するのでなく、立ち上げなおしのときチェック・ディスクを行う、というものである。それで立ち上げなおすと、確かにチェック・ディスクが開始された。それは3ステップもあって、結構時間を要したような気がしたが、なにかのエラーを修復したというメッセージが出たので、おっ、もしかしてこれで直ったか、と期待して立ち上げなおした。

すると、「エクスプローラは動作を停止しました」や「エクスプローラを再起動しています」という画面は、でなくなったが、画面に表示されるアイコンが減り、依然としてディスク・アクセスが続いて入力をまったく受け付けない。そこで、あまり粘り強くない私は、これは駄目かもと、諦め始めた。

そもそも、今使っているVAIOを買ったのは、2011年の10月だった。それまで自宅でかなり古いThinkPadをWindows XPで使用していたのだが、会社のパソコンがWindows 7に以降する、というので自宅もWindows 7にする必要があるが、古いThinkPadではそれはスペック的に厳しい。そこで、自宅兼業務用に買い換えたのが今使っているVAIOである。するともう5年以上使っているので、耐用年数的には買い換えてもいいのだが、まだハードウェア的にVAIOが壊れたわけではないしなあ、と思案した。

その思案というか葛藤がストレスになって体調が次第に悪くなった。夜の眠りも浅くなって、これはまずいと思った。そしてこれはいよいよ、リカバリーをかけるとかないかな、という気持ちになった。VAIOのリカバリーは、会社を辞めたときに一度かけている。それは、パソコンの障害ではなく、自宅の業務用パソコンに対する機密保持の観点で会社からの要請だった。それできちんとリカバリーをかけて、そのことを確認する書面を退職後に会社に送った。

それでも今回、私がリカバリーをためらうのは、ダウンロード導入した、C++ Builder XE4などのいくつかの重要プログラムがあって、リカバリーをかけるとそこは回復できないからである。そのあとWindows Updateがウンカの大群のように押し寄せることも知っている。それでも背に腹は換えられないと次の日にリカバリー作業をしようと決意し、会社に休暇を申請した。

さて、その当日である。飼い猫は、あまり時間に構わず、腹が減ると私を起こしに来るのだが、ふつうはせいぜい朝4時半くらいである。ところがその日に限って、朝3時に私を起こしにきた。私は、うんとうなずいた。これは、早く作業を始めよというお告げだと。それで猫に餌を与えてから、早速リカバリーを開始した。意外に几帳面な私は、前にリカバリー作業したときの手順をきちんとメモしているので迷うことはない。それでも、おそろしいほどの回数の立ち上げ直しが必要で、そのつど操作を要するので、離席もままならない。結局、リカバリーを完了するのに3時間かかったが、なにしろ朝3時からはじめたので、まだ6時すぎである。これだと全作業は午後一くらいに終わるだろうと高をくくったが、これは甘かった。

ともかく、ここからはネットに接続するわけだから、とりあえずウイルスチェック・ソフトを導入しておこうと思い、前日に買っておいた、スーパーセキュリティ・ゼロのCDを挿入した。すると、導入が始まったのだが、途中で止まってしまった。どうも、雨嵐のように降りかかってくるWindows Updateのせいらしい。それでも作業していると、今度は導入プログラムは、ウイルスパスターのプログラムをアンインストールせよ、という。ウイルスパスターは、リカバリーのイメージに含まれている。スーパーセキュリティ・ゼロはまるで嫉妬深い女のように、他のウイルス・チェック・ソフトの存在を許さない。

以前にスーパーセキュリティ・ゼロを導入したときは、たしかウイルスパスターはインストーラが自動で消してくれた。しかし今回はどうしても消えないので、手動でコントロールパネルから操作してみた。それで消えたと思ったら、立ち上げなおしたらまだ居る。困ってウェブを探したら、ウイルスパスター削除ツールというのがあるので、これをダウンロードしたらうまくいった。

そこで勇躍、スーパーセキュリティ・ゼロのCDを挿入して導入しようとしたら、途中まだは進むのだが、途中で原因不明のエラーになってしまう。これはともかく、Windows Updateの嵐が過ぎるのを待つしかないと思った。

結局、Windows Updateは199個も溜まっており、すべて完了するのに3時間もかかった。スーパーセキュリティ・ゼロの対処に手間取ったので、その時点でもう正午だった。そこからスーパーセキュリティ・ゼロのCDを挿入して導入しようしても依然としてエラーのままである。念のためソースネクストのヘルプデスクに電話したが、まったくつながらない。それで、これはもう別のウイルス・チェック・ソフトを導入するよりないと覚悟した。そして近所のコジマ電気にカスペルスキーでも買いにいこうとおもったが、念のためにあることを試してみようとおもった。それは、販売元のソースネクストによると、スーパーセキュリティ・ゼロは、ライセンスがあるソフトにつきマイページからのソフト・ダウンロードが可能である。それで、マイページからスーパーセキュリティ・ゼロをダウンロードして実行させたら、なんとか導入できて、なんか涙が出るほどほっとした。さらに、救えなかった筆王もダウンロードして再導入できることがわかったので、一時は私の中で最低ランクに針が振れたソースネクストは、なんとか許容レベルまでQoSが回復した。

ここからは私にとってシスタン的ルーチン作業でデータを回復していった。私は日々BUNBACKUPでデータをパックアップしているので、データとしてはほとんど失ったものはないが、返す返すも残念なのはエンバカデロのC++ Builder XE4 Starter Editionである。これは2万円以上も払ってダウンロード版を購入したのに、完全に消えてしまい、もはやこの版は買えない。こんなことなら、もうワンランク上の、媒体付のプロフェッショナル版を買っとくんだったかと思ったが、当時でもそれは10万円であり、いまはなんと17万円もする。しかも、安価なStarter Editionは最早売ってない。こうなるといよいよ、マイクロソフトのVisual C++しかないのか、とまた思案し、くよくよ考え始めるのだった。

まったく、パソコンさえ問題なかったら、春の宵はのどけからまし、だったのだが。

私は、多倍長計算ライブラリなどから推察していただけるように、コンピュータ・プログラミングが好きで、自宅でも暇つぶしになにかプログラムを書いているくらいなので、学習塾のちらしで、プログラミング教育を謳っているのについ着目した。

しかし、ちらしに「プログラミングは必須のスキル!」と題して、「(前略)すでにアメリカでは、プログラミングスキルがないと、大学を出ていないとみなされています。」と書かれているのをみて、それは言い過ぎだろうと私は急に不機嫌になった。

というのは、外資系のとき私を虐めた上司は、天下のMIT卒で、なにやらコンピュータのスキルを自慢げにいうので、ならプログラミング談義ができそうだと、話題を振ってみたら、どうも歯切れが悪い。そのあたりの空気を読むのが苦手な私がついプログラミングの話を続けていたら、彼はすっかり不機嫌で黙ってしまった。それからずっと陰に陽に虐められるようになったのだから、私のKYは罪が重い。

ただ理系の権化のようなMIT卒の人がプログラミングが得意ではないのだから、「すでにアメリカでは、プログラミングスキルがないと、大学を出ていないとみなされています。」は違うと思う。

その上司のために弁護すると、彼はプログラミングスキルを除けば、コンピュータのアプリケーション全般に私より詳しかったし、特許弁護士として特許実務もできた。まあ全般的に優秀だったといってよい。なので、私がプログラミングの話題さえ振らなければ、いろいろな意味で私は平穏だったし、彼のプライドも傷つくことはなかった。

何がいいたいかというと、プログラミングは、誰でも普通に習えば上達するという技芸でないし、子供のときから習わないと上達しないものでもない。多分、囲碁や将棋よりも年齢依存性は低い。だから、プログラミングに活き活きした楽しみを感じる子供だけ習えばよいのである。そういう子供はほぼ確実にプログラミングの才能がある。今の私のスキルなんぞあっという間に追い抜く、将棋がそうであるように。

これは多分英語についてもいえる。英語で、帰国子女とかでネイティブ並みの発音だと羨ましがられる人がいるかもしれないが、要するに重要なのは話す内容なのであって、内容を充実させるためには、母国語での思考力が必須である。すると下手に英語をやるより、子供のときはみっちり日本語や漢字などを勉強した方がよい、ということになる。

プログラミングも同様で、きちんと意味があるプログラミングができるようになるためには、プログラミングの才能がある子供でも、いつかは数学的論理思考力が必須になる。大学のときプログラミングの授業で、悲惨なまでにできなかった私が、急にプログラミングに目覚めたのは、ブルバキの数学原論でみっちり集合論と代数学を勉強した結果だった。

ただ、折角ブルバキの数学原論を読んだのに、目覚めたのはプログラミングであり、数学ではなかった。すると要するに数学の才能はなかった、ということなのであり、結局そこに行きつくのである。

なのでときどき私はこう言って自分を励ましたい。いやあ、君は瀬戸内海の孤島から東京に出てきて、たいしたバックグラウンドもなく今までよく頑張ったね、その田舎者らしい泥臭い努力は買うよ。まあ、君に足りないものは才能だけだけどね。

ドワンゴ

user-pic
0

数学セミナーは、だいたい4月号がちょっとつまらなかったりする。というのは、4月号は大学の理系の新入生に数学の勉強方法をガイドするという趣旨がメインで、それは高校数学から大学数学へのギャップを埋めるという意味ですこぶる有意義なのだが、その有意義さが却ってベタになってしまう、ということだったりする。

ところが、2017年4月号の数学セミナーは、私のような意見を他の読者からも以前から聞いていたのか、例年と違って一新された、大学の理系の新入生だけでなく、文系の学生や、いまさら数学を勉強したいという社会人に対するガイドともなるような興味深い内容となっていて、うれしかった。

うれしかったのはそれだけではない、なんとドワンゴ会長の川上量生氏へのインタビュー記事があったのである。

ドワンゴは、さまざまな催しを企画してきたと思うが、いまいち世情に疎い私にとってその全貌はみえておらず、一番印象に残っているのは、将棋の電王戦である。将棋もコンピュータも好きな私は、この企画に熱狂して、ドワンゴ、スゲーと思った。

数学セミナーの記事に戻って、川上氏は1968年に愛媛県生まれ、一ヶ月に40冊から50冊もの本を読む子供だったというから相当な読書量だったのだろう。普通の本なら2時間くらいで読んでしまうというのだから、間違いなく秀才である。そして科学者になろうと思って京都大学工学部に入った。そのとき数学は、科学のための道具みたいな認識たったのかもしれない。

ところが、よくあることであるが、どうも大学の勉強に身が入らず、プログラミングのアルバイトで稼ぐようになった。そしてプログラミングとお金を稼ぐことの両方に才能があったか、月に100万円も稼ぎ、仕送りなしでやっていけたという。

それできちんと大学を卒業して就職したはいいが、折角就職した会社が倒産してしまった。そこで仕方なく起業したのが、オンライン専門のゲーム会社であるドワンゴだった。1997年のことである。その後、携帯電話の着信メロディの配信で急成長し、2006年にニコニコ動画を立ち上げた。

そんなドワンゴの現在の関心に、「電王戦」と「人工知能研究」がある。グーグルもマイクロソフトも人工知能研究に力を入れている。今の時代、IT企業であれば、外せない。

実は将棋連盟が電王戦を企画したとき、スポンサーが現われなかった。そこで将棋連盟はドワンゴにコンタクトし、ドワンゴがこれを受けた、という次第である。ここらあたりのニュアンスは、ハッシーの棋士の一分に書かれていることとは少し違う。

将棋連盟にとって、電王戦の貢献は実に大きく、落ち目だった将棋人気がかなり盛り返した。将棋連盟の理事たちは、川上氏に足を向けて寝れないのではないか。

また、ドワンゴの人工知能研究であるが、グーグルと張り合うというよりも、グーグルの研究がカバーしていないニッチを狙っているという。

人工知能に関して、川上氏は、「数学者と理論物理学者の仕事が人工知能に取って代わられるのは、すべての職業の中で最後であろう。」という。確かに、できた理論や方程式に基づき計算するのはコンピュータは得意であるが、理論構築は難しそうである。ちなみに、「最後であろう。」というのは、ありえないという意味だと私は解釈する。なぜなら、英語で、He is the last person who may commit murder.というのは、彼が殺人なんかするわけがないという意味だからである。

あと、川上氏は現在、3組の数学の家庭教師を雇っているという。一人は大学数学科の院生、もう一人は数学を愛するあまり会社を辞めてしまった人、最後は「すうがくぶんか」という数学塾だという。

会社を辞めてしまった人からは、リーマン予想の理解の準備のため、複素解析、ベルヌーイ多項式、ゼータ関数を学んでいるという。なんか、リーマン予想に入れ込んで会社を辞めてしまったという人の行く末が不安になってきた。

院生からは、数論、群論、表現論を学び、次は相対論を学ぶのだという。なんか一貫したものがみえない。

「すうがくぶんか」からは、ドワンゴの社員と一緒に、線形代数、微分幾何を学び、次に多様体を学ぶという。さらに、ドワンゴの社員は、圏論を学びたがっているという。川上氏はなぜか、仕事に直接役立つ、確率・統計、ビッグ・データや、機械学習の勉強はここではやめようと話しているそうで、ここで小さくまとまるのを避けているのか。

川上氏には夢があって、それはIT業界は一般に数学のレベルが低くて、数学をもっと勉強することで、もっと頭を使ったITサービスを考えたいという。

私はというと、ラマヌジャンの世話役だったハーディではないが、あまり数学の応用性は信じていない。というのは、特許公報などでアルゴリズム系の発明をみていても、そこで使われている数学は、有限体とか、フーリエ級数とか、ベッセル関数、ルジャンドルの球関数などと比較的限定されているからである。

でも、これはビジネス書でいわれる、コップに水が半分しか入っていないか、半分も入っている、の認識の違いなのかもしれない。

ということで、ドワンゴの活躍に期待である。

私は広島県の備後に生まれ育ち、ネイティブな方言は広島弁(備後弁)なので、どうみても江戸っ子ではないが、それでも備後を経て、筑前、河内を経て25歳で江戸に出てきて、今に至るまで江戸に住み続けているので、江戸が一番しっくり来たりする。おっと、厳密には今住んでいる相模原市は、もともと江戸ではないが、概数計算で丸めると、江戸ということにしておく。

それで、よく江戸っ子は宵越しの銭はもたねぇ、などというが、私はその点江戸っ子とは真逆で、リスクを最小限にしようとする傾向があり、サラリーマンになって自分の生活費は自分で稼ぐようになると、薄給なりにあまり浪費しないようにし、確か、飲み会でたまたまうっかり持ち合わせがなかったような場合を除き、他人に借金したことはないはずである。まあ、家を買ったときのローンは仕方ないが、それもなるべく早めに繰り上げ返済した。

そんな私でも、なぜかパソコンだけは、一日単位でシャットダウン、あるいはログオフするようにしている。それは、会社勤務のとき、セキュリティ管理担当者をしていて、パソコンを消し忘れて帰宅することはセキュリティ違反だったからである。すくなくともセキュリティの責任者が違反をしては示しがつかない。

自宅は、会社のオフィスとは違うので、そんなに厳密にならなくてもいいはずだが、つい上記の癖がでてしまい、少なくとも寝る前はパソコンを閉じてしまう。要するに、江戸っ子じゃねぇが、宵越しのパソコンは使わねえぞ、てやんでえ、という次第である。

ところが、あるまとまった量の多倍長計算、より具体的にはLucas-Lehmerによるメルセンタ数素数判定プログラムを走らせようとすると、どうしても少なくとも数日に亘ってパソコンを走らせ続けなくてはならない、ということになった。

さて、私の自宅には3台のパソコンがある。私が使っているのは、機種はVAIOで、Intel Core i3-2350M 2.3GHz、主記憶4GB、64ビットのWindows 7。家内が使っているのは、Acerで、Intel Core i3-400SU 1.7GHz、主記憶4GB、64ビットのWindows 10。もう一台は、ASUSのタブレットタイプで、Intel Atom CPU Z3740 1.33GHz、主記憶2GB、32ビットのWindows 8.1。

こう書いてスペックを比較すると、どうしてもASUSのが見劣りするが、現時点で窓際扱なのはASUSのパソコンで、まあたまたま実際に、誰にも使われることなく窓際に置かれている。そこで、ASUSのパソコンに、Lucas-Lehmerの計算をしてもらうことにした。課題は、5から5000の間の素数pに対して、そのメルセンヌ数2p - 1の素数性を判定することである。今までの試行と、このパソコンのスペックを考慮すると、どうしても少なくとも一週間程度の連続運転になるだろうと覚悟した。

なんかASUSのパソコンが、ええっ、冗談じゃないっすよ、一週間程度の連続運転だなんて、労働基準法違反すよ、と叫んだような気がしたが、パソコンに労働基準法が適用されるという判例はないはずなので、ともかくコンパイルしたプログラムをコピーして実行させた。すると、普段干されていてたASUSのパソコンが、単純とはいえなにかジョブが与えられて喜んでいると思ったのは、飼い主?の思い過ごしだろうか。

計算は、p = 5, 7, 13, 17, 19, 31, 61, 89, 107, 127までは一気に進み、521から小考するようになり、607からは長考が目立つようになった。そしてなんとか一日目で1279に到達した。

ところがここからが中盤の難所で、次のp = 2203に到達するまで、ほぼ二日ほど要した。ただ、次の2281は近いので、比較的すぐに着いた。ああ、と私はここで少し気を引き締めたのは、ここまでのメルセンヌ素数は、私が生まれる前の1952年までに発見されたものだったからである。私はなんとか次の3217まで到達してほしいと思った。なぜなら、それは私が生まれた後の1957年に発見されたメルセンヌ素数に対応するからである。

私はp = 2281を正しく計算した時点で、とりあえず私の計算プログラムに決定的なバグはないと確信した。ただ、問題は、ASUSのパソコンがメモリ・リークその他の原因でハングする可能性である。そもそも、簡易なタブレット型パソコンである、このASUSのパソコンは長時間駆動向きに設計されていない。

そこから2日くらいかかって、なんとか3217に到達し、これで一応の目的を達したと思った。ASUSのパソコンに、非力ながらよくやったと褒めた。非力は余計だろう、と言われたような気がした。

そこからは余禄で、いけるところまで行ってほしいと思ったら、3日かかって4253、それから1日かかって4423を出力し、これはもう上出来で、ここから目標の5000まではメルセンヌ素数はないので、ここで終わってもいいのだが、とりあえずプログラムを最後まで実行してもらおうとおもった。ところが次の日、パソコンをみてみたら、知らないうちにハングしており、無事終了できなかった。

結局、全体の計算を終えるために8日くらい要したような気がするが、こういうのって、コンピュータ将棋ソフトのように、I/Oがほとんど関係なくてCPUだけを使う感じなので、CPUのクロックレートが直接効いてきそうな気がする。で、終えてみての反省点は次のとおりである。

  1. プログラムを完全に終えてから、全体の結果を書きだすようにしていたので、結局、途中ハングで結果レポートを出力できなかった。これはまずいので、少しずつ結果をコミットしたら部分的に出力するようにすべきである。
  2. プログラムは、私が会社で仕事しているときも寝ているときも、黙々と計算しているので、何時にどの段階まで処理したかあとでみても分からない。そこを、あまりコストをかけずに、後で確認可能にする。
  3. pがどのくらいなら、どれくらい時間がかかるかをある程度見積もれるようにする。計算時間はCPUなどの性能で違ってくるにしても、なにか比例定数のようなものを計算する目安がほしい。

先日、Lucas-Lehmer判定法に触れたが、Lucas-Lehmer判定法といえども結構コストがかかるので、もっとコストの少ない方法で2p-1が合成数だと判別できたら、メルセンヌ素数の判定も少しは楽になるのにと思って、Chris K. Caldwell編著、SOJIN編訳「素数大百科」共立出版、2004のページをめくっていたら、次のようなオイラーの定理が載っていた。

すなわち、素数pについて、k > 1の整数として、p = 4k + 3且つ2p + 1が素数なら、2p - 1は合成数。

そこで、5以上100000以下の素数9591個について、この条件を満たすpの個数を調べたところ、なんと580個しかなかった。そして、このpに対して確かに2p - 1は合成数は合成数になるのだが、2p - 1が合成数だからpがこの条件を満たすとは限らないので、Lucas-Lehmer判定法のコスト節約にはあまり貢献しないのだった。

それでは、以下に示す、Bateman、Selfridge、Wagstaffによる以下の予想(BSW89)はどうだろうか。すなわち、pを奇数の自然数とすると、以下の2つが成立すると、のこりの一つも同時に成り立つ。

  1. p = 2k±1または、p = 4k±3
  2. 2p-1は、メルセンヌ素数
  3. (2p+1)/3は素数

これの第1の式は、扱いが容易だが、他の2つの式は面倒である。で、ともかく第1の式は、メルセンヌ素数の事前判定に使えそうである。この式を満たす素数pで、2p-1は、メルセンヌ素数であると(あくまでも予想であるが)一応言えるのではないだろうか。

そこで、例によって5以上100000以下の素数について、第1の式に該当するものをみると、5 7 13 17 19 31 61 67 127 257 1021 4093 4099 8191 16381 65537 65539の17個で、このうち、5 7 13 17 19 31 61まではちゃんと2p-1がメルセンヌ素数になる場合のpに対応していて、跳んで127もそうなのだが、あとはメルセンヌ素数に該当せず、しかも、メルセンヌ素数に該当する89 107 521 607 1279 2203 2281 3217 4253 4423 9689 9941 11213 19937 21701 23209 44497 86243がどれも含まれていないという疎漏ぶりなのだった。

しかし、そんな指摘はいちゃもんなのであって、(2p+1)/3は素数という条件を使っていないし、そもそもこの式でメルセンヌ素数をみたすpを網羅するなんてどこにも書いていない。

ということで、安易にメルセンヌ素数の事前判定なんて考えてはいけないのだった。

自家製の多倍長計算ライブラリを利用して、いろいろ初等整数論的なことを試しているのだが、折角なので、いい意味でベタな、メルセンヌ素数の判定に関する、Lucas-Lehmer判定法を実装してみようと思い、手許にあるChris K. Caldwell編著、SOJIN編訳「素数大百科」共立出版、2004を眺めてみた。

まず、メルセンヌ数とは、pを自然数として、2p - 1であらわされる数であるが、それが素数であるためには、pも素数であることが必要条件である。
なぜなら、p = rsなら、2p - 1 = (2r - 1)Σi=1r2 s(r-i)と分解される。
pが素数であるだけでは十分条件でないのは、例えば、211 - 1が、23×89で合成数であることからもわかる。2p - 1のかたちの素数をメルセンヌ素数と呼ぶ。

世界最大の素数でも述べたように、近年、最大の素数はメルセンヌ素数として計算される傾向にある。それは、メルセンヌ素数の素数判定のアルゴリズムが比較的システマチックに実装できるからだろう。

「素数大百科」によると、メルセンヌ素数の素数判定のアルゴリズムである、Lucas-Lehmer判定法を疑似コードでかくと、以下のとおりである。
s := 4;
for i from 3 to p do s := (s2 - 2) mod (2p - 1)
if s == 0 then
  2p - 1は素数;
else
  2p - 1は合成数;

この疑似コードを、私の多倍長計算ライブラリで記述するのは容易であって、実際に動くC++のコードを下記に示す。

また、これの実行結果は、以下のとおりである。

  1. 23 - 1 は、素数
  2. 25 - 1 は、素数
  3. 27 - 1 は、素数
  4. 213 - 1 は、素数
  5. 217 - 1 は、素数
  6. 219 - 1 は、素数
  7. 231 - 1 は、素数
  8. 261 - 1 は、素数
  9. 289 - 1 は、素数
  10. 2107 - 1 は、素数
  11. 2127 - 1 は、素数
  12. 2521 - 1 は、素数
  13. 2607 - 1 は、素数
  14. 21279 - 1 は、素数

上記の実行結果は、(2を除く)2000以下の素数pについて、2p - 1の素数判定を行った結果である。3から2000までの302個の素数pについて、2p - 1の素数判定を行ったものである。ここから分るのは、3から2000までの302個の素数pについて、2p - 1が素数になるpは、14個しかないということである。しかも、pを増やしていくと、メルセンヌ素数はどんどん疎らになる。メルセンヌ素数は無限にあると予想されているらしいが、信じがたい。このあたり、オイラーの無限和とも似ている。

今回、とりあえず3から2000までの302個の素数pについての計算に留めたのは、計算に膨大な時間がかかるからである。一応、nの数を、計算に足りるだけの妥当な最小値になるように抑えることで計算時間を最適化したものの、特にMMOD(n,s_num,a_num,z_num)の割り算が、筆算的なナイーブ実装であるのがイタい。結局、下記のプログラムの実行完了まで、約2時間半かかってしまった。なお、参考までに私のPCの環境は、ソニーVAIO、Windows 7 Professional、Intel Core i3-2350M、2.3GHz、メモリ4GBと、極めてconventionalである。

専門家は、メルセンヌ数が2の累乗のかたちであることをうまく利用して、ビットシフトを利用しているらしいが、私のプアなプログラミング・スキルでは、それをどう記述するのかさえ思いつかない。勉強してみる。

なお、p = 9941の場合にnを妥当にスケーリングしてメルセンヌ素数判定を計算してみたところ、なんとこの単一の計算に、3時間半くらいかかってしまった。それで、巨大素数の世界記録に挑むことがいかに大変か、想像して気が遠くなった。少なくとも、このナイーブ実装ライブラリで世界記録に挑もうとしたら、ジャージとサンダルの組み合わせでエベレストに登ろうとするくらい暴挙だろう。

メルセンヌ素数判定に時間がかかる別の理由として、素数pに対してのメルセンヌ素数判定のほとんどが無駄弾になってしまう、ということがある。それでいて、素数判定には、きっちりp回ループを廻さなくてはならず、途中で合成数だと分ってループを脱出するということができない。なので、例えばRabin法などの確率的素数判定で予めメルセンヌ数が合成数だとわかったものを事前に弾けるのではないかとも考えたが、そもそもRabin法の計算がLucas-Lehmer判定法よりコストが低いのかどうかも疑問である。

ともかく、素数を勉強する初心者をprimerと呼ぶことにすると、私ってなれそう、ねっprimer、と時代遅れの歌を歌ったりするのだった。


// 実際に動くC++のコード
#include "MLA2.h"

int n = 400;
int *s_num;
int *a_num;
int *b_num;
int *z_num;
int *k_num;

int Lucas(int p);

int main()   {
int p;
FILE *fi,*fo;

s_num = new int[n];
a_num = new int[n];
b_num = new int[n];
z_num = new int[n];
k_num = new int[n];

// primex.txtは、1000000以下の78498個の素数を列挙した、簡易素数バンク
if (( fi = fopen("primex.txt","rt")) == NULL ) return -1;
if (( fo = fopen("Lucas.txt","wt")) == NULL ) return -1;

while ( fscanf(fi,"%d",&p) != EOF )     {
 if ( p >= 3 )    {
  if ( Lucas(p) == 1 )   {
     fprintf(fo,"2<sup>%d</sup> - 1 は、素数<br>\n",p);
  }
 }
 if ( p > 2000 ) break;
}
fclose(fi);

delete[] s_num;
delete[] a_num;
delete[] b_num;
delete[] z_num;
delete[] k_num;
return 1;
}

int Lucas(int p)       {
int i;

// 2^p - 1のセット
CLEAR(n,a_num,1);
for ( i = 0; i < p; i++ )  {
  MUL(n,a_num,2);
}
SUB(n,a_num,1);

// 以下、Lucas-Lehrmer判定
CLEAR(n,s_num,4);
for ( i = 3; i <= p; i++ )   {
 MMUL(n,s_num,s_num,b_num);
 COPY(n,s_num,b_num);
 SUB(n,s_num,2);
 MMOD(n,s_num,a_num,z_num);
 COPY(n,s_num,z_num);
}

if ( ISN(n,s_num,0) == 1 )   {  // 割り切れたか
 return 1;   // 素数である
}
 return 0;   // 合成数である
}

先月は、いまどきのWindows Updateに書いたように、Windows Updateは実質的にパスだった。それで今月は流石にきちんとWindows Updateが来ると期待したら、なんとまあ、Windows 7のそれは、単一のファイルがあっただけで、それもオプション扱いだった。しかも導入しても再起動もない。なんとも軽い。

Windows 8.1も同様で、Windows 10に至っては、アップテートなしである。ある意味枯れたWindows 7でほとんどアップテートがないのは分るが、Windows 10はまだまだ枯れていなはずである。マイクロソフト、どうしたのだろう。

とおもったら、私が日常的に使っているWindows 7マシンのマウスがおかしくなった。カーソルが動かない。そういう場合は、USBを指し直すか、パソコンを立ち上げ直すと直るのだが、それも効かないので、これは壊れてしまった、と判断することにした。

折角気に入っていた青色LEDマウスだったのに残念である。でも、3年くらい使ったので、もう寿命だったのかも。それでマウスを買い替える必要があるのだが、そういえば、百均のダイソーで、マウスを売っていることを思い出した。なんでも300円 + 税金という廉価版らしいが、ネットの評判はそんなに悪くない。そこで会社からの帰りに、ダイソーでマウスを買った。一応、赤色LEDと、青色LEDのがあるが、青色LEDの方を買った。

百均でマウスを売っているのはありがたいが、私はこの300円を特に安いとは思わないのは、少し前からバッファローの光マウスが500円程度で買えるからである。まあちょっと前までは少しいいマウスが2000円くらいしたものだが、すっかりマウスがコモディティ化したのだなあ、と時代の流れを感じた。

あと、USB HDDやUSBメモリもすっかり安くなり、意外に安くならないのがパソコン本体であり、むしろ値上がったのは、C++などのコンパイラである。すなわち、20,000円程度の入門版だと何かと機能が制約されていて、DVDがついておらずダウンロード版であり、普通にDVDがついてくる中級者版が一気に10万とか20万円くらいする。なんか、C++で本格的なプログラムを書きたいという人が減ったんだよなあとつくづく思う。

そう考えると、マウスのコモディティ化くらいで喜んでいられない。それにしても来月はまともなWindows Updateがきてほしいものである。

あっそうそう、個人的には、ハッシーが三浦九段に謝ったことで、私は随分ほっとして、将棋に対する興味がだいぶ回復した。それで昨日の夜もB級1組の将棋の山崎-阿久津戦を観戦していたのだが、みたところ山崎が不利のようだがと思いつつ、私は朝が早いので寝てしまった。そしたら、知り合いからメールで、山崎は力尽きてしまい、またもA級昇級を逃したと知った。残念であるが、私が好きな棋士の一人である豊島が頭ハネで昇級したようで、こちらはうれしい。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちコンピュータカテゴリに属しているものが含まれています。

次のカテゴリはスピリチュアルです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。