I think it's the first time I see such thing in the wild.
No, I mean even the most naive brutal force code comes back after ~10 minutes, whereas the Z3 didn't finish even after "several hours".
I am now quite curious about writing a Z3 implementation of this myself and try to figure out why is it taking that much time.
max_gcd = 0 for a1 in range(9): for b1 in range(9): ... *check_valid(a1, b1, ...)* n1 = to_number(a1, b1, ...) ... new_gcd = gcd(n1, n2, ...) max_gcd = max(max_gcd, new_gcd)
for gcd in range(111111111): for r1 in range(?): for r2 in range(?): ... a1, a2,... = split(r1*gcd) ... *check_valid(a1, b1, ...)* max_gcd = gcd
It's very difficult for a compiler to transform one into the other.