メインコンテンツへスキップ
見出し画像

ジュリア集合の合同・相似変換

    どうも、108Hassiumです。

    突然ですが、皆さんはジュリア集合を縦横無尽に平行移動させたりグルングルン回転させまくったり、大きくしたりちっちゃくしたりしたいと思ったことは無いでしょうか?

    この記事では、ジュリア集合を自由に平行移動・回転・縮小・拡大する方法を紹介したいと思います。

    なお、この記事では「ジュリア集合」を以下のように定義します。

    ジュリア集合の定義
    以下の数列znz_nが無限大に発散しないような複素数z0z_0全体の集合を「f(z)f(z)のジュリア集合」と呼ぶ。

    zn+1=f(zn)z_{n+1}=f(z_n)

    ※念のため言っておくと、この定義は原義の同値な言いかえとかではなく全くの別物です。

    平行移動

    f(z+a)−af(z+a)-a(aaは定数)のジュリア集合は、f(z)f(z)のジュリア集合を平行移動したものになります。

    画像
    ☝例:z^2+0.3+0.5iのジュリア集合(左)と、(z+i)^2+0.3+0.5i-iのジュリア集合(右)

    f(z+a)−af(z+a)-aのジュリア集合の計算に使う数列は、以下のように変形できます。

    z1=f(z0+a)−az_1=f(z_0+a)-a

    z2=f(f(z0+a)−a+a)−a=f(f(z0+a))−az_2=f(f(z_0+a)-a+a)-a\\=f(f(z_0+a))-a

    z3=f(f(f(z0+a)−a+a)−a+a)−a=f(f(f(z0+a)))−az_3=f(f(f(z_0+a)-a+a)-a+a)-a\\=f(f(f(z_0+a)))-a

    z4=f(f(f(f(z0+a)−a+a)−a+a)−a+a)−a=f(f(f(f(z0+a))))−az_4=f(f(f(f(z_0+a)-a+a)-a+a)-a+a)-a\\=f(f(f(f(z_0+a))))-a

    zn=f(f(f(…f(f(f(z0+a)−a+a)−a+a)−a…+a)−a+a)−a+a)−a=f(f(f(…f(f(f(z0+a)))…)))−az_{n}=f(f(f(…f(f(f(z_0+a)-a+a)-a+a)-a…+a)-a+a)-a+a)-a\\=f(f(f(…f(f(f(z_0+a)))…)))-a

    関数を重ねることによって、関数の中と外にあった+a+aと−a-aが打ち消し合うようになり、一番内側と一番外側にだけ影響が残ります。

    外側に残った−a-aは数列の発散性にほとんど影響せず、せいぜい発散判定の行われるタイミングがずれて外側の模様が変わる程度です。(先程の画像でも、収束領域の周りの模様が変わっています)

    そして内側の+a+aは、初期値をずらす効果があります。

    (z+i)2+0.3+0.5i−i(z+i)^2+0.3+0.5i-iのジュリア集合の計算ではz0=1z_0=1とするとz2+0.3+0.5iz^2+0.3+0.5iのジュリア集合におけるz0=1+iz_0=1+iのときの数列が計算され、z2+0.3+0.5iz^2+0.3+0.5iのジュリア集合でのz0=0z_0=0の計算はz0=−iz_0=-iのときの計算に対応しています。

    このような仕組みにより、f(z+a)−af(z+a)-aのジュリア集合はf(z)f(z)のジュリア集合を−a-a平行移動したものになります。

    ※先程の画像は諸事情により上下逆に描画されているので、a=ia=iとすることにより上方向に移動しています。

    画像
    ☝ランダムに平行移動を繰り返すz^2+0.3+0.5iのジュリア集合

    回転・縮小・拡大

    1af(az)\frac{1}{a}f(az)のジュリア集合は、f(z)f(z)のジュリア集合を回転・縮小・拡大したものになります。

    画像
    ☝例:z^2+0.3+0.5iのジュリア集合(左)と、(((1+i)z)^2+0.3+0.5i)/(1+i)のジュリア集合(右)

    1af(az)\frac{1}{a}f(az)のジュリア集合の計算に使う数列は、以下のように変形できます。

    z1=1af(az0)z_1=\frac{1}{a}f(az_0)

    z2=1af(a×1af(az0))=1af(f(az0))z_2=\frac{1}{a}f(a×\frac{1}{a}f(az_0))\\=\frac{1}{a}f(f(az_0))

    z3=1af(a×1af(a×1af(az0)))=1af(f(f(az0)))z_3=\frac{1}{a}f(a×\frac{1}{a}f(a×\frac{1}{a}f(az_0)))\\=\frac{1}{a}f(f(f(az_0)))

    z4=1af(a×1af(a×1af(a×1af(az0))))=1af(f(f(f(az0))))z_4=\frac{1}{a}f(a×\frac{1}{a}f(a×\frac{1}{a}f(a×\frac{1}{a}f(az_0))))\\=\frac{1}{a}f(f(f(f(az_0))))

    zn=1af(a×1af(a×1af(a×…1af(a×1af(a×1af(az0)))…)))=1af(f(f(…f(f(f(az0)))…)))z_n=\frac{1}{a}f(a×\frac{1}{a}f(a×\frac{1}{a}f(a×…\frac{1}{a}f(a×\frac{1}{a}f(a×\frac{1}{a}f(az_0)))…)))\\=\frac{1}{a}f(f(f(…f(f(f(az_0)))…)))

    関数を重ねることによって、関数の中と外にあったaaと1a\frac{1}{a}が打ち消し合うようになり、一番内側と一番外側にだけ影響が残ります。

    外側に残った1a\frac{1}{a}は数列の発散性にほとんど影響せず、せいぜい発散判定の行われるタイミングがずれて外側の模様が変わる程度です。

    そして内側のaaは、初期値をずらす効果があります。

    11+i((1+i)z)2+0.3+0.5i\frac{1}{1+i}((1+i)z)^2+0.3+0.5iのジュリア集合の計算ではz0=1z_0=1とするとz2+0.3+0.5iz^2+0.3+0.5iのジュリア集合におけるz0=1+iz_0=1+iのときの数列が計算され、z2+0.3+0.5iz^2+0.3+0.5iのジュリア集合でのz0=1z_0=1の計算はz0=11+iz_0=\frac{1}{1+i}のときの計算に対応しています。

    このような仕組みにより、1af(az)\frac{1}{a}f(az)のジュリア集合はf(z)f(z)のジュリア集合に対して以下のような関係を持ちます。

    • ∣a∣=1|a|=1:−arg(a)-\text{arg}(a)回転

    • ∣a∣>1|a|>1かつarg(a)=0\text{arg}(a)=0:1a\frac{1}{a}倍縮小

    • ∣a∣<1|a|<1かつarg(a)=0\text{arg}(a)=0:1a\frac{1}{a}倍拡大

    • その他:上記の組み合わせ

    画像
    ☝ランダムに回転・縮小・拡大を繰り返すz^2+0.3+0.5iのジュリア集合

    まとめ

    以上の結果を踏まえると、ある1次関数g(z)=az+bg(z)=az+bを用いてg−1(f(g(z)))g^{-1}(f(g(z)))と表せる関数のジュリア集合がf(z)f(z)のジュリア集合に回転・縮小・拡大・平行移動を施したものになることがわかります。

    画像
    ☝ランダムに平行移動・回転・縮小・拡大を繰り返すz^2+0.3+0.5iのジュリア集合

    また、ほぼ同じような考え方によりcon(f(con(z)))\text{con}(f(\text{con}(z)))(con(z)\text{con}(z)はzzの複素共役)が鏡映変換に対応していることも分かります。

    応用

    せっかくなので、1次関数による合同・相似変換の概念の応用例を紹介します。

    2次関数の自由度

    2次関数といえばax2+bx+cax^2+bx+cという3自由度の一般式を高校で習いますが、実はジュリア集合の合同・相似変換で移り合うものを同一視すると自由度は1変数分しかなくなります。

    実際、f(z)=az2+bz+cf(z)=az^2+bz+c、g(z)=1az−b2ag(z)=\frac{1}{a}z-\frac{b}{2a}とすると、g−1(f(g(z)))g^{-1}(f(g(z)))は以下のようになります。

    g−1(f(g(z)))=a(a(1az−b2a)2+b(1az−b2a)+c+b2a)g^{-1}(f(g(z)))=a(a(\frac{1}{a}z-\frac{b}{2a})^2+b(\frac{1}{a}z-\frac{b}{2a})+c+\frac{b}{2a})

    =a(a(1a2z2−ba2z+b24a2)+baz−b22a+c+b2a)=a(a(\frac{1}{a^2}z^2-\frac{b}{a^2}z+\frac{b^2}{4a^2})+\frac{b}{a}z-\frac{b^2}{2a}+c+\frac{b}{2a})

    =z2−bz+b24+bz−b22+ac+b2=z^2-bz+\frac{b^2}{4}+bz-\frac{b^2}{2}+ac+\frac{b}{2}

    =z2+ac−b24+b2=z^2+ac-\frac{b^2}{4}+\frac{b}{2}

    ac−b24+b2=Cac-\frac{b^2}{4}+\frac{b}{2}=Cと書き換えることで、z2+Cz^2+Cという見慣れた形の式に変形できます。

    これは「az2+bz+caz^2+bz+cのジュリア集合は、z2+Cz^2+Cのジュリア集合に回転・縮小・拡大・平行移動を施したものしかない」という事を意味するのですが、実は意外な副産物があります。

    以下の記事で、「ccがz2+cz^2+cのマンデルブロ集合のフチの位置にあるとき、特殊なジュリア集合が生成される」という話をしました。

    画像
    ☝z^2+0.37+0.16iのジュリア集合
    画像
    ☝z^2+cのマンデルブロ集合上における0.37+0.16iの位置

    ハート形の部分は「カージオイド」という図形で、曲線上からキリのいい座標の点を見つけるのは難しそうです。

    一方、c(z2−z)c(z^2-z)のマンデルブロ集合はこんな形をしています。

    画像
    ☝c(z^2-z)のマンデルブロ集合

    真ん中の丸い領域は、どうやら半径1の円になっているようです。

    単位円周上の有理点を探すのは簡単なので、c(z2−z)c(z^2-z)のジュリア集合からz2+cz^2+cのジュリア集合への相似変換ができればz2+cz^2+cの周上のキリのいい値の点を見つけることができそうです。

    先程の相似変換の式を使ってc(z2−z)c(z^2-z)をz2+Cz^2+Cの形に変形すると、C=−c24−c2C=-\frac{c^2}{4}-\frac{c}{2}となります。

    実際に単位円周上のccの値を代入してみるとCCはカージオイド上の点になるようで、0.6+0.8iなどの値を代入することで目的の値を得ることができます。

    画像
    ☝c(z^2-z)の外周上の点とz^2+cの外周上の点の対応関係

    追記(2026/08/20)

    計算ミスによりC=−c24+c2C=-\frac{c^2}{4}+\frac{c}{2}になっていたのをC=−c24−c2C=-\frac{c^2}{4}-\frac{c}{2}に修正しました。

    なお、C=−c24+c2C=-\frac{c^2}{4}+\frac{c}{2}という式は「−c(z2−z)-c(z^2-z)からz2+Cz^2+Cへの変換」になっており、−c(z2−z)-c(z^2-z)のマンデルブロ集合も原点周りに単位円がある形になっているため、結果としてC=−c24+c2C=-\frac{c^2}{4}+\frac{c}{2}も「カージオイドのフチの値を得るための式」として成立していたようです。

    3次関数の自由度

    2次関数と同様に、3次関数の(ジュリア集合の形状についての)自由度についても4より少ないことを確認できます。

    3次関数f(z)f(z)をaz3+bz2+cz+daz^3+bz^2+cz+dと置き、この関数の係数を1次関数g(z)=ez+hg(z)=ez+hを使って減らすことを考えます。

    まず、g−1(f(g(z)))g^{-1}(f(g(z)))を展開します。

    g−1(f(g(z)))g^{-1}(f(g(z)))

    =1e(a(ez+h)3+b(ez+h)2+c(ez+h)+d−h)=\frac{1}{e}(a(ez+h)^3+b(ez+h)^2+c(ez+h)+d-h)

    =1e(a(e3z3+3e2hz2+3eh2z+h3)+b(e2z2+2ehz+h2)2+c(ez+h)+d−h)=\frac{1}{e}(a(e^3z^3+3e^2hz^2+3eh^2z+h^3)+b(e^2z^2+2ehz+h^2)^2+c(ez+h)+d-h)

    =1e(ae3z3+(3ae2h+be2)z2+(3aeh2+2beh+ce)z+ah3+bh2+ch+d−h)=\frac{1}{e}(ae^3z^3+(3ae^2h+be^2)z^2+(3aeh^2+2beh+ce)z+ah^3+bh^2+ch+d-h)

    =ae2z3+(3aeh+be)z2+(3ah2+2bh+c)z+1e(ah3+bh2+ch+d−h)=ae^2z^3+(3aeh+be)z^2+(3ah^2+2bh+c)z+\frac{1}{e}(ah^3+bh^2+ch+d-h)

    ここからeeとhhを使って係数を消していくとなると、3次と2次の係数を消すのが簡単そうです。

    というわけで、以下の連立方程式を解いてみます。

    • ae2=1ae^2=1

    • 3aeh+be=03aeh+be=0

    これをeeとhhについて解くと以下のような解が得られます。

    • e=1ae=\frac{1}{\sqrt{a}}

    • h=−b3ah=-\frac{b}{3a}

    これをg−1(f(g(z)))g^{-1}(f(g(z)))の式に代入すると以下のようになります。

    g−1(f(g(z)))=z3+(−b23a+c)z+a(2b327a2+b−bc3a+d)g^{-1}(f(g(z)))=z^3+(-\frac{b^2}{3a}+c)z+\sqrt{a}(\frac{2b^3}{27a^2}+\frac{b-bc}{3a}+d)

    C=−b23a+cC=-\frac{b^2}{3a}+c、D=a(2b327a2+b−bc3a+d)D=\sqrt{a}(\frac{2b^3}{27a^2}+\frac{b-bc}{3a}+d)と置くことで、az3+bz2+cz+daz^3+bz^2+cz+dのジュリア集合はz3+Cz+Dz^3+Cz+Dのジュリア集合を平行移動・回転・縮小・拡大したものであることがわかります。

    なお、マンデルブロ集合を描画するために臨界点を計算することを考えるとz3+Cz+Dz^3+Cz+Dよりもz3+Cz2+Dz^3+Cz^2+DやC(z33−z22)+DC(\frac{z^3}{3}-\frac{z^2}{2})+Dという形の式の方が便利なのですが、これらの式は連立方程式の立て方を変えたりz3+Cz+Dz^3+Cz+Dにさらに変換をかけたりすることで導出できます。

    また、一般のnn次多項式関数においても、1次関数の係数が2つあるので係数を2つ消すことができ、自由度はn−1n-1個になることが予想できます。(係数の消し方によっては5次以上の高次方程式が出てくる可能性もありますが、解が存在することさえわかれば特定の式が標準形として使えることを確認するには十分です)

    一般の多項式関数に関する話が出てきたので、ついでに他の話をします。

    2次関数の自由度の話に出てきた記事では、「z5+cz^5+cと(−c)45(z5−1)(-c)^{\frac{4}{5}}(z^5-1)のジュリア集合は相似」という話もしていました。

    ※☟再掲

    実はこの性質も、1次関数による合同・相似変換で説明できます。

    f(z)=z5+cf(z)=z^5+c、g(z)=azg(z)=azとすると、

    g−1(f(g(z)))=a4z5+ca=a4(z5+ca5)g^{-1}(f(g(z)))=a^4z^5+\frac{c}{a}=a^4(z^5+\frac{c}{a^5})

    となり、a=(−c)15a=(-c)^{\frac{1}{5}}とすることでz5+cz^5+cと(−c)45(z5−1)(-c)^{\frac{4}{5}}(z^5-1)のジュリア集合が相似であることがわかります。


     
     
    数学関係の記事を書きます。毎週日曜更新予定。

    あなたへのおすすめ