, was Sie wollen, ist die Zahl faktorisiert, hier ist ein Beispiel dafür, wie
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: "))
der lustige Teil ist hier die prime_generator
kann es so einfach sein wie nur die Zahlen Filterung mit einer is_prime
Funktion wie zum Beispiel filter(is_prime,xrange(2,n+1))
, oder etwas mehr wie das
EDIT Sieve of Eratostenes spezialisiert
die oben genannten, die einen allgemeinen Ansatz für das Problem verwenden, können durch die Prüfung weiter verbessert werden, als Semi-Primzahl nur genau zwei Faktoren haben, dann müssen wir nur die erste finden, entfernen Sie es von der Zahl und wenn was übrig bleibt ist Prime wir finde es. nur Dafür brauchen wir eine erstklassige Prüffunktion und einen Generator von Primzahlen
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: "))
Ich denke, dieser Algorithmus ist, dass Sie zu erklären versuchen, wie Sie für die zweite Primzahl zu suchen brauchen nicht sehen können (p2
) der erste (p1
) und der andere wird natürlich erscheinen, wenn es existiert.
Ich lasse die beiden Funktionen als Übung.
Für is_prime
können Sie die einfache Probedivision verwenden, wie Sie in Ihrer Antwort zu tun, die durch die Art und Weise 2 als Haupt identifizieren scheitern, oder ein leistungsfähigeres test wie die Miller-Rabin test (Deterministic variants) (Sie können eine funktionierende Version finden in http://rosettacode.org) oder Baillie-PSW test.
Für die prime_generator
können Sie, wie ich vor dem Sieb von Eratostenes erwähnt habe, oder einen unendlichen Prim-Generator verwenden. Sie können zum Beispiel in dieser Frage finden: Sieve of eratosthenes finding primes python und how to implement an efficient infinite generator of prime numbers in python. Letzteres ist mein Favorit
mmm, faktorisieren Sie die Anzahl und überprüfen Sie, wie viele Faktoren es haben? – Copperfield
naja, dann tu das einfach ... was ist nochmal die Frage? Check ist eine Nummer ist ein Semi-Prime? oder produzieren Sie eine Liste mit allen Semi-Prime? – Copperfield
Entschuldigung, ich habe nicht erklärt, wie es funktioniert. Sie benötigen 4 Variablen (n-te, Primzahl 1, Zahl und Primzahl 2), setzen n auf 1, setzen die Zahl auf n-te Primzahl, setzen Primzahl 1 auf Zahl und setzen Primzahl 2 auf Semi-Primzahl/Primzahl 1. Wenn Sie teilen Ihre Semi-Primzahl durch Primzahl 1 kommt als Dezimalzahl heraus und erhöht dann n um 1, wodurch die Zahl zur nächsten Primzahl geht. Wiederholen Sie dies, bis Primzahl 2 als ganze Zahl ausgegeben wird. Sobald es Prime 1 ist Ihre erste Prime und Prime 2 ist Ihre zweite Prime, wenn Sie möchten, können Sie kopieren und fügen Sie diesen Code in Ihre Umgebung und testen Sie es aus. –