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

山口昌哉、「カオスとフラクタル」講談社ブルーバックスをきちんと読み直してみると、個別の図形の計算はポール・ピエール・レヴィだとしても、複数個の縮小写像による自己相似集合という表し方を発見したのは、日本では、京都大学理学部の畑 政義氏が最初ということである。現在、京都大学理学研究科/数学・数理解析専攻解析学講座/准教授という肩書である。

さて、レヴィの図形と同じ式で、定数a, b, c, dだけ違う他の図形も示しておく。

  1. a = 0, b = 0.4+0.5i, c = 0, d = 0.4+0.5i
  2. a = 0.4614+0.4614i, b = 0, c = 0.622-0.192i, d = 0
  3. a = 0, b = 0.5+0.2887i, c = 0, d = 0.6667
  4. a = 0.707i, b = 0, c = 0.5, d = 0
  5. a = 0.4614+0.4614i, b = 0, c = 0, d = 0.2896-0.585i

これを見ていると、1. は悪魔系、2.は雲、3.は木の枝、4.は氷柱、5.は海藻または細菌のコロニーと、なかなか表現力豊かである。そういえば、レヴィの図形は蟹か。

フラクタルについては、シェルピンスキのガスケットコッホ曲線マンデルブロ集合ジュリア集合など、典型的なものを描いてみたが、そういえば、少し毛色の変わったフラクタルであるレヴィの図形はまだ描いていないね、と思って、一時はバイブルのように読んだ、山口昌哉、「カオスとフラクタル」講談社ブルーバックスを自分の書棚で探したが、どうしても見つからない。あれっ、いくらなんでもこの本は捨てたり古書店に売ったりしていないはずだが、と思ったが、いくら探しても見つからないので、仕方なくアマゾンの古本で買いなおした。そして、レヴィの図形が載っているページをみてみた。

レヴィの図形は、描き方は、再帰的に所定の操作を繰り返す点でシェルピンスキのガスケットに似ているが、これは一応、シェルピンスキのガスケットとは違って、複素力学系ということになるのだろう。

そのために以下のような線形の複素関数f0(z)とf1(z)を用意する。

ここで、zは複素変数であり、a, b, c, dは複素定数である。そこで、a, b, c, dとして適当な値を選び、Kを複素点の集合とする。

そこで、Kの初期値として、K ={i}、すなわち単一の元iだけを含む集合とする。そこで、K ← f0(K) ∪ f1(K)という操作を複数回行うものとする。一回の操作で点の数は倍になるので、n回繰り返すと、点の数は2nになる。これらの点を複素平面上でプロットするのであるが、特にレヴィの図形の場合、a = 0.5+0.5i, b = 0, c = 0.5-0.5i, d = 0である。下記のような図形となる。

なお、レヴィとは、フルネームがポール・ピエール・レヴィ、フランスの数学者であり、確率論に優れた業績を残した。上記の図形を研究し手書きで描いたりしたそうである。

なお、例によって、プログラムのソースコードも付ける。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void fracta(double x, double y, int level);

// 定数の設定
double ar = 0.5;  // aの実部
double ai = 0.5;  // aの虚部
double br = 0.0;  // bの実部
double bi = 0.0;  // bの虚部
double cr = 0.5;  // cの実部
double ci = -0.5;  // cの虚部
double dr = 0.0;  // dの実部
double di = 0.0;  // dの虚部

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 fracta(0.0, 1.0, 0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Close();
}
//---------------------------------------------------------------------------

void fracta(double x, double y, int level)  {
 int Level = level;
 double px, py, tx, ty;
 if (level > 15 )  {
   px = 200.0 + 300.0 * x;
   py = 400.0 - 300.0 * y;
   Form1->Canvas->Pixels[px][py] = clBlack;
   return;
 }
 Level++;
 tx = (ar * x - ai * y + br * x + bi * y);
 ty = (ai * x + ar * y - br * y + bi * x );
 fracta(tx, ty, Level);
 tx = (cr * (x - 1.0) - ci * y + dr * (x - 1.0) + di * y + 1.0);
 ty = (ci * (x - 1.0) + cr * y + di * (x - 1.0) - dr * y );
 fracta(tx, ty, Level);
 return;
}

AIにはコンピュータへの興味を通じて概略的な興味があって、最近では将棋や囲碁のAIソフトなどを通じて、AIに対する興味を高めているが、どうも怠慢なので興味だけで知識のほうはさっぱりである。

そこでせめてもと、以前から買ってある「Harvard Business Review 人工知能」ダイヤモンド社を読み始めた。これは、Harvard Business Review日本語版の記事のうち人気が高かったものを集めたもので、以下、その最初の記事、トーマス・H・ダベンポート、ジュリア・カービー「オーグメンテーション:人工知能と共存する方法」を私なりにまとめてみる。

最近、AIが発達すると人間の仕事が奪われるという、シンギュラリティなる議論が喧しいが、必ずしもそうじゃないんじゃないの、という私の意見の根拠がオーグメンテーションである。

そこでまず、オーグメンテーションとは何かという定義をみてみる。すなわち、通常の自動化戦略は、人間がする仕事を定義して、そこからコンピュータでできる仕事を見出して差し引いていく。すると、すべてがコンピュータでできるとなると、人間することがなくなる。これはシンギュラリティにつながる。

一方、オーグメンテーションとは、人間がする仕事を基準として、コンピュータの使用によって、いかに人間がする仕事を深められるかを見極めることである。この論文は、そのための5つの手法を紹介する。それは、以下のとおりである。

  • Step up (向上する)
  • Step aside (譲る)
  • Step in (介入する)
  • Step narrowly (絞り込む)
  • Step forward (前進する)

Step upは、コンピュータの計算が終わった段階で、その結果を利用して、より高度な課題に取り組む。これは、高い教育と熟練を受けた人だけが関与できる。

Step asideは、細かいタスクはコンピュータに任せて、対人的知能、内省的知能など、人間が得意な多重知能を駆使する。

Step inは、時として無骨になりがちなコンピュータが出した結論に介入して、これを修正する。

Step narrowlyは、ユーザーが、コンピュータが及ばないニッチな分野をみつけて、その世界に入り込む。その際、知識をデータベース化するためにコンピュータを利用する。

Step forwardは、人間が次世代のツールを構築する。これによって、人間とコンピュータが、互いの欠点を補いあう。しかし、Step forwardを実践するには、普通のSTEM(科学・技術・工学・数学)の知識だけでは不十分で、人工知能、アナリティックスの高度な知識も必要である。

こう書くと、オーグメンテーションは高学歴の理系人間にしかできないように思われるが、私は決してそんなことはないと思う。例えば、私はミステリー小説の愛読者だが、もっとも優れたミステリー小説の作者は、必ずしも高学歴とは限らない。高卒や専門学校卒の人もざらで、そういう人たちの方が却って冴えた構想力と、調査力を発揮したりする。

まあ要するに、シンギュラリティを喧伝する人たちは、人間の営みを過度に狭く解釈しているだけことであろう。

クリエーターズ・アップデートというのは、Windows 10のユーザなら誰もが知っているWindows 10 Creators Updateのことである。このアップデートの押し売りがしつこくて、うんざりしているユーザは少なくないだろう。Windows 10以外のユーザは去年の夏、Windows 10の押し売りで嫌になった記憶がよみがえるかもしれない。

それで私は、Windows 10 Creators Updateを勧誘するパネルがあらわれる度に、後で通知する、をクリックして退けていた。

ところが私は、疲れていたせいか、Windows 10 Creators Updateを勧誘するパネルがあらわれたタイミングで、後で通知する、でなく、ついプライバシー設定を確認する、をクリックしてしまった。こうしてもすぐにWindows 10 Creators Updateが始まるわけではないよね、と軽視していた。

ところがしばらくたって、Windows 10 Creators Updateの導入画面のようなものがあらわれた。ここでは「再起動」、「時間指定」、「遅延」のどれかを選ぶしかなく、私はとりあえず「遅延」を選んだ。

それで他の作業をしていると、どうもパソコンの動作が変である。ああ、と私は悟った。これはWindows Updateが進行中は動作が不安定になるという、例の現象だと悟った。それで改めて「再起動」をクリックすると、パソコンが再起動して、数字が1%から次第に増えていく画面になった。

これは、普通のWindows Updateでよく見かける画面なので黙ってみていると、なんとも数字の増え方が遅い。私はもう寝る時間だったので、パソコンのそばで横になって仮眠することにした。それで40分くらいで起きてみたらまだ50%にも達していない。それからさらに40分くらい経過するとパソコンが勝手に何回か再起動して、やっと100%に達した。

そこでなにかバックグラウンドでアップデートのプログラムを導入しているらしい。そこから待っていると、いよいよWindows 10 Creators Updateの導入が完了したらしい。なにかMicrosoft Edgeの案内画面になったが、よくわからないのでこれはスキップした。

結局2時間近くかけてWindows 10 Creators Updateを完了したのだが、何が変わったのかさっぱりわからない。もし単に大型のWindows Updateなら、"Creators"って何よ、とさっぱりわからなかった。

まあそれでも、いつも気にしている、タスクバーにピン止めしたアイコンが現れないというバグが直っているかと思ったら、それも特に直っているわけではない。

ところが、6月14日の早朝、まあ、これを書いている時点なのだが、Windows Updateをかけると、再起動直後にはタスクバーにはピン止めがなくてがっかりしたのだが、数十秒後にタスクバーに一斉にピン止めしたアイコンが現れてほっとした。内部的にはいろいろ機能が改善されているのだろうが、GUI関係の改善は目立っていて、ありがたくかんじる。

この子(Windows 10)は、いろいろ至らん点もあるが、未完の大器じゃけん、まあ長い目でみてやってつかあさい、とつい、自分に広島弁で言い聞かせた。

前回のマンデルブロ集合の彩色があまりにもナイーブだったので、こちらのように色を付けなおしてみた。

しかし、才能の乏しさのゆえ、いくら努力しても冴えた配色にならないので、諦めてこれで完成ということにする。

また、蛇足ながら、これのソースコードも示す。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
double x,y,tx,ty;
double a;
double b;
int px, py;
int A,B,n;

 for ( A = -500; A < 220; A++ )     {
   for ( B = -300; B < 310; B++ )  {
     x = 0.0; y = 0.0;
	 n = 0;
	 a = (double) A /230.0;
	 b = (double) B /230.0;
     while ( x*x + y*y < 4.0 )   {
	  tx = x*x - y*y + a;
	  ty = 2.0*x*y + b;
	  x = tx;
	  y = ty;
      n++;
	  if ( n > 300 ) break;
	}
	px = A + 520; py = B + 320;
	if ( n > 300 ) Canvas->Pixels[px][py] = clRed;
	else if ( n <= 300 && n > 20 ) Canvas->Pixels[px][py] =clFuchsia;
	else if ( n <= 20 && n > 8 ) Canvas->Pixels[px][py] = clYellow;
	else if ( n <= 8 && n > 4 ) Canvas->Pixels[px][py] = clCream;
	else if ( n <= 4 && n > 3 ) Canvas->Pixels[px][py] = clSilver;
	else if ( n == 3 ) Canvas->Pixels[px][py] = clMedGray;
	else if ( n == 2 ) Canvas->Pixels[px][py] = clTeal;
	else Canvas->Pixels[px][py] = clBlack;
  }
 }	
  
}
//---------------------------------------------------------------------------

数学セミナーのフラクタル特集を眺めていてフラクタルへの興味が復活したのは、こちらに書いたとおりだが、よくわからないのだが、それから雨後の筍のようにパソコン・トラブルが押し寄せた。それはパソコン・トラブル奮戦記で始まる一連の記事で書いたので、ここでは繰り返さない。

さて、ヒュームではないが、Aという事象が起きたあとに高い頻度でBという事象が起きるということが続くと人間は、あるいは生物一般に、A ⇒ Bという因果関係があると想定し始める。なので、本当に理系なのかというくらい迷信深い面のある私は、フラクタル ⇒ パソコン・トラブルという因果関係というか仮説を立て始めた。

そうやって思考を巡らせてみたとき思い出すのは、黒魔術で地面になにやら図形を描いて祈り、悪魔を呼び出すシーンである。それは確か、少年漫画の「エコエコアザラク」でみた。そのとき描かれる図形が、フラクタルでいえばなんかシェルピンスキのガスケットぽくて、そこからフラクタルは、ある種のスピリチュアルな実体を呼び出すのだと考えてみた。なので、夜市という小説を読んだとき、夜市の入り口には、シェルピンスキのガスケットのような図形が掲げられているにちがいないと勝手に思ったりした。

他の例を挙げると、ピラミッドの形状の内部では、物が腐りにくいという性質があって、だからピラミッドの内部にミイラが安置されるのだという説も読んだことがある。その空間形状が独特の効果を与えるらしい。私は、ううんそれもあるかな、と少し信じたりする。要するに、フォルムは事象に影響を与えることができるのだろう。

ところで、藤堂明保著、「漢字入門」放送ライブラリー9、日本放送出版会を読んでいたら、「およそ人間の歴史のうちで、物質の文明の進歩は速く、精神的な面での進歩はすこぶる遅い。」とあって、確かに、と思ってしまった。具体的にいうと、コンピュータのメモリなどムーアの法則が適用されて、倍々ゲームで進歩するが、精神的な所産であるアルゴリズムの進歩は極めて遅い。

といいつつ、フラクタルのフォルムによって呼び出されるスピリチュアルな実体が主として作用するのは人間の精神、そして電子である。

じっさい、フラクタルの働きで私は、あるはずのものを遺失してしまう経験を多くした。典型的にはExcel 2010のDVDだったりする。スピリチュアルな実体にとって、人間の注意力を逸らすなど、朝飯前である。

スピリチュアルな実体は電子の動きを操作してコンピュータを誤動作させるのも得意である。すると恐ろしいのは、世界は、スピリチュアルな実体による制御性を高める方向に向かっているということである。これはなにかの壮大な陰謀ではないだろうか。

戻って、私はフラクタルのせいで?受けた試練に対して全く怯むつもりはなく、野球でいえば監督の千本ノックを受ける選手のような気持ちでいた。じつはあまり根性のない私はなんどもめげそうになったが、とりあえずトラブル解決の後再びのトラブルと破たんをへて、その後のコンピュータの置き換えで落ち着いて、少しだけパソコン・スキルの線が太くなったような気がした。

別の側面からみると、フラクタルからのこのようなアプローチを幾何学的アプローチということにすると、プラトン流にいうなら、幾何学はイデアの世界から現実の世界へのプロキシであり、なのでアカデメイアでは、幾何学が重要視されたのだろう。

では、ピタゴラス流の数論、あるいは数霊学はどうなのだろう。数の現実の世界へのアプローチは、占星術や中国の易経に受け継がれている。これは幾何学的アプローチとは別なのだろうか。今年の前半に私が多倍長のライブラリを実装して素数判定していたときは、少なくともパソコンの不具合は起きなかった。ううん、とわからなくなってきたので、別途考え直すとする。

ともかく読み直してみて、普段の論理的な?自分がどこにいったのか、支離滅裂になってしまっている。それでもこのままブログに載せるとしよう、フラクタルの呪いとして。

シェルピンスキのカーペットの変形に続いて、コッホ曲線も変形版を描いてみることにした。

すなわち、直線を三等分した後、中央の2点から垂線をそれぞれ引いて、垂線の先端の点同士に線を引く。以下のような感じである。

以上のような操作を結果の5つの線分に再帰的に適用する、ということを繰り返すと、以下のような図形になる。

どんな図形かと思っていたら、これはこれで、そんなに違和感は与えないような気がする。

ちなみに、この図形のフラクタル次元はlog(5)/log(3) = 1.464974...だから、たまたまシェルピンスキの市松模様と同じである。コッホ曲線のフラクタル次元はlog(4)/log(3) = 1.261859...なので、少なくともコッホ曲線よりは次元は高い。

なお、プログラムのソースコードは、以下のとおりである。

//---------------------------------------------------------------------------

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

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const double pi = 3.14159;
void fracta(double x1, double y1, double x2, double y2, int level);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 double x1, y1, x2, y2;
 Canvas->Pen->Color = clBlack;
 x1 = 30.0;  y1 = 400.0;
 x2 = 800.0; y2 = 400.0;
 fracta(x1,y1,x2,y2,0);
}
//---------------------------------------------------------------------------

void fracta(double x1, double y1, double x2, double y2, int level)  {
 double X1,Y1, X2,Y2, X3,Y3, X4,Y4, X5,Y5, X6, Y6, TH, S;
int Level = level;
 Level++;
if ( Level > 9 )      {
  Form1->Canvas->MoveTo(x1,y1);
  Form1->Canvas->LineTo(x2,y2);
  return;
}

 X1 = x1; Y1 = y1; X2 = x2; Y2 = y2;
 X3 = (X2 - X1)/3.0 + X1;  Y3 = (Y2 - Y1)/3.0 + Y1;
 X4 = 2.0 * (X2 - X1)/3.0 + X1;  Y4 = 2.0 * (Y2 - Y1)/3.0 + Y1;
 S = sqrt((X4-X3)*(X4-X3) + (Y4-Y3)*(Y4-Y3));
 TH = acos((X4 - X3)/S);
 if ( Y4 - Y3 < 0 ) TH = -TH;
 X5 = X3 + S * cos(TH - pi/2.0);
 Y5 = Y3 + S * sin(TH - pi/2.0);
 X6 = X4 + S * cos(TH - pi/2.0);
 Y6 = Y4 + S * sin(TH - pi/2.0);
 fracta(X1, Y1, X3, Y3, Level);
 fracta(X3, Y3, X5, Y5, Level);
 fracta(X5, Y5, X6, Y6, Level);
 fracta(X6, Y6, X4, Y4, Level);
 fracta(X4, Y4, X2, Y2, Level);
 return;
}

フラクタル図形を本にあるとおりにただ描いてみるのもつまらないので、一番手頃そうなシェルピンスキのカーペットを少し変形してみることにした。

すなわち、シェルピンスキのカーペットでは、正方形を3×3に等分して、中央の小正方形を中抜きするのだが、3×3に等分した小正方形のうち、市松模様の小正方形だけを残し、あとは取り去るようにする、というだけの変形である。

これを描いてみると、以下のように、いかにもインパクトの弱い図形になってしまっているが、まあこれもありか、と思うことにする。

ちなみに、関連図形のフラクタル次元を示すと以下のとおりである。

  • シェルピンスキのガスケット: log(3)/log(2) = 1.584963...
  • シェルピンスキのカーペット: log(8)/log(3) = 1.892789...
  • シェルピンスキの市松模様?: log(5)/log(3) = 1.464974...
これをみるとなんと、市松模様はガスケットより次元が低いのだった。

//---------------------------------------------------------------------------
#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 + 2.0 * d;  b = p1y;
 Fracta(a,b,a + d,b,a + d, b + d, a, b + d, depth);
 
 a = p1x + 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 + 2.0 * d;  b = p1y + 2.0 * d;
 Fracta(a,b,a + d,b,a + d, b + d, a, b + d, depth);
 return;
}

なんとか新規パソコンのセットアップを完了して何か積み残しがないか思案してみたところ、そうだ、インターネット出願ソフトがあったと思い出した。

特許出願手続とは最早縁がないのになぜ今更インターネット出願ソフトをインストールするのだと怪訝に思われるかもしれないが、じつは私は昔作った特許出願手続用ツールのソースコードを今でも維持していて、手続様式の最新のフォームに対応させている。なので、生成フォームの妥当性検証のためにインターネット出願ソフトが必要なのである。

なぜそんなことをするかというと、今までの私の経験と観察では、私が作ってきたツールは、手続き合理化のためにかなり有用であるにも拘わらず、あまり世間に似たものはないようである。そこで将来の話であるが、もし可能なら、私のツールをオープンソース化あるいはフリーウェア化して特許事務所などで使ってもらえればという夢がある。そこで収入を得ようとするつもりはなく、ボランティア・ベースで、それをきっかけに緩い人的つながりができれば、程度のきもちである。

まあ、それが単なる夢に終わる可能性は高そうであるが、それでもインターネット出願ソフトを自分のパソコンに導入しておいて、種を植えておくのは意味があると信じている。

さて、インターネット出願ソフトを素から導入するにはまず、特許庁の電子出願ソフトサポートサイトに行く。ここから直接ダウンロードできるわけではなく、出願ソフトダウンロード請求というメニューで住所、氏名、使用しているOS、メールアドレスなどを打ち込んで申請する。すると数分後に、URL付きのメールが届いて、そのURLをクリックすることにより、インターネット出願ソフトのパッケージの導入がはじまる。最新の版は、180MBくらいあるが、昨今では驚くほどのサイズではない。

このとき注意があって、インターネット出願ソフトを動かすには、32ビットのJavaが必要である。以前の版のインターネット出願ソフトには、特定の古い版の32ビットのJavaが必要だったが、普通にJavaを導入すると最新版が導入されてしまい、それが互換性がなくて弱った経験がある。特定の古い版の32ビットのJavaをウェブ上でみつけるのが一苦労だった。

ともかく、インターネット出願ソフトを導入するに先立って、最新の32ビットのJava8を導入した。それからインターネット出願ソフトを導入したら、なんの苦労もなく正常動作した。

あと、以前に、出願ソフトダウンロード請求で導入できるのはベース版で、そこから最新版にアップグレードするには何個かアップグレード・パッチを当てなくてはならなかったという経験があり、今回もそうだったら面倒だな、と思っていたら、今回の版は、全体のアップグレード直後で、オールイン・ワンで手間が省けた。

インターネット出願ソフトを導入したあと感じるのは、私はインターネット出願ソフトに弁理士や企業のディジタル署名ファイルをセットする手続きの経験がほとんどない、ということである。じっさい、外資系の知財部を辞める直前に、システム担当関係の同僚とディジタル署名ファイルのセットのマニュアルを一緒に作成したが、実際の処理は同僚の方がやっていたので私はほとんど経験の蓄積がない。以前に自分でやってみたときは随分戸惑った記憶がある。このあたりを将来、誰かにサポートを頼まれたら困る。

あと、一時は特許手続の様式に詳しいと自負していた時期もあるのだが、今ではすっかり特許サーチャーで、特許手続から遠ざかってしまったので、このあたりも、浦島太郎感が漂っている。特に、国際出願関係の様式は、無知に等しい。現役性維持というのは、なかなか困難である。

まあともかく、インターネット出願は私がまだ30代の頃からのライフワークなので、なんとかスキルを枯らせないようにしたいものである。

別にこれがトリというわけでもないが、マンデルブロ集合の後は、ジュリア集合を描いてみる。

それで、ともかくとりあえず描いてみたジュリア集合の画像と、そのプログラムを示す。


すなわち、ジュリア集合は、f(z) = z2 + cをもちいた複素力学系で、複素定数cをあらかじめ決めておき、初期値z0をいろいろ変えてみるものであり、すると、どういうcを選ぶかが、審美的な画像になるかどうかの決め手なのであるが、妥当な複素数cをどう決めるか私には難しいので、数学セミナーの荒井迅氏の記事にあった、c = 0.36237 + 0.32iという定数を拝借させて頂いた。この図形は、どこかしらドラゴンというか、八岐大蛇というか、中国の水墨画のようで、なかなか趣がある。

ただこれだと、画像の解像度が低いことで、細部のフラクタル性がわからない。なので、プログラムの下に、ズームした画像も貼り付けてみた。
なお、ズームとは下記のコードで、x = (double) A/180; y = (double) B/180;となっている分母の180を適当に増やし、px = 420 + A; py = 280 + B;となっている420と280を適当に変更して、みたい領域が画面に出てくるようにすることである。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
double x,y,tx,ty,x0,y0;
double a = 0.36237;
double b = 0.32;
int n,A,B;
int px, py;

 for ( A = -200; A < 200; A++ )     {
   for ( B = -230; B < 230; B++ )  {
	 x = (double) A/180; y = (double) B/180;
	 n = 0;
     while ( x*x + y*y < 4.0 )   {
      tx = x*x - y*y + a;
      ty = 2.0*x*y + b;
      x = tx;
      y = ty;
      n++;
      if ( n > 2000 ) break;
    }
    px = 420 + A; py = 280 + B;
    if ( n > 2000 ) Canvas->Pixels[px][py] = clBlack;
    else if ( n == 1 ) Canvas->Pixels[px][py] = clGreen;
    else if ( n == 2 ) Canvas->Pixels[px][py] = clYellow;
    else if ( n == 3 ) Canvas->Pixels[px][py] = clBlue;
	else Canvas->Pixels[px][py] = clWhite;

  }
 }	
  
}
//---------------------------------------------------------------------------


このアーカイブについて

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

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

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