Python Prime "C-номер" - PullRequest
       3

Python Prime "C-номер"

0 голосов
/ 08 февраля 2012

"C-число" - это целое число n> 1 такое, что (b ^ n) mod n = b для всех целых чисел 1

По сути, мне нужно создать программу, которая будет работать приблизительно с 2000 целыми числами (1-2000), чтобы она удовлетворяла условию числа C, а затем также проверить, не является ли это простым числом. Я не могу заставить цикл работать правильно. У меня есть программа, которая создает список не простых чисел, и работающая программа, которая, если я введу число, вернет мне это число, если это c-число, если нет, мне вернется false.

Я хочу, чтобы он просто проверял числа 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 ]

1 голос
/ 08 февраля 2012

Самый простой и даже более важный: самый простой способ - создать два списка: один для простых чисел, которые вы нашли, и один для c чисел. Затем просмотрите списки, чтобы проверить, какие из них находятся в числах c, а не в простых числах. Также разделите функции для простого числа и числа 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
1 голос
/ 08 февраля 2012

Во-первых, не уверен, что numc () делает то, что вы ожидаете - как написано, что оператор if будет проверен только для последнего значения a в диапазоне. Оператор 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]

Это сначала генерирует полный массив выходных значений, а затем возвращает только те, которые являются Истиной.

РЕДАКТИРОВАТЬ: Вы, кажется, смущены отступом блока, или возможно двумя операторами возврата. Вот еще один способ с одним возвратом:

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

Здесь возвращаемым значением по умолчанию является << n >>, которое должно быть сброшено в цикле << for >>, если условие cnumber нарушается некоторым значением << a >>. В этом случае << break >> останавливает цикл (хотя здесь это и не нужно.) Функция просто возвращает то, что происходит << retval >>, когда достигается возвращаемый статус.

Мой первоначальный черновик имел тот же эффект, но там цикл for был прерван / 'прерван' оператором << return False >>, что также прервало функцию, не позволяя ей достичь << return n> >. Если бы это утверждение не было выполнено, то есть << a >> не нарушило условия, функция достигла бы и выполняла << return n >>. Если у функции есть два оператора возврата, она будет выполнять только первое достигнутое, и весь код после этого будет игнорироваться.

1 голос
/ 08 февраля 2012

Возможно, вам нужно просто исправить отступы (нужно исправить во многих местах):

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

Python в значительной степени написан с помощью отступов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...