Python Prime“C-number”

时间:2012-02-08 14:44:47

标签: python numpy

“C数”是整数n>对于所有整数1,(b ^ n)mod n = b

基本上我必须创建一个程序来运行大约2000个整数(1-2000),并让它满足C数条件,然后还检查它是否不是素数。我似乎无法让循环正常工作。 我有一个程序,它创建一个非素数列表,以及一个工作程序,如果我输入一个数字,如果它是一个c号,它将返回该号码,如果不是,我将得到错误的返回。

我希望它只检查数字1-2000而不仅仅是我输入的一个数字,然后检查非素数列表。

这是我的代码:

import numpy
def primesfrom2to(n):
""" Input n>=6, Returns a array of primes, 2 <= p < n """
sieve = numpy.ones(n/3 + (n%6==2), dtype=numpy.bool)
for i in xrange(1,int(n**0.5)/3+1):
    if sieve[i]:
        k=3*i+1|1
        sieve[       k*k/3     ::2*k] = False
        sieve[k*(k-2*(i&1)+4)/3::2*k] = False
    return numpy.r_[2,3,((3*numpy.nonzero(sieve)[0][1:]+1)|1)]

num=range(600)
mylist =primesfrom2to(600)
s = [item for item in num if item not in mylist]
a=[]
d=[]        
from math import *
def numc(n):
    for a in range(1,n):

            c= a**n
        d=c%n       
    if a == d:
        return n
    else:
        return False
print numc(561)

3 个答案:

答案 0 :(得分:1)

您可能只需要修复缩进(需要在很多地方修复):

def numc(n):
for a in range(1,n):
    c= a**n
    d=c%n  

Python几乎是通过缩进编写的。

答案 1 :(得分:1)

最简单甚至更重要:最干净的方法是创建两个列表,一个列表用于找到的素数,另一个用于c号码。然后浏览列表以检查哪些是c号而不是素数。同时在两个函数中分割prime和c数的函数。类似的东西:

prime_numbers = []
c_numbers = []

amount = 2000

for i in xrange(amount):
   if is_prime(i):
      prime_numbers.append(i)

   if is_c_number(i):
      c_numbers.append(i)

for i in xrange(amount):
    if i in c_numbers and (not i in prime_numbers):
        print i

答案 2 :(得分:1)

首先,不确定numc()是否符合您的预期 - 如上所述,if语句仅针对范围中的最后一个值进行测试。 if语句不在for循环块中,因此循环将遍历赋值,而if语句仅与上一次迭代中指定的值相反。这似乎更符合您的要求:

def numc(n):
    for a in range(1,n):
        c= a**n
        d=c%n       
        if a != d:
           return False
    return n

如果某个值在if测试中失败,则该函数返回False。如果所有值都通过,则返回true。

其次,我的草稿和你的草稿都不会返回一个数组,只是一个整数或一个布尔值。要获取传递的值数组,必须在候选数组的每个项目上调用该函数。

这为候选数组的每个成员提供了输出,整数或布尔值:

c_values = [numc(i) for i in range(1, 2000)]

您可以通过循环测试获得传递值:

    c_values = [numc(i) for i in range(1, 2000) if numc(i)]

您可以通过嵌套列表推导而不调用numc()两次来执行此操作:

    c_values = [i for i in [numc(j) for j in range(1, 2000)] if i]

首先生成完整的输出值数组,然后仅返回True。

编辑:您似乎对块缩进或两个返回语句感到困惑。这是另一种回归方式:

def numc(n):
    retval = n
    for a in range(1,n):
        c= a**n
        d=c%n       
        if a != d:
           retval = False # reset return value
           break   # halt the loop
    return retval

这里的默认返回值是&lt;&lt; n&gt;&gt;,将在&lt;&lt;&lt;&lt;&lt;&lt;对于&gt;&gt;循环,如果cnumber条件被某些值&lt;&lt;违反a&gt;&gt;。在这种情况下,&lt;&lt;休息&gt;&gt;停止循环(虽然这里不需要。)函数只返回任何&lt;&lt; retval&gt;&gt;碰巧是在达到归还的时候。

我的初稿具有相同的效果,但是&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;返回False&gt;&gt;声明 - 它也中断了该功能,阻止它到达&lt;&lt;返回n&gt;&gt;。如果没有达到该陈述,即没有&lt;&lt; a&gt;&gt;违反条件,该函数将达到并执行&lt;&lt;返回n&gt;&gt;。如果一个函数有两个return语句,它只执行第一个到达的语句,之后的所有代码都将被忽略。