12 part1 = length $ filter (uncurry (==)) $ take 40000000 $ zip streamA streamB
15 part2 = length $ filter (uncurry (==)) $ take 5000000 $ zip fsA fsB
16 where fsA = filteredStream 3 streamA
17 fsB = filteredStream 7 streamB
20 generatorA = generator 2147483647 16807
21 generatorB = generator 2147483647 48271
23 streamA = stream generatorA generatorAStart
24 streamB = stream generatorB generatorBStart
26 generator :: Word64 -> Word64 -> Word64 -> Word64
27 generator divisor factor n = fromIntegral $ fromIntegral n * factor `rem` divisor
29 toWord16 :: Word64 -> Word16
30 toWord16 = fromIntegral
32 stream :: (Word64 -> Word64) -> Word64 -> [Word16]
33 stream gen n0 = map toWord16 $ drop 1 $ iterate gen n0
35 filteredStream :: Word16 -> [Word16] -> [Word16]
36 filteredStream f str = filter (\n -> n .&. f == 0) str