MojoでProject Euler 36

https://projecteuler.net/problem=36

10進で回文数を出してそれが2進で回文数になっているか調べるくらいですが、2進で考えると回文数は必ず奇数になるんですね。
これを進めて考えると、例えば、17xxxという10進数を2進にすると10xx…となりますが、末尾を考えると10進で71で2進で01ですが、4で割ると余りが3と1になり、17xxxはありえないことが分かります。しかし、こうしても速くなりませんでした。

from collections import Set
import sys


#################### library ####################

fn binary(owned n: Int) -> List[Int]:
    var bs = List[Int]()
    while n > 0:
        bs.append(n & 1)
        n >>= 1
    return bs


#################### process ####################

fn palindromes(first: Int, last: Int, e: Int) -> List[Int]:
    var ns = List[Int]()
    if last - first == 1:   # middle digit
        var d0 = 1 if first == 0 else 0
        var delta = 2 if first == 0 else 1
        if first * 2 + 1 == e:
            var N = 10**first
            for d in range(d0, 10, delta):
                ns.append(d*N)
        else:
            var N = 10**first + 10**(e-first-1)
            for d in range(d0, 10, delta):
                ns.append(d*N)
    else:
        var mid = (first + last) // 2
        var ns1 = palindromes(first, mid, e)
        var ns2 = palindromes(mid, last, e)
        for n1 in ns1:
            for n2 in ns2:
                ns.append(n1[] + n2[])
    return ns

fn is_palindromic(n: Int) -> Bool:
    var bs = binary(n)
    var L = len(bs)
    for i in range(L//2):
        if bs[i] != bs[L-i-1]:
            return False
    return True

fn f_each(e: Int) -> Int:
    var ns = palindromes(0, (e+1)//2, e)
    var s = 0
    for n in ns:
        if is_palindromic(n[]):
            print(n[])
            s += n[]
    return s

fn f(E: Int) -> Int:
    var s = 0
    for e in range(1, E+1):
        s += f_each(e)
    return s

fn main() raises:
    var args = sys.argv()
    var E = atol(args[1])
    print(f(E))