| {-# LANGUAGE ScopedTypeVariables #-} |
| {-# OPTIONS_GHC -Wall -Wno-orphans #-} |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| module Main where |
|
|
| import Data.Complex |
| import Data.Vector (Vector) |
| import qualified Data.Vector as V |
| import Numeric (showFFloat) |
| import System.Environment (getArgs) |
|
|
| |
| |
| |
| msgSize :: Int -> Int -> Int |
| msgSize l b = 2 ^ (l * b) |
|
|
| cvSize :: Int -> Int |
| cvSize w = 2 ^ w |
|
|
| totalSize :: Int -> Int -> Int -> Int |
| totalSize l b w = msgSize l b * cvSize w * 2 |
|
|
| |
| |
| |
| |
| msgShift :: Int -> Int -> Int -> Int |
| msgShift l b m = (m + 1) `mod` msgSize l b |
|
|
| |
| |
| |
| |
| statePerm :: Int -> Int -> Int -> Int -> Int |
| statePerm l b w idx = |
| let cv' = cvSize w |
| msg' = msgSize l b |
| msg = idx `div` (cv' * 2) |
| rest = idx `mod` (cv' * 2) |
| newMsg = msgShift l b msg |
| in newMsg * (cv' * 2) + rest |
|
|
| |
| |
| |
| |
| |
| johnsonWalk :: Int -> Int -> Int -> Vector (Complex Double) -> Vector (Complex Double) |
| johnsonWalk l b w psi = |
| V.generate (totalSize l b w) $ \i -> |
| V.unsafeIndex psi (statePerm l b w i) |
|
|
| |
| |
| |
| readState :: Int -> IO (Vector (Complex Double)) |
| readState n = do |
| nums <- map read . words <$> getContents |
| let pairs = zip (evens nums) (odds nums) |
| comps = [ r :+ im | (r, im) <- pairs ] |
| if length comps /= n |
| then error $ "Expected " ++ show n ++ " complex numbers, got " ++ show (length comps) |
| else return $ V.fromList comps |
| where |
| evens xs = [ xs !! i | i <- [0,2..length xs - 1] ] |
| odds xs = [ xs !! i | i <- [1,3..length xs - 1] ] |
|
|
| printState :: Vector (Complex Double) -> IO () |
| printState vec = V.forM_ vec $ \c -> |
| putStrLn $ fmt (realPart c) ++ " " ++ fmt (imagPart c) |
| where fmt x = showFFloat (Just 6) x "" |
|
|
| main :: IO () |
| main = do |
| args <- getArgs |
| case args of |
| [ls, bs, ws] -> do |
| let l = read ls; b = read bs; w = read ws |
| n = totalSize l b w |
| putStrLn $ "State size: " ++ show n ++ " amplitudes" |
| psi <- readState n |
| let psi' = johnsonWalk l b w psi |
| putStrLn "After Johnson walk (cyclic message shift):" |
| printState psi' |
| _ -> putStrLn "Usage: ./johnsonWalk <L> <b> <w>\n\ |
| \Provide state vector on stdin as real imag pairs.\n\ |
| \Example (L=1,b=2,w=1 => N=16):\n\ |
| \ ./johnsonWalk 1 2 1 < state16.txt" |
|
|