Problem35

30分プログラム、その308。Problem35 - Project Euler

197は巡回素数と呼ばれる. 桁を回転させたときに得られる数 197, 971, 719 が全て素数だからである.
100未満には巡回素数が13個ある: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, および97である. 100万未満の巡回素数は何個か?

力技で解いてみた。遅っ。なんか素敵な解法があるのかしら。

使い方

$ python problem35.py
...
933199
939193
939391
993319
999331
55
python problem35.py  175.48s user 1.21s system 87% cpu 3:22.29 total

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
#
# problem35.py -
#
# Copyright(C) 2008 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2008/05/19 22:15:42
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#
import math

def shift(x):
    w = 10**int(math.log10(x))
    return w*(x%10)+x/10

def is_prime(x):
    for n in xrange(2,int(math.sqrt(x)+1)):
        if x % n == 0:
            return False
    return True

def rotate(n):
    xs = [n]
    x = shift(n)
    while not x in xs:
        xs.append(x)
        x = shift(x)
    return xs
    
def is_rot_prime(x):
    return all(map(is_prime,rotate(x)))

def main():
    n = 0
    for x in xrange(2,1000000):
        if is_rot_prime(x):
            n += 1
            print x
    print n

main()