2008-01-29 12:39:25 -05:00
|
|
|
! Copyright (c) 2008 Aaron Schaefer.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-02-11 15:14:56 -05:00
|
|
|
USING: kernel math math.combinatorics math.parser math.primes
|
2008-04-14 03:40:32 -04:00
|
|
|
project-euler.common sequences sequences.lib sets ;
|
2008-01-29 12:39:25 -05:00
|
|
|
IN: project-euler.035
|
|
|
|
|
|
|
|
! http://projecteuler.net/index.php?section=problems&id=35
|
|
|
|
|
|
|
|
! DESCRIPTION
|
|
|
|
! -----------
|
|
|
|
|
|
|
|
! The number, 197, is called a circular prime because all rotations of the
|
|
|
|
! digits: 197, 971, and 719, are themselves prime.
|
|
|
|
|
|
|
|
! There are thirteen such primes below 100:
|
|
|
|
! 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.
|
|
|
|
|
|
|
|
! How many circular primes are there below one million?
|
|
|
|
|
|
|
|
|
|
|
|
! SOLUTION
|
|
|
|
! --------
|
|
|
|
|
|
|
|
<PRIVATE
|
|
|
|
|
|
|
|
: source-035 ( -- seq )
|
|
|
|
1000000 primes-upto [ number>digits ] map ;
|
|
|
|
|
|
|
|
: possible? ( seq -- ? )
|
|
|
|
dup length 1 > [
|
2008-04-14 00:09:42 -04:00
|
|
|
dup { 0 2 4 5 6 8 } swap diff =
|
2008-01-29 12:39:25 -05:00
|
|
|
] [
|
|
|
|
drop t
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
: rotate ( seq n -- seq )
|
2008-03-19 20:15:32 -04:00
|
|
|
cut* prepend ;
|
2008-01-29 12:39:25 -05:00
|
|
|
|
|
|
|
: (circular?) ( seq n -- ? )
|
|
|
|
dup 0 > [
|
2008-02-06 22:15:47 -05:00
|
|
|
2dup rotate 10 digits>integer
|
2008-01-29 12:39:25 -05:00
|
|
|
prime? [ 1- (circular?) ] [ 2drop f ] if
|
|
|
|
] [
|
|
|
|
2drop t
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
: circular? ( seq -- ? )
|
|
|
|
dup length 1- (circular?) ;
|
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
|
|
|
: euler035 ( -- answer )
|
|
|
|
source-035 [ possible? ] subset [ circular? ] count ;
|
|
|
|
|
|
|
|
! [ euler035 ] 100 ave-time
|
|
|
|
! 904 ms run / 86 ms GC ave time - 100 trials
|
|
|
|
|
|
|
|
! TODO: try using bit arrays or other methods outlined here:
|
|
|
|
! http://home.comcast.net/~babdulbaki/Circular_Primes.html
|
|
|
|
|
|
|
|
MAIN: euler035
|