function is_prime(num)
    if num == 2 || num == 3 return true end
    if num < 2 || num % 2 == 0 return false end
    if num < 9 return true end
    if num % 3 == 0 return false end
    r = trunc(Int, sqrt(num))
    f = 5
    while f <= r
        if num % f == 0 return false end
        if num % (f+2) == 0 return false end
        f += 6;
    end
    return true
end

function is_gaussian_prime(num)
    a = real(num)
    b = imag(num)
    if a == 0
        b = abs(b)
        return is_prime(b) && b % 4 == 3
    elseif b == 0
        a = abs(a)
        return is_prime(a) && a % 4 == 3
    end
    return is_prime(a^2 + b^2)
end

b = -1 - 1im
numInComplexBase = [complex(0)]

# Check the first x numbers in the complex base
x = 10000

for index = 2:x
    # Row index of the binary tree constructed from the values of numInComplexBase
    row = ndigits(index - 1, base = 2) - 1
    leadingValue = b^row

    theRest = numInComplexBase[index - 2^row]
    number = leadingValue + theRest

    push!(numInComplexBase, number)
    if is_gaussian_prime(number)
        println(index - 1)
    end
end