fortran66のブログ

fortran について書きます。

メモ帳

Young の上昇演算子で、同次対象関数 h_λ を使って、シューア関数 s_λ を展開する(またはその逆)をやりたいのだがが、ががが。Murnaghan 式に、上昇・下降演算子ξ^-1,ξで表わして行けるかと思ったが、むしろ符号の問題が面倒で仕切り直しになった。

実行結果

[[2,2,1],[2,3,0],[3,2,0],[3,1,1],[3,2,0],[4,1,0]]     

s221=h41-h32-h311+h221

をだしたい。

ソース・プログラム

Haskell は、相変わらず型の指定が難しくて思い通りにならない。大したことはしていないはずなのにw

xi :: Int -> [Int] -> [Int]
xi  k = xiop (-1) (k - 1)
xi' k = xiop   1  (k - 1)

xiop :: Int -> Int -> [Int] -> [Int]
xiop m k xs = xs0 ++ x : xs1
        where xs0 = take k xs 
              x   = m + xs !! k  
              xs1 = drop (k + 1) xs  
         
r :: (Int,Int) -> [[Int]] -> [[Int]]         
r (x, y) xs = xs ++ [r_ (x,y) xx | xx <- xs]

r_ :: (Int,Int) -> [Int] -> [Int] 
r_ (x,y) xs = xi' x (xi y xs)


lij n = reverse [(i,j)| i<-[1..n], j<-[i+1..n]]

s_h :: [(Int,Int)] -> [[Int]] -> [[Int]]   
s_h []  xs = xs
s_h (y:ys) xs = s_h ys (kill (r y xs))  

kill [] = []
kill (x:xs) = if head (reverse x) < 0 
                 then kill xs
                 else x:kill xs

main = print (s_h (lij 3) [[2,2,1]])