Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows:

21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13

It can be verified that the sum of the numbers on the diagonals is 101.

What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way?


In [1]:
def foo(n):
    total = 1
    i = 1
    increment = 2
    n -= 1
    while n > 0:
        i += increment
        total += i
        i += increment
        total += i
        i += increment
        total += i
        i += increment
        total += i
        increment += 2
        n -= 2
    return total

In [2]:
print foo(1)
print foo(3)
print foo(5)
print foo(7)
print foo(9)
print foo(11)


1
25
101
261
537
961

In [3]:
n = 1001
%timeit foo(n)
foo(n)


1000 loops, best of 3: 318 us per loop
Out[3]:
669171001

In [4]:
def foo(n):
    total = 1
    a = -12
    b = 4
    n -= 1
    while n > 0:
        a += 32
        b += a
        total += b
        n -= 2
    return total

In [5]:
n = 1001
%timeit foo(n)
foo(n)


10000 loops, best of 3: 159 us per loop
Out[5]:
669171001

In [6]:
def foo(n):
    total = 1
    i = 1
    increment = 2
    n -= 1
    while n > 0:
        total += 4 * i + 10 * increment
        i += 4 * increment
        increment += 2
        n -= 2
    return total

In [7]:
n = 1001
%timeit foo(n)
foo(n)


1000 loops, best of 3: 286 us per loop
Out[7]:
669171001