Spigot 算法之中的一个 计算调和级数的和
我是首先在[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 算法之中的一个 计算调和级数的和的更多相关文章
- 在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM
题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...
- 声明式编程:程序=数据+逻辑(what)+算法(控制+计算)
接口:what: 实现:算法:指令: 编程语言中,凡是不涉及到算法的部分,都可以认为是声明式编程. 命令式编程可以与算法划等号:算法要求严格的计算逻辑和控制,是实施细节的精准描述: 命令式编程与声明式 ...
- The Pragmatic Programmer 读书笔记之中的一个 DRY-Don’t Repeat Youself
The Pragmatic Programmer读书笔记之中的一个 DRY-Don't Repeat Youself 尽管自己买了非常多软件project方面的书,可是由于时间的问题.一直没有静 ...
- poj 1741 楼教主男人八题之中的一个:树分治
http://poj.org/problem? id=1741 Description Give a tree with n vertices,each edge has a length(posit ...
- 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!
乐高Mindstorm EV3智能机器人(下面简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!E ...
- 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- hdu1465不easy系列之中的一个(错排)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/37512659 转载请注明出 ...
- Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列
11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...
- C#算法之判断一个字符串是否是对称字符串
记得曾经一次面试时,面试官给我电脑,让我现场写个算法,判断一个字符串是不是对称字符串.我当时用了几分钟写了一个很简单的代码. 这里说的对称字符串是指字符串的左边和右边字符顺序相反,如"abb ...
随机推荐
- Gmail进程信息转储分析工具pdgmail
Gmail进程信息转储分析工具pdgmail 进程信息转储(Process Memory Dump)是数字取证的重要方式.通过分析对应进程的信息转储,可以获取大量的信息.Kali Linux提供一 ...
- 浅析Oracle PL/SQL 学习--未完待续
这是一篇关于Oracle Pl/SQL数据库编程的课程学习分享... 首先说明几点: 学习这门课程之前,已经学过并且掌握一些基础的SQL语句.数据库结构分析.ER图设计等知识: 这里也只是较为大概地将 ...
- Jackson反序列化提示:Can not deserialize instance of Task out of START_ARRAY token
解决方法: 1.没有绝对的方法,只能不断的测试和排查. 2.检查一下JSON数据和实体的字段结构是不是不一致导致的.比如JSON数据是数组,而实体字段为非数组. 参考: https://stackov ...
- EF for oracle中无法读取配置 显示无法open问题解决方式
1.更新以上设置为 非注销部分 弄了很久很久哈.
- 【Linux】CentOS7上的一些操作小方法
1.在文件夹目录下删除文件 点击文件,按Delete键删除,就可以把文件删除到回收站中. 2.更改命令窗口的样式 打开命令窗口--->右键---->配置文件---->配置文件首选项
- vue axios跨域请求,apache服务器设置
问题所在axios请求会发送两次请求 也就是说,它会先使用options去测试,你这个接口是否能够正常通讯,如果不能就不会发送真正的请求过来,如果测试通讯正常,则开始正常请求. 思路: 跨域--> ...
- mac mysql命令行
https://www.cnblogs.com/lonecloud/p/5841522.html mac下使用mysql控制台命令行 命令行中输入 open .bash_profile 然后将 a ...
- net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案
net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案 今天在用List集合转换成json数组的时候发生了这个错误,这个 ...
- Web项目中用mybatis配置多个数据库
需要在项目中配置多个数据库(比如一个mysql,一个oracle)的时候,可按照如下方式配置 首先是第一个数据库的配置 <bean name="transactionManager&q ...
- Angular 学习笔记——ng-repeat 隔行换色
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...