我是首先在[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 算法来计算这个级数也最为简单。

以下给出代码。

详细说明以后补上。

  1. #define R 10 //进制。可改为100。1000,10000。
  2. #define FMT_STR "%d" //当R=100,1000,10000时。对应的,须要改为"%02d","%03d","%04d",
  3. #define N 10 //计算交错级数的前10项
  4. #define P 20 //当R=10^k时,可打印前P*k位有效数字
  5. int a[N+1],i,j,x;
  6. void main()
  7. {
  8. for (i=N;i;a[i--]=1);
  9. for (j=0;j<P;j++)
  10. {
  11. x=0;
  12. for (i=N;i;i--)
  13. {
  14. x+=(a[i]*R)/i; a[i]=(a[i]*R)%i;
  15. }
  16. x+=a[i]*R;
  17. printf(FMT_STR,x/R); a[0]=x/R;
  18. if ( j==0)
  19. printf(".");
  20. }
  21. }

几点说明:

  1. 数组的长度和计算的项数有关,而和终于精度无关。

2. a[1] to a[n]存储第j轮计算时。各项的分子。

  3. 每轮计算中。得到2位10进制数。最高位直接输出,次高位缓存在a[0]

  4. 当N大于10时。计算结果错误。这是由于交错级数收敛非常慢. 当得到次高位时就急于输出最高位仍是冒险的方法。

改进的方法是当得到第5位时再输出最高位,然后将第2到5位存储在a[0],以下是改动后的代码,可正确计算交错级数前100项的值。

  1. #define R 10 //进制,可改为100。1000,10000,
  2. #define FMT_STR "%d" //当R=100,1000,10000时,对应的,须要改为"%02d","%03d","%04d",
  3. #define N 100 //计算交错级数的前N项
  4. #define P 100 //当R=10^k时,可打印前P*k位有效数字
  5. int a[N+1],i,j,x;
  6. void main()
  7. {
  8. for (i=N;i;i--)
  9. a[i]=1;
  10. for (j=0;j<P+1;j++)
  11. {
  12. x=0;
  13. for (i=N;i;i--)
  14. {
  15. x+=(a[i]*R)/i; a[i]=(a[i]*R)%i;
  16. }
  17. a[0]= a[0]*R + x;
  18. if ( j>2)
  19. {
  20. printf(FMT_STR,a[0]/(R*R*R*R));
  21. a[0]%=(R*R*R*R);
  22. if ( j==3)
  23. printf(".");
  24. }
  25. }
  26. }

參考文献:

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. 在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM

    题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...

  2. 声明式编程:程序=数据+逻辑(what)+算法(控制+计算)

    接口:what: 实现:算法:指令: 编程语言中,凡是不涉及到算法的部分,都可以认为是声明式编程. 命令式编程可以与算法划等号:算法要求严格的计算逻辑和控制,是实施细节的精准描述: 命令式编程与声明式 ...

  3. The Pragmatic Programmer 读书笔记之中的一个 DRY-Don’t Repeat Youself

     The Pragmatic Programmer读书笔记之中的一个 DRY-Don't Repeat Youself 尽管自己买了非常多软件project方面的书,可是由于时间的问题.一直没有静 ...

  4. poj 1741 楼教主男人八题之中的一个:树分治

    http://poj.org/problem? id=1741 Description Give a tree with n vertices,each edge has a length(posit ...

  5. 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!

    乐高Mindstorm EV3智能机器人(下面简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!E ...

  6. 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 &amp; 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  7. hdu1465不easy系列之中的一个(错排)

    版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/37512659 转载请注明出 ...

  8. Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列

    11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...

  9. C#算法之判断一个字符串是否是对称字符串

    记得曾经一次面试时,面试官给我电脑,让我现场写个算法,判断一个字符串是不是对称字符串.我当时用了几分钟写了一个很简单的代码. 这里说的对称字符串是指字符串的左边和右边字符顺序相反,如"abb ...

随机推荐

  1. Gmail进程信息转储分析工具pdgmail

    Gmail进程信息转储分析工具pdgmail   进程信息转储(Process Memory Dump)是数字取证的重要方式.通过分析对应进程的信息转储,可以获取大量的信息.Kali Linux提供一 ...

  2. 浅析Oracle PL/SQL 学习--未完待续

    这是一篇关于Oracle Pl/SQL数据库编程的课程学习分享... 首先说明几点: 学习这门课程之前,已经学过并且掌握一些基础的SQL语句.数据库结构分析.ER图设计等知识: 这里也只是较为大概地将 ...

  3. Jackson反序列化提示:Can not deserialize instance of Task out of START_ARRAY token

    解决方法: 1.没有绝对的方法,只能不断的测试和排查. 2.检查一下JSON数据和实体的字段结构是不是不一致导致的.比如JSON数据是数组,而实体字段为非数组. 参考: https://stackov ...

  4. EF for oracle中无法读取配置 显示无法open问题解决方式

    1.更新以上设置为 非注销部分 弄了很久很久哈.

  5. 【Linux】CentOS7上的一些操作小方法

    1.在文件夹目录下删除文件 点击文件,按Delete键删除,就可以把文件删除到回收站中. 2.更改命令窗口的样式 打开命令窗口--->右键---->配置文件---->配置文件首选项

  6. vue axios跨域请求,apache服务器设置

    问题所在axios请求会发送两次请求 也就是说,它会先使用options去测试,你这个接口是否能够正常通讯,如果不能就不会发送真正的请求过来,如果测试通讯正常,则开始正常请求. 思路: 跨域--> ...

  7. mac mysql命令行

    https://www.cnblogs.com/lonecloud/p/5841522.html mac下使用mysql控制台命令行   命令行中输入 open .bash_profile 然后将 a ...

  8. net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案

    net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案 今天在用List集合转换成json数组的时候发生了这个错误,这个 ...

  9. Web项目中用mybatis配置多个数据库

    需要在项目中配置多个数据库(比如一个mysql,一个oracle)的时候,可按照如下方式配置 首先是第一个数据库的配置 <bean name="transactionManager&q ...

  10. Angular 学习笔记——ng-repeat 隔行换色

    <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...