Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 求一个数的最大因子(除其自身外)_Javascript_Algorithm_For Loop_Math_Optimization - Fatal编程技术网

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;
}