Primfaktor Zerlegung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Joey_das_Chameleon
User
Beiträge: 13
Registriert: Sonntag 9. Dezember 2007, 19:44

Hi ich hatte die Aufgabe von unserem Leher ein Programm zu schreiben das die Primfaktoren alos bei 6 (2*3) ausgibt das hab ich auch so weit nur irgendwie gehts nicht bei mir kann mir bitte einer helfen und sagen wo mein Fehler liegt

Code: Alles auswählen

def pfz(x):
    xyz=x
    zaehler=1
    liste2 = []
    liste1=primTeilerListe(x)
    while (zaehler<len(liste1)):
        while(xyz%liste1[zaehler]==0):
            xyz=xyz/zaehler
            liste2.append(liste1[zaehler])
        zaehler = zaehler+1
    return liste2
BlackJack

Geraten: Das erste Element einer Liste hat den Index 0.
Joey_das_Chameleon
User
Beiträge: 13
Registriert: Sonntag 9. Dezember 2007, 19:44

welche liste hab viel und 2tens was willst ud mir jetzt damit sagen index 0 heißt doch nur das das zeichen an der ersten stelle gnommen wird merh nicht oder etwa nicht
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Joey_das_Chameleon hat geschrieben:Hi ich hatte die Aufgabe von unserem Leher ein Programm zu schreiben das die Primfaktoren alos bei 6 (2*3) ausgibt das hab ich auch so weit nur irgendwie gehts nicht bei mir kann mir bitte einer helfen und sagen wo mein Fehler liegt
Das klingt zwar jetzt sehr gemein aber ich finde es hart einen solchen Satz so vollständig ohne Interpunktion zu lesen verstehen und zu beantworten Außerdem ist irgendwie gehts bei mir nicht eine sehr schwammige Formulierung die eigentlich nichts aussagt so dass man gezwungen ist den Code selbst noch mal nachzuvollziehen damit man weiß was eigentlich nicht funktioniert Ich würde dich bitten das Dokument Wie man Fragen richtig stellt zu lesen denn wenn du die Tipps dort beherzigst dann ist es für uns alle einfacher
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Joey_das_Chameleon
User
Beiträge: 13
Registriert: Sonntag 9. Dezember 2007, 19:44

kk sorry aber ich weiß ja selber nicht so richtig wo der fehler ist. Wenn ich das ja wüsste könnte ich dir die frage auch ganz deutlich stellen, aber ich weiß ja nicht wo der fehler liegt, wenn ich die funktion printen lasse gibt er nix aus. Wenn ich aber nun xyz printen lasse kommt immer nur 6 also endlos 6 hilft das dir weiter? Mehr weiß ich leider auch nicht.
So jetzt sag du mir wo mein prob ist ich hab dir gesagt was ich weiß.
ps: ich kann mich richtig ausdrücken
BlackJack

@Joey_das_Chameleon: Du hast nicht viele Listen sondern *zwei*. Und wenn ich sage dass das erste Element einer Liste den Index 0 hat, solltest Du vielleicht mal schauen welche Indexe *Du* benutzt. Kann natürlich auch sein, dass Du das absichtlich so machst, denke aber eher nicht.

Einfacher kann man über eine Liste iterieren wenn man in einer ``for``-Schleife direkt über die Elemente geht.

Ansonsten solltest Du vielleicht mal ein Beispiel auf Papier durchrechnen und vergleichen was Dein Code tut. Da ist nämlich noch ein Fehler drin.
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

hi Luki,warum arbeitest du mit ner zusätzlichen variable und ner zusätzlichen liste? 'xyz = x' kannste einfach x verwenden, liste1 = primTeilerListe(x) kannste einfach primTeilerListe(x) verwenden da die Fkt. doch eh ne Liste zurückgibt. ich zeig dir ma grad meine version:
grade runtergetippt (ungetestet)

Code: Alles auswählen

def pfz(zahl)
    primfaktoren = list()
    while(zahl > 1):
        primfaktoren.append(primTeilerListe(zahl)[-1]) #größtmöglicher Primteiler wird angehängt
        zahl = zahl / primTeilerListe(zahl)[-1] #zahl % größter Primteiler ist immer 0, deshalb funzt das
    return primfaktoren
Zuletzt geändert von RauberRacing am Montag 17. Dezember 2007, 21:41, insgesamt 1-mal geändert.
Joey_das_Chameleon
User
Beiträge: 13
Registriert: Sonntag 9. Dezember 2007, 19:44

aber das erste zeichen aus ner liste hat doch immer index 0 oder nicht ich versteh dich nicht ganz blackjack
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Eben. Aber warum faengst du erst bei Index 1 an, wenn du ueber deine Liste laeufst?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BlackJack

@RauberRacing: Zur `zahl` immer wieder die möglichen Primzahlen zu berechnen ist ineffizient. Du berechnest da immer wieder Werte und verwirfst alle bis auf den letzten. Dabei bekommst Du beim Aufruf mit der ursprünglichen Zahl schon eine Liste mit allen Kandidaten die in Frage kommen. Diesen teuren Aufruf dann auch noch *zweimal* pro Schleifendurchlauf mit dem gleichen Argument zu machen, ist schon fast grausam. :-)
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

hmm wie mach ich das denn am einfachsten?
mir käm jetz nur die idee dass ich das jedes mal in der schleife ner variable zuweise... spart dan schonma 50% laufzeit aber ich würds gern ganz raushaben die ständige berechnung
BlackJack

Naja, die Primzahlen nicht *in* der Schleife berechnen lassen.
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

dadurch dass ich zahl immer nen neuen wert zuweise muss ich doch jedes mal die primteiler neu berechnen... oder?

hier mal mein aktueller code

€: OK ich glaub ich habs

Code: Alles auswählen

def pfz(zahl):
    zerlegt = list()
    a = primTeilerListe(zahl)
    while (zahl > 1):
        for i in a:
            if (zahl >= i):
                zerlegt.append(i)
                zahl = zahl / i
    return sorted(zerlegt)
Pablo Escobar
User
Beiträge: 21
Registriert: Montag 12. November 2007, 15:15
Wohnort: Stuttgart

hm eine frage am rande
gibt primTeilerListe(zahl) eine liste aus die alle primzahlen beinhaltet
die bis zu eurer zahl gehn?

wenn das so sein sollte, habe ich die theorie, dass eure funktionen eventuell nicht das machen, was ihr wollt.
probiert mal die zahl 14 aus. ich glaub bei euch kommt 2 und 3 als ergebnis in eurer liste.
korrekt wär doch 2 und 7, gell?
bei 8 oder 16 sollte das auch der fall sein

lieg ich falsch, tut es mir leid eure zeit sinnlos verschwendet zu haben

lg
Pablo

edit:

Code: Alles auswählen

def primzahlen(x):
	prim = range(2,x)
	
	for i in xrange(2,int((x-1)**0.5+1)): 
		if i in prim: # i ist in der liste also 
			for j in xrange(i*2,x,i): #alle vielfachen von i sind keine primzahlen 
				if j in prim: #wenn j noch in der Liste, 
					prim.remove(j) # aus der Liste loeschen 
	print prim
	return prim
	
def primfaktorzerlegung(zahl):
	pzahlen = primzahlen(zahl)
	anfangswert = zahl
	zerlegt = list()
	while zahl > 1:
		for i in pzahlen:
			if zahl % i == 0:
				zerlegt.append(i)
				zahl /= i
		
	
	faktoren = sorted(zerlegt)
                print faktoren
	ausgabe(faktoren,anfangswert)

print primfaktorzerlegung(16)

>pythonw -u "test.py"
[2, 3, 5, 7, 11, 13] #primzahlen die durch iteriert werden
[2, 2, 2, 2] # liste aller primfaktoren
16=2*2*2*2 # Gleichung
>Exit code: 0
hab mich jetzt an eurem code orientiert,
ist jetzt auch nur nen erster quickhack
sprich da ist wahrscheinlich noch einiges zu optimieren
als kleine weitere anregung:
man könnte das ergebnis zum beispiel in der kanonischen
primfaktorzerlegung ausgeben:
für die zahl 16 wär die ausgabe: 2^4
für die zahl 144 wär die ausgabe: (2^4)*(3^2)
RauberRacing
User
Beiträge: 25
Registriert: Montag 19. November 2007, 10:03
Wohnort: Schwarzenbach
Kontaktdaten:

nee wir sollen nur ne Liste mit allen Primfaktoren ausgeben

'primTeilerListe(zahl)' gibt eine Liste zurück die einfach dadurch definiert wird, dass aus der 'teilerListe(zahl)' einfach alle Nich-Primzahlen gelöscht werden
BlackJack

@Pablo Escobar: Das diese `primzahlen()`-Funktion wegen dem `remove()` und dem ``in``-Test recht ineffizient ist, hatten wir an anderer Stelle im Forum schon mal, oder!?
Pablo Escobar
User
Beiträge: 21
Registriert: Montag 12. November 2007, 15:15
Wohnort: Stuttgart

ah alles klar
dann tuts mir leid für meinen sinnfreien beitrag

edit:
yes sir,
hat dookie glaub ich geschrieben
irgendwo findet man die unter suche,
so musst ich nicht fix noch was dafür tippen
allerdings ist sie laufzeitmässig glaub ich net wirklich effizient
Antworten