2010-11-22 13 views
0

私は、数値のすべての素因数を見つけるための割り当てを持っています...符号なしlong long整数のすべての素因数を見つけるには?

私は数を取る関数を書く必要があり、数のすべての素因数を教えてください。

  • N = 350素因数:例えば2 5 7

(Iは範囲0 18446744073709551615に関数に数値を渡す - 最大数に収まる最大数であります64ビットの符号なしlong long整数)

+8

あなたの考えは?何を試しましたか?あなたはどこにいるのですか?これはあなたの課題を達成するためのサイトではありません。あなたが努力したことを示す必要がある場合は、面倒なことに助けを求めるかもしれません。出発点として、Wikipedia:http://en.wikipedia.org/wiki/Integer_factorization –

+0

http://stackoverflow.com/questions/2267146/what-is-the-fastest-factorization-algorithm – joni

答えて

2

これは難しい問題であり、量子コンピュータのすべての研究の主な理由の1つです。 Shor's Algorithmをご覧ください。最適化を行わない単純なブルートフォースは1000年のようなものですが、この特定のケース(64ビット整数)では実行時間をわずか数分に短縮できるはずです。

1つの大きな素因数をとることが少ないと仮定すると、2からカウントアップして各数値を試してみると、スピードアップが大幅に向上します(動作する場合は複数回、2の場合は12回、3など)。因子を見つけたら、その因子で標的数を減らし、新しい標的が素数であるかどうかをテストします。

さらに高速化するために、複数のスレッドにわたって処理を行い、各スレッドはそれぞれの除数の範囲を担当します。素数を1つ以上のスレッドで実行し、素数をテストスレッドに提供して、素数でしか割り切れないようにすることができます。

値を提供している人物がトリックであると思っている場合は、範囲の上から検索することもできますが、下位のプライムの密度がそれほど高くない場合、助けて。

Xの最大可能因数は、X自体のほかにXの平方根です。因子を見つけるたびに、可能な限り大きな残りの因子が大幅に減少します。

+0

tricksomeの使い方。 –

+0

2で始まり、上手くいくはずです。なぜなら、素数の密度はローエンドの近くで大きくなるからです。そこで素因数を見つける良いチャンスがあります。また、素因数を発見するたびに、それを因数分解する数から除外することで、上限がちょうど小さくなったことを意味します。 – nategoose

+0

@nategoose良い点。私は反映するために私の答えを更新します。 – Jonathan

関連する問題