что вы хотите, чтобы Факторизует номер, вот пример того, как
def prime_generator(n):
"""produce all the prime numbers less or equal to n"""
#put here the code for this
def prime_factorization(n):
"""return a list of with the all prime factors of n including their multiplicity"""
result=[]
for p in prime_generator(n):
while n%p==0: #while p divide n...
result.append(p)
n = n//p
if n<=1:
break
return result
def is_semi_prime(n):
factors = prime_factorization(n)
if len(factors) == 2:
print n, "is a semi prime with those prime factors:", factors
else:
print n, "is not a semi-prime"
is_semi_prime(input("enter a number: "))
забавная часть здесь является prime_generator
он может быть столь же просто, как только фильтрации номера с is_prime
функции как, например, filter(is_prime,xrange(2,n+1))
, или что-то более специализированы как Sieve of Eratostenes
EDIT
выше, который использует общий подход к проблеме, может быть дополнительно улучшен с помощью специализированной проверки, поскольку полупростое число имеет ровно два фактора, тогда нам нужно всего лишь найти первое, удалить его из числа, и если все остальное будет простым, Найди это. Для этого нам нужен главная функция проверки и генератор простых чисел
def is_prime(n):
#put here the code for this
def prime_generator(n):
#put here the code for this
def is_semi_prime(n):
p1,p2 = 0,0
for p1 in prime_generator(n):
if n%p1==0:
p2 = n//p1
break
if is_prime(p2):
print n, "is a semi prime with those prime factors:", p1, p2
else:
print n, "is not a semi-prime"
is_semi_prime(input("enter a number: "))
Я думаю, что это алгоритм, который вы пытаетесь объяснить, как вы можете видеть, не нужно искать второй штрих (p2
) только первый (p1
), а другой, естественно, появится, если он существует.
Я оставляю две функции, необходимые в качестве упражнения.
Для is_prime
вы можете использовать простое пробное разделение, как и вы в своем ответе, который, кстати не в состоянии определить 2 как штрих или более мощный test вроде Miller-Rabin test (Deterministic variants) (вы можете найти рабочую версию в http://rosettacode.org) или Baillie-PSW test.
Для prime_generator
вы можете использовать, как я упоминаю перед сито Эратостенов, или использовать бесконечный первичный генератор. Вы можете найти, например, в этом вопросе: Sieve of eratosthenes finding primes python и how to implement an efficient infinite generator of prime numbers in python. Последний мой любимый
mmm, умножите число и проверьте, сколько у него факторов? – Copperfield
ну, тогда просто сделай это ... в чем вопрос снова? Проверить, является ли число полупростой? или создать список со всеми полуправами? – Copperfield
Извините, я не объяснил, как это работает. вам нужно 4 переменные (nth, prime 1, number и prime 2), установите nth на 1, установите число на n-е простое число, задайте простой 1 на номер и установите prime 2 в sem-prime/prime 1. Если когда вы разделите ваше полупростое простым числом 1 оно выдается как десятичное число, а затем увеличивает n на 1, делая число переходит к следующему простому числу. повторите это до тех пор, пока простое 2 не выйдет как целое число. как только он будет первым 1, ваше первое премьерное и простое 2 - это ваше второе премьерное предложение, если вы хотите, чтобы вы могли скопировать и вставить этот код в свою среду и протестировать его. –