Project Euler Problem 99 Solution

Question

Comparing two numbers written in index form like 2^{11} and 3^7 is not difficult, as any calculator would confirm that 2^{11} = 2048 \lt 3^7 = 2187.

However, confirming that 632382^{518061} \gt 519432^{525806} would be much more difficult, as both numbers contain over three million digits.

Using base_exp.txt (right click and ‘Save Link/Target As…’), a 22K text file containing one thousand lines with a base/exponent pair on each line, determine which line number has the greatest numerical value.

NOTE: The first two lines in the file represent the numbers in the example given above.

Commentary

As the question notes, it would be difficult to evaluate these exponents directly as they contain over three million digits each. Therefore, we must find a way to reduce these exponents to a manageable size.

To do so, we use the identity \log{a^x} = x \times \log{a}. Since \log{b} \gt \log{a} if $ b a$, this will serve as an approximation of calculating the exponents directly.

Python

#!/usr/bin/env python
import os
from math import log10
largest = [0, 0]
for i, line in enumerate(open(os.path.join(os.path.dirname(__file__), 'base_exp.txt'))):
    a, x = list(map(int, line.split(',')))
    if x * log10(a) > largest[0]:
        largest = [x * log10(a), i+1]
print(largest[1])
$ time python3 largest-exponent.py
real   0m0.018s
user   0m0.018s
sys    0m0.000s