勿体なくも、108Hassium さんに私の投稿を見ていただけたようで、「相似遊興記 10」の投稿後に元記事の数式を修正してくださったようです。
108Hassium さん、ありがとうございました。
ですので今回は、以前の投稿で再現できなかった部分について遊んでみようと思います。使うソフトはもちろん UltraFractal(UF)です。
まずは次の式と設定です。
$${ \large z = \frac{z(1-mod(x,2)-iy)}{2} + \frac{(3z+1)(mod(x,2)+iy)}{2} }$$
$${z_0=pixel}$$
この式は氏が修正後の内容ですが、これは私が以前の投稿で挑戦済みです。なので、このままでは結果は変わりませんね。
では、他にどの部分を修正すれば同じ結果を得られるのか?
一番怪しいのは$${mod}$$の処理の部分です。
以前の投稿と重複しますが、UF には$${mod}$$の組込関数は無さそうなので、負数対策として以下の工夫をしています(AI が)。
float x = real(z)
float mod_x2 = ((x % 2.0) + 2.0) % 2.0 ; mod(x, 2) の非負版
この部分について改めて調べてみましたが、同様の情報は他のサイトでも見ることができ、間違いではなさそうです。が、今回は他の方法が無いか AI(Gemini 高速モード)に聞いたところ、以下のやり方を教えてくれました。
タイプA:float mod_x2 = x - 2 * floor(x / 2)
タイプB:float mod_x2 = abs(x) % 2
このやり方は、どちらも UF で実装可能です。
両方を試した結果、タイプAは以前の投稿と同じでしたが、タイプBで元記事と同じ結果を確認できました。
mapping: center=0/0 magn=1.0 formula: maxiter=1000 adjust=yes filename="SU-10.ufm" entry="Collatz_mod_Julia_Self_00_02" pa=2 pb=2 pk=1/0 bailout=10000 inside: transfer=linear entry="Default" outside: density=2 transfer=linear entry="Basic" type=Iterationこれって要するに「最初にマイナスを取っちゃえ」ということですね?
まぁいいんだけど。
次は設定を変えてマンデルブロ扱いです。
$${z_0=1}$$、$${k=pixel}$$。
mapping: center=-1/0 magn=3 formula: maxiter=1158 adjust=yes filename="SU-10.ufm" entry="Collatz_mod_Mandelbrot_Self_00_02" pa=2 pb=2 start=1/0 bailout=10000 inside: transfer=linear entry="Default" outside: density=2 transfer=linear entry="Basic" type=Iteration次は設定を変更。
$${z_0=k=pixel}$$
mapping: center=0/0 magn=1.0 formula: maxiter=1000 adjust=yes filename="SU-10.ufm" entry="Collatz_mod_Julia_Self_01_02" pa=2 pb=2 bailout=10000 inside: transfer=linear entry="Default" outside: density=2 transfer=linear entry="Basic" type=Iterationいや~、快感ですね。すっきりしましたw
こういうの、なんて言うのでしょうね。
レシピ通り作って、その通り料理ができた快感。
プラモデルを買って、説明通り組みあがった快感。
まいいか。
次の式と設定に進みます。
$${ \large z = \frac{z(1-mod(x,2)-imod(y,2))}{2} + \frac{(3z+1)(mod(x,2)+imod(y,2))}{2} }$$
$${z_0=pixel}$$
mapping: center=0/0 magn=1.0 formula: maxiter=1000 adjust=yes filename="SU-10.ufm" entry="Collatz_mod_Julia_Self_10_02" pa=2 pb=2 pk=1/0 bailout=10000 inside: transfer=linear entry="Default" outside: density=2 transfer=linear entry="Basic" type=Iterationこちらも、結局は$${mod}$$の処理の問題だったようですね。
上下反転してますが、それは良しとします;
厳密にはノイズの入り方が違うのですが、これは彩色アルゴリズムの違いだと思うので、今回は良いということにします。
どんどん進みます。
$${z_0=1}$$、$${k=pixel}$$。
mapping: center=0/0 magn=1.0 formula: maxiter=1000 adjust=yes filename="SU-10.ufm" entry="Collatz_mod_Mandelbrot_Self_10_02" pa=2 pb=2 start=1/0 bailout=10000 inside: transfer=linear entry="Default" outside: density=2 transfer=linear entry="Basic" type=Iteration最後です。
$${z_0=k=pixel}$$
mapping: center=0/0 magn=1.0 formula: maxiter=1000 adjust=yes filename="SU-10.ufm" entry="Collatz_mod_Julia_Self_11_02" pa=2 pb=2 bailout=10000 inside: transfer=linear entry="Default" outside: density=2 transfer=linear entry="Basic" type=Iterationこれで、コラッツは完全攻略です!(偉そげに)
と、終わる予定だったのですが、以前にやり忘れたことをやっておきます。
それは「UF のパブリックフォーミュラにコラッツあるの?」です。
検索した結果、4 つヒットしました。
om.ufm:Collatz、Collatz Mod、Collatz Mod 2
om2.ufm:Bivar Modified Collatz
サラッと見てみます。
Collatz フォーミュラ
コメントに wiki の URL が書いてあるので参考にしたのだと思われます。
$${z}$$の初期化は pixel 値を使った関数($${\sin}$$等)を指定できます。
loop 中、最初は$${z=p5*fn2(z)+p6}$$が適用されます。
$${p5}$$と$${p6}$$は複素数を、$${fn2}$$は関数を指定可能です。
デフォルト値だと$${z=1z}$$になります。
その後は次の 2 タイプあります。
$${z=0.25*(p1+7z-(p2+5z) \cos(\pi z))}$$
$${p1}$$と$${p2}$$は floatで、デフォルトは 2.0 と 1.9 です。
私が以前に書いた式では$${p2}$$は 2 だったので、少し違いますね。
描画結果は次の通り。bailout を増やした以外はデフォルトです。
mapping: center=0/0 magn=1 formula: maxiter=1000 percheck=off adjust=yes filename="om.ufm" entry="Collatz" V=1 p1=2.0 p2=1.9 p3=1.0 p4=0.75 p5=1/0 p6=0/0 fn1=ident fn2=ident bail=1000 inside: transfer=linear entry="Default" outside: transfer=linear entry="Basic" type=Iteration$${z=0.25*(p3+4z-(p4+2z) \cos(\pi z))}$$
$${p3}$$と$${p4}$$は floatで、デフォルトは 1.0 と 0.75 です。
これは以前に Gemini が提案してくれた式で、私が不採用にしたものです。
上の式のショートカット版ということでしたね。
描画結果は次の通りで、これも bailout を増やした以外はデフォルトです。
mapping: center=0/0 magn=1 formula: maxiter=1000 percheck=off adjust=yes filename="om.ufm" entry="Collatz" V=2 p1=2.0 p2=1.9 p3=1.0 p4=0.75 p5=1/0 p6=0/0 fn1=ident fn2=ident bail=1000 inside: transfer=linear entry="Default" outside: transfer=linear entry="Basic" type=Iteration以前も感じたことですが、ここまで図が変化するなら、それはショートカットとは言えない気がするのですが…
Collatz Mod フォーミュラ
Collatz フォーミュラと大きくは変わりません。
違うのは、loop 開始時に、$${z}$$に対してもう一度関数が適用できることと、$${\sin}$$等の関数毎に式が書かれていることです。
Collatz フォーミュラで loop 開始時に適用されていた式は無いです。
基本的な式は$${z=0.25*(p1+7z-(p2+5z) \cos(\pi z))}$$で、関数毎に式が書かれています。例えば以下のように。
$${z=p1*\log((abs(fn3(2+7z-(2+5z)*\cos(\pi z))/4)))^{@pow}+p2+pixel}$$
mapping: center=0/0 magn=0.7 formula: maxiter=1000 percheck=off filename="om.ufm" entry="CollatzMod" V=9 p1=1/0 p2=0/0 fn1=ident fn2=ident fn3=ident pow=1/0 iter=3 adj=102.0 bail=1000.0 inside: transfer=none outside: transfer=linear entry="Default"式も結果も、なかなか強烈です。
Collatz Mod 2 フォーミュラ
これはもう、私が言葉では書けないレベル(面倒…)なので省略します。
気になる方は UF のパブリックフォーミュラをダウンロードして確認してみてください。
次の図は、サラサラッと見て面白そうだったヤツです。
mapping: center=0/-0.75 magn=0.5 formula: maxiter=250 percheck=off filename="om.ufm" entry="CollatzMod2" V=7 p1=0/0 p2=0/0 p3=1/0 p4=0/0 fn1=ident fn2=ident fn3=ident pow=1/0 iter=3 adj=102.0 bail=1000.0 inside: transfer=none outside: transfer=linear entry="Default"Bivar Modified Collatz フォーミュラ
これも、もう全然説明なんてできません;
結果だけ。次の図はデフォルトです。
mapping: center=0.001/0.001 magn=1.2 formula: maxiter=250 percheck=off filename="om2.ufm" entry="BivarModifiedCollatz" bf=ident p8=0.5/0 p9=0/0 p2=1/0 p3=1/0 p4=1/0 p5=0/0 p6=1/0 p7=0/0 fn1=ident fn2=ident bt=Convergent bailcon=0.00000000000001 baildiv=8.0 inside: transfer=none outside: transfer=linear entry="Default"例えば$${\sin、\cosh、\sinh}$$を組み合わせると次のようになります。
mapping: center=0.001/0.001 magn=0.7 formula: maxiter=250 percheck=off filename="om2.ufm" entry="BivarModifiedCollatz" bf=sin p8=0.5/0 p9=0/0 p2=1/0 p3=1/0 p4=1/0 p5=0/0 p6=1/0 p7=0/0 fn1=cosh fn2=sinh bt=Convergent bailcon=0.00000000000001 baildiv=8.0 inside: transfer=none outside: density=2 transfer=linear entry="Default"パラメータの組み合わせも考えると凄い数ですね。
ということで、今回は終了です。
次回の投稿予定は「不明」です。