I wrote a non-optimized version of this in Ruby, ran in ~10sec. Then I rewrote it in C, and it was <1ms runtime for 20-100 digit inputs. Yay algorithms!