<?php

/**

* 圆周率计算(BBP)

* @author Moyo

* @url http://moyo.uuland.org/code/php-pi-calc/

* @version 1.0

* @date 2013.01.12

*/

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;

}

}

?>

测试代码:

<?php

include 'bbp.pi.php'; $pi = pi::calc(1);

printf('Pi从第%d位开始后九个数字为:%s', $pi['n'], $pi['v']);?>

python用bbp公式计算圆周率_利用BBP公式来计算Pi圆周率的PHP代码相关推荐

  1. 凯利公式自动计算表_利用凯利公式计算每场投注的最佳比例

    即便是胜率 99%的赌局,如果每局全押,那么也注定会血本无归.即便是胜率只有 1%,如果 1000 元钱本金每局仅投注 1 元,哪怕每次必输,也要 1000 次才会破产.成功的投资不仅要对投资策略的胜 ...

  2. vb net excel 剪贴板 粘贴_利用剪贴板强化 Excel 计算

    遇到Excel难以实现的复杂或特殊运算时,可先用剪贴板将数据复制到esProc,利用esProc强大的计算能力完成,再用剪贴板返回Excel.剪贴板方式比传统的add-ins方式部署更简单,操作更顺滑 ...

  3. java 两日期的周数_利用 Java 中 Calendar 计算两个日期之间的天数和周数

    利用 Java 中 Calendar 计算两个日期之间的天数和周数 前言 究竟什么是一个 Calendar 呢? 中文的翻译就是日历, 那我们立刻可以想到我们生活中有阳 (公) 历阴 (农) 历之分它 ...

  4. 如何根据灰度直方图计算标准差_如何根据电器功率计算电线的粗细?

    一般来说,测算电线的粗细,需要根据功率计算电流,根据电流选择导线截面,根据导线的截面,导线或电缆的型号查厂家的该型号的导线电缆的直径.这里就涉及了:电线粗细与功率之间的关系计算:导线截面积与载流量的计 ...

  5. python用泰勒级数计算圆周率_利用泰勒级数加速计算

    使用Python+Numpy,它可能在这里和那里进行了优化,因此不可能真正地对log(1+x)与{}进行基准测试. 所以我搬到了C++.在 结果:Time per operation with log ...

  6. python计算信息增益_利用Python提取ABAQUS的计算结果(ODB)信息、体积、应变等变化(一)...

    00 实例模型 一个金属长方体,我们需要对其做拉伸的加载约束示意图如图1,并在完成后采用Python命令流读取参考点的位移.体积.应变随加载时间的变化情况. 图1 金属长方体约束加载示意图 01 Py ...

  7. python 求组合数最快方法_利用Python进行组合数计算

    如何利用Python来实现数学组合计算?一起来看看吧~ 前言 开学几个星期了emmm 作业一如既往的多....... 在做数学的时候经常要算组合数,奈何我的计算机太水了(其实是我懒哈哈) 正好最近学P ...

  8. 利用java格里高利公式求圆周率_用格里高利公式求π的近似值

    源程序 /* 用格里高利公式计算 π 的近似值,精度要求:最后一项的绝对值小于 10 – 5 */ #include #include /* 程序中调用绝对值函数 fabs , 需包含 math.h  ...

  9. python二维随机游走_利用python进行时间序列分析——从随机游走到GARCH模型(二)...

    Autoregressive Models - AR(p) 当因变量能由它的多个滞后项表示就叫做自回归性.公式如下: 当我们描述模型的阶数,比如,AR模型的阶数为怕p,p代表在这个模型里用的滞后数量. ...

最新文章

  1. 客快物流大数据项目(五十四):初始化Spark流式计算程序
  2. USACO JANUARY——矩形[rects]
  3. Markdown如何插入LaTeX公式?(在线LaTeX公式编辑器)
  4. linux命令 su和sudo,解析Linux中sudo,su与su -的异同
  5. Linux shell编程:状态变量
  6. 安装并配置ROS环境
  7. Qt文档阅读笔记-Qt工作笔记-QTableWidget::selectedItems()官方解析与实例(如何进行多选)
  8. mac 安装jdk_Mac安装rJava天坑
  9. vue2使用脚手架配置prettier报错:‘prettier/prettier‘: context.getPhysicalFilename is not a function
  10. python 拆分字符串反斜杠_用反斜杠拆分字符串
  11. MacBook 管理员账户无法删除 解决方法
  12. 物欲横流的社会中,有没有那么一首诗、一首歌、一句话、一个词....不经意间勾起了你心中无限的回忆,甚至心都跟着微微颤抖了一下
  13. matlab错位相减,matlab随手记
  14. 【linux】运行run文件显示cannot execute binary file
  15. jitter概念理解
  16. 用邮件联系导师有哪些注意事项需要关注呢?如何选择适合自己的导师呢?
  17. 如何安装Java软件开发工具包(JDK)
  18. 羊驼alpaca php,“草泥马”-----羊驼(Alpaca)
  19. Com插件开发-VBE-模块导出函数-DllRegisterServer-DllUnregisterServer-DllGetClassObject-DllCanUnloadNow-使用时机场合
  20. FHS、bash与用户权限

热门文章

  1. 短线量化股票金股和长线量化金股有什么区别?
  2. 星际巡航—玩转javascript中this!
  3. 我奋斗18年,和你或者咖啡没有任何关系
  4. 美赛数学建模 | 信息检索与竞赛工具 降低信息差
  5. codewars--js--Pete, the baker
  6. 根据一堆数字判定下一个数字_坐在一堆数字黄金
  7. Common Lisp Style Guide - Ariel Networks Labs
  8. 在线报表设计实战系列 – ③制作交叉分析表
  9. 一款牛逼的Java工具类库,GitHub星标11.6k+
  10. java 字符串 数组 索引_如何在Java中找到数组中元素的索引?