首先,正如很多評論/職位在此間表示,需要確定素數的快速方法。我會給你C++中的代碼,但轉換爲JavaScript應該相對容易。
/**
* Miller Rabin primality test
* Returns true if n is probably prime
* optionally, you can specify a vector of witnesses to test against
* leave empty if you want the algorithm to randomly generate witnesses
*/
static bool isProbablePrime(ulong n, std::vector<ulong> w)
{
// easy
if(n==2 || n==3 || n==5 || n==7)
{
return true;
}
if(n<10)
{
return false;
}
// write (n-1) as 2^s * d
auto d = n - 1L;
auto s = 0L;
while(d%2==0)
{
d/=2;
s++;
}
// witness loop
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<ulong> dis(1, n - 1);
bool nextWitness = false;
for(int k=0; k<(w.empty() ? 10 : w.size()); k++)
{
// random base between 1 and n - 1
auto a = w.empty() ? dis(gen) : w[k];
// mod pow
auto x = modpow(a, d, n);
if(x == 1 || x == n - 1)
{
continue;
}
// modular exponentiation with repeated squaring
for(auto i=s-1; i>=0; i--)
{
x = (x * x) % n;
// composite
if(x == 1)
{
return false;
}
if(x==n-1)
{
// the behaviour of this flag, and the break are meant to emulate a 'continue <loopname>' statement
nextWitness = true;
break;
}
}
if(!nextWitness)
{
return false;
}
nextWitness = false;
}
// probably prime
return true;
}
現在可以很容易地編寫的一段代碼,生成下一個質數:
static ulong nextPrime(ulong p)
{
p++;
while(!isProbablePrime(p))
{
p++;
}
return p;
}
下一頁(最後一步)是迭代開始於2號,並且當數目是發現分割輸入,返回相應的最大除數。
long largestDivisor(long n)
{
long f = 2;
while(f < sqrt(n))
{
if(n % f == 0)
return n/f;
f = nextPrime(f);
}
return n;
}
您可以實現波拉德的RHO分解算法,倫斯特拉的橢圓曲線分解等。更簡單的情況下,爲什麼不走回頭路,回到第一個我那分開數字? –
也許這可以幫助:https:// stackoverflow。com/questions/22130043 /試圖找到一個數字在js中的因子 –
並保持遞減2而不是1. –