美文网首页
php 质数

php 质数

作者: 嚼不烂的口香糖 | 来源:发表于2020-05-26 19:05 被阅读0次

质数 是指在大于1的自然数中,除了1和它本身以外不再有其他[因数]的自然数。

<?php
require_once 'init.php';

xhprof_enable(XHPROF_FLAGS_NO_BUILTINS);
$num = 2000;
$a1 = getPrimes($num);
$a2 = getPrimes2($num);

var_dump(strcmp($a1,$a2));


print_r(xhprof_disable());die;
var_dump($a1);
var_dump($a2);

/**
 * 常规遍历算法
 * @param int $num
 * @return string
 */
function getPrimes(int $num) {
    $digit = 2;
    $count = 0;
    $primes = [];
    while ($count < $num) {
        $i = 2;
        $is_prime = true;
        while ($i < $digit) {
            if ($digit % $i++ == 0) {
                $is_prime = false;
                break;
            }
        }
        if ($is_prime) {
            $count++;
            $primes[] = $digit;
        }
        $digit++;
    }
    return join(',', $primes);
}

/**
 * 最大值调节算法
 * @param int $num
 * @return string
 */
function getPrimes2(int $num) {
    $digit = 2;
    $count = 0;
    $primes = [];
    while ($count < $num) {
        $i = 2;
        $is_prime = true;
        $max = $digit;
        while ($i < $max) {
            if ($digit % $i == 0) {
                $is_prime = false;
                break;
            }
            $i++;
            $max = ceil($digit / $i) + 1;
        }
        if ($is_prime) {
            $count++;
            $primes[] = $digit;
        }
        $digit++;
    }
    return join(',', $primes);
}

function checkPrime($num) {
    $i = 2;
    $max = $num;
    while ($i < $max) {
        if ($num % $i == 0) {
            return false;
        }
        $i++;
        $max = ceil($num / $i);
    }
    return true;
}

function checkPrime2($num) {
    $i = 2;
    while ($i < $num) {
        if ($num % $i == 0) {
            return false;
        }
        $i++;
    }
    return true;
}

运行结果:

# 说明两个算法结果是一致的
int(0)
getPrimes()函数用了 1.367318s;getPrimes2()函数只用了 0.162182s
近10倍差距,而且随着计算数量的增加,这个差距还会继续增大
# 
Array
(
    [main()==>getPrimes] => Array
        (
            [ct] => 1
            [wt] => 1367318
        )

    [main()==>getPrimes2] => Array
        (
            [ct] => 1
            [wt] => 162182
        )

    [main()] => Array
        (
            [ct] => 1
            [wt] => 1529593
        )

)

简单说明一下

如何判断11是一个质数?

  • 如果 11/2 不能整除,那么就说明 11 除以 11/2 ~ 10 也一定不能整除
  • 如果 11/2 不能整除,而 11/3 有可能被整除,但 11/3 + 1 肯定是不能被整除的,所以 11/3 + 1 ~ 10 必然也不能被整除,而这一段可以不遍历。

相关文章

  • php 质数

    质数 是指在大于1的自然数中,除了1和它本身以外不再有其他[因数]的自然数。 运行结果: 简单说明一下 如何判断1...

  • 编程与数学3 编程找出200以内所有的质数

    利用PHP编程,找出1至20(任意整数区间)所有的质数 题 找出给定范围的所有质数 编程思考 这道题,我用PHP编...

  • Swift 计数质数 - LeetCode

    题目:计数质数 描述:统计所有小于非负整数 n 的质数的数量。 案例1: 质数的定义:质数 方案一:判断质数 代码...

  • Android 每日算法:猫扑素数、单词反转

    经典算法集锦,不定时更新 一、素数(质数)算法 定义: 质数(prime number)又称素数,有无限个。质数定...

  • 204. Count Primes - swift

    描述: 计算小于非负数整数n的质数(素数)个数 什么是质数(素数): 质数(prime number)又称素数,有...

  • 质数的孤独

    在数学中,所谓的质数是只能被1和它自身整除的数字,质数看似简单,却不那么普通。而质数家族中,如果某两个连续质数...

  • 质数-试除法

    质数 质数的定义:若一个正整数无法被1和他自身除外的任意自然数整除,则称该数为质数,否则为合数。 0和1不是质数也...

  • 极少数人用过的另类素数求解法,C语言经典算法之筛选法求质数

    筛选求质数 明除了自身之外,无法被其它整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计...

  • 刷leetCode算法题+解析(十八)

    计数质数 题目:统计所有小于非负整数 n 的质数的数量。 示例:输入: 10输出: 4解释: 小于 10 的质数一...

  • 204. 计数质数

    204. 计数质数 最简单的质数筛埃式筛法

网友评论

      本文标题:php 质数

      本文链接:https://www.haomeiwen.com/subject/plivahtx.html