ある数が素数であるかどうかをテストするために、その数の平方根までしか割り切れないかどうかをテストする必要があるのはなぜですか。
数n
が素数でない場合、それは2つの要素a
およびb
に因数分解することができます。
n = a * b
a
とb
の両方がn
の平方根より大きい場合、a * b
はn
より大きくなります。したがって、これらの要素のうち少なくとも1つはn
の平方根以下でなければならず、平方根以下の要素が見つからない場合はn
が素数でなければなりません。
m = sqrt(n)
そしてm × m = n
としましょう。 n
が素数でない場合、n
はn = a × b
と書くことができるので、m × m = a × b
となります。 m
は実数、n
、a
、およびb
は自然数です。
今3つのケースがあります。
3つのケースすべてで、min(a, b) ≤ m
。したがって、m
まで検索すると、n
の少なくとも1つの要素を見つける必要があります。これは、n
が素数ではないことを示すのに十分です。
因数がnの平方根よりも大きい場合、それに乗じてnと等しくなる他の因数は必然的にnの平方根よりも小さいためです。
より直感的な説明は次のようになります -
100の平方根は10です。aとbのさまざまなペアに対して、a x b = 100としましょう。
A == bの場合、それらは等しく、正確に100の平方根です。 10です。
それらのうちの1つが10未満であるならば、他はより大きくなければなりません。たとえば、5 x 20 == 100です。一方は10より大きく、他方は10より小さくなります。
X bについて考えると、片方が下がってももう片方が大きくなって補正する必要があるため、製品は100のままになります。これらは平方根を中心に回転します。
101の平方根は約10.049875621です。ですから、101という素数をテストする場合は、10を含む10までの整数を試すだけで済みます。ただし、8、9、および10はそれ自体が素数ではないため、7までテストする必要があります。プライム.
10より大きい数のうちの1つを持つ要素のペアがある場合、ペアの他の要素は10未満でなければならないためです。小さい方が存在しない場合、101という一致する大きい要素はありません。
121をテストしている場合、平方根は11です。素数が1から11(両端を含む)で均等にテストされる必要があります。 11は11回になるので、121は素数ではありません。もしあなたが10で止まっていて11をテストしていなければ、11を見逃していたでしょう。
奇数のみをテストしていると仮定して、2より大きく平方根以下のすべての素数をテストする必要があります。
`
n
が素数(1より大きい)ではないとします。そのため、a
とb
という数字があります。
n = ab (1 < a <= b < n)
関係a<=b
にa
およびb
を掛けることによって、次のようになります。
a^2 <= ab
ab <= b^2
したがって、(n=ab
に注意してください)
a^2 <= n <= b^2
したがって、(a
とb
は正数であることに注意してください)
a <= sqrt(n) <= b
そのため、(1より大きい)数が素数でなく、その数の平方根までの分割可能性をテストする場合、その要因の1つが見つかります。
与えられた整数N
が素数ではないとしましょう。
それでNは2つの因数a
とb
、2 <= a, b < N
に因数分解され、N = a*b
となります。明らかに、それらの両方が同時にsqrt(N)
より大きくなることはできません。
一般性を失うことなくa
が小さいと仮定しましょう。
さて、もしあなたがN
の除数が[2, sqrt(N)]
の範囲に属していることを見つけることができなかったとしたら、それはどういう意味ですか?
これは、N
がa <= sqrt(N)
として[2, a]
内に除数を持たないことを意味します。
したがって、a = 1
およびb = n
、したがって定義により、N
は素数ですです。
...
あなたが満足していない場合はさらに読む:
(a, b)
のさまざまな組み合わせが可能です。彼らがいるとしましょう:
(a1、b1)、(a2、b2)、(a3、b3)、.....、(k、bk)一般性を失うことなく、私 <b私1<= i <=k
。
さて、N
が素数ではないことを示すことができるようにするためには、私 さらに因数分解することができます。そして私達はまたそれを知っています私 <= sqrt(N)
なので、sqrt(N)
までチェックする必要があります。私。それゆえ、あなたはN
が素数であるかどうかを結論することができます。
...
それはすべてファクタ化と平方根の基本的な使い方にすぎません。
それは抽象的に見えるかもしれませんが、実際には非素数の最大可能階乗がその平方根でなければならないという事実に単純にあります:
sqrroot(n) * sqrroot(n) = n
。
その場合、1
の上またはそれ以下またはsqrroot(n)
以下の整数が均等にn
に分割されると、n
素数にすることはできません。
疑似コードの例
i = 2;
is_prime = true;
while loop (i <= sqrroot(n))
{
if (n % i == 0)
{
is_prime = false;
exit while;
}
++i;
}
それで数Nが素数であるかどうかチェックするために。 NがSQROOT(N)以下の数で割り切れるかどうかだけをチェックする必要があります。これは、Nを任意の2つの要素に分解すると、XとYのようになるからです。 N = X Y。XとYのそれぞれをSQROOT(N)より小さくすることはできません。そのため、X Y <N XとYのそれぞれをSQROOT(N)より大きくすることはできません。 Y> N
したがって、1つの係数はSQROOT(N)以下でなければなりません(他の係数はSQROOT(N)以上です)。そのため、Nが素数であるかどうかを調べるには、これらの数<= SQROOT(N)を調べるだけで済みます。
素数ではない[素数/合成数の意味ではない - 1またはそれ以外の数で均等に分割できる数。例えば、6は2、または3、さらに1または6で均等に割ることができます。
6 = 1×6または6 = 2×3
さて、もし "a"が素数でなければ、それは他の2つの数で割ることができ、それらの数が "b"と "c"であるとしましょう。どの意味
a = b * c。
今 "b"または "c"の場合、 "b"と "c"の乗算は "a"よりも大きくなりますが、それらのいずれも "a"の平方根よりも大きくなります。
したがって、式 "a = b * c"を証明するために、 "b"と "c"は常に<= "a"の平方根になります。
上記の理由のため、数が素数かどうかをテストするとき、その数の平方根までチェックするだけです。
Nを非素数とする。それ故、それは1よりも大きい少なくとも2つの整数因子を有する。fをnのそのような因子の最小値とする。 f> sqrt nとします。その場合、n/fは整数LTE sqrt nなので、fより小さくなります。したがって、fはnの最小係数になることはできません。とんでもないnの最小係数はLTE sqrt nでなければなりません。
任意の数n
が与えられたら、その因数を見つける一つの方法はその平方根p
を得ることです:
sqrt(n) = p
もちろん、p
を単独で乗算すると、n
が返されます。
p*p = n
次のように書き換えることができます。
a*b = n
どこp = a = b
。 a
が増加すると、b
は減少してa*b = n
を維持します。したがって、p
が上限です。
数の素数、nをテストするには、まず次のようなループが予想されます。
bool isPrime = true;
for(int i = 2; i < n; i++){
if(n%i == 0){
isPrime = false;
break;
}
}
上記のループがすることはこれです:与えられた1 <i <nのために、それはn/iが整数であるかどうかチェックします(残り0を残します)。 n/iが整数であるiが存在すれば、nは素数ではないと確信でき、その時点でループは終了します。 iがない場合、n/iが整数の場合、nは素数です。
すべてのアルゴリズムと同様に、私たちは尋ねます:私たちはもっとうまくいくことができますか?
上記のループで何が起こっているのか見てみましょう。
Iのシーケンスは次のようになります。i = 2、3、4、...、n-1
整数チェックのシーケンスは次のようになります。j = n/i、つまりn/2、n/3、n/4、...、n /(n-1)
あるi = aに対して、n/aが整数の場合、n/a = k(integer)
またはn = ak、明らかにn> k> 1(k = 1の場合、a = n、ただしiに到達することはありません。k= nの場合、a = 1、ただしiはフォーム2から開始します)
また、n / k = aであり、上述のように、aはiの値であるので、n> a> 1である。
したがって、aとkはどちらも1からnまでの整数です(排他的)。なので、iはその範囲内のすべての整数に達するので、ある反復でi = a、他の反復でi = kとなります。 nの素数性検定がmin(a、k)に対して失敗すると、max(a、k)に対しても失敗します。そのため、min(a、k)= max(a、k)(2つのチェックが1になる場合)を除いて、これら2つのケースのうち1つだけをチェックする必要があります。 a = sqrt(n)を意味します。
言い換えれば、nの素数判定があるi> = sqrt(n)(すなわち、max(a、k))に対して失敗した場合、それはいくつかのi <= n(つまり、min(a)に対しても失敗します。 、k))。したがって、i = 2からsqrt(n)までのテストを実行すれば十分です。
任意の合成数は素数の積です。
n = p1 * p2
としましょう、ここでp2 > p1
とそれらは素数です。
n % p1 === 0
の場合、nは合成数です。
n % p2 === 0
であれば、n % p1 === 0
も推測します。
そのため、n % p2 === 0
がn % p1 !== 0
と同時に行われることはありません。言い換えれば、複合数nを均等に分割できる場合p2、p3 ... pi(その大きい方の係数)それはその最小の係数で割らなければなりませんp1も。最も低い因数p1 <= Math.square(n)
は常に真実です。