2016-04-19 14 views
0

Ich versuche, ein Skript zu schreiben, das bestimmt, ob es möglich ist, einen ganzzahligen Wert in einer Liste von Ganzzahlen zu faktorisieren. Die Art und Weise, wie ich es gemacht habe, ist rekursiv nach einer gültigen Faktorisierung zu suchen, effektiv ein DFS in einem Baum von möglichen Faktoren zu machen (in dem Code unten). Ist es möglich, einen gierigen Algorithmus zu entwickeln, der das schnell findet? Meine Idee war, die Liste nach dem größten Faktor im Rest zu durchsuchen, bis eine gültige Faktorisierung gefunden wurde. Wird das in diesem Fall ein richtiger Algorithmus sein? Wenn nicht, ist dieses Problem in NP?Faktorisieren einer Ganzzahl in einer Liste von ganzen Zahlen

Code, um das Problem in Python geschrieben zu lösen:

def can_factorize_in_list(n, list): 
    # Determines whether it is possible to factorize 'n' in 'list' 
    # Filter the list to only include the values which are factors 
    fac_list = [p for p in list if (n % p is 0)] 
    for x in fac_list: 
     if n % x is 0: 
      if n/x is 1: 
       # If we end up at 1, we have a valid factorization 
       return 1 # End state 
      else: 
       # If we do not end at 1, keep trying 
       if can_factorize_in_list(n/x, fac_list): 
        return 1 
       else: 
        continue 
    return 0 

EDIT: Zum Beispiel gegebene ganze Zahl 30 und Liste [2,3,5,8], sollte der Algorithmus return true, weil 30 = 2 * 3 * 5. Es ist nicht erforderlich, alle Elemente in der Liste zu verwenden, da Faktoren und Faktoren mehr als einmal verwendet werden können.

+0

Was meinen Sie mit der Faktorisierung einer Ganzzahl "in" einer Liste von ganzen Zahlen? Die übliche Interpretation wäre, dass die ganze Zahl ein Element der Liste ist, und Sie wollen nur die Ganzzahl faktorisieren (also ist die Liste nicht einmal wichtig), aber das scheint nicht das zu sein, was Sie zu sagen versuchen. Sind die Faktoren erforderlich, um von der Liste zu kommen? Wenn ja, können Faktoren wiederverwendet werden? – user2357112

+0

Sie müssen "n% x ist 0" nicht erneut prüfen. Deine 'fac_list' hat diese Werte bereits gefiltert. Auch das 'else: continue' ist unnötig. Und Sie könnten es wie folgt umschreiben: 'Wenn n/x 1 ist oder can_factorize_in_list (n/x, fac_list): gibt True zurück. Und bitte, geben Sie die booleschen Werte nicht "0"/"1" zurück, es macht Ihren Code sauberer und weniger hacky –

+0

Faktoren werden benötigt, um von der Liste zu kommen, ja. Faktoren können auch mehrfach verwendet werden. – Meldrin

Antwort

0

Es ist keine Tiefensuche erforderlich, und das Problem ist linear in der Größe der Liste der möglichen Faktoren. Hier ist eine Funktion, die entweder die Faktorisierung der Zielnummer zurückgibt, oder falsch, wenn sie nicht über die Liste von Faktoren berücksichtigt werden können:

def smooth(n, fs): 
    xs = [] 
    for f in fs: 
     if n == 1: return xs 
     while n % f == 0: 
      n = n/f 
      xs.append(f) 
    if n == 1: return xs 
    return False 

ich die Funktion smooth genannt, weil, dass das Konzept in der Zahlentheorie ist, dass Sie versuchen, zu berechnen: eine Zahl, die Faktoren über eine gegebene Liste ist glatt über diese Liste von Faktoren. Für die meisten Anwendungen möchten Sie wahrscheinlich, dass alle möglichen Faktoren prim sind.

+0

Dieser gierige Algorithmus löst nicht das Problem, das ich versuche zu lösen. Es würde funktionieren, wenn die Elemente in der Liste "fs" alle Primzahlen sind, aber dies ist nicht notwendigerweise der Fall. Ein triviales Gegenbeispiel: 'n = 46' und' fs = [2,46] '. Der Algorithmus, den Sie beschrieben haben, würde zuerst durch zwei dividieren und dann dort enden, da "23" keine Faktoren in "xs" hat. – Meldrin

+0

Der Aufruf der Funktion als glatt (46, [46,2]) scheint zu funktionieren. Andernfalls können Sie sowohl das Ziel als auch jedes Mitglied der Liste faktorisieren und Faktoren vergleichen. Was ist das eigentliche Problem, das Sie versuchen zu lösen? – user448810

Verwandte Themen