1 ! Copyright (c) 2008 Aaron Schaefer.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel math math.primes project-euler.common sequences ;
6 ! http://projecteuler.net/index.php?section=problems&id=35
11 ! The number, 197, is called a circular prime because all rotations of the
12 ! digits: 197, 971, and 719, are themselves prime.
14 ! There are thirteen such primes below 100:
15 ! 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.
17 ! How many circular primes are there below one million?
25 : source-035 ( -- seq )
26 1000000 primes-upto [ number>digits ] map ;
28 : possible? ( seq -- ? )
35 : rotate ( seq n -- seq )
38 : (circular?) ( seq n -- ? )
40 2dup rotate digits>number
41 prime? [ 1 - (circular?) ] [ 2drop f ] if
46 : circular? ( seq -- ? )
47 dup length 1 - (circular?) ;
51 : euler035 ( -- answer )
52 source-035 [ possible? ] filter [ circular? ] count ;
54 ! [ euler035 ] 100 ave-time
55 ! 538 ms ave run time - 17.16 SD (100 trials)
57 ! TODO: try using bit arrays or other methods outlined here:
58 ! http://home.comcast.net/~babdulbaki/Circular_Primes.html