In today’s Programming Praxis exercise our goal is to implement a few functions that create integer sequences related to prime generation. Let’s get started, shall we?

As in the Scheme solution, the function names refer to their number in the On-Line Encyclopedia of Integers.

The first sequence can be written in a manner similar to the typical Fibonacci sequence solution.

a106108 :: [Integer] a106108 = 7 : zipWith (\n r -> r + gcd n r) [2..] a106108

The next two just build on the previous one and are fairly trivial.

a132199 :: [Integer] a132199 = zipWith (-) (tail a106108) a106108 a137613 :: [Integer] a137613 = filter (/= 1) a132199

The shortcut function is slightly longer. We store the sum of all the previous numbers so that the function runs in O(n^{2}) rather than O(n^{3}).

shortcut :: [Integer] shortcut = f 0 1 where f s n = r : f (s + r) (n + 1) where r = lpd (6 - n + s) lpd n = head $ filter (\d -> mod n d == 0) [3,5..]

Some tests to see if we’re getting the correct output:

main :: IO () main = do print $ take 65 a106108 print $ take 104 a132199 print $ take 72 a137613 print $ take 72 shortcut

Yup. Piece of cake.