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))