Problem 28 : Number spiral diagonals

Problem Statement

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?

Solution

def printSpiral(n) : 
    val=[]
    for i in range(0, n) : 
        for j in range(0, n) : 
              
            x = min(min(i, j), min(n - 1 - i, n - 1 - j)) 
              
            if (i <= j) : 
                q=(n - 2 * x) * (n - 2 * x) - (i - x)- (j - x)
                val.append(q)
  
            else : 
                q=((n - 2 * x - 2) *
                       (n - 2 * x - 2) +
                       (i - x) + (j - x))
                val.append(q)
                
    return val 
          
n = 1001
final=[]
sum1=0
sum2=0
j=0
val=[] 

val = printSpiral(n)

for i in range(0,len(val),n):
    final.append(val[i:i+n][::-1])

for i in range(len(final)):
    sum1+=final[i][i]
for i in range(len(final)):
    sum2+=final[i][len(final[i])-j-1]
    j=j+1
    
print(sum1+sum2-final[len(final)//2][len(final[0])//2])

Output

669171001