Javascript 求一个数的最大因子(除其自身外)
找到一个数字中除自身以外的最大因子的最佳方法是什么?到目前为止,我得到了这个:Javascript 求一个数的最大因子(除其自身外),javascript,algorithm,for-loop,math,optimization,Javascript,Algorithm,For Loop,Math,Optimization,找到一个数字中除自身以外的最大因子的最佳方法是什么?到目前为止,我得到了这个: function biggestFactor(num) { if (num % 2 == 0) return num / 2; var result; for (var i = 1, m = Math.floor(num / 2); i < m; i++) { if (num % i == 0) result = i; } return result; } greatestFact
function biggestFactor(num) {
if (num % 2 == 0) return num / 2;
var result;
for (var i = 1, m = Math.floor(num / 2); i < m; i++) {
if (num % i == 0) result = i;
}
return result;
}
greatestFactor(1024); // 512
greatestFactor(1025); // 205
greatestFactor(1026); // 513
greatestFactor(1027); // 79
这显然不是很有效。还有什么其他方法可以解决这个问题?您的要求是从num中删除最小的素数 测试2正常,然后从3开始直到squarerootnum 你应该增加2 结果是num/i,而不仅仅是i i是num的最小素数 首先我错了,因为我以为你在寻找最伟大的黄金 现在是一个经过测试的版本 函数最大值{ 如果num%2==0,则返回num/2; var stop=Math.sqrtnum;
对于var i=3,首先是i<P>,如这里的很多注释/文章所示,您需要一种快速识别素数的方法。我将在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;
}
下一个最后一步是迭代从2开始的数字,当发现一个数字除以输入时,返回相应的最大除数
long largestDivisor(long n)
{
long f = 2;
while(f < sqrt(n))
{
if(n % f == 0)
return n/f;
f = nextPrime(f);
}
return n;
}
我可以提出一种OsqrtN方法,其中N是数字 函数最大值{ 设结果=1;
forlet i=2;i*i如果你知道这个数字不是素数,或者甚至不是素数,那么这应该是可行的
function greatestFactor(num) {
for (var i = 3; num%i>0; ) i+=2;
return num/i;
}
如果最小因子是大的,则速度会很慢,不过您可以实现Pollard的rho分解算法、Lenstra的椭圆曲线分解等。对于更简单的情况,为什么不向后返回第一个除以数字的i?也许这会有帮助:继续递减2而不是1。开始从2开始除以素数然后返回进行除法的num/第一个素数。您可能支持的最大数的数量级是多少?如果它低于10^15,一个简单的算法,如Erastothene's siever,将完成繁重的工作,即找到最小除法的考虑因素14。答案是7,sqrt14<7。@AjayBrahmakshatriya如果您离婚e乘2,你会得到7。@ShashwatKumar他要求OP从sqrtx开始向下。然后返回第一个除法的数字。我只是说14是错误的。我认为他的前两个语句不兼容。sqrtx是正确的,但它应该从最大2开始。@ShashwatKumar不,即使这样也足够了。在这种情况下,他必须返回x/I.Sin这与stefan bachert的答案有什么不同?
function greatestFactor(num) {
for (var i = 3; num%i>0; ) i+=2;
return num/i;
}