The most recent programming challenge from Programming Praxis is to:
Pairs of prime numbers that differ by two are known as twin primes: (3,5), (5,7), (11,13), (17,19), (29,31), (41,43), (59,61), (71,73),... Your task is to write a function that finds the twin primes less than a given input n.
Samuel Tardieu has contributed many improvements to Factor's math.primes vocabulary, which we will be using to solve this puzzle.
We can solve this puzzle in the naive method by computing all prime numbers up to a specified input, and then filtering them for pairs that differ by two:
: twin-primes-upto ( n -- seq ) primes-upto 2 <clumps> [ first2 - abs 2 = ] filter ;
Another nice word would check to see whether any two numbers are twin primes (using short-circuit combinators to exit early if any of the conditions are not satisfied):
: twin-primes? ( x y -- ? ) { [ - abs 2 = ] [ nip prime? ] [ drop prime? ] } 2&& ;
The puzzle page suggests a more efficient method for computing twin primes, which might be worth experimenting with...