魔方陣についての考察

 投稿者:GAI  投稿日:2013年10月 1日(火)20時12分55秒
  3×3の魔方陣で各行と列と一方の対角線の和は一定だが
他方の対角線が異なるものとして

      15
7 6 2 15
3 8 4 15
5 1 9 15
      24
151515

が存在する。


また4×4の魔方陣では各行、各列の和は一定だが、対角線の和は異なるものとして

              48
12  8  1  13  34
6  10 15   3  34
7  11 14   2  34
9   5  4  16  34
              52
34 34 34  34

などがある。(対角線の和は2つとも、異なる状態)
そこで、一方の対角線だけが異なる和になるものが存在できるのか?

また5×5の魔方陣で対角線のみ和が異なるものを作ろうとやってみたんですが、
各行と各列での和が一致してしまうと、自動的に対角線の和も一致してしまい、そこだけが
和が異なるものがみつれらませんでした。
そこでこれも対角線の和だけが異なるものが存在しているのか?

これについて調査して頂けませんか?




 

Re: 魔方陣についての考察

 投稿者:山中和義  投稿日:2013年10月 2日(水)19時05分5秒
  > No.3156[元記事へ]

GAIさんへのお返事です。

> また4×4の魔方陣では各行、各列の和は一定だが、対角線の和は異なるものとして
> そこで、一方の対角線だけが異なる和になるものが存在できるのか?


!4x4魔方陣
PUBLIC NUMERIC C !解の個数
LET C=0
DIM F(16) !数字
MAT F=ZER
DIM A(16) !並び
LET S=16*(16+1)/2 / 4 !魔法数
PRINT S
CALL try(1,F,S,A)
END

EXTERNAL SUB try(P,F(),S,A()) !バックトラック法で検索する
FOR i=1 TO 16 !未使用の数字が候補である
   IF F(i)=0 THEN
      LET F(i)=1 !使用中

      LET A(P)=i !p番目の数字

      LET OK=1
      SELECT CASE P !並んだ数字の個数に応じて
      CASE 2
         IF A(1)>A(2) THEN LET OK=0 !対称性
      CASE 3
         IF A(2)>A(3) THEN LET OK=0 !対称性
      CASE 4
         IF A(1)>A(4) THEN LET OK=0 !対称性
      CASE 6
         IF A(2)+A(5)+A(6)+A(3)<>S THEN LET OK=0
      CASE 8
         IF A(1)+A(7)+A(8)+A(4)=S THEN LET OK=0
         !!IF A(1)+A(7)+A(8)+A(4)<>S THEN LET OK=0 !4x4魔方陣
      CASE 10
         IF A(1)+A(9)+A(10)+A(2)<>S THEN LET OK=0
      CASE 12
         IF A(11)+A(7)+A(5)+A(12)<>S THEN LET OK=0
      CASE 13
         IF A(1)+A(11)+A(13)+A(3)<>S THEN LET OK=0
      CASE 14
         IF A(13)+A(6)+A(8)+A(14)<>S THEN LET OK=0
         IF A(2)+A(12)+A(14)+A(4)<>S THEN LET OK=0
      CASE 15
         IF A(9)+A(7)+A(6)+A(15)<>S THEN LET OK=0
      CASE 16
         IF A(10)+A(5)+A(8)+A(16)<>S THEN LET OK=0
         IF A(3)+A(15)+A(16)+A(4)<>S THEN LET OK=0
      CASE ELSE
      END SELECT
      IF OK=1 THEN !条件を満たす
         IF P=16 THEN !すべて揃ったなら
            LET C=C+1
            PRINT "No.";C
            PRINT USING "## ## ## ##":  A(1), A(9),A(10), A(2)
            PRINT USING "## ## ## ##": A(11), A(7), A(5),A(12)
            PRINT USING "## ## ## ##": A(13), A(6), A(8),A(14)
            PRINT USING "## ## ## ##":  A(3),A(15),A(16), A(4)

         ELSE
            CALL try(P+1,F,S,A) !次へ
         END IF
      END IF

      LET F(i)=0 !元に戻す
   END IF
NEXT i
END SUB


 

Re: 魔方陣についての考察

 投稿者:山中和義  投稿日:2013年10月 3日(木)07時02分33秒
  > No.3156[元記事へ]

GAIさんへのお返事です。

> また5×5の魔方陣で対角線のみ和が異なるものを作ろうとやってみたんですが、
> 各行と各列での和が一致してしまうと、自動的に対角線の和も一致してしまい、そこだけが
> 和が異なるものがみつれらませんでした。
> そこでこれも対角線の和だけが異なるものが存在しているのか?

同様な手法で検索しようとしました。
5x5の場合、25!通りが対象なので、実時間内では困難のようです。
したがって、4隅を既知として考えてみました。

5x5を2,3時間程度で求めることは今後の課題です!


PUBLIC NUMERIC C !解の個数
LET C=0
DIM F(25) !数字
MAT F=ZER
DIM A(25) !並び
DATA 1,18,25,12 !4隅
FOR i=1 TO 4
   READ W
   LET F(W)=1
   LET A(i)=W
NEXT i
LET S=25*(25+1)/2 / 5 !魔法数
PRINT S
CALL try(5,F,S,A)
!!CALL try(1,F,S,A)
END

EXTERNAL SUB try(P,F(),S,A()) !バックトラック法で検索する
FOR i=1 TO 25 !未使用の数字が候補である
   IF F(i)=0 THEN
      LET F(i)=1 !使用中

      LET A(P)=i !p番目の数字

      LET OK=1
      SELECT CASE P !並んだ数字の個数に応じて
      CASE 2
         IF A(1)>A(2) THEN LET OK=0 !対称性
      CASE 3
         IF A(2)>A(3) THEN LET OK=0 !対称性
      CASE 4
         IF A(1)>A(4) THEN LET OK=0 !対称性
      CASE 7
         IF A(2)+A(5)+A(6)+A(7)+A(3)<>S THEN LET OK=0
      CASE 9
         IF A(1)+A(8)+A(6)+A(9)+A(4)=S THEN LET OK=0
         !!IF A(1)+A(8)+A(6)+A(9)+A(4)<>S THEN LET OK=0 !5x5魔方陣
      CASE 12
         IF A(1)+A(10)+A(11)+A(12)+A(2)<>S THEN LET OK=0
      CASE 15
         IF A(13)+A(8)+A(14)+A(5)+A(15)<>S THEN LET OK=0
      CASE 18
         IF A(16)+A(7)+A(17)+A(9)+A(18)<>S THEN LET OK=0
      CASE 20
         IF A(11)+A(14)+A(6)+A(17)+A(20)<>S THEN LET OK=0
      CASE 21
         IF A(3)+A(19)+A(20)+A(21)+A(4)<>S THEN LET OK=0
      CASE 22
         IF A(1)+A(13)+A(22)+A(16)+A(3)<>S THEN LET OK=0
      CASE 23
         IF A(10)+A(8)+A(23)+A(7)+A(19)<>S THEN LET OK=0
      CASE 24
         IF A(12)+A(5)+A(24)+A(9)+A(21)<>S THEN LET OK=0
      CASE 25
         IF A(2)+A(15)+A(25)+A(18)+A(4)<>S THEN LET OK=0
         IF A(22)+A(23)+A(6)+A(24)+A(25)<>S THEN LET OK=0
      CASE ELSE
      END SELECT
      IF OK=1 THEN !条件を満たす
         IF P=25 THEN !すべて揃ったなら
            LET C=C+1
            PRINT "No.";C
            PRINT USING "## ## ## ## ##":  A(1),A(10),A(11),A(12), A(2)
            PRINT USING "## ## ## ## ##": A(13), A(8),A(14), A(5),A(15)
            PRINT USING "## ## ## ## ##": A(22),A(23), A(6),A(24),A(25)
            PRINT USING "## ## ## ## ##": A(16), A(7),A(17), A(9),A(18)
            PRINT USING "## ## ## ## ##":  A(3),A(19),A(20),A(21), A(4)

         ELSE
            CALL try(P+1,F,S,A) !次へ
         END IF
      END IF

      LET F(i)=0 !元に戻す
   END IF
NEXT i
END SUB


実行結果

65
No. 1
1 11 14 21 18
15  4 24  2 20
8 23  3 22  9
16 17 19  7  6
25 10  5 13 12
No. 2
1 11 15 20 18
21  4 22  2 16
10 24  3 23  5
8 17 19  7 14
25  9  6 13 12
No. 3
1 14 10 22 18
19  4 24  2 16
5 21  3 23 13
15 17 20  7  6
25  9  8 11 12
No. 4
1 15  9 22 18
16  4 24  2 19
10 21  3 20 11
13 17 23  7  5
25  8  6 14 12
No. 5
1 15 11 20 18
16  4 22  2 21
14 19  3 23  6
9 17 24  7  8
25 10  5 13 12
No. 6
1 15 11 20 18
16  4 22  2 21
9 24  3 23  6
14 17 19  7  8
25  5 10 13 12
 :
 :


 

戻る