質問

うことによりプログラムを書く最大級の素因数の非常に大きな数として複数の方法の異なる。すべてのものにしていたかどうかという信じられないほど遅くなります。私の思いで、迷ったらこの有効なアプローチ:

long number = input;

while(notPrime(number))
{
    number = number / getLowestDivisiblePrimeNumber();
}

return number;

このアプローチを取ることになろうの入力は次のように処理されます:

200 -> 100 -> 50 -> 25 -> 5 (返却)

90 -> 45 -> 15 -> 5 (返却)

とりわけcurrentNum繰り返しによる最小ので割り切れの番号(もしばしば2、3)までcurrentNum自体が盛り(ありませんで割り切れの素数の未満のsquarerootのcurrentNum)はこの素因子に入力します。

まこいのか。ない場合は、人によって反例?

-

編集:による非常に大きいというのは、約2^40、10^11.

役に立ちましたか?

解決

このは常にためのユニークな素因数分解定理のrel="noreferrer">の

他のヒント

確実に取り組む予定です( マークバイヤー'回答)が、"大型"の入力であまりにも長い。いことに留意する必要がありお電話 getLowestDivisiblePrimeNumber() 隠別のループではこの運転ではO(N^2)、このように利用することにより"非常に大き"での勤務が発生することがありに BigNums るにはログインが必要です。

きが加速することが期待されるので、少し調べることによりこのアルゴリズムが必要なチェック要因により最後ます。

私はちょうどでした迅速な検索から、数を考慮する最速の知られている方法は、楕円曲線法を用いることです。

あなたはこのデモでは、あなたの数を投げてみてください: http://www.alpertron.com .Ar / ECM.HTMするます。

それはあなたを説得する場合は、あなたが試みることができるいずれかのコードを(つまり、彼らはそれへのリンクを提供し、何の楽しみません!)、窃盗や他の場所でそれの理論にまで読んで。ここではそれについてのWikipediaの記事があります: http://en.wikipedia.org/wiki/Lenstra_elliptic_curve_factorizationしかし、私はそれを理解するにはあまりにも愚かです。ありがたいことに、それは私ではない、あなたの問題です! :)

プロジェクトオイラーのあるものは、通常はちょうど約永遠にかかります問題を行うには明白なブルートフォース法、があるということです。質問がより困難になるとして、あなたは巧妙なソリューションを実装する必要があります。

あなたはこの問題を解決することができる一つの方法は、常に数の最小(正の整数)の要因を見つけたループを使用することです。数の最小の要因はその数がある場合は、あなたが最大の素因数を発見しました!

の詳細なアルゴリズムの説明:

次の3つの変数を保つことによってこれを行うことができます:

あなたが考慮しようとしている数(A) 現在の除数ストア(B) 最大除数ストア(C)

最初は、(A)は、あなたが興味を持っている数とする - この場合には、それは600851475143.で次に(B)は2であるとする(A)は(B)で割り切れる場合は、条件のチェックを持っています。それは(B)によって、除算(A)割り切れる場合は、2(B)をリセットし、(A)は(B)で割り切れるかどうかのチェックに戻ります。そうでなければ、(A)場合は、+1インクリメント(B)(B)で割り切れないと、次に(A)は(B)で割り切れるかどうかを確認します。 (A)が1になるまでループを実行します(3)あなたが600851475143の最大の素数除数となります返します。

あなたはこれをより効果的にすることができ、さまざまな方法があります - ときにその代わりに、次の整数にインクリメントの、あなたは次必ずしもプライム整数にインクリメント可能性があり、代わりに最大の除数ストアを維持するのは、あなただけの現在の数を返すことができます唯一の除数は、それ自体です。しかし、私は上記のアルゴリズムは関係なく、秒で実行されます。

次のように

Pythonでの実装は次のとおりです。 -

def lpf(x):
        lpf = 2;
        while (x > lpf):
                if (x%lpf==0):
                        x = x/lpf
                        lpf = 2
                else:
                        lpf+=1;
        print("Largest Prime Factor: %d" % (lpf));

def main():
        x = long(raw_input("Input long int:"))
        lpf(x);
        return 0;

if __name__ == '__main__':
    main()

例:上記の方法を使用して105の最大の素因数を見つけるのをしてみましょう。

(A)が105(B)は(私たちは常に2で始まる)= 2、そして我々はまだ(C)の値を持っていない=ましょう。

(B)で割り切れる(A)ですか?特許インクリメント+1により(B):(B)= 3であり、(A)は(B)で割り切れますか?はい。 (3分の105 = 35)。これまでに見つかった最大の除数が3レッツ(C)= 3を更新(A)= 35リセット(B)= 2である。

次に、(B)で割り切れる(A)は?特許インクリメント+1により(B):(B)= 3(A)は(B)で割り切れますか?特許インクリメント+1により(B):(B)= 4(A)は(B)で割り切れますか?特許インクリメント+1により(B):(B)= 5(A)は(B)で割り切れますか?はい。 (5分の35 = 7)。我々は以前に見つかった最大の除数は、(C)に格納されます。 (C)は3 5が3よりも大きい現在あるので、我々は、(C)を更新= 5.我々は、更新(A)= 7。我々は、リセット(B)= 2。

その後、我々は、(A)のためのプロセスを繰り返しますが、我々はわずか7は素数であり、それ自体以外に約数を持たず、1ので、(我々はすでに停止する可能性があり、(A)=(B)まで、(B)をインクリメントし続けますとき(B)>((A)/ 2)、あなたは整数除数数の半分より大きくすることはできませんよう! - 任意の数が2の(1以外))可能な最小の除数を

その時点で我々は返すので(A)= 7ます。

手でこれらのいくつかをやってみて、あなたが得るだろうという考えのこつ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top