пожалуйста, помогите мне с созданием функции в Wolfram Mathematica для магического квадрата. Я должен создать функцию MagicSquare[n_], которая выводит квадратную матрицу первых n^2 целых чисел, и сумма этих целых чисел в каждом столбце, каждой строке и по диагоналям должна быть одинаковой. Пожалуйста, помогите мне, я пытаюсь это в течение нескольких дней, и я потерпел неудачу. Мне это нужно для моего школьного задания.
Магический квадрат n-го порядка в wolfram mathematica
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
Большое спасибо за это, но это работает только с 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
@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
Большое спасибо за это, Джордж, но это работает только с 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
Вам необходимо реализовать один или несколько известных подходов, описанных на этой странице в Википедии.
- person agentp; 28.02.2014