# The Fractalist

给定一些复数

t
-1.2499999999999993-0.03999999999999925i
-0.4199999999999986+0.6000000000000011i
-0.24999999999999845-0.6399999999999997i
-1.2099999999999993-0.16999999999999926i
0.08000000000000164-0.6299999999999997i
0.3600000000000018-0.3199999999999994i
0.3300000000000018+0.520000000000001i
-0.16999999999999837+0.6500000000000011i
-0.23999999999999844+0.7500000000000012i
-0.6999999999999988-0.26999999999999935i
-0.5699999999999987+0.5700000000000011i
-0.5499999999999987-0.6499999999999997i
-0.5699999999999987-0.49999999999999956i
-0.7099999999999989+0.29000000000000087i
-0.36999999999999855-0.6399999999999997i
-0.7499999999999989+0.030000000000000755i
-1.2599999999999993-0.08999999999999925i
-1.0099999999999991+0.28000000000000086i
-1.3399999999999994-0.059999999999999255i
-0.5699999999999987+0.500000000000001i
-0.7499999999999989+0.04000000000000076i
-0.47999999999999865-0.6299999999999997i
-1.0599999999999992-0.25999999999999934i
-0.7799999999999989+0.13000000000000073i
-0.21999999999999842-0.7399999999999998i
-0.7799999999999989+0.15000000000000074i
-0.47999999999999865-0.6199999999999997i
-0.1899999999999984+0.6700000000000012i
-0.4199999999999986-0.5999999999999996i
0.29000000000000176+0.47000000000000103i
-0.829999999999999-0.18999999999999928i
-0.7899999999999989+0.15000000000000074i

题面:Math and science are powerful tools, but imagination might be the key to success.

# Writeup

根据题目名字,猜测是分型,与 Mandbrot Sequence 有关。

Mandbrot 是在一个复数平面上的区域.

img

给定一个点 x+yix+yi, 怎么确定它在不在这个集合里呢(图中黑色部分)

就是用这个公式

zn+1=zn2+cz_{n+1}=z_n^2+c

c=x+yic=x+yi , 带入这个式子计算 zn+1z_{n+1} 一直计算,如果这个数收敛,那么它就在这个集合里。

可以证明,如果 zn>2|z_n|>2 那么它一定不在这个集合里面,并且这个最小的 nn 就是这个 cc 的逃逸时间,escape-time

我们计算出上面这些复数点的逃逸时间 nn. 可以得到一个逃逸时间序列,把它作为 ascii 输出就可以了

n
import matplotlib.pyplot as plt
data = [
    complex(-1.2499999999999993,-0.03999999999999925),
    complex(-0.4199999999999986,0.6000000000000011),
    complex(-0.24999999999999845,-0.6399999999999997),
    complex(-1.2099999999999993,-0.16999999999999926),
    complex(0.08000000000000164,-0.6299999999999997),
    complex(0.3600000000000018,-0.3199999999999994),
    complex(0.3300000000000018,0.520000000000001),
    complex(-0.16999999999999837,0.6500000000000011),
    complex(-0.23999999999999844,0.7500000000000012),
    complex(-0.6999999999999988,-0.26999999999999935),
    complex(-0.5699999999999987,0.5700000000000011),
    complex(-0.5499999999999987,-0.6499999999999997),
    complex(-0.5699999999999987,-0.49999999999999956),
    complex(-0.7099999999999989,0.29000000000000087),
    complex(-0.36999999999999855,-0.6399999999999997),
    complex(-0.7499999999999989,0.030000000000000755),
    complex(-1.2599999999999993,-0.08999999999999925),
    complex(-1.0099999999999991,0.28000000000000086),
    complex(-1.3399999999999994,-0.059999999999999255),
    complex(-0.5699999999999987,0.500000000000001),
    complex(-0.7499999999999989,0.04000000000000076),
    complex(-0.47999999999999865,-0.6299999999999997),
    complex(-1.0599999999999992,-0.25999999999999934),
    complex(-0.7799999999999989,0.13000000000000073),
    complex(-0.21999999999999842,-0.7399999999999998),
    complex(-0.7799999999999989,0.15000000000000074),
    complex(-0.47999999999999865,-0.6199999999999997),
    complex(-0.1899999999999984,0.6700000000000012),
    complex(-0.4199999999999986,-0.5999999999999996),
    complex(0.29000000000000176,0.47000000000000103),
    complex(-0.829999999999999,-0.18999999999999928),
    complex(-0.7899999999999989,0.15000000000000074)
]
ans = []
for c in data:
    n = 0
    z = 0
    while abs(z) <= 2:
        z = z*z + c
        n += 1
    ans.append(n-1)
print(bytearray(ans))

于是得到 flag

l
DawgCTF{BeN01tWh0Co1N3dFr@CtaLs}