2016-04-19 18 views
0

私は、整数リストの整数値を因数分解できるかどうかを判断するスクリプトを作成しようとしています。私がやったやり方は、有効な因子分解のためにrecursivleyを検索することです。有効な要素のツリー内でDFSを実行します(下記のコードを参照)。これは速く見つける貪欲なアルゴリズムを作ることは可能ですか?私の考えは、有効な因数分解が見つかるまで、残りの部分で最大の要素を探し続けることでした。この場合正しいアルゴリズムでしょうか?もしそうでなければ、NPでこの問題はありますか?整数リストの整数を因数分解する

Pythonで書かれた問題解決するためにコード:EDIT

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 

を:例えば、指定された整数30とリスト30 = 2ため、[2,3,5,8]、アルゴリズムがtrueを返します* 3 * 5。因子と因子を複数回使用できるので、リストのすべての要素を使用する必要はありません。

+0

整数を整数リストで「因数分解」するとはどういう意味ですか?通常の解釈は、整数がリストの要素であり、整数を因数分解したいだけなので(リストも問題ではありません)、それはあなたが言うことではないようです。要因はリストから来る必要がありますか?もしそうなら、要素を再利用できるか? – user2357112

+0

'n%x is 0'を再確認する必要はありません。あなたの 'fac_list'はすでにそれらの値をフィルタリングしました。また、 'else:continue'も不要です。そして、もしあなたが 'n/xが1ならば、can_factorize_in_list(n/x、fac_list):return True'と書き直すことができます。そして、 '0' /' 1'ではなくブーリアン値を返すようにしてください。それはあなたのコードをより綺麗にし、よりハッキリにします。 –

+0

リストから要素が来る必要があります。因子は複数回使用することもできます。 – Meldrin

答えて

0

潜在的な要因のリストのサイズの問題は、深さ優先検索の必要はなく、問題は線形です。ここではそれが要因のリスト上で因数分解できない場合、目標数の因数分解を返す、またはFalseという機能があります:

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 

それはあなたがしようとしていることを数論における概念ですので、私は機能smoothと呼ばれます計算する:与えられたリストを要因とする数は、その要素のリスト上で平滑と言われています。ほとんどのアプリケーションでは、すべての潜在的な要因をプライムにすることをお勧めします。

+0

この貪欲なアルゴリズムは私が解決しようとしている問題を解決しません。リスト 'fs 'の要素がすべてプライムであれば動作しますが、必ずしもそうであるとは限りません。簡単な反例: 'n = 46'と' fs = [2,46] '。あなたが記述したアルゴリズムは最初に2で除算され、 '23 'は' xs'に要素がないのでそこで終了します。 – Meldrin

+0

'smooth(46、[46,2])'として関数を呼び出すと動作するようです。それに失敗すると、リストのターゲットとメンバーの両方を因数分解し、要因を比較することができます。あなたが解決しようとしている実際の問題は何ですか? – user448810