C++ (x86_64-specific) - 220000 = (easily portable to x86-32, porting to other architectures implies a significant speed loss) Here's my own micro-implementation of long arithmetic. The calculation itself takes 10 seconds, and while the output is in easily printable form (see the `operator<<` overload), it takes some more time to print it. <!-- language: lang-cpp --> #include <vector> #include <iostream> #include <stdint.h> #include <ctime> typedef uint64_t digit; typedef std::vector<digit> number; std::ostream &operator<<(std::ostream &s, const number &x) { std::vector<char> o; size_t size = x.size() * 21; o.resize(size); size_t lud = 0; for(number::const_reverse_iterator i = x.rbegin(), end = x.rend(); i != end; i++) { digit carry = 0; int j; for(j = 0; j <= lud || carry; j++) { digit r = o[j] * (1LL << 32) + carry; o[j] = r % 10; carry = r / 10; } lud = j; carry = 0; for(j = 0; j <= lud || carry; j++) { digit r = o[j] * (1LL << 32) + carry; o[j] = r % 10; carry = r / 10; } lud = j; carry = *i; for(j = 0; carry; j++) { digit r = o[j] + (carry % 10); carry /= 10; carry += r / 10; o[j] = r % 10; } if(j > lud) lud = j; } for(int j = lud; j--;) s.put(o[j] + '0'); return s; } inline digit dmul(digit x, digit y, digit &carry) { asm("mulq %2" : "+a"(x), "=d"(carry) : "r"(y)); return x; } inline digit dadd(digit x, digit y, digit &carry) { asm("movq $0, %1; addq %2, %0; adcq %1, %1" : "+r"(x), "=r"(carry), "+r"(y)); return x; } void multiply(number &x, digit y) { x.resize(x.size() + 21); digit carry = 0; for(number::iterator i = x.begin(), end = x.end(); i != end; i++) { digit nc, res = dmul(*i, y, nc); *i = dadd(res, carry, carry); carry += nc; } size_t sz = x.size(); for(number::const_reverse_iterator i = x.rbegin(), end = x.rend(); i != end; i++) { if(*i) break; sz--; } x.resize(sz); } int main() { const int r = 220000; clock_t start = clock(); number n; n.push_back(1); for(digit a = 2; a <= r; a++) multiply(n, a); std::cout << "Took: " << (clock() - start)/((double)CLOCKS_PER_SEC) << std::endl; std::cout << n << std::endl; }