2012-04-19 16 views
2

私はInterview Streetの "Unfriendly Numbers"パズルに取り組んでいます。このパズルにどのようにアプローチしますか? (番号のユニークな要素を見つけること)

それはこのように書き:指定された整数にのみ一意である要因を見つけ、整数、および整数の別のリストを考えると

、および整数の他のリストと共有されていません。

に設定1(Yセット)である(そしてnは所定の数である)場合:

∃Y{Z | N%のZ = 0}基本的

:Yは、すべてのZのためにそこにありますここで、zはn%zが0の数です。

他の数字のリストのすべての要素を含むセットからYの差を求めます。

どのようにこれにアプローチしますか?

整数nの係数を見つける?他の数字のすべての要因だけでなく、非ユニークな要因を取り除く?

あなたはnの因子を見つけて、それらを使って他の数を分け、非固有のものを除外しますか?

番号を考慮せずに行う方法はありますか?

これまでのところ、PollardのRhoのTrial Division、PollardのRhoのBrentのバリ​​エーション、Fermatの分解法を使用しました。私はまた、Lucas-Lehmer素数性テストとユークリッドGCDを利用しました。

これまでのところ、何もせず、間違った回答や期限を超過したものだけです。知られている解決策はホイールプライム篩に関係すると思われますが、私はそれが何であるか不明です。

ありがとうございました。

+0

以前の分解の解法はどれくらい早かったのですか?整数Nの因数分解は、O(sqrt(N))時間で行うことができます。 –

+0

うん、フェルマーのやり方は、(試行分割後の)最も遅いように思えたが、素数の数をテストすることは、それを遅くするようにも見えた。 もし私が素数性テストを適用せず、反復因子が発見されたときにいつもfermatのメソッドを使用してループを止めれば、すべての時間が制限時間に達しました。問題があるだけで、ループが途中で止まった可能性があるので、すべての答えが間違っていました。 ブレント/ポラードの方法は速いと思われましたが、問題は因数分解をいつ停止するかを知っていると思います。素数テストを適用して停止するタイミングを判断すると、速度が低下します。 –

+0

(続き)時間制限を超えてしまうかもしれませんが、私はそうではありません。私は間違った答えを得る。 おそらく、私は素因数分解を見つけて、どういうわけか....そこからすべての正常な因子を見つけるべきでしょうか? –

答えて

0

リストのサイズをxとし、数字をnとします。次いで

1-見つける分割nは素数のそれぞれに対するN

2- SQRTが、リストにない要素までのすべての素数を、に追加のX *のSQRT(N)の時間複雑性を期待します結果は

3-リターン結果が

public static void main(String[] args) { 
    int n=2*3*5*7*11*13*17*19; 
    int list[]= {8,9,25,98,121,38}; 
    System.out.println(uniqueFactors(n,list)); 
} 

print out: [13, 17] 

すべてOで

public static List<Integer> uniqueFactors(int n, int[] list){ 
    //find possible prime factors of n: O(sqrt(n)) 
    int factors = (int)Math.sqrt(n); 
    boolean [] P = new boolean[factors+1]; 
    Arrays.fill(P, true); 
    P[0]=P[1]= false;//0 and 1 are not primes 
    int limit =(int) Math.sqrt(factors)+1;//prime search limit 
    for(int i=2; i <= limit; i++) 
     if(P[i]) { 
      int y; 
      for(int x=2; (y=x*i)<=factors; x++) 
       if(P[y]) 
        P[y]=false; 
     } 
    //retrieve/identify all prime factors of n that are not prime factors of elements in list 
    //O is sqrt(n) * list 
    List<Integer> result = new ArrayList<Integer>(); 
    for(int i=2; i<=factors; i++) 
     if(P[i] && n%i==0) {//if i is prime and a factor of n 
      boolean shared = false; 
      for(int el: list) 
       if(el%i==0) { 
        shared=true; 
        break; 
       } 
      if(!shared) 
       result.add(i); 
     }//if 
    return result; 
}//uniqueFactors 

テストを設定する設定しましたBig-Oで終わるソリューションのバリエーションは次のとおりです。sqrt(n)* list_size