var TMan = new N6LTimerMan(); //タイマーマネージャー
TMan.add();
window.onload=function(){
readCSV('./primelist100000.txt', 'analyzeCSV', 'readedCSV');
}
var PRMTABLE = [];
var READED = false;
function readedCSV(res) {
if(res.length < 1) return;
var i;
for(i = 0; i < res.length; i++){
PRMTABLE.push(parseInt(res[i]));
}
READED = true;
}
var PRM = [2, 3, 5];
var ONELOOPNUM = 1000;
var TMP = 7;
var NUM;
var MOD = true;
var USEMOD = 100;
function checkprime(num, max){
if(max < PRM[PRM.length - 1]) return num;
var i;
var mod = num % 6;
if((mod != 1)&&(mod != 5)) return -1;
for(i = 2; i < PRM.length; i++){
if(max < PRM[i]) return num;
if(num % PRM[i] == 0) return -1;
}
return num;
}
function enumprime(num){
PRM = [2, 3, 5];
TMP = 7;
function Loop(id){
var cnt;
for(cnt = 0; cnt < ONELOOPNUM; cnt++){
if(num < TMP){
if(checkprime(NUM, num) == NUM) {
TXT_ANS.value = "Prime Number"
}
else{
TXT_ANS.value = "Not Prime Number"
}
return;
}
var maxtmp = Math.ceil(Math.sqrt(TMP));
if(checkprime(TMP, maxtmp) == TMP){
PRM.push(TMP);
}
TMP += 2;
}
TMan.timer[id].setalerm(function() { Loop(id); }, 50); //メインループ再セット
}
Loop(0);
}
//素数列挙あり
function oncheckprime(){
TXT_ANS.value = "Calculating・・・"
NUM = parseInt(TXT_NUM.value);
var max = Math.ceil(Math.sqrt(NUM));
if((NUM == 1)||(NUM == 2)){
TXT_ANS.value = "Prime Number"
return;
}
if((NUM <= 0)||(NUM % 2 == 0)){
TXT_ANS.value = "Not Prime Number"
return;
}
var mod = NUM % 6;
if((NUM != 3)&&((mod != 1)&&(mod != 5))){
TXT_ANS.value = "Not Prime Number"
return;
}
enumprime(max);
}
//素数列挙なし
function oncheckprimeeasy(){
TXT_ANS.value = "Calculating・・・"
NUM = parseInt(TXT_NUM.value);
MAX = Math.ceil(Math.sqrt(NUM));
if((NUM == 1)||(NUM == 2)||(NUM == 3)){
TXT_ANS.value = "Prime Number"
return;
}
if((NUM <= 0)||(NUM % 2 == 0)){
TXT_ANS.value = "Not Prime Number"
return;
}
TMP = 5;
var mod = NUM % 6;
if((NUM != 3)&&((mod != 1)&&(mod != 5))){
TXT_ANS.value = "Not Prime Number"
return;
}
if(MAX <= TMP){
TXT_ANS.value = "Prime Number"
return;
}
function Loop2(id){
var cnt;
for(cnt = 0; cnt < ONELOOPNUM; cnt++){
// if((MOD)||(USEMOD <= TMP)){
mod = TMP % 6;
if((mod != 1)&&(mod != 5)){
TMP += 2;
continue;
}
// }
if(NUM % TMP == 0){
TXT_ANS.value = "Not Prime Number"
return;
}
TMP += 2;
if(MAX <= TMP){
TXT_ANS.value = "Prime Number"
return;
}
}
TMan.timer[id].setalerm(function() { Loop2(id); }, 50); //メインループ再セット
}
Loop2(0);
}
function onEratosthenes(){
TXT_ANS.value = "Calculating・・・"
NUM = parseInt(TXT_NUM.value);
MAX = Math.ceil(Math.sqrt(NUM));
if(200000 <= NUM){
TXT_ANS.value = "Do not number range!!!"
return;
}
if((NUM == 1)||(NUM == 2)||(NUM == 3)){
TXT_ANS.value = "Prime Number"
return;
}
if((NUM <= 0)||(NUM % 2 == 0)){
TXT_ANS.value = "Not Prime Number"
return;
}
var mod = NUM % 6;
if((NUM != 3)&&((mod != 1)&&(mod != 5))){
TXT_ANS.value = "Not Prime Number"
return;
}
var i;
PRM = [2];
for(i = 3; i <= NUM;){
PRM.push(i);
i += 2;
}
TMP = 1;
function Loop3(id){
var cnt;
for(cnt = 0; cnt < ONELOOPPROC; cnt++){
if(MAX <= PRM[TMP]){
if(PRM[PRM.length - 1] == NUM){
TXT_ANS.value = "Prime Number"
return;
}
else{
TXT_ANS.value = "Not Prime Number"
return;
}
TMP++;
}
TXT_ANS.value = "Calculating・・・" + PRM[TMP];
var tmp;
var n;
for(tmp = TMP; tmp < PRM.length; tmp++){
var tprm = PRM.filter(n => ((n === PRM[tmp])||(n % PRM[tmp]) !== 0));
PRM = [];
PRM = [...tprm];
}
}
TMan.timer[id].setalerm(function() { Loop3(id); }, 50); //メインループ再セット
}
Loop3(0);
}
function onTable(){
if(!READED) {
TXT_ANS.value = "Do not read yet!!!"
return;
}
TXT_ANS.value = "Calculating・・・"
NUM = parseInt(TXT_NUM.value);
MAX = Math.ceil(Math.sqrt(NUM));
if(100000 <= NUM){
TXT_ANS.value = "Do not number range!!!"
return;
}
if((NUM == 1)||(NUM == 2)||(NUM == 3)){
TXT_ANS.value = "Prime Number"
return;
}
if((NUM <= 0)||(NUM % 2 == 0)){
TXT_ANS.value = "Not Prime Number"
return;
}
var mod = NUM % 6;
if((NUM != 3)&&((mod != 1)&&(mod != 5))){
TXT_ANS.value = "Not Prime Number"
return;
}
TMP = 0;
function Loop4(id){
TXT_ANS.value = "Calculating・・・" + PRMTABLE[TMP];
var i;
for(i = 0; i < ONELOOPNUM; i++){
if(NUM < PRMTABLE[TMP + i]){
TXT_ANS.value = "Not Prime Number"
return;
}
if(PRMTABLE[TMP + i] == NUM){
TXT_ANS.value = "Prime Number"
return;
}
}
TMP = TMP + i + 1;
TMan.timer[id].setalerm(function() { Loop4(id); }, 50); //メインループ再セット
}
Loop4(0);
}
function onCHK(){
MOD = CB_CHK.checked;
}
var TMan = new N6LTimerMan(); //タイマーマネージャー
TMan.add();
TMan.add();
...省略...
function onN6LIsPrime(){
TXT_ANS_T.value = "Calculating・・・"
NUM = parseInt(TXT_NUM_T.value);
var ret = N6LIsPrime(0, NUM);
function Loop5(id){
if(ret == NUM){
TXT_ANS_T.value = "Prime Number"
return;
}
else if(ret < 0){
TXT_ANS_T.value = "Not Prime Number"
return;
}
ret = N6LISPRMRET;
TMan.timer[id].setalerm(function() { Loop5(id); }, 75); //メインループ再セット
}
Loop5(1);
}
}
function IsPrime(num){
if((num == 1)||(num == 2)||(num == 3)) return num;
///////////////////#1
var mod = num % 6;
if((mod != 1)&&(mod != 5)){
return -1;
}
///////////////////
var max = Math.floor(Math.sqrt(num));
var tmp;
for(tmp = 5; max < tmp;){
///////////////////#2
mod = tmp % 6;
if((mod != 1)&&(mod != 5)){
tmp += 2;
continue;
}
///////////////////
if(num % tmp == 0){
return -1;
}
tmp += 2;
}
return num;
}
function IsPrimeEratosthenes(num){
if((num == 1)||(num == 2)||(num == 3)) return num;
var mod = num % 6;
if((mod != 1)&&(mod != 5)){
return -1;
}
var max = Math.floor(Math.sqrt(num));
var i;
var PRM = [2];
for(i = 3; i <= num;){
PRM.push(i);
i += 2;
}
var TMP;
for(TMP = 1; PRM[TMP] <= max; TMP++){
if(max < PRM[TMP]){
if(PRM[PRM.length - 1] == num){
return num;
}
else{
return -1;
}
var tmp;
var n;
for(tmp = TMP; tmp < PRM.length; tmp++){
var tprm = PRM.filter(n => ((n === PRM[tmp])||(n % PRM[tmp]) !== 0));
PRM = [];
PRM = [...tprm];
}
}
return num;
}
function N6LIsPrimeMNRD(id, num){
N6LISPRMRET = 0;
N6LNUM = num;
N6LMAX = Math.ceil(Math.sqrt(NUM));
if((N6LNUM == 1)||(N6LNUM == 2)||(N6LNUM == 3)){
N6LISPRMRET = N6LNUM;
return N6LNUM;
}
if((N6LNUM <= 0)||(N6LNUM % 2 == 0)){
N6LISPRMRET = -1;
return -1;
}
N6LTMP0 = Math.ceil(N6LMAX / 2) * 2 + 1;
N6LTMP1 = 5;
var mod = N6LNUM % 6;
if((N6LNUM != 3)&&((mod != 1)&&(mod != 5))){
N6LISPRMRET = -1;
return -1;
}
if(N6LTMP0 <= N6LTMP1){
N6LISPRMRET = N6LNUM;
return N6LNUM;
}
function LoopMNRD(id){
var cnt;
for(cnt = 0; cnt < N6LONELOOPNUM; cnt++){
mod = N6LNUM % N6LTMP0;
if(mod != 0){
N6LTMP0 -= 2;
}
else{
N6LISPRMRET = -1;
return -1;
}
mod = N6LNUM % N6LTMP1;
if(mod != 0){
N6LTMP1 += 2;
}
else{
N6LISPRMRET = -1;
return -1;
}
if(N6LTMP0 <= N6LTMP1){
N6LISPRMRET = N6LNUM;
return N6LNUM;
}
}
TMan.timer[id].setalerm(function() { LoopMNRD(id); }, 50); //メインループ再セット
N6LISPRMRET = 0;
return 0;
}
N6LISPRMRET = LoopMNRD(id);
return N6LISPRMRET;
}
function onN6LIsPrimeMNRD(){
TXT_ANS_MNRD.value = "Calculating・・・"
NUM = parseInt(TXT_NUM_MNRD.value);
var ret = N6LIsPrimeMNRD(0, NUM);
function Loop6(id){
if(ret == NUM){
TXT_ANS_MNRD.value = "Prime Number"
return;
}
else if(ret < 0){
TXT_ANS_MNRD.value = "Not Prime Number"
return;
}
ret = N6LISPRMRET;
TMan.timer[id].setalerm(function() { Loop6(id); }, 75); //メインループ再セット
}
Loop6(1);
}
最速素数判定法のまとめ
素数判定する数Nの性質
1.Nが約数(非素数)であった場合約数の小さい方の組の最大は√N以下
だから[2<=X<=√N]*の範囲を調べる
2.[3<N]の範囲ならばNが素数である可能性は2×3=6の
倍数の±1つまりNの6の剰余が1or5剰余が偶数ならば
2の倍数剰余が3ならば3の倍数という説明でもOK
INTMAX程度の範囲ならばエラトステネスの篩はダメで
試し割が最速
つまりINTMAX程度の最速素数判定法最速素数判定
アルゴリズムは単純シンプルで以上を最適化すると
[2<=X<=√N]の範囲の奇数を試し割して全てクリア
すれば最速素数判定
最速素数判定法最速素数判定アルゴリズム
//TXT_NUM判定数テキストボックス
//TXT_ANS解答テキストボックス
//NUM,MAX,MIN,TMP,ONELOOPNUM外部変数
//if((NUM % 2 == 0)||(NUM % 3 == 0)){//2,3の倍数篩い落とし
//で2,3のエラトステネスの篩と同じだからなんなら
//少数の素数の篩い落とし
//if((NUM % 2 == 0)||(NUM % 3 == 0)
//||(NUM % 5 == 0)||(NUM % 7 == 0)
//||(NUM % 11 == 0)||(NUM % 13 == 0)
//||(NUM % 17 == 0)||(NUM % 19 == 0)){
//で19までの篩い落としが出来るんです[19までの篩い落とし素数の次の素数23]
//但し試し割素数判定で調べる数が奇数全てを調べるので
//あまり多くの素数で篩ってもさほどの効果はないと思います
//MINは篩い落とし素数の次の素数を設定する
//if((NUM == 2)||(NUM == 3)||(NUM == 5)){//初期素数判定
//初期素数判定は篩い落とし素数の次の素数までを列挙して素数として判定してリターン
//最速素数判定アルゴリズム
function onIsPrime(){
//初期設定
TXT_ANS.value = "Calculating・・・"
NUM = parseInt(TXT_NUM.value);
if(NUM < 0){
NUM *= -1;
}
MAX = Math.ceil(Math.sqrt(NUM));
MIN = 5;
ONELOOPNUM = 1000;
//初期判定
if((NUM == 0)||(NUM == 1)){
TXT_ANS_ULT.value = "0 or 1";
return;
}
if((NUM == 2)||(NUM == 3)||(NUM == 5)){//初期素数判定
TXT_ANS_ULT.value = "Prime Number";
return;
}
if((NUM % 2 == 0)||(NUM % 3 == 0)){//2,3の倍数篩い落とし
TXT_ANS_ULT.value = "Not Prime Number";
return;
}
TMP = MIN;//判定開始[5<=X<=√N]
//処理をビジーにしてフリーズさせないため適当にシステムに処理を返す
//メインループを作る
function LoopMain(id){
var cnt;
for(cnt = 0; cnt < ONELOOPNUM; cnt++){
if(NUM % TMP == 0){//試し割
TXT_ANS.value = "Not Prime Number"
return;
}
TMP += 2;//次の奇数
if(MAX <= TMP){//終了判定
TXT_ANS.value = "Prime Number"
return;
}
}
setTimeout(function() { LoopMain(id); }, 50); //メインループ再セット
}
LoopMain(0);//メインループのエントリーポイント
}
マジックナンバーまでの少数エラトステネスの篩を自動化したアルゴリズム
少数エラトステネスの篩のマジックナンバー
注:大きすぎる値だとメモリオーバーフローするよ
素数判定数
マジックナンバーまでの少数エラトステネスの篩を自動化したアルゴリズム
最速素数判定法最速素数判定アルゴリズム自動化少数エラトステネスの篩
//TXT_NUM_ERA判定数テキストボックス
//TXT_ANS_ERA解答テキストボックス
//NUM,MAX,MIN,TMP,TMP2,PRM,ONELOOPNUM外部変数
//最速素数判定アルゴリズム自動化少数エラトステネスの篩
function onIsPrimeERA(){
//初期設定
TXT_ANS_ERA.value = "Calculating・・・";
MIN = parseInt(TXT_NUM_ERAMAG.value) + 2; //少数エラトステネスの篩のマジックナンバー
if(MIN < 0){
MIN *= -1;
}
NUM = MIN;
MAX = NUM;
ONELOOPNUM = 1000;
//少数エラトステネスの篩素数列挙
PRM = [2,3,5];
TMP = 7;
TMP2 = 3;
function LoopMain1(id){//メインループ
var cnt;
for(cnt = 0; cnt < ONELOOPNUM; cnt++){
if(TMP % TMP2 == 0){//試し割
TMP += 2;
TMP2 = 3;
if(MAX <= TMP){//終了判定
TMP = PRM[PRM.length - 2];
MIN = TMP;
onIsPrimeERA2nd();//本番へ
return;
}
break;
}
TMP2 += 2;
if(TMP <= TMP2){//列挙記憶判定
PRM.push(TMP);
TMP += 2;
TMP2 = 3;
if(MAX <= TMP){//終了判定
TMP = PRM[PRM.length - 2];
MIN = TMP;
onIsPrimeERA2nd();//本番へ
return;
}
break;
}
}
setTimeout(function() { LoopMain1(id); }, 50); //メインループ再セット
}
LoopMain1(0);//メインループエントリーポイント
}
//本番
function onIsPrimeERA2nd(){
//本番初期設定
TMP = MIN;
NUM = parseInt(TXT_NUM_ERA.value);
if(NUM < 0){
NUM *= -1;
}
MAX = Math.ceil(Math.sqrt(NUM));
ONELOOPNUM = 1000;
var i;
//初期判定少数エラトステネスの篩
if((NUM == 0)||(NUM == 1)){
TXT_ANS_ERA.value = "0 or 1"
return;
}
for(i = 0; i < PRM.length; i++){
if(NUM == PRM[i]){
TXT_ANS_ERA.value = "Prime Number"
return;
}
if(i == PRM.length - 1) break;
if(NUM % PRM[i] == 0){
TXT_ANS_ERA.value = "Not Prime Number"
return;
}
}
TMP = MIN;//試し割素数判定[MIN<=X<=√N]
//メインループ
function LoopMain2(id){
var cnt;
for(cnt = 0; cnt < ONELOOPNUM; cnt++){
if(NUM % TMP == 0){//試し割
TXT_ANS_ERA.value = "Not Prime Number"
return;
}
TMP += 2;
if(MAX <= TMP){//終了判定
TXT_ANS_ERA.value = "Prime Number"
return;
}
}
setTimeout(function() { LoopMain2(id); }, 50); //メインループ再セット
}
LoopMain2(0);//メインループエントリーポイント
}