在wolfram mathematica的n阶魔术广场

时间:2014-02-28 12:36:25

标签: wolfram-mathematica magic-square

请帮助我在Wolfram Mathematica中为魔术广场创建功能。我必须创建函数MagicSquare [n_],其输出是前n ^ 2个整数的sqare矩阵,并且每列,每行和对角线上的这些整数之和必须相同。请帮助我,我尝试了一天,但我失败了。我的学校作业需要这个。

2 个答案:

答案 0 :(得分:0)

这是一种简单的蛮力方法。请注意,检查值mmagic constant

(将随机值设置为数组变量可以很好地使用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

答案 1 :(得分:0)

这是另一种适用于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'将会大约永远运行。 :)