ibaibabaibaiのサイエンスブログ

サイエンス中心の予定ですが,何を書くかわかりません.統計とかの話はこっちに書くつもり. https://sites.google.com/site/iwanamidatascience/memberspages/ibayukito  ツイッターは@ibaibabaibai

5次方程式の解をぐるぐる動かす

続編です

前回「平方根の日付変更線」の続編である.こんどの話には元ネタがあるが,それは後で紹介する.ただし「ニュートン法で解析接続する」「それをマウスでカチカチ実演する」というあたりはオリジナルである.

こんどは5次方程式

前回は平方根,すなわち,{z^2=a}の解を{a}の関数だと思って,複素数の平面上で動かしてみた.このときに「解析接続」に相当するものを「ニュートン法で前の答を初期値と考えて解く」ということだと定義して,{a}の値をマウスでカチカチ入力しながら,解を動かしてみるプログラムも紹介した.

ここでは,平方根の代わりに5次方程式,たとえば{z^5-z+a=0}の解を{a}の関数として考えて,マウスでカチカチ動かしてみる.対応するソースコードは末尾に添付したが,使い方は「平方根の日付変更線」で説明したのと同じである.

ただし,出力の側のパネルには{a=0}のときの方程式{z^5-z=0}の解を○で描いてある.入力側の小さい黒丸は原点{a=0}を示す.以下の実行結果では,モノクロのほうが入力で,色のついたほうが解である.

さっそく.{z^5-z+a=0}についてやってみよう.

  • まずは原点のまわりをあまり大きく外れないように注意深く回ってみる.すると,無事に5つの根は元に戻った.

f:id:ibaibabaibai_h:20151120234111p:plain:w350f:id:ibaibabaibai_h:20151120234122p:plain:w350

  • こんどは少し大胆に・・ おお,一対が入れ替わった!

f:id:ibaibabaibai_h:20151120234140p:plain:w350f:id:ibaibabaibai_h:20151120234151p:plain:w350

  • もっとがーっとやってみる.3つが循環的に入れ替わり,ひとつは元に戻った.

f:id:ibaibabaibai_h:20151120234206p:plain:w350f:id:ibaibabaibai_h:20151120234216p:plain:w350

  • めちゃめちゃ複雑にしてみたら,なんかすごいことになってる.

f:id:ibaibabaibai_h:20151120235347p:plain:w350f:id:ibaibabaibai_h:20151120235427p:plain:w350

という具合で,なかなか楽しい.

別の例

もうひとつ別の5次方程式{z^5+az-1=0}についてやってみよう.{a=0}のときの方程式{z^5-1=0}の解はこんどは5角形に並ぶ.

  • 小さくまわるとやはり元に戻る.

f:id:ibaibabaibai_h:20151117193844p:plain:w350f:id:ibaibabaibai_h:20151117193853p:plain:w350

  • こんどは1対が入れ替わった

f:id:ibaibabaibai_h:20151117193903p:plain:w350f:id:ibaibabaibai_h:20151117193912p:plain:w350

  • えいっとふくらませると

f:id:ibaibabaibai_h:20151117193921p:plain:w350f:id:ibaibabaibai_h:20151117193937p:plain:w350

もっと色々できそうである.読者はマウスのカチカチで5つの解を自由に操れるだろうか?

元ネタの本の紹介

5次方程式の解を係数{a}の値を連続的に動かして入れ替える話の元ネタは「ラマヌジャンの遺した関数」(フックス,タバチニコフ著,蟹江訳,岩波書店)である.

『ラマヌジャンの遺した関数』〈本格数学練習帳1〉moreinfo

入れ替わりの背後にある数学的な仕組みは,この本の第5講「5次方程式」に詳しく説明されている*1が,それで終わりではない.この本の面白いところは,そこから発展させて「5次方程式の解を係数から根号と加減乗除であらわす公式」が存在しない理由まで説明してしまっていることである(そういう背景があるので3次でも4次でもなく5次方程式だったわけだ).

該当する章(長くない)だけを読んでほぼ理解できるので,興味のある方はぜひ手にとって頂きたい.

普通の証明と違うのか?

自分はかなり感動したのだが,そういうと,事情通の人は「それって,普通のガロア理論群論による証明と違うんですか?」と聞くかもしれない.

いや,あんまり違わないように見える

というのが正直なところかも.最後まで図を念頭に入れて議論しているが,置換群の性質を利用する部分は普通っぽい.結局「置換」をすごく具体的・直観的にやってみせているだけなのかも・・という気もしないではない.

それどころか,普通より劣っているという見方もあるかもしれない.まず,細部まで述べていないので簡単にみえるが,細かい点をきっちり詰めようとしたら,実はかなり煩雑になるのかもしれないという懸念がある.また,普通の議論は,複素数だけでなく,たとえば1+1=0となるような少し風変りな四則のもとで5次方程式を考えた場合にも拡張できる(正標数の場合).しかし複素数の平面をぐるぐる回る議論はそんな方向に拡張できるようには思えない.

これに対しての弁護としては,まず,この話は,zが不定元であるような普通の「方程式」というより,方程式の定義する代数関数を扱っているような気がする,ということがある.そっちの方向に行く入り口のようにも思えるのだが,その考えが妥当かどうかは,素人すぎてわからない.

しかし,素人の立場でいうと,そういう高度な話よりも「根の置換」ということを,具体的で自然な操作で実際にやってみせてくれるところが,何か想像力を掻き立てるのだと思う.抽象的に置換群を論じるほうが一般性ではまさるにしても,それでは何かピンとこない部分があって,そこが満たされるのである.

その部分をもっと味わいたくて,ニュートン法とか,マウスでカチカチとかを考えてみた,というわけだ.

ソースコード

ほとんど同じだが,5次方程式版のR言語のコードを載せておく.基本的に,互いに違うのはfとdfの定義とzの初期値の設定だけである.使い方は「平方根の日付変更線」の記事と上の実行例を参照.前の記事ではカットペーストと書いたが.直接やると再実行が不便なので,テキストファイルにカットペーストしてsource関数で実行するのが良さそうだ.


{z^5-z+a=0} バージョン

f=function(z,a)
{
w=z^5-z+a
return(w)
}

df=function(z,a)
{
w=5*z^4-1
return(w)
}

dev.new()
a=0+0i
plot(a,xlim=c(-2,2),ylim=c(-2,2),col=1,pch=20,cex=2)

dev.new()
th=c(1:4)*2*pi/4
z=array(0,dim=5)
z[2:5]=cos(th)+sin(th)*(0+1i)
plot(z,xlim=c(-2,2),ylim=c(-2,2),col=1,cex=3,lwd=3)

zz=z
for(j in 1:1000)
{
  dev.set(dev.prev())
  aa=locator(1)
  points(aa,xlim=c(-2,2),ylim=c(-2,2),pch=20,col=1)
  if(abs(aa$x>2)|abs(aa$y)>2) break
  a=aa$x+aa$y*(0+1i)
  icount=0
  repeat
  {
    zzold=zz
    zz=zz-f(zz,a)/df(zz,a)
    if(sum(abs(zz-zzold))<1.0e-04){print(paste(i," converge")); break}
    if(icount>1000) {print("not converge"); break}
    icount=icount+1 
  }
  dev.set(dev.prev())
  points(zz,xlim=c(-2,2),ylim=c(-2,2),pch=20,col=c(2:6))
}


{z^5+az-1=0} バージョン

f=function(z,a)
{
w=z^5+a*z-1
return(w)
}

df=function(z,a)
{
w=5*z^4+a
return(w)
}

dev.new()
a=0+0i
plot(a,xlim=c(-2,2),ylim=c(-2,2),col=1,pch=20,cex=2)

dev.new()
th=c(0:4)*2*pi/5
z=cos(th)+sin(th)*(0+1i)
plot(z,xlim=c(-2,2),ylim=c(-2,2),col=1,cex=3,lwd=3)

zz=z
for(j in 1:1000)
{
  dev.set(dev.prev())
  aa=locator(1)
  points(aa,xlim=c(-2,2),ylim=c(-2,2),pch=20,col=1)
  if(abs(aa$x>2)|abs(aa$y)>2) break
  a=aa$x+aa$y*(0+1i)
  icount=0
  repeat
  {
    zzold=zz
    zz=zz-f(zz,a)/df(zz,a)
    if(sum(abs(zz-zzold))<1.0e-04){print(paste(i," converge")); break}
    if(icount>100) {print("not converge"); break}
    icount=icount+1 
  }
  dev.set(dev.prev())
  points(zz,xlim=c(-2,2),ylim=c(-2,2),pch=20,col=c(2:6))
}
(おまけ)「本格数学練習帳」はいわゆる演習書ではないという件

上の「ラマヌジャンの遺した関数」は「本格数学練習帳」というシリーズの1巻なのだが,いわゆる演習書というわけではなくて「具体的で面白い問題を通じて数学を語る」という趣旨だと思われる.シリーズのタイトルをみると,練習問題だけが並んでいる本と誤解されるかもしれないが,それはちょっと違う.練習問題も沢山あるが,基本的には普通に解説していくスタイルの本である.

*1:ヒント.鍵を握るのは{z^5+az-1=0}が重根を持つ{a}の値である.このとき違う色の解が衝突してヤバいことになるが,実はそれらの点をどう回るかが入れ替えを決めている.多項式{f(z)=0}の重根の条件は,{f(z)=0}微分した{f'(z)=0}を連立させたものになるので,それを解いてヤバい{a}の値を求めることができる.