1

http://www.javascripter.net/faq/numberisprime.htmから以下のコードが表示されます

leastFactor = function(n){
 if (isNaN(n) || !isFinite(n)) return NaN;  
 if (n==0) return 0;  
 if (n%1 || n*n<2) return 1;
 if (n%2==0) return 2;  
 if (n%3==0) return 3;  
 if (n%5==0) return 5;  
 var m = Math.sqrt(n);
 for (var i=7;i<=m;i+=30) {
  if (n%i==0)      return i;
  if (n%(i+4)==0)  return i+4;
  if (n%(i+6)==0)  return i+6;
  if (n%(i+10)==0) return i+10;
  if (n%(i+12)==0) return i+12;
  if (n%(i+16)==0) return i+16;
  if (n%(i+22)==0) return i+22;
  if (n%(i+24)==0) return i+24;
 }
 return n;
}

これは、素数は常に 7 番以降の 30 ごとに同じパターンになるということですか?

これは、7 から 30 を加算すると、その数の結果が素数であり、その数 +4 が素数であり、その数 +6 が常に素数であり、+24 までの間で素数がなくなることを意味しますか?彼ら?

4

3 に答える 3

3

いいえ、しかし、このコードは単にすべての値をチェックしているだけなので機能します (一種)。偶数は 2 の倍数であり、素数ではないことがわかります。同様に、右端の数字が 5 の場合、それは 5 で割り切れるが、素数ではないことがわかります。このような多くのルールを使用すると、これらのパラメーターの 1 つを満たす多くの異なる値をチェックする必要がなくなります。

したがって、スクリプトは 2 をチェックし、2 が入力の倍数ではないことを確認し、偶数を再度チェックする必要がないことを認識します。

for ループは素数だけを生成しているわけではありません。これは素数ではない 187 を生成する可能性がありますが、関数が 11 をチェックすると返されるため、実際には生成されません。

于 2013-01-22T02:58:38.213 に答える
2

基本的には、すでにチェックされている 2、3、または 5 の倍数であるため不可能な除数の再チェックを回避しているだけです。これは、2、3、および 5 の積が 30 であるという理由だけで、まだ可能な除数の繰り返しパターンです。

素数が非常に予測可能なパターンに従うことはまったくわかっていません。

于 2013-01-22T03:01:56.360 に答える
1

そのコードが行っていることは高度に最適化されています - 基本的に「3 は n に均等に分割されますか?」と同じことを行っています。4 は n に均等に割り切れますか? 5 は n に均等に割り切れますか?」しかし、「2 以降、偶数は素数ではない」などの重要な知識を使用して、すべての偶数要素のチェックをスキップします (7 + 偶数、37 + 偶数、67 + 偶数などを行うことに注意してください。決して偶数ではない)。同様に、3 の倍数になるため、6 要素ごとにスキップします。

于 2013-01-22T02:48:39.930 に答える