≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 网络编程 > PHP笔记

php 计算圆周率(π)的值的简单示例

人气:288 时间:2021-08-25

这篇文章主要为大家详细介绍了php 计算圆周率(π)的值的简单示例,具有一定的参考价值,可以用来参考一下。

最后一行的200表示计算圆周率后200位。当然如果你觉得电脑足够强大,可以试试更高的位数。
<?php
    set_time_limit(0);  //没有这个代码可能会运行超时
    class pi
    {
        public static function calc($__N__)
        {
            $n = (int)$__N__;
            $av = $a = $vmax = $N = $num = $den = $k = $kq = $kq2 = $t = $v = $s = $i = 0;
            $sum = 0.0;
            $N = (int)(($n + 20) * log(10) / log(2));
            $sum = 0;
            for ($a = 3; $a <= (2 * $N); $a = self::next_prime($a))
            {
                $vmax = (int)(log(2 * $N) / log($a));
                $av = 1;
                for ($i = 0; $i < $vmax; $i ++)
                {
                    $av = ($av * $a);
                }
                $s = 0;
                $num = 1;
                $den = 1;
                $v = 0;
                $kq = 1;
                $kq2 = 1;
                for ($k = 1; $k <= $N; $k ++)
                {
                    $t = $k;
                    if ($kq >= $a)
                    {
                        do
                        {
                            $t = (int)($t / $a);
                            $v --;
                        }
                        while (($t % $a) == 0);
                        $kq = 0;
                    }
                    $kq ++;
                    $num = self::mul_mod($num, $t, $av);
                    $t = (2 * $k -1);
                    if ($kq2 >= $a)
                    {
                        if ($kq2 == $a)
                        {
                            do
                            {
                                $t = (int)($t / $a);
                                $v ++;
                            }
                            while (($t % $a) == 0);
                        }
                        $kq2 -= $a;
                    }
                    $den = self::mul_mod($den, $t, $av);
                    $kq2 += 2;
                    if ($v > 0)
                    {
                        $t = self::inv_mod($den, $av);
                        $t = self::mul_mod($t, $num, $av);
                        $t = self::mul_mod($t, $k, $av);
                        for ($i = $v; $i < $vmax; $i ++)
                        {
                            $t = self::mul_mod($t, $a, $av);
                        }
                        $s += $t;
                        if ($s >= $av)
                        {
                            $s -= $av;
                        }
                    }
                }
                $t = self::pow_mod(10, ($n - 1), $av);
                $s = self::mul_mod($s, $t, $av);
                $sum = (double)fmod((double)$sum + (double)$s / (double)$av, 1.0);
            }
            return array(
                'n' => $n,
                'v' => sprintf('%09d', (int)($sum * 1e9))
            );
        }
        private static function next_prime($n)
        {
            do
            {
                $n ++;
            }
            while (!self::is_prime($n));
            return $n;
        }
        private static function is_prime($n)
        {
            $r = $i = 0;
            if (($n % 2) == 0)
            {
                return 0;
            }
            $r = (int)(sqrt($n));
            for ($i = 3; $i <= $r; $i += 2)
            {
                if (($n % $i) == 0)
                {
                    return 0;
                }
            }
            return 1;
        }
        private static function mul_mod($a, $b, $m)
        {
            return fmod((double)$a * (double)$b, $m);
        }
        private static function inv_mod($x, $y)
        {
            $q = $u = $v = $a = $c = $t = 0;
            $u = $x;
            $v = $y;
            $c = 1;
            $a = 0;
            do
            {
                $q = (int)($v / $u);
                $t = $c;
                $c = $a - $q * $c;
                $a = $t;
                $t = $u;
                $u = $v - $q * $u;
                $v = $t;
            }
            while ($u != 0);
            $a = $a % $y;
            if ($a < 0)
            {
                $a = $y + $a;
            }
            return $a;
        }
        private static function pow_mod($a, $b, $m)
        {
            $r = $aa = 0;
            $r = 1;
            $aa = $a;
            while (1)
            {
                if ($b & 1)
                {
                    $r = self::mul_mod($r, $aa, $m);
                }
                $b = $b >> 1;
                if ($b == 0)
                {
                    break;
                }
                $aa = self::mul_mod($aa, $aa, $m);
            }
            return $r;
        }
        static function  sub($len){
            $lens = ceil ($len / 10) + 2;
            $a = 1;
            $p = '3.';  
            for($i=1;$i<$lens;$i++){
                $v = self::calc($a);
                $p .= $v['v'];
    $a = $a+9;
            }
            return $p;
        }
    }
    echo pi::sub(200);
 

本文来自:http://www.q1010.com/173/22716-0.html

注:关于php 计算圆周率(π)的值的简单示例的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:圆周率

您可能感兴趣的文章

  • python之计算圆周率π的的实现方法
上一篇:解决PHP防刷票的一些问题
下一篇:用php做个简单的计算
热门文章
  • PHP 写入WRITE编码为UTF8的文件示例
  • PHP 中文字符串截取函数示例:支持gb2312,gbk,big
  • PHP 简单留言板的制作示例
  • 解决Fatal error: Call to undefined function mb_convert_encoding() in错误问题
  • PHP语言基础(标记、注释、变量、数组、常量、函数)示例
  • php 生成迅雷链接的简单示例
  • php 获取短网址的实现方法
  • PHP 通用分页类的简单示例
  • PHP 使用文件方式导入导出整个MYSQL数据库的实现方法
  • php 获取MYSQL错误的简单示例
  • 最新文章
    • 解决PHP使用redis实现统计缓存MySQL压力的问题
    • php 简单的上传进度条的简单示例
    • php 给html中引用的js和css路径打上版本号的实现方法
    • php 实现计算年龄精准到年月日的实例
    • php+ajax无刷新分页的简单示例
    • 解决php+ajax无刷新上传图片的问题
    • 解决PHP生成HTML静态页面的问题
    • 解决PHP使用uniqid函数生成唯一ID的问题
    • 解决PHP防刷票的一些问题
    • 微信access_token的获取开发的实现方法

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。