半標準ヤング盤では、マスを埋める数字に重複が許されます。
半標準ヤング盤はシューア関数との関係を深く持っています。半標準ヤング盤が得られれば、シューア関数の単項式による展開が得られます。
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