Магически квадрат от порядък 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, докато Chris ще работи приблизително вечно. :)

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
Трябва да приложите един или повече от известните подходи, които са описани на тази страница в wikipedia. - person agentp; 28.02.2014