パラメータnとqを取り、q以上のnを除算する最小の素数を返すfindFirstという関数が必要です。そこで、最初に、数が素数であるかどうかを示す関数を作成しました。
var isPrime = function(n){
if(n === 1){
return false;
}
else if (n === 2 || n === 3){
return true;
}
else {
for(i=2; i < n; i++){
if(i * i >= n){
for(j=2; j<=i; j++){
if(n % j === 0){
return false;
}
}
return true;
}
}
}
};
これをより効率的にする他の方法があるかもしれませんが、私はこの関数が問題ではないと確信しています。
したがって、この関数を使用して、findFirstを作成する最初の試みを行いました。
var findFirst = function(n,q){
var p = q;
while(n % p !== 0 || isPrime(p) === false){
p++;
}
return p;
};
この関数は機能しますが、数値が大きいとクラッシュします。たとえば、入力時にクラッシュします(6310545154、3)。ちなみに6310545154の素数冪分解は2*3155272577です
そこで、最初に数の素因数をリストする別の関数を作成しました。
var getFactors = function(n){
var factors = [];
var k = n;
var p = 2;
while(isPrime(k) === false && k !== 1){
while(k % p !== 0 || isPrime(p) === false){
p = p+1;
}
while(k % p === 0){
k = k/p;
}
factors.push(p);
}
if(isPrime(k) === true){
factors.push(k);
return factors;
}
if(k === 1){
return factors;
}
};
そして今、findFirstでの2回目の試みは次のとおりです。
var findFirst = function(n,q){
var array = getFactors(n);
var p = 0;
for(i = 0; i < array.length; i++){
if(array[i] >= q && p === 0){
p = array[i];
}
}
return p;
};
これはうまくいきます。上記の大きな数値ではクラッシュせず、結果を即座に計算します。なぜこれが起こるのか誰かがわかりますか?私の最初の試みの「while」ループは、getFactors関数の「while」ループの1つと非常に似ているようです。そして、2番目の試みははるかに複雑に見えます。