Random123-0.1.0: test/TestThreefry.hs
module TestThreefry (test_threefry) where
import Data.Word
import Test.Framework (testGroup)
import Test.Framework.Providers.HUnit
import Test.HUnit
import System.Random.Random123.Types
import System.Random.Random123.Threefry
-- Reference results were obtained using Random123 v1.07
-- (with a minor bug fixed --- rotation constant order is broken in 20-th round)
-- Checking reference results for Threefry-2x32-32
test_threefry2x32 = results @?= reference where
key = (123, 456) :: Array2 Word32
rounds = 32
counters = [
(0x058741f8, 0x346b43e7),
(0xcedc5891, 0x2c5c1d28),
(0x5a086b94, 0x1acbdc33),
(0xa76cc7bf, 0x857c8f0f),
(0xad8d9e57, 0x01b1d9fa)]
reference = [
(0x2d4c5ff6, 0x76375d6e),
(0x78b73f35, 0xea905a45),
(0xfde30fed, 0x9c104974),
(0x15861c3d, 0x293ba61f),
(0x5033c8d1, 0x7b92151a)]
results = map (threefry2R rounds key) counters
-- Checking reference results for Threefry-4x32-72
test_threefry2x64 = results @?= reference where
key = (123, 456, 789, 101112) :: Array4 Word32
rounds = 72
counters = [
(0x589c8db6, 0x19d662ad, 0x3e63b1e5, 0x25dad2c5),
(0x403512be, 0x370c9a86, 0x66d4c418, 0x92ed3769),
(0x1920eb77, 0x2d6340fe, 0xa2f618e3, 0xb8e4aacf),
(0x66005aa2, 0xf70ecfdf, 0xe38e29c5, 0xcbbd54d2),
(0x295e45f0, 0xa3d266cd, 0xb102152d, 0x2f57b507)]
reference = [
(0xcc07f462, 0x18cbe434, 0x97b800fe, 0xc515a3c1),
(0x67bf63ec, 0x08274d21, 0x18557796, 0x36706c15),
(0x428a06be, 0xbf1caad7, 0x25e51e44, 0x89e4bd74),
(0xbfff9163, 0x4106e304, 0x03157e56, 0xebfbd11c),
(0x5a1f4a9c, 0x1725d096, 0x2b561b17, 0xeb9b4807)]
results = map (threefry4R rounds key) counters
-- Checking reference results for Threefry-2x64-32
test_threefry4x32 = results @?= reference where
key = (123, 456) :: Array2 Word64
rounds = 32
counters = [
(0x097a4f5083c77380, 0x51794d6039c75400),
(0x65918ba6ccfe6400, 0x3d91c69276916c00),
(0xdfe3269c92f1f800, 0xe6a0ab67f2207800),
(0x6240b418d521f000, 0x40299ed82854f400),
(0x9acc98590f691000, 0x89df228bd6bae800)]
reference = [
(0xa6102e76d20f3382, 0x44dbf36431f9e9ee),
(0x0da48a45f9295d0e, 0x95d3b41c67e0f4c2),
(0x050a8dfccae89041, 0x76c474fad535292d),
(0xea84579be191a8fc, 0x3236c9527cba73e9),
(0x31f9c11860715320, 0x7ba946b5076efd08)]
results = map (threefry2R rounds key) counters
-- Checking reference results for Threefry-4x64-72
test_threefry4x64 = results @?= reference where
key = (123, 456, 789, 101112) :: Array4 Word64
rounds = 72
counters = [
(0x916c0b160f927800, 0x52eb051cf7d14400, 0xbb685306834af800, 0x472bc9ebd7c67000),
(0x61b7386b8fea1800, 0x8e3c63aaaf6f0000, 0x32a99c88983d4400, 0x0e6631cb0b255a00),
(0x5ac82c4303a38400, 0xe3b2d6d630f00000, 0xb0fd6567c0918800, 0x103c4caced3ad200),
(0x8df94ae6b44d9000, 0x6a20b71e020c1800, 0x7a7554df0c355000, 0x0ab535e581250880),
(0x2f8ec42369683200, 0xda1197831643b000, 0xe1e589e32f32c800, 0x0b7a9b0053df1480)]
reference = [
(0x8d72c51e3e02c62c, 0xf343d5bdd4428602, 0xc3769f920f6bb846, 0x68f81b2a1276a4e1),
(0x333f98bad6286630, 0xbd1330b5f841bc3a, 0x95f3aab12571ae68, 0xbc2f487dd4b9d63c),
(0xebec496e8c1198ab, 0xdd7ea52e93dbf166, 0x6894711ca28c7c12, 0x5817ba9c9f36f1bc),
(0x892f196d93952843, 0x4341d023d4fe64f3, 0x72bd9fba2c6ed9c3, 0x5f7affd1dd0b449f),
(0xc91f23d22b34be06, 0x8ddbf89963b13e67, 0x230bb28bfb3f4b3c, 0xefaa712baaa3dafb)]
results = map (threefry4R rounds key) counters
test_threefry = testGroup "Threefry, comparison with the reference" [
testCase "2x32" test_threefry2x32,
testCase "4x32" test_threefry4x32,
testCase "2x64" test_threefry2x64,
testCase "4x64" test_threefry4x64
]