Php 寻找唯一因子的有效方法

Php 寻找唯一因子的有效方法,php,algorithm,numbers,primes,Php,Algorithm,Numbers,Primes,可能重复: 我以前问过这个问题,但现在无法访问该帐户,所以我再次问它,以显示我这次的努力 给定一个数字列表(数组)和一个数字N,找出N的所有除数,它不除列表中的任何数字。我用蛮力和一点有效的方法(但不是最好的方法)解决了这个问题。因此,我正在寻找一种解决此类问题的最佳方法。一切都是整数(没有浮点) 我的方法是首先找到数字N的所有除数(没有任何开销),然后对列表和除数按相反顺序(分别)排序。现在,对于每个除数D,我检查它是否将列表中的任何数字除掉(从最高的元素开始到>=除数D的元素)。如果它除以

可能重复:

我以前问过这个问题,但现在无法访问该帐户,所以我再次问它,以显示我这次的努力

给定一个数字列表(数组)和一个数字N,找出N的所有除数,它不除列表中的任何数字。我用蛮力和一点有效的方法(但不是最好的方法)解决了这个问题。因此,我正在寻找一种解决此类问题的最佳方法。一切都是整数(没有浮点)

我的方法是首先找到数字N的所有除数(没有任何开销),然后对列表和除数按相反顺序(分别)排序。现在,对于每个除数D,我检查它是否将列表中的任何数字除掉(从最高的元素开始到>=除数D的元素)。如果它除以,那么D的所有除数也必须除以。然后我从除数列表中删除这些元素,这些元素也是D的除数(可以认为是删除交集)。因此,左除数数组最终是所需的数组(根据我的方法)。如果有人能指出我的方法中的任何错误或缺乏效率,我们将不胜感激。列表中可以出现的最大值为10^18

我已经用PHP实现了它。我在下面提供我的代码。请忽略这些评论

while($div=each($divisors))
{
$i=0;
$divisor=$div['key'];
//echo "divisor is $divisor\n";
while((int)$unfriendly[$i]>=$divisor)
{//echo "aya\n";
    if(!((int)bcmod($unfriendly[$i],$divisor)))
    {//echo "ayeea\n";
        $divisors_of_divisor=divisors_of_a_number($divisor);
        //print_r($divisors_of_divisor);
        //print_r($divisors);
        foreach($divisors_of_divisor as $d)
        unset($divisors[$d]);
        //print_r($divisors);
        break;
    }
    ++$i;
}
 }
echo sizeof($divisors);
function divisors_of_a_number($n)//returns all the divisors of a number in an unsorted array
{
$i=1;
$s=sqrt($n);
while($i<=$s)
{
if(!($n%$i))
{
    $a[]=$i;
    if($i!=$s)
    $a[]=$n/$i;
}
++$i;
}
return $a;
}
function divisors_of_a_number_as_keys_of_array($n)//returns all the divisors of a number in an unsorted array as keys
{
$i=1;
$s=sqrt($n);
while($i<=$s)
{
if(!($n%$i))
{
    $a[$i]=1;
    //if($i!=$s)
    $a[$n/$i]=1;
}
++$i;
}
return $a;
}
while($div=每个($divors))
{
$i=0;
$divisor=$div['key'];
//echo“除数为$divisor\n”;
while((int)$unfriendly[$i]>=$divisior)
{//echo“aya\n”;
if(!((int)bcmod($unfriendly[$i],$divisor)))
{//echo“ayeea\n”;
$divisors\u of_divisor=_a_数的divisors\u($divisor);
//print\u r($除数的除数);
//打印(除数);
foreach($除数作为$d)
未设置($d)除数;
//打印(除数);
打破
}
++$i;
}
}
回声大小(除数);
函数除数(n)//返回未排序数组中一个数的所有除数
{
$i=1;
$s=sqrt($n);
而($i你可以用这个

还有


请看。

我将在上一个问题中添加相关的添加内容[您尝试时的代码快照],并投票结束。@amit将问题转移给@vitalik怎么样?@vitalik:(1)我不是版主,只是一个拥有编辑特权的人,所以我不能这样做。(2)我认为它不适合codereview.SE。他不是在要求审查,他要求的是完全不同的方法,并且提供了他以前的尝试,因为像每个SO问题一样,在提出问题之前,需要进行一次体面的研究。@amit,而不是结束,你可以帮助解决问题problem@vitalik朋友,你也一样,我已经提到了至少,我以前问过,但无法访问该帐户。如何筛选eratos帮助改进我所说的方法。实际上,该数字可以高达10^13,那么我如何使用此技术找到高达如此大数字的素数。需要为解决方案提供缓存文本,因为该链接可能在未来死亡404。