fortran66のブログ

fortran について書きます。

Semi-Standard Young Tableau

半標準ヤング盤では、マスを埋める数字に重複が許されます。
半標準ヤング盤はシューア関数との関係を深く持っています。半標準ヤング盤が得られれば、シューア関数の単項式による展開が得られます。
http://www.mth.msu.edu/~sagan/Papers/Old/schur.pdf
シューア関数は、一般線形変換群(GL(N))のうち、荒く言ってユニタリー群に属するものの指標にもなっています。

あるヤング図と次元dに対応する半標準ヤング盤の数は、Hook図を使った方法で簡単に求められます。(|λ| = 5, d = 5 までは、その数をチェックしました。)

実行結果

λ=(1), d = 4

 1

 2

 3

 4

 total number of tableaux = 4

λ=(2), d = 4

 1 1

 1 2

 1 3

 1 4

 2 2

 2 3

 2 4

 3 3

 3 4

 4 4

 total number of tableaux = 10

λ=(1, 1), d = 4

 1
 2

 1
 3

 1
 4

 2
 3

 2
 4

 3
 4

 total number of tableaux = 6

ソース・プログラム

table の列と行の扱いを標準ヤング盤の時と反対にしました。よく考えずに作ったので、将来に禍根を残しそうなw

module m_ssyt
  implicit none
  type :: t_box
    integer :: k, ix, iy  
  end type t_box
contains
  recursive subroutine ssyt(n, nd, k0, table, list)
    integer, intent(in) :: n, nd, k0
    integer, intent(in out) :: table(0:, 0:)
    type(t_box), intent(in) :: list(:)
    integer :: ix, iy, k
 
    if (size(list) == n) then
      write(9, *) list
    else
      do iy = 1, ubound(table, 2)
        if ( any( table(:, iy - 1) == 0 ) ) exit
        do ix = 1, ubound(table, 1)
          do k = 1, nd
            if (is_ok(ix, iy)) then
              table(ix, iy) = k
              call ssyt(n, nd, k, table, [list, t_box(k, ix, iy)])
              table(ix, iy) = 0
            end if
          end do
        end do
      end do
    end if
    return
  contains 
    logical function is_ok(ix, iy)
      integer, intent(in) :: ix, iy
      if (table(ix, iy) == 0 .and. &
          table(ix - 1, iy) <= k .and. table(ix - 1, iy) /= 0 .and. &
          table(ix, iy - 1) <  k .and. table(ix, iy - 1) /= 0 ) then
        is_ok = .true.
      else
        is_ok = .false.
      end if  
      return
    end function is_ok
  end subroutine ssyt

  subroutine pr_young_tableau(n)
    implicit none
    integer, intent(in) :: n
    type(t_box), allocatable :: list(:)
    integer, allocatable :: tableau(:, :)
    integer :: io, i, k
    allocate( list(n), tableau(n, n) )
    k = 0
    do 
      read(9, *, iostat = io) list
      if (io == -1) exit
      tableau = 0
      do i = 1, size(list)
        tableau(list(i)%ix, list(i)%iy) = list(i)%k
      end do
      do i = 1, n
        if ( all(tableau(:, i) == 0) ) exit
        write(*, '(*(i2))') pack(tableau(:, i), tableau(:, i) /= 0)
      end do
      k = k + 1
      write(*, *) 
    end do    
    write(*, *) 'total number of tableaux =', k
    return
  end subroutine pr_young_tableau
end module m_ssyt

program SSYT
  use m_ssyt
  implicit none
  integer, allocatable :: lambda(:), table(:, :)
  type(t_box), allocatable :: list(:)
  integer :: n, nd
  lambda = [2,1]
  n = sum(lambda)
  nd = 5
  allocate( list(0) )
  call init_table(lambda)
  call ssyt(n, nd, 1, table, list)
  rewind(9)
  deallocate( list )
  allocate( list(sum(lambda)) )
  call pr_young_tableau(n)
  stop
contains 
  subroutine init_table(lambda)
    integer, intent(in) :: lambda(:)
    integer, parameter :: NG = huge(0)
    integer :: i
    allocate( table(0:maxval(lambda, 1), 0:size(lambda)) )
    table = NG
    table(0, :) = -1
    table(:, 0) = -1
    do i = 1, size(lambda)
      table(1:lambda(i), i) = 0  
    end do
    return
  end subroutine init_table
end program SSYT

実行結果 補足 整形

λ = (3), d = 4

 1 1 1         1 1 2        1 1 3        1 1 4        1 2 2

 1 2 3         1 2 4        1 3 3        1 3 4        1 4 4

 2 2 2         2 2 3        2 2 4        2 3 3        2 3 4

 2 4 4         3 3 3        3 3 4        3 4 4        4 4 4

 total number of tableaux = 20

λ = (2, 1), d = 4

 1 1          1 1          1 1          1 2          1 2
 2            3            4            2            3

 1 2          1 3          1 3          1 3          1 4
 4            2            3            4            2  

 1 4          1 4          2 2          2 2          2 3     
 3            4            3            4            3    

 2 3          2 4          2 4          3 3          3 4
 4            3            4            4            4

 total number of tableaux = 20

λ = (1, 1, 1), d = 4

 1            1            1            2
 2            2            3            3
 3            4            4            4

 total number of tableaux = 4