Python 确定整数是否为循环素数

Python 确定整数是否为循环素数,python,primes,Python,Primes,我一直在试图解决欧拉计划的问题35,需要做一个函数,告诉我一个整数是否是循环素数。我有一个标准的isprime函数和一个给出数字旋转列表的函数。我的旋转代码和iscircularprome代码如下: def rotate(n): rotlist = [] m = str(n) counter = 0 while counter < len(str(n)): m = m[1:] + m[0] rotlist.append(int

我一直在试图解决欧拉计划的问题35,需要做一个函数,告诉我一个整数是否是循环素数。我有一个标准的
isprime
函数和一个给出数字旋转列表的函数。我的旋转代码和
iscircularprome
代码如下:

def rotate(n):
    rotlist = []
    m = str(n)
    counter = 0
    while counter < len(str(n)):
        m = m[1:] + m[0]
        rotlist.append(int(m))
        counter += 1
    return rotlist

def iscircularprime(n):
    np = [0,2,4,5,6,8]
    y = str(n)
    for j in y:
        if int(j) in np:
            return False
    if isprime(n)==False:
        return False
    m = rotate(n)
    for i in m:
        if isprime(i)==True:
            return True
        else:
            return False
def旋转(n):
rotlist=[]
m=str(n)
计数器=0
当计数器

我没有包括我的
isprime
函数,因为它是相当标准的。我的函数将正确识别素数是否为圆形,如197,但也将识别一些非圆形素数为圆形,如191,它不是圆形,因为119不是素数。

在一次旋转后,您
返回True
,因此您不会检查所有的圆形素数。您应该将其更改为:

def iscircularprime(n):
    np = [0,2,4,5,6,8]
    y = str(n)
    for j in y:
        if int(j) in np:
            return False
    if isprime(n)==False:
        return False
    m = rotate(n)

    # new code here
    is_circ_prime = True
    for i in m:
        if not isprime(i):
            is_circ_prime = False
    return is_circ_prime

未经测试,但我认为这是我多年前解决它的方法

最简单的方法是快速帮助:

from collections import deque
def shifter(num):
 strnum = deque(str(num))
 for i in xrange(len(strnum)):
     yield int(''.join(strnum))
     strnum.rotate()
然后:


这是一个循环任意数字的函数:

def circulate_number(A):
  for v in range(len(str(A))):
        a , i , s =  str(A), len(str(A)), ''
        for c in range(i):
              s += str(a[(v+c) % i])
        print(s)
        v+= 1

circulate_number(123456)

强制性的低效一行解决方案。语句的左侧是质数检查器,右侧是旋转生成器:

from math import factorial as f

def is_circular_prime(n):
    return (lambda s: all(f(i - 1) % i == i - 1 for i in (int(s[j:] + s[:j]) for j in range(len(s)))))(str(n))

for number in range(2, 10000):
    if is_circular_prime(number):
        print(number)
输出

> python3 test.py
2
3
5
7
11
13
17
31
37
71
73
79
97
113
131
197
199
311
337
373
719
733
919
971
991
1193
1931
3119
3779
7793
7937
9311
9377
> 

啊,这是有用的,应该可以很好的解决问题了吧,谢谢大家的帮助
> python3 test.py
2
3
5
7
11
13
17
31
37
71
73
79
97
113
131
197
199
311
337
373
719
733
919
971
991
1193
1931
3119
3779
7793
7937
9311
9377
>