part2 = length $ filter (uncurry (==)) $ take 5000000 $ zip fsA fsB
- where fsA = filteredStream 3 streamA
- fsB = filteredStream 7 streamB
+ where fsA = stream' 4 generatorA generatorAStart -- filteredStream 3 streamA
+ fsB = stream' 8 generatorB generatorBStart -- filteredStream 7 streamB
generatorA = generator 2147483647 16807
streamA = stream generatorA generatorAStart
streamB = stream generatorB generatorBStart
-generator :: Word64 -> Word64 -> Word64 -> Word64
+generator :: Int -> Int -> Int -> Int
generator divisor factor n = n * factor `rem` divisor
-toWord16 :: Word64 -> Word16
+toWord16 :: Int -> Word16
toWord16 = fromIntegral
-stream :: (Word64 -> Word64) -> Word64 -> [Word16]
+stream :: (Int -> Int) -> Int -> [Word16]
stream gen n0 = map toWord16 $ drop 1 $ iterate gen n0
-filteredStream :: Word16 -> [Word16] -> [Word16]
-filteredStream f str = filter ((== 0) . ( .&. f)) str
+stream' :: Int -> (Int -> Int) -> Int -> [Word16]
+stream' f gen n0 = map toWord16 $ filter ((== 0) . (`mod` f)) $ drop 1 $ iterate gen n0
+
+
+-- filteredStream :: Word16 -> [Word16] -> [Word16]
+-- filteredStream f = filter ((== 0) . ( .&. f))
+