Project Euler 129

http://projecteuler.net/index.php?section=problems&id=129


1が続く数は、1からはじまって10倍して1を足すを繰り返します。そのnの剰余を計算するとき、最初に1が続く数を作るととてつもなく大きな数になってしまいます。そこで10倍して1を足してからnの剰余を取ることにします。そうすれば大きな数を計算することはありません。
nの剰余は割り切れない限り最大でもn-1個しかないので、A(n)が100万を超えるなら、100万2から調べればよいです。
本当はもっと速い方法があるのですが、それは次問で。

from itertools import *
from fractions import gcd

def iterate(f, x):
    while True:
        yield x
        x = f(x)

def A(n):
    return next(k for k, m in izip(count(1),
            iterate(lambda x: (x * 10 + 1) % n, 1)) if m % n == 0)

N = 10 ** 6
print next(n for n, a in ((n, A(n))
                for n in count(N + 2) if gcd(n, 10) == 1) if a > N)