Магический квадрат n-го порядка в wolfram mathematica

пожалуйста, помогите мне с созданием функции в Wolfram Mathematica для магического квадрата. Я должен создать функцию MagicSquare[n_], которая выводит квадратную матрицу первых n^2 целых чисел, и сумма этих целых чисел в каждом столбце, каждой строке и по диагоналям должна быть одинаковой. Пожалуйста, помогите мне, я пытаюсь это в течение нескольких дней, и я потерпел неудачу. Мне это нужно для моего школьного задания.


person Alex    schedule 28.02.2014    source источник
comment
покажи что пробовал. как то вопрос не по теме   -  person agentp    schedule 28.02.2014
comment
en.wikipedia.org/wiki/Magic_square   -  person Chris Degnen    schedule 28.02.2014


Ответы (2)


Вот простой метод грубой силы. Обратите внимание, что контрольное значение m — это магическая константа.

(Установка случайных значений в переменные массива отлично использует HoldFirst.)

n = 3;

m = n (n^2 + 1)/2;

check = {0};

While[Unequal[Union[check], {m}],
  Clear[s];
  x = Table[s[i, j], {i, 1, n}, {j, 1, n}];
  d1 = Diagonal[x];
  d2 = Diagonal[Reverse[x]];
  cols = Transpose[x];
  vars = Flatten[x];
  rand = RandomSample[Range[n^2], n^2];
  MapThread[Function[{v, r}, v = r, HoldFirst], {vars, rand}];
  check = Total /@ Join[x, cols, {d1, d2}]];

MatrixForm[x]

8 3 4

1 5 9

6 7 2

person Chris Degnen    schedule 28.02.2014
comment
Большое спасибо за это, но это работает только с n = 3. Мне нужен код, который работает для каждого n. Я пробовал что-то вроде этого: я создал матрицу matrix=Partition[Table[0,{n^2}],n] Это матрица с nxn со всеми нулями. И чем я пытался реализовать правило с этим Sum[matrix[[i]][[j]],{i,1,1},{i,1,n}]==(n^3+n)/2 ; Сумма[матрица[[i]][[j]],{i,1,n},{i,1,1}]==(n^3+n)/2; Но я не могу реализовать код с этими правилами, но я думаю, что это хорошее начало. :( - person Alex; 28.02.2014
comment
@Alex - Теоретически мой ответ масштабируется, в зависимости от того, что установлено n. Однако требуется нереально много времени (или суперкомпьютер), чтобы найти решение для n > 3. На вики-странице описан правильный процесс реализации. - person Chris Degnen; 28.02.2014

Вот еще один подход грубой силы, который работает для n=3..

 n = 3
 m = n  (n^2 + 1) /2
 Select[
     Partition[#  , n] & /@ 
        Permutations[Range[n^2]],
          (Union @(Total /@ # )) == {m} &&
          (Union @(Total /@ Transpose[#] )) == {m} &&
          Total@Diagonal[#] == m  && 
          Total@Diagonal[Reverse@#] == m & ][[1]] // MatrixForm

Преимущество этого заключается в том, что для больших n немедленно возникает ошибка нехватки памяти, в то время как Крис будет работать почти вечно. :)

person agentp    schedule 28.02.2014
comment
Большое спасибо за это, Джордж, но это работает только с n = 3. Мне нужен код, который работает для каждого n. Я пробовал что-то вроде этого: я создал матрицу matrix=Partition[Table[0,{n^2}],n] Это матрица с nxn со всеми нулями. И чем я пытался реализовать правило с этим Sum[matrix[[i]][[j]],{i,1,1},{i,1,n}]==(n^3+n)/2 ; Сумма[матрица[[i]][[j]],{i,1,n},{i,1,1}]==(n^3+n)/2; Но я не могу реализовать код с этими правилами, но я думаю, что это хорошее начало. :( И, конечно же, при n больше 3 я получаю ошибку нехватки памяти. - person Alex; 28.02.2014
comment
Вам необходимо реализовать один или несколько известных подходов, описанных на этой странице в Википедии. - person agentp; 28.02.2014