- ベストアンサー
素数の見分け方
いっけん素数にしか見えないような数を、素数ではないとすばやく判断する方法ってあるのでしょうか? たとえば、841という数は、2でも3でも4でも・・・・・・割れず、順順に判断していっても、なかなか割り切れません。結局、根拠なく素数だと判断してしまいます。 ですが、実際は 841=29×29 なので、素数ではありません。 まともに考えていては、時間が足りないと思うのですが・・・何かうまい方法があるのでしょか?今日も、模試でこの問題が出て、だまされました(><) 数学に詳しい方、ご教授ください。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
一応「決定論的な多項式時間素数判定アルゴリズム」は存在します. 与えられた n (log n ビットで表してます) が素数かどうかを, (log n)^8 くらいの計算時間で判定するというものだったような.... まあ n が小さければ √n までの数で割ってみるのが簡単かと.
その他の回答 (9)
√nよりも小さな素数で割るか、#8さんが教えてくれた「フェルマーの小定理」を使うのが面倒かもしれないけど確実な方法だと思いますが、ある数が素数でないことをある程度まで絞ることはできます。 イ:10以上の数において、1の位が1・3・7・9でない場合は、その数は素数ではありません。 ロ:同じく10以上の数において、数字を一番上の位から1の位まで足していったとき、それが3の倍数になる場合は3で割り切れますので、素数ではありません。 例:6561の場合、使われている数字を全て足せば6+5+6+1=18となります。18=3*6で3の倍数ですので、素数ではありません。 このように、素数でないことを判別するテクニックは少しならありますので、活用してみてください。
- proto
- ベストアンサー率47% (366/775)
フェルマーの小定理を用いた判定法があります。 pがもし素数ならば。 p以下の自然数mをなんでもいいので持ってきて、 mをp乗してpで割ると必ずm余ります。 式を用いて書くと。 m^p≡m (mod p) になります。 なので、余りがmでなければpは素数でないことになります。 しかし余りがmならばpは素数かというと、そうとは限りません。 素数ではないkに対しても、 mのk乗をkで割った余りが偶然mになることはあります。 なのでp以下の自然数mについていろいろなmで m^p≡m (mod p) になるか試してみて、成り立たなければpは素数でないことになります。 この方法は√p以下の自然数で実際に割っていくよりも効率的な方法です。 しかし、カーマイケル数と名前の付いた素数もどきの合成数が存在するので注意が必要です。 カーマイケル数に対しては上記以外の確実な判定法もあります。 そちらは初心者には少し難しいですが。
- Ama430
- ベストアンサー率38% (586/1527)
みなさんの書かれている方法しかないために、大きな素数の扱いはコンピュータを使っても時間がかかります。 そのために素数が暗号に利用されていると聞いたことがあります。
- tatsumi01
- ベストアンサー率30% (976/3185)
脇道にそれます。 Nが素数かどうかを判定する高速な方法もあるようですが、Nを√N以下の素数で割ってみる方法が確実です。 √N以下の素数はどれ位あるかというと、ざっと√N/(1.15・log(N))ですから、この回数分の割り算が必要です(logは常用対数)。 このとき、√N以下の素数で割るとき、素数表を覚えておかないといけません。覚えていないと、ある整数Kで割るとき、Kが素数かどうか判定しないといけません。そんなことを判定しているより、素数かどうか関係なく2から順に割っていった方が早いでしょう。 素数表を覚えていないと√N回の割り算が必要です。N=841とすると、必要な割り算の回数は、素数表を覚えていれば10回、覚えていなければ29回です。 以上から、教訓として「100以下の素数は覚えておいて損はない」です。100以下の素数は25個ですから覚えるのは大した手間ではありません。 それから30以下の整数の二乗も覚えておいて損はありません。実際、私は841と見た途端に29の二乗とわかりました。
- yoikagari
- ベストアンサー率50% (87/171)
ある数nが素数あるかどうか調べる方法は、√nよりも小さな素数で割ってみるしかありません。 (ほかの判定法もありますが、大学の数学科で勉強する内容になりますし、どれも上記の方法より効率が悪いものです) この問題の場合n=841ですから、√841=29以下の素数2,3,5,・・・,29で割ってみるしかありません。 その際に、下記の倍数の判定が多少役に立つと思います。 たとえば 「nの1の位が偶数なら、nは2で割り切れます。」 「nの1の位が0あるいは5なら、nは5で割り切れます。」 「nの各位の和が3の倍数ならば、元の数も3で割り切れる。」 といった判定法を知っておくと多少計算は楽になります。
- agosu
- ベストアンサー率57% (4/7)
私が現役の時は1の位に注目してました。例えば質問の841の1の位は1です。1の位が1になる1桁の掛け算は1*1と3*7と9*9のみです。(7*3は3*7と一緒として)あとは上の3つの式に10の位を当てはめていきます。この方法ならだいぶ考えるのが楽になりますよ。
開平計算という計算があるのですが、学校で習わないですよね。でも実際はこれを使わないと解けない問題もたまにあると思うので、覚えておくといいと思います。(この計算を使うと841が29の2乗であることもスグわかります) 解説したURLがあったので貼っておきますね。わかりにくかったら、数学の先生に質問したら教えて下さると思いますよ。何回か手を動かして計算したらすぐ覚えられます。 偶然にも、私も841が見破れなかったことをきっかけに、姉に教わって覚えました。これもご縁です、覚えちゃってください(^^)
- driverII
- ベストアンサー率27% (248/913)
確率的素数判定法というのが早いようですが・・・ nの素数判定の場合、 3からルートnまでの素数について割り算を行えば良いのですから、試験であれば大丈夫ですよね・・・
- tnt
- ベストアンサー率40% (1358/3355)
その数のルートを取り、その数字よりも小さいすべての 素数で割ってみて、 あまりが出ない物があったら素数ではない。 他に方法は無いと思います。