ホームページ >ウェブフロントエンド >jsチュートリアル >Emrips のアンチプライム列挙を JavaScript で実装する方法
以下のエディターは、JavaScript で Emrips アンチプライム列挙を実装するためのサンプル コードを共有します。これは優れた参考値であり、皆さんの役に立つことを願っています。編集者をフォローして見てみましょう
今日は「エミルプ」という概念を提案したカタを見ました。素数を反転すると、別の素数が得られます。この数は「エミールプ」と呼ばれます。
例: 13,17 は素数、31,71 も素数、13 と 17 は「エミルプ」です。 しかし、素数 757,787,797 は回文素数であり、反転した数が元の数と同じであることを意味するため、「エミルプ」とはみなされません。
この質問では、正の整数 n を入力し、n 未満の「emirps」の数、最大の「emirps」、および n 未満のすべての「emirps」の合計を返す関数を書く必要があります。
問題を解く考え方は、まずn以下の素数をすべて列挙し、回文素数と反転後の合成数となる数を消去するというものです。
まず、素数を決定する関数を作成します
主に 3 つの数学的結論に基づいています:
すべての合成数は、いくつかの素数の積です
数値が因数分解できる場合は、2因数は sqrt(n) 以下、および sqrt(n) 以上の 1 でなければなりません。
3 より大きいすべての素数は 6X+1 または 6X-1 の形式であり、6 の倍数である隣接する数ですが、すべての 6X+1 または 6X-1 が素数であるわけではありません。
最初の結論は矛盾による証明で証明できます
3番目の結論は証明されます:
数字を次の形式で表します 6X-1, 6X, 6X+1, 6X+2, 6X+ 3 、 6X+4 (X は正の整数) 6X => 2*3x 6X+2 => 3(2x+1) 6X+4 => (3x +2) これらは間違いなく素数ではない、つまり、素数は 6X-1 または 6X-1 のみであることが証明できます
コード:
function isPrimeNumber(num){ if(num == 2 || num == 3){ return true; }/*2、3特殊处理*/ if(num % 6 != 1 && num % 6 != 5){ return false; }/*根据结论三排除*/ for(var i=5;i<=Math.sqrt(num);i+=6){ if(num % i == 0 || num % (i+2) == 0){ return false; } }/*根据结论二、结论三排除*/ return true; }
次に、回文素数と次の数を削除します。反転後の合成
コード:
function emirpNumber(num){ var reverseNumber = Number(String(num).split('').reverse().join('')) if(reverseNumber != num && isPrimeNumber(reverseNumber)){ return true; } else{ return false; } }
最後に目的の結果を出力します
コード:
function findEmirp(n){ var emirpGroup = []; for(var i=1;i<n;i++){ if(isPrimeNumber(i) && emirpNumber(i)){ emirpGroup.push(i); } } return [ 'n为:' + n, '数量为:' + emirpGroup.length, '最大数:' + emirpGroup[emirpGroup.length - 1], '求和:' + emirpGroup.reduce(function(total,current){ return total + current; }) ] }
出力結果と時間を見てください
n=1000000:
n=10000000:
以上、皆様の参考になれば幸いです。
関連記事:
JavaScriptを使用してカスタムイベントメカニズムを実装する方法
Javascriptを使用して2次元の週間ビューカレンダーを開発する方法
JS 抽象ファクトリー パターンについて (詳細なチュートリアル)
以上がEmrips のアンチプライム列挙を JavaScript で実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。