重複円順列、重複じゅず順列

 投稿者:山中和義  投稿日:2012年 6月 6日(水)15時44分47秒
  碁石(表裏が区別されない)とオセロの石(表裏が区別される)を使ったとき、R個選ぶことを考察する。

まず、碁石を使った場合

a.回転(輪全体を時計まわりに回転させる)
 表  1       表  6
  6   2  →   5   1
  5   3       4   2
     4           3
 ※表、裏は「目」の位置とする。
 「対象物の手前から対象物を見る」が表なら、「向う側から見る」が裏になる。


 R個に対して、a^0, a^1, a^2, a^3, …, a^(R-1) は、円順列を表す作用となる。
 ただし、a^3=a(a(a))、すなわち「3回連続して行う」の意味とする。

4個を並べる場合
 1: ○○○○
 2: ○○○●(○○●○、○●○○、●○○○)
 3: ○○●●(○●●○、●●○○、●○○●)
 4: ○●○●(●○●○)
 5: ○●●●(●●●○、●●○●、●○●●)
 6: ●●●●



LET N=2 !n種類の石
LET R=4 !重複を許してr個選ぶ

LET B=N^R !一列に並べたときの「場合の数」 ※N進法R桁

DIM F(0 TO B-1) !篩い
MAT F=(-1)*CON

LET C=0 !個数
FOR i=0 TO B-1 !小さい順に篩いにかける
   IF F(i)<0 THEN

      LET W=i !円順列 ※並びを回転させる
      FOR K=0 TO R-1
      !表  1       表  5
      ! 5   2  →   4   1
      !  4 3         3 2
         LET T=MOD(W,B)+INT(W/B) !左ローテイト
         IF T<>i THEN LET F(T)=i !自分自身(=最小値)は残す

         LET W=W*N !次へ
      NEXT K

      LET C=C+1 !結果を表示する
      PRINT STR$(C);":"; i; "(";
      FOR K=i+1 TO B-1 !同一視するもの
         IF F(K)=i THEN PRINT K;
      NEXT K
      PRINT ")"

   END IF
NEXT i

END

実行結果

1: 0 ()
2: 1 ( 2  4  8 )
3: 3 ( 6  9  12 )
4: 5 ( 10 )
5: 7 ( 11  13  14 )
6: 15 ()


b.鏡映変換、反転(輪全体として反転させる)
 表  1       表  1
  6   2  →   2   6
  5   3       3   5
     4           4

 R個に対して、a^0,a^1,a^2,a^3,…,a^(R-1) と b(a^0),b(a^1),b(a^2),b(a^3),…,b(a^(R-1)) は、
 じゅず順列を表す作用となる。



LET N=2 !n種類の石
LET R=4 !重複を許してr個選ぶ

LET B=N^R !一列に並べたときの「場合の数」 ※N進法R桁

DIM F(0 TO B-1) !篩い
MAT F=(-1)*CON

LET C=0 !個数
FOR i=0 TO B-1 !小さい順に篩いにかける
   IF F(i)<0 THEN

      LET W=i !円順列 ※並びを回転させる
      FOR K=0 TO R-1
      !表  1       表  5
      ! 5   2  →   4   1
      !  4 3         3 2
         LET T=MOD(W,B)+INT(W/B) !左ローテイト
         IF T<>i THEN LET F(T)=i !自分自身(=最小値)は残す


         !表  1       表  1
         ! 5   2  →   2   5
         !  4 3         3 4
         LET V=T !数珠順列 ※鏡映変換(対称軸のひとつ、(12345)→(15432) )
         LET T=0
         FOR J=1 TO R-1 !N進法R桁
            LET T=T*N+MOD(V,N)
            LET V=INT(V/N)
         NEXT J
         LET T=T+V*N^(R-1) !最上位(MSB)
         IF T<>i THEN LET F(T)=i

         LET W=W*N !次へ
      NEXT K

      LET C=C+1 !結果を表示する
      PRINT STR$(C);":"; i; "(";
      FOR K=i+1 TO B-1 !同一視するもの
         IF F(K)=i THEN PRINT K;
      NEXT K
      PRINT ")"

   END IF
NEXT i

END



次に、オセロの石を使った場合
反転(裏返す)ことで色が変わるので、上記に加えて次のことにも注意が必要である。

c.桁の反転(石の位置を固定して個々に反転させる)
 表  1       表  [1]
  6   2  →  [6]   [2]
  5   3      [5]   [3]
     4           [4]

 例
 碁石のような表裏が区別されない(色が同じ)場合、
  表  ●       表  ●
   ○  ●  →   ○  ●
   ●  ○       ●  ○
      ○           ○
  恒等変換である。

 オセロのような表裏が区別される(色が異なる)場合、
  表  ●       表  ○
   ○  ●  →   ●  ○
   ●  ○       ○  ●
      ○           ●

円順列


LET N=2 !n種類の色を着けた(オセロの)石
LET R=4 !重複を許してr個選ぶ

LET M=2*COMB(N,2) !m種類の石
LET B=M^R !一列に並べたときの「場合の数」 ※M進法R桁

DIM F(0 TO B-1) !篩い
MAT F=(-1)*CON

LET C=0 !個数
FOR i=0 TO B-1 !小さい順に篩いにかける
   IF F(i)<0 THEN

      LET W=i !円順列 ※並びを回転させる
      FOR K=0 TO R-1
         LET T=MOD(W,B)+INT(W/B) !左ローテイト
         IF T<>i THEN LET F(T)=i !自分自身(=最小値)は残す

         !表  1       表  (1)
         ! 5   2  →  (5)   (2)
         !  4 3        (4) (3)
         LET V=(B-1)-T !桁の反転 ※2進法なら、ビットごとの反転(否定演算、1の補数)
         IF V<>i THEN LET F(V)=i

         LET W=W*M !次へ
      NEXT K

      LET C=C+1 !結果を表示する
      PRINT STR$(C);":"; i; "(";
      FOR K=i+1 TO B-1 !同一視するもの
         IF F(K)=i THEN PRINT K;
      NEXT K
      PRINT ")"

   END IF
NEXT i

END


じゅず順列


LET N=2 !n種類の色を着けた(オセロの)石
LET R=4 !重複を許してr個選ぶ

LET M=2*COMB(N,2) !m種類の石
LET B=M^R !一列に並べたときの「場合の数」 ※M進法R桁

DIM F(0 TO B-1) !篩い
MAT F=(-1)*CON

LET C=0 !個数
FOR i=0 TO B-1 !小さい順に篩いにかける
   IF F(i)<0 THEN

      LET W=i !円順列 ※並びを回転させる
      FOR K=0 TO R-1
         LET T=MOD(W,B)+INT(W/B) !左ローテイト
         IF T<>i THEN LET F(T)=i !自分自身(=最小値)は残す

         LET V=(B-1)-T !桁の反転 ※ビットごとの反転(否定演算、1の補数)
         IF V<>i THEN LET F(V)=i


         LET V=T !数珠順列 ※鏡映変換(対称軸のひとつ、(12345)→(15432) )
         LET T=0
         FOR J=1 TO R-1 !M進法R桁
            LET T=T*M+MOD(V,M)
            LET V=INT(V/M)
         NEXT J
         LET T=T+V*M^(R-1) !最上位(MSB)
         IF T<>i THEN LET F(T)=i

         LET V=(B-1)-T !桁の反転 ※ビットごとの反転(否定演算、1の補数)
         IF V<>i THEN LET F(V)=i

         LET W=W*M !次へ
      NEXT K

      LET C=C+1 !結果を表示する
      PRINT STR$(C);":"; i; "(";
      FOR K=i+1 TO B-1 !同一視するもの
         IF F(K)=i THEN PRINT K;
      NEXT K
      PRINT ")"

   END IF
NEXT i

END



d.下から見る
 表  1       裏  [1]
  6   2  →  [2]   [6]
  5   3      [3]   [5]
     4           [4]
 例
 碁石のような表裏が区別されない(色が同じ)場合、
  表  ●       裏  ●
   ○  ●  →   ●  ○
   ●  ○       ○  ●
      ○           ○
  鏡映変換である。

 オセロのような表裏が区別される(色が異なる)場合、
  表  ●       裏  ○
   ○  ●  →   ○  ●
   ●  ○       ●  ○
      ○           ●
  並びの順序(石の位置)は、鏡映変換である。
  b(c)またはc(b)で可能である。

円順列


LET N=2 !n種類の色を着けた(オセロの)石
LET R=4 !重複を許してr個選ぶ

LET M=2*COMB(N,2) !m種類の石
LET B=M^R !一列に並べたときの「場合の数」 ※M進法R桁

DIM F(0 TO B-1) !篩い
MAT F=(-1)*CON

LET C=0 !個数
FOR i=0 TO B-1 !小さい順に篩いにかける
   IF F(i)<0 THEN

      LET W=i !円順列 ※並びを回転させる
      FOR K=0 TO R-1
         LET T=MOD(W,B)+INT(W/B) !左ローテイト
         IF T<>i THEN LET F(T)=i !自分自身(=最小値)は残す


         !表  1       裏  [1]
         ! 5   2  →  [2]   [5]
         !  4 3        [3] [4]
         LET V=T !下から見る、輪全体として反転する (12345)→([1][5][4][3][2])
         LET T=0
         FOR J=1 TO R-1 !M進法(R-1)桁
            LET T=T*M+( (M-1)-MOD(V,M) ) !※桁の反転
            LET V=INT(V/M)
         NEXT J
         LET T=T+( (M-1)-V )*M^(R-1) !最上位(MSB) ※桁の反転
         IF T<>i THEN LET F(T)=i

         LET W=W*M !次へ
      NEXT K

      LET C=C+1 !結果を表示する
      PRINT STR$(C);":"; i; "(";
      FOR K=i+1 TO B-1 !同一視するもの
         IF F(K)=i THEN PRINT K;
      NEXT K
      PRINT ")"

   END IF
NEXT i

END

 

戻る