# Magic Square Identification in Python

In this tutorial, we are going to learn how to identify whether a given matrix is a magic square or not in Python. First, let’s take a look at what we mean by a magic square in terms of matrices.

## What is a Magic Square?

A Magic Square is a square matrix in which the sum of all its rows, all its columns, and all its diagonals is equal to a single number and this number is called the Magic Constant or Magic Number

Let’s take a look at an example:

0,2,4,6

6,6,0,0

1,1,5,5

5,3,3,1

This is a magic square with magic constant = 12

## How to identify whether a given matrix is a Magic Square or not in Python?

For identifying a magic square, we need to keep in our minds that the sum of every row, every column, and every diagonal must be equal to each other. This is a simple enough task. So, here’s how we proceed:

1. Take the sum of the first row as the magic constant.
2. Check all other sums of rows, columns, and diagonals.
3. If any row/column/diagonal found whose sum is not equal to the magic constant → return False
4. Else return True

In order to make our task simpler and our code more interpretable, we will decompose our task into the following tasks:

1. rows- all the rows of the square matrix do not add up to the magic number returns False
2. columns- all the rows of the square matrix do not add up to the magic number returns False
3. diagonals- all the rows of the square matrix do not add up to the magic number returns False

## Implementing the code in Python

Below is our code:

```def rows(square, magic_num):
n = len(square)
for i in range(n):
sum_row = 0
for j in range(n):
sum_row += square[i][j]
if sum_row != magic_num:
return False
return True

def columns(square, magic_num):
n = len(square)
for i in range(n):
sum_col = 0
for j in range(n):
sum_col += square[j][i]
if sum_col != magic_num:
return False
return True

def diagonals(square, magic_num):
n = len(square)
#left_to_right
sum_diag = 0
for i in range(n):
sum_diag += square[i][i]
if sum_diag != magic_num:
return False
#right to left
sum_diag = 0
for i in range(n):
sum_diag += square[i][-(i+1)]
return sum_diag == magic_num

# this is our main function
def magic_square(square):
# find magic number
magic_constant = 0
for n in square:
magic_constant += n
return ( rows(square, magic_constant) and columns(square, magic_constant) and diagonals(square, magic_constant) )

```

Let’s run the above-mentioned example:

```sq = [[0,2,4,6],
[6,6,0,0],
[1,1,5,5],
[5,3,3,1]]

magic_square(sq)
```

Output:

`True`