如何在php中查找范围内的素因子

如何在php中查找范围内的素因子,php,for-loop,logic,Php,For Loop,Logic,这是一个寻找一个数的素数因子的程序 Like-数字1125的素数因子是3和5 我的算法是这样的-(如果不正确,请告诉我) 首先,我使用sqrt() 函数来打破复杂性和运行时间 查找介于范围之间的素数 最后,将这些素数除以原始数(尚未达到此步骤,因为第二步失败) 我的代码不起作用,请让我知道我的逻辑和步骤2和步骤3中的代码的具体失败之处 没有抛出错误,但代码也没有输出任何内容。 <?php error_reporting(E_ALL); $number = 6006; $sqrt_num

这是一个寻找一个数的素数因子的程序

Like-数字1125的素数因子是
3
5

我的算法是这样的-(如果不正确,请告诉我)

  • 首先,我使用
    sqrt()
    函数来打破复杂性和运行时间
  • 查找介于范围之间的素数
  • 最后,将这些素数除以原始数(尚未达到此步骤,因为第二步失败)
  • 我的代码不起作用,请让我知道我的逻辑和步骤2和步骤3中的代码的具体失败之处

    没有抛出错误,但代码也没有输出任何内容。

    <?php
    error_reporting(E_ALL);
    $number = 6006;
    
    $sqrt_num = (int)sqrt($number);
    
    for($i=2;$i<$sqrt_num;$i++)
    {
        for($j=2;$j<=$i-1;$j++)
        {
            if($i%$j==0)
            break;
            if($i==$j) 
                echo $i;
        }   
    }
    

    查找素数在大多数编程语言中都是一个常见问题。首先,请看一下。您可以使用该函数。

    因为我可以确定您是想要一个数的素数因子,还是想要1到sqrt(number)范围内的所有素数,我将给您一些我不久前编写的代码,并展示不同的实现:

    //Check if a number is prime
    function isPrime($num, $pf = null)
    {
        if(!is_array($pf)) 
        {
            for($i=2;$i<intval(sqrt($num));$i++) {
                if($num % $i==0) {
                    return false;
                }
            }
            return true;
        } else {
            $pfCount = count($pf);
            for($i=0;$i<$pfCount;$i++) {
                if($num % $pf[$i] == 0) {
                    return false;
                }
            }
            return true;
        }
    }
    
    //Find Prime Factors
    function primeFactors($num)
    {
        //Record the base
        $base = intval($num/2);
        $pf = array();
        $pn = null;
        for($i=2;$i <= $base;$i++) {
            if(isPrime($i, $pn)) {
                $pn[] = $i;
                while($num % $i == 0)
                {
                    $pf[] = $i;
                    $num = $num/$i;
                }
            }
        }
        return $pf;
    }
    
    我想指出的是,
    isPrime
    中使用了
    $pf
    ,因为它是一个筛子,可以根据已经处理过的素数因子来减少确定一个数字是否为素数的处理时间。

    $namber=1122676330;
    
    $namber = 1122676330;
    $text = $namber.'=';
    $time_start = microtime(1);
    
    for($i=2; $i<=$namber; $i++ ){
        if($namber % $i == 0){
            $namber = $namber / $i;
            $text .= $i. '  ';
            $i--;
        }
        if($namber == 1){
                echo 'ok';
            }
    }
    
    $time_end = microtime(1);
    $time = $time_end - $time_start;
    echo "<br><br>$text<br><br> $time seconds\n";
    
    $text=$namber.'='; $time_start=微时间(1); 对于($i=2;$i),您可以在上使用php类

    PHP素数模块能够非常快速地进行大量的素数分解

    链接:

    可能重复首先,从逻辑上讲,你不是在检查素数,你是在检查“可除数”,其次,你
    打破循环,而不是
    继续进行下一次迭代。看看:你可能在这里找到你的解决方案:我试着给你发布的解决方案添加一条注释,因为它可以工作。评论是“编辑我的上一篇文章太晚了,但是如果
    $number
    大于1,那么2将始终是要包含在列表中的质数,因此您可以在声明数组后任意添加
    $myarr[]=2;
    。”在旁注中,你说你想找到1到所选数字平方根之间的所有素数,但这个问题的第一句话说的是寻找素数因子。^^他实际上在寻找素数因子。关于素数因子,请查看@user1929959,谢谢链接。但实际上我更感兴趣的是在我自己的网站上找到bug代码..一旦找不到,我就在这里寻求逻辑帮助:)实际上我的代码是一个子部分..我在寻找一个数字的素数因子,这个数字非常大,所以我用我的sqrt()来分解这个数字返回值,然后寻找从1到sqrt的素数…问题是我在寻找从2到sqrt的素数时迷失了方向_number@swapnesh啊,好的!^^为此,您需要知道您必须转到
    $number/2
    ,作为
    sqrt($number)
    太小。例如,数字
    102012
    作为
    2,2,38501
    的主要因子,停在
    sqrt($number)
    将永远不会给出
    8501
    因子。^这可能回答了问题(我不是一个PHP家伙),但是解释一下为什么它可以与注释和文本一起使用会很好。现在它只是一段代码。
    $namber = 1122676330;
    $text = $namber.'=';
    $time_start = microtime(1);
    
    for($i=2; $i<=$namber; $i++ ){
        if($namber % $i == 0){
            $namber = $namber / $i;
            $text .= $i. '  ';
            $i--;
        }
        if($namber == 1){
                echo 'ok';
            }
    }
    
    $time_end = microtime(1);
    $time = $time_end - $time_start;
    echo "<br><br>$text<br><br> $time seconds\n";