数学の最近のブログ記事

今まで、ジュリア集合のパラメータは既知のものを調べて用いてきたが、ちょっとオリジナルのパラメータを模索してみたくて、試してみた。

まず、とっかかりとして、c = 0.6 + 0.6iとしてみたが、これは単調すぎて、つまらないので即棄却した。

次に、c = 0.4 + 0.4iとしてみたら、多少綾が出てきたが、まだいまいちであった。

そこで、c = -0.6 + 0.6iや-0.4 + 0.4iとしてみたが、今度は黒い領域(収束領域)が多すぎてつまらなかった。

そこから、それこそ0.01刻みでいろいろパラメータを変化させ、場合により0.0001ずつの微調整も入れて、まあこれならとやっと得たパラメータが、c = -0.54 + 0.51iで、この画像は、


であるので、まあまあかと思った。

さらにパラメータをc = -0.5008 + 0.53076iに変化させ、これなら、と思った画像が、


で、渦巻きが本格的なので、それなりに満足した。

このように、ジュリア集合のパラメータは、ヒューリスティックに妥当に決められると思った次第である。ジュリア集合では、3体問題などと違い、適当にパラメータを決めても発散しないので楽である。あとは審美だけの問題だったりする。

ジュリア集合については、ジュリア集合の続きで、適当に思いついたカラーリング・スキームを適用してみたが、折角なので他の複素定数c = a + biを使ってみたいと思っていたところ、こちらのサイトに好例がいくつか示されていたので、そこにある複素定数cを使わせて戴くことにした。

解説は不可能だが、なかなか玄妙ではないだろうか。ソースコードは、ジュリア集合の続きで示したとおりなので、再掲しない。

  1. c = 0.27734 + 0.00742i
  2. c = -0.15652 + 1.03225i
  3. c = -0.11 + 0.67i
  4. c = -0.12 + 0.74i
  5. c = -0.39054 - 0.58679i
  6. c = 0.11031 - 0.67037i
  7. c = -0.74543 + 0.11301i

今更であるが、ジュリア集合は味気なさすぎるので、下記のように彩色してみたが、どうだろうか。

すなわち、カラーリング・スキームは、脱出回数nを7で割った余りで、適当に色を変えるというものである。

ともかく、ソースコードは以下のとおりである。

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

#include <vcl.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TColor ColorN(int n);
//---------------------------------------------------------------------------
__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 = -300; A < 300; A++ )      {
   for ( B = -300; B < 300; B++ )  {
	 x = (double) A/500.0; y = (double) B/500.0;
	 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 > 10000 ) break;
    }
    px = 320 + A; py = 320 + B;
    if ( n > 10000 ) Canvas->Pixels[px][py] = clBlack;
	else Canvas->Pixels[px][py] = ColorN(n);

  }
 }	
  
}

TColor ColorN(int n)   {
 int i;
 i = (n%7);
 
 switch(i)           {
  case 0:
   return clRed;
  case 1:
   return clYellow;
  case 2:
   return clGreen;
  case 3:
   return clLime;
  case 4:
   return clPurple;
  default:
   return clSkyBlue;
 }
 return clWhite;
}
//---------------------------------------------------------------------------

レスラー系のアトラクタのまとめを眺めていて、ふと極めて非論理的なステートメントを思いついたので、書き下してみる。

  1. 我々が住んでいる宇宙は、より高次元宇宙のポアンカレ断面である。
  2. その高次元宇宙に別のポアンカレ断面を適用すると、別宇宙が出現し、それは我々が住んでいる宇宙と因果的に独立でありえる。
  3. 因果的に独立と感じるのは、われわれの観測能力の限界による場合がある。高次元宇宙においては、互いに独立にみえる異なる宇宙同士が、因果的に従属でありえる。
  4. 一つの宇宙において、時間パラメータに沿ってポアンカレ断面の推移をみていくと、レスラー系のアトラクタのまとめでみたような疎密領域があらわれる。その疎密領域は銀河団などの構造に対応する。
  5. 高次元宇宙における力学系の方程式が宇宙のより深い法則であり、その力学系の低次元宇宙への投影が、個々の宇宙の自然法則である。しかし、多分、高次元宇宙における力学系の方程式が最終法則である、というわけでもない。

これはなんの意味もない非論理的な夢想にすぎない。でも、夢想する練習にはなる。

少し前に、2次方程式の整数解について簡単に考察してみたが、それでは整数解でなく有理数解ならどうなるか、と考えてみるのは自然な拡張である。

すなわち、2次方程式 ax2 + bx + c = 0の係数a,b,cが整数でなく、もっと一般的に有理数と考えたときの有理数解を求めるということである。

そこでまず、有理数は、整数の分子と分母による分数表示されていると考えることができることに着目して、分数a,b,cの分母の最小公倍数Hを求め、それを2次方程式の両辺に掛けることで、係数を整数A,B,Cにする。すなわち、
Ax2 + Bx + C = 0

そして、これが整数D,E,F,Gを以て、(Dx - E)(Fx - G) = 0と因数分解されるなら、x = E/D, G/Fが有理数解になる。このようなやり方で求めるべき有理数解を尽くせる(exhausive)ことは、
ax2 + bx + c = 0が有理数解をもつなら、整数d,e,f,gを以て、(x - e/d)(x - g/f) = 0とあらわされることから分かる。

ここで、2次方程式の整数解と同様の考察を適用すると、A = DF, C = EGであることに着目して、
Y = {(∀S)(∀T) S/T |S∈{Cの約数},T∈{Dの約数}}のようなYの各元をAx2 + Bx + C = 0のxに代入して、解になっているかどうか確かめるということになる。

ここまでアルゴリズムを書き下すと、2次方程式の整数解と同様にプログラミングすることは簡単なようであるが、一つ問題がある。それは、有理数の代数的厳密計算である。すなわち、有理数は小数表示すると一般的に循環小数になるが、循環小数展開してしまうと最早厳密計算は不可能になる。そこで、中学で習う記号的分数計算、例えばa/b + c/d =(ad + bc)/bd等を実装して分数は分数のまま扱い、2次方程式に分数を代入した結果の分数の分子がゼロなら、その代入した分数が解だと判定するのだが、こうやって分数を代入していくと、整数の桁数がすぐにプログラミング言語の仕様の整数変数で扱える桁数を超えてしまうので、多倍長計算を実装しなくてはならないということになり、面倒である。さらには桁数の増大を抑えるためには分子と分母の最大公約数で分子と分母を割ることで、分数を既約化するなどの裏処理も必要になる。

このように、2次方程式の整数解の解法を2次方程式の有理数解の解法に拡張するのは、プログラミング的には意外に面倒なのだった。

レスラー系のアトラクタについては、レスラー系のアトラクタの更なる続きで一応完結したつもりだが、断片の寄せ集めのようになってしまったので、cを3.0から12.0まで広く動かして、一応、以下のようなまとめのアトラクタを生成してみた。

ここでは、折角なので、赤字で示すスケールと、その下の座標値を入れてみた。そこで座標値の表示は、TextOut()という関数を使うのだが、C++ Builderの標準の関数だけではTextOut()が表示する色をつけることができず、仕方なくその色は黒のままである。

ともかく、以下にソースコードを示しておく。

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

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

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double fnx(double y,double z); 
double fny(double a,double x,double y);
double fnz(double b,double c,double x,double z);
void SCALE(int x1, int x2, int y, int N, double b, double step);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Close1Click(TObject *Sender)
{
 Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Draw1Click(TObject *Sender)
{
const double H = 0.0001;
const pi = 3.14156;
double x,y,z;
double a = 0.2, b = 0.2, c;
double a1,a2,a3,a4;
double b1,b2,b3,b4;
double c1,c2,c3,c4;
double px, py;
int p_sgn, c_sgn;
int i,N;

 SCALE(30,830,500,9,3.0,1.0);

for ( i = 0; i < 800; i++ )      {

 N = 0;
 c = 3.0 + 9.0*i/800.0;
 x = 2.0; y = 2.0; z = 13.0;
 if ( x + y >= 0 )
 p_sgn = c_sgn = 1;
else
 p_sgn = c_sgn = -1;
 
 while (N++ < 30000000 )  {
  a1 = fnx(y,z); 
  b1 = fny(a,x,y);
  c1 = fnz(b,c,x,z);
  a2 = fnx(y+H*b1/2.0,z+H*c1/2.0);
  b2 = fny(a,x+H*a1/2.0,y+H*b1/2.0);
  c2 = fnz(b,c,x+H*a1/2.0,z+H*c1/2.0);
  a3 = fnx(y+H*b2/2.0,z+H*c2/2.0);
  b3 = fny(a,x+H*a2/2.0,y+H*b2/2.0);
  c3 = fnz(b,c,x+H*a2/2.0,z+H*c2/2.0);
  a4 = fnx(y+H*b3,z+H*c3);
  b4 = fny(a,x+H*a3,y+H*b3);
  c4 = fnz(b,c,x+H*a3,z+H*c3);
  x += H*(a1+2.0*a2+2.0*a3+a4)/6.0;
  y += H*(b1+2.0*b2+2.0*b3+b4)/6.0;
  z += H*(c1+2.0*c2+2.0*c3+c4)/6.0;
  if ( x + y >= 0 )
   c_sgn = 1;
   else
   c_sgn = -1;
  if ( N > 10000 )                {
   if ( p_sgn != c_sgn )            {
     px = 30 + i;
     if ( y >= 0 )
	   py = 150.0 - 30.0*x;

     Canvas->Pixels[px][py] = clBlack;
   }
  }
  p_sgn = c_sgn;
 } // end of while
}
 // end of for
 SCALE(30,830,500,9,3.0,1.0);
}
//---------------------------------------------------------------------------
double fnx(double y,double z)  {
 return -y-z;
}

double fny(double a,double x,double y)  {
 return x + a*y;
}

double fnz(double b,double c,double x,double z)  {
 return b + x*z - c*z;
}

void SCALE(int x1, int x2, int y, int N, double b, double step)  {
 int i,t;
 String NUM;
 char temp[10];
 double s = (x2 - x1)/N;
 Form1->Canvas->Pen->Color = clRed;
 Form1->Canvas->MoveTo(x1,y);
 Form1->Canvas->LineTo(x2,y);
 
 for ( i = 0; x2 >= s*i + x1; i++ )    {
   t = s*i + x1;
   Form1->Canvas->MoveTo(t,y);
   Form1->Canvas->LineTo(t,y - 600);
   sprintf(temp,"%2.1f",b + step*i);
   NUM = (String) temp;
   Form1->Canvas->TextOut(t, y+5,NUM);
 }
}

私は数学オタクなので、2012年に、望月新一氏がABC予想を証明したということで話題になったとき、私なりに調べて、あるいは計算して、以下のような一連の記事を書いた。

  1. ABC予想
  2. ABC予想の関連定理
  3. ABC予想の計算

その後、論文が難解すぎて、専門の数学者にも検証できないとか、本当に正しいのか怪訝に思われている、みたいな記事を眺めたりしているうちに、とりあえず記憶のスタックにプッシュされ、知らないうちにスタックの奥底に潜むようになった。

ところが最近、知り合いから、ついにABC予想の証明の検証が完成し、正式に正しいとして論文に掲載されることになったと知らされた。ええっ、そんな記事あったっけ、と思っていたら、なんでも朝日新聞に記事が掲載されたのだという。

そこで、ウェブで検索してみると、朝日新聞のウェブ記事と、J-CASTニュースの記事しか見つからず、朝日新聞のウェブ記事は有料会員向けで見れる内容が限定されていたので、J-CASTニュースの記事を引用させて戴く。
京都大学数理解析研究所教授を務める望月新一氏が数学界の難問「ABC予想」の証明を行ったとされる論文が、国際的な数学の専門誌である「Publications of the Research Institute for Mathematical Science」(PRIMS・京都大学数理解析研究所刊行)に掲載される見通しであることを、朝日新聞が2017年12月16日に報じた。これまで査読を続けてきたが、早ければ18年1月にも掲載が決まるとしている。
数学界の難問の証明とあって、称賛の声が多く上がっているのはもちろん、望月氏の「圧倒的な」経歴などについても注目が集まっている。

ううん、ついに証明が検証されたか、と私は唸った。そういえば京大数理解析研列伝に私は、以下のように、一行だけ書いた。

京大数理解析研で数論といえば外せないのは、ABC予想の望月新一氏である。宇宙際幾何学者を名乗り、いかにも怪しい(妖しい?)雰囲気なのだが、間違いなく天才のようである。
これは私がABC予想や望月新一氏に興味がないわけではなく、単にあまりにも知識が少なすぎて、書けないのである。

ところで、京大数理解析研のホームページにおける、望月教授の紹介文を私なりに抜粋して紹介させて戴く。

(前略)2000年以降の研究では,
   (d) 絶対p進遠アーベル幾何 ([5], [10])と
   (e) 組合せ論的遠アーベル幾何 ([8])
を中心に,上の三つのテーマの「相互作用」や「融合」に関心の対象が移った。 特に有限体上の双曲的曲線と数体の間の古典的な類似の延長線上にあるもの として,(a)にヒントを得た形で,((b)の延長線上にある)(d)と(e)を用いて, (c)をスキーム論の枠組みに収まらない幾何([6], [7])の下で再定式化することにより,「宇宙際タイヒミューラー理論」(=「数体に対する一種の数論的なタイヒミューラー理論」)を構築することが大きな目標となった。
 「宇宙際タイヒミューラー理論」に関する4篇からなる連続論文は2012年8月, プレプリントとして公開した(理論の要約については[9]を参照)。4篇 で500頁にも上る連続論文の内容を一言で総括すると,数体上の楕円曲線に 付随するテータ関数の値やその周辺にある数論的次数の理論を,絶対遠アーベ ル幾何等を用いて(比較的軽微な不定性を除いて)「異なる環論」にも 通用するような形で記述することによってディオファントス幾何的な不等式を帰結するという内容である。(以下、略)

あと、京大数理解析研に山下剛という講師の方がいらっしゃって、

近年は, 望月新一氏による宇宙際幾何学のさらなる発展の方向性で同氏と共同研究をしている.
ということである。

その他、これに尽きるものではないが、京大数理解析研の無限解析研究部門 准教授の星 裕一郎氏、ミシガン大学のJeffrey C. Lagariasなどが宇宙際タイヒミューラー理論(IUT)の理解者だという。

私としては、最近とみに紙面が充実している数学セミナーで、ABC予想特集が組まれるのを待つとしよう。

加法定理

user-pic
0

先日、横須賀の研究所に出張して、打合せまで、まだ時間があったので、ディジタル信号処理の本を読んでいたら、突然、三角関数の加法定理を今更証明してなくてはならない、という気持ちになった。それでとりあえず10分くらい考えて、以下の方法を思いついた。

それは、有名なオイラーの定理を使う方法で、まず以下のとおり書き下す。
e = cosα + i sinα
e = cosβ + i sinβ

この式の左辺同士、右辺同士を掛け合わせると、
ei(α+β) = (cosα + i sinα)(cosβ + i sinβ)

例えば、これの実部同士を比較すると、
cos(α+β) = cosαcosβ - sinαsinβ

なんだ楽勝じゃんと思い、ディジタル信号処理の本に戻ろうとしたら、ちょっと待てぃ、と自分の気持ちの中から待ったがかかった。なんだよう、と問いかけたら、もっと初等的な、例えばピタゴラスの定理を使うような方法でやれ、という。るっせ~な、オイラーの定理を使う方法だって十分初等的じゃん、と思いつつ、改めて考えてみたら、これが意外に難しい。そういえば、何年か前も三角関数の加法定理の証明を試みて、そのときは30分くらいで計算できたことを思い出した。で、あのときどうやったっけと思い出そうとするのだが、どうしても思い出せない。で、仕方なくいまさら考えたが、仕事の打ち合わせが終わって電車の中と帰宅してからと合計して3時間くらい考えて、やっと、以下の到底エレガントでない方法に思い至った。頭、悪すぎである。

それは、下記の図から出発する。

この図において、線ADの長さを1とし、BADの角度をα、CADの角度をβとする。すると、線ABの長さは1/cosα、線ACの長さは1/cosβ、線BDの長さはsinα/cosα、線CDの長さはsinβ/cosβとなる。

そこで、線ADの長さをL(AD)のように表記すると、ピタゴラスの定理だけを使って導き出される既知の公式によると、
cos(α+β) = (L(AB)2 + L(AC)2 - L(BC)2)/2L(AB)L(AC)
=( L(AB)2 + L(AC)2 - (L(BD) + L(CD))2)/2L(AB)L(AC)

これに、上記具体的なsinとcosを用いた式を代入すると、

これをもう少し変形すると、

ここまでくると、これがcos(α+β) = cosαcosβ - sinαsinβとなることは見やすい。それにしても、不慣れなので、PowerPointで数式を描くのにも一苦労だった。

もうすこし冴えたやり方はいくらでもあるようであるが、こういう筋の悪さはいかにも自分らしい。

2次方程式が整数解をもつ割合に続き、蛇足とは思ったが、3次方程式が整数解をもつ割合についてもみてみた。

単なる直感で、3次方程式が整数解をもつ割合は2次方程式が整数解をもつ割合より少ないかと思ったら、確かに3次方程式が整数解をもつ割合は2次方程式が整数解をもつ割合の0.64倍程度であるが、案外大きい。

ただ、107の試行で、2つ以上を解をもつ場合というのは5回しか観察できなかった。

あまり豊穣ではないかもしれないが、どうもよく分からない世界である。ともかくプログラムのソースコードをリストする。少なくとも、高次になるほど複数の解をもちにくくなるということはいえるかもしれない。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

long long int QD(int a, int b, int c, int d, int x);

int main()     {
 int i,j,a,b,c,d;
 int e,f;
 srand(time(NULL));
 
 for ( i = 0; i < 10000000; i++ )  {
	a = rand() % 1000 + 1;
	if (( rand() % 2 + 1) == 1 ) a = -a;
 	b = rand() % 1000 + 1;
	if (( rand() % 2 + 1) == 1 ) b = -b;
 	c = rand() % 1000 + 1;
	if (( rand() % 2 + 1) == 1 ) c = -c;
 	d = rand() % 1000 + 1;
	if (( rand() % 2 + 1) == 1 ) d = -d;
 	e = 0; // 解の数
 	if ( d < 0 )
 	  f = -d;
 	else
 	  f = d;
 	for ( j = -f; j <= f; j++ )    {
		if ( j != 0 && (f % j) == 0 ) {
		  if ( QD(a,b,c,d,j) == 0 )       {
			if ( e == 0 )
		      printf("a = %4d,b = %4d,c = %4d, d = %4d, 解1:%d\n",a,b,c,d,j);
		    else if ( e == 1 )
		      printf("a = %4d,b = %4d,c = %4d, d = %4d, 解2:%d\n",a,b,c,d,j);
		    else
		      printf("a = %4d,b = %4d,c = %4d, d = %4d, 解3:%d\n",a,b,c,d,j);
		     e++;
		    }
		}
	}
 }
 
 return 1;

}

long long int QD(int a, int b, int c, int d, int x)  {
 return a*x*x*x + b*x*x + c*x + d;
}

バックナンバーである数学セミナーの2017年10月号の「不可能性の証明」特集の金子元氏の「超越数論における不可能性」の記事のリュービルの定理や、eの超越性の証明を読んでいて、ううん実に難しいとうなっていたら、最後に参考文献のところで、西岡久美子「超越数とはなにか-代数方程式の解にならない数たちの話」講談社と、塩川宇賢「無理数と超越数」森北出版しかリストされていないので、唖然とした。

普通は、参考文献は少なくとも5つくらいはリストされるものなので、どうしても超越数論はマイナーなんだなと感じてしまった。とはいえ、超越数論は、ヒルベルト23の問題の七番目にも採り上げられているので、それなりに重要だと認識されているとはいえる。

私は西岡久美子さん(お笑いの好きな私は、どうしても、ピン芸人のにしおかすみこを思い出してしまう)のこの本はもっているのだが、塩川宇賢さんの本はもってないので、アマゾンの古本で急いで注文した。新刊では出ていないので入手できなくなることを懼れた。

そこで、塩川宇賢「無理数と超越数」森北出版のまえがきだけ読んだ段階で、単なる雑感のようなことを書いてみる。

さて、数というと、複素数も、四元数も、行列も入るのかもしれないが、ここでは素朴な意味での数を考える。すると、最初にくるのは、自然数と整数。これらが解として満たすのは、モニックな整係数の一次方程式である。

次に有理数となると、それが満たすのは、モニックでなくてよい、有理係数の一次方程式である。

次に無理数となると、有理係数の複数次方程式の解である場合と、有理係数の複数次方程式の解にはならない場合とがあり、前者は代数的数、後者は超越数と呼ばれる。

さて、問題は、特定の数が無理数であること、あるいは超越数であることの証明であり、それは場合により、途轍もなく難しい。

超越数であることが証明されている数として、e、π、2の√2乗、log102などがある。

ところが、e + πは、超越数どころか、無理数であるかどうかさえ分からないそうである。そんなもん超越数に決まっとるやんけ、みたいな思い込みは通用しない。

リーマンのゼータ関数に5を代入したζ(5)や、オイラー定数γも、超越数はおろか、無理数かどうかもわからないそうである。ところが、ζ(3)の無理数性を1978年にアペリが証明したというのだから、いよいよわからないものである。

で、ある命題を思いついた。それは、「超越数のうちで、超越数性が証明できるのは、高々加算無限である。」ううん、なんか当たり前で命題にならないか。ともかく、何億年経とうと、その超越数性が証明されない非加算無限の実数たちがひっそりと数の世界で暮らしている、ということだった。これもまた、いわゆる一つのプラトニズムではあるまいか。

このアーカイブについて

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

前のカテゴリは教育です。

次のカテゴリは日常です。

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