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