我是首先在[1] 注意到 Spigot-Algorithm的,这个算法发布的相当早,见[2].  [1] 给出几个令人惊异的程序,只用很少的代码就可以计算e,pi,log(2)等常数。其中那个4行代码计算圆周率的程序被网友称作外星人写的程序,但我一直没有勇气去分析和学习它,最近终于决定学习这个 Spigot-Algorithm,先看了文献【3】,明白了其基本思想,遂计划尝试编写各种计算常数的代码,并写一个系列博客。从这篇开始,我将讲述如果使用这个算法计算各种常数或者级数的和。

数列a[n]={1/1,1/2,1/3,1/4... 1/n} 被称作调和数列。调和数列的和f(n)= 1/1 + 1/2 + 1/3 +1/4 + ... 1/n 被称作调和级数。调和级数是最简单的级数之一。用Spigot 算法来计算这个级数也最为简单。

下面给出代码。具体说明以后补上。

#define R 10     //进制,可改为100,1000,10000,
#define FMT_STR "%d"  //当R=100,1000,10000时,相应的,需要改为"%02d","%03d","%04d",
#define N 10        //计算交错级数的前10项
#define P 20        //当R=10^k时,可打印前P*k位有效数字
int a[N+1],i,j,x;
void main()
{for (i=N;i;a[i--]=1);for (j=0;j<P;j++){x=0;for (i=N;i;i--){x+=(a[i]*R)/i; a[i]=(a[i]*R)%i;}x+=a[i]*R;printf(FMT_STR,x/R); a[0]=x/R;if ( j==0)printf(".");}
}

几点说明:
  1. 数组的长度和计算的项数有关,而和最终精度无关。
  2. a[1] to a[n]存储第j轮计算时,各项的分子。
  3. 每轮计算中,得到2位10进制数,最高位直接输出,次高位缓存在a[0]
  4. 当N大于10时,计算结果错误,这是因为交错级数收敛很慢. 当得到次高位时就急于输出最高位仍是冒险的方法。改进的方法是当得到第5位时再输出最高位,然后将第2到5位存储在a[0],下面是修改后的代码,可正确计算交错级数前100项的值。

#define R 10  //进制,可改为100,1000,10000,
#define FMT_STR "%d" //当R=100,1000,10000时,相应的,需要改为"%02d","%03d","%04d",
#define N 100  //计算交错级数的前N项
#define P 100  //当R=10^k时,可打印前P*k位有效数字
int a[N+1],i,j,x;
void main()
{for (i=N;i;i--)a[i]=1;for (j=0;j<P+1;j++){x=0;for (i=N;i;i--){x+=(a[i]*R)/i; a[i]=(a[i]*R)%i;}a[0]= a[0]*R + x;if ( j>2){printf(FMT_STR,a[0]/(R*R*R*R));a[0]%=(R*R*R*R);if ( j==3)printf(".");}}
}

参考文献:

1. Tiny programs for constants ,http://numbers.computation.free.fr/Constants/constants.html

1. M. Abramowitz and I. Stegun, Handbook of Mathematical Functions, Dover, New York, (1964)

3. https://en.wikipedia.org/wiki/Spigot_algorithm



Spigot 算法之一 计算调和级数的和相关推荐

  1. c语言x在二进制表示下1的个数,算法:计算十进制数字在二进制表示1的个数,...

    算法:计算十进制数字在二进制表示1的个数, 题目一 计算十进制数字在二进制表示 1 的个数 举个例子: 十进制数字为 1 时,它的二进制表示是 001,二进制表示 1 的个数为 1: 十进制数字为 2 ...

  2. 问题描述 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底

    问题描述 给定一个由n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径 ...

  3. 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子

    问题描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子 ...

  4. Python一句话实现秦九韶算法快速计算多项式的值

    关于秦九韶算法快速计算多项式值的原理描述请参考之前推送的文章Python使用秦九韶算法求解多项式的值.本文重点演示Python函数reduce()和lambda表达式的用法.代码没加注释,如果不好理解 ...

  5. python计算n阶乘中尾部零的个数_(Java)设计一个算法,计算出n阶乘中尾部零的个数...

    展开全部 long 类型对大数阶乘来e68a8462616964757a686964616f31333365633963说存储范围大小,强行使用会溢出,可以使用 BigDecimal. 代码如下:im ...

  6. 在一个请求分页系统中,假定系统分配给一个作业的物理块数为 3,并且此作业的页面走向为 2、3、2、1、5、2、4、5、3、2、5、2。试用 FIFO和 LRU 两种算法分别计算出程序访问过程中所发生

    页面置换算法 题目: 在一个请求分页系统中,假定系统分配给一个作业的物理块数为 3,并且此作业的页面走向为 2.3.2.1.5.2.4.5.3.2.5.2.试用 FIFO和 LRU 两种算法分别计算出 ...

  7. python用链表求两数之和_python 算法 - 008 计算两个链表所代表的整数之和 (整数相加法)...

    python 算法 - 008 计算两个链表所代表的整数之和 (整数相加法) 知之者不如好之者, 好之者不如乐之者.--<雍也> 知道德者不如好道德者, 好道德者不如乐道德者, 是为形容人 ...

  8. 当逻辑表达式或者算法的计算过程冗长的时候该如何做的简单可读

    当逻辑表达式或者算法的计算过程冗长的时候,类似下面的代码,会让我们阅读和理解的过程非常痛苦,例如: if( browser.toUpperCase().indexOf("SAFARI&quo ...

  9. 名词解释 算法的有限性_欲借助 FFT 算法快速计算两有限长序列的线性卷积,则过程中要调用 ( ) 次 FFT 算法_学小易找答案...

    [单选题]计算 N=2 L ( L 为整数)点的按时间抽取基 -2FFT 需要 ( ) 级蝶形运算 [单选题]Les étudiants chinois, une fois arrivés en Fr ...

  10. 【算法】计算组合数的四种常用方法

    [算法]计算组合数的四种常用方法 算法一:Cab=Ca−1b−1+Ca−1bC_{a}^{b}=C_{a-1}^{b-1}+C_{a-1}^{b}Cab​=Ca−1b−1​+Ca−1b​ 解析: Ca ...

最新文章

  1. 假期怎么提升Python技能?100+编程题给你练~
  2. 【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]
  3. wine清除软件残余图标
  4. 天津教师招聘考试计算机真题及答案,天津教师招聘考试真题五(含答案)
  5. java接口测试工具_这 5 款实用性能测试工具,你会如何选择?
  6. PHP实现加密的几种方式介绍
  7. android sdk更新代理设置
  8. .NET Core on K8S学习实践系列文章索引(持续更新)
  9. nylon尼龙的来历
  10. date日期相减 java_一个小小的Java程序
  11. K8S从懵圈到熟练 - 节点下线姊妹篇
  12. 关闭浏览器前提示_win7系统ie总弹出查看和跟踪下载的关闭方法
  13. Exception in thread main java.lang.RuntimeException: org.apache.hadoop.security.AccessControlExcep
  14. 中国净水装置行业市场供需与战略研究报告
  15. 【论文写作】在线考试系统的设计原理如何写
  16. 码农如何写好一封邮件/1
  17. mysql sql优化与调优机制详解_MySQL性能调优——锁定机制与锁优化分析详解
  18. network 宽带比特b,字节B
  19. Nginx proxy反向代理 缓存处理流程
  20. 理想世俗化:受挫的年轻一代 未来在哪里

热门文章

  1. 金三银四跳槽季,前端面试题记录(2021),VUE
  2. win7启动任务管理器快捷键
  3. Vue-电子签名(E-Signature)
  4. DA-TLC5615
  5. Longhorn 企业级云原生容器存储解决方案-部署篇
  6. Seafile私有云盘搭建详解
  7. Labview和三菱Q系列PLC通讯
  8. 抖音新版抓包方案,绕过sslpinning 直接修改so
  9. ikuai与AZ 组SDWAN
  10. 常见的服务器报错数字的意思