欢迎辞

欢迎来到“笃志以砺,决起而飞”!
如果您是第一次来到本站,建议访问本站导读以便更快地了解本站。
如果您喜欢本站,欢迎订阅

 

2012 年五月
« 四  
 123456
78910111213
14151617181920
21222324252627
28293031 

使用连分数获得无理数的最佳有理数逼近

连分数是一种很神奇的分数。关于连分数的概念、定理和一些简单的应用,请参见维基百科

使用连分数,我们可以优雅的表示出所有的实数。对于有理数,它是有限连分数,对于无理数,它是无限逼近的。

现在我们来考虑一下如何将一个无理数表示为一个尽可能接近的分数。我们以二次根式为例。

首先,连分数的定义具有很强的递归性,我们可以很轻松的给出下面的方法,将一个实数转换为连分数:

SETP1 取出其整数部分。

SETP2 将其小数部分取倒数,然后重复第一步。

在这个过程中,每次取出整数,就依次排列,分别作为 a0,a1,a2,…的值。

如果你能理解上面的方法,那么我们很快就可以找到取无理数的最佳有理数逼近的方法:使用无限连分数。无理数的无限连分数表示是非常有用的,因为它的初始段提供了对这个数的优异的有理数逼近。在维基百科该词条的“无限连分数”章节中,清晰了告诉了我们在计算这样的有理数时的递推公式。

下面这个程序实现了这样的算法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <cmath>
#include <cstring>
 
using namespace std;
 
#define min(a,b) a>b?b:a
 
long long d[10000], fz[10000], fm[10000];
long long i = 0, p;
long long l1 = 0, l2 = 0;
 
void digui(double num)
{
	int zs = (int)floor(num);
	d[i++] = zs;
	if (zs == num)
		return;
	if (i > 2000)
		return;
	digui(1 / (num - zs));
}
 
long long getfenzi(int n)
{
	if (fz[n] != 0)
		return fz[n];
	long long i = -1;
	if (n == 0)
		i = d[0];
	else if (n == 1)
		i = d[0] * d[1] + 1;
	else i =  getfenzi(n - 1) * d[n] + getfenzi(n - 2);
	fz[n] = i;
	return i;
 
	if (i > p)
	{
		l1 = n - 1;
		i = 0;
		fz[n] = 0;
	}
	else
		fz[n] = i;
	return i;
}
 
long long getfenmu(int n)
{
	if (fm[n] != 0)
		return fm[n];
	long long i = -1;
	if (n == 0)
		i = 1;
	else if (n == 1)
		i = d[1];
	else i = getfenmu(n - 1) * d[n] + getfenmu(n - 2);
	fm[n] = i;
	return i;
 
	if (i > p)
	{
		l2 = n - 1;
		i = 0;
		fm[n] = 0;
	}
	else
		fm[n] = i;
	return i;
}
 
int main()
{
	int n;
	while (cin >> n)
	{
		if (n == 0)
			return 0;
		i = 0;
 
		memset(fz, 0, sizeof(fz));
		memset(fm, 0, sizeof(fm));
 
		digui(sqrt((double)n));
 
		getfenzi(25); getfenmu(25);
 
		int f;
		for (f = 0; f < 25; ++f)
		{
			cout << fz[f] << " " << fm[f] << endl;
		}
	}
	return 0;
}

这里的程序只计算了25项,其实可以继续精确下去,(但是前提是sqrt函数的结果要保证准确)。测试结果如下:

输入2(表示根号2),程序可以输出分式 759029082/536714611  :  1.41421356

这个结果和根号2的值已经相当的接近。

春去春回来;年年岁岁人不同

[本文为草稿箱文章,写于1年前]

春去春回来,花谢花会开。

年年岁岁花相似,岁岁年年人不同。

这两句话放在一起,能给人很多感慨。

春天过去了还会回来,花儿凋谢了还会再开。一年一岁的花草很相似,而每年的人却已经不同。这使我想到了苏东坡所说的话。“逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎!”这是多么难能可贵的心境!照此想来,五千年来,那山,那月,那花,岁岁相似,若“自其不变者而观之”,那真是“物与我皆无尽也”。如果接纳佛学的轮回观点,连人都处于这样的循环中,真是“逝者如斯,而未尝往也”,因为逝者还有“来生”。这种阴阳调和,循环往复,万世不竭的思想,应该是中华文化的核心内容之一了。在我看来,佛学文化传入中华大地之后,与中华文化互相作用,早已成为了中华文化的一部分了。直到现在,日常用语中的许多字词都来源于它。

诗经:邶、鄘、卫与我的家乡

《诗经》的诗歌分为三类:风、雅、颂。风是各地的民间歌谣。其中,有三个小类引起了我的注意。邶风、鄘风、卫风。这三个地方在今天的哪里?

邶:约相当于今河南省淇县以北,汤阴县东南一带地方。

鄘:今河南省卫辉市。

卫:定都朝歌,今河南省淇县。

卫辉市是新乡市的一个辖市。

看来,我们家乡附近和诗经颇有渊源啊。

实数范围内的求模(求余)运算:负数求余究竟怎么求

最近在一道 Java 习题中,看到这样的一道题:

What is the output when this statement executed:  System.out.printf(-7 % 3);

正整数的取余运算大家都很熟悉,但是对于负数、实数的取余运算,确实给人很新鲜的感觉。于是我对此进行了一些探索。我发现,这里面还是颇有一点可以探索的东西的。

自然数的取模运算的定义是这样的(定义1):

如果ad是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 aqdr 且0 ≤ rd。其中,q 被称为商,r 被称为余数。

那么对于负数,是否可以沿用这样的定义呢?我们发现,假如我们按照正数求余的规则求 (-7) mod 3 的结果,就可以表示 -7 为 (-3)* 3 +2。其中,2是余数,-3是商。

那么,各种编程语言和计算器是否是按照这样理解的呢?下面是几种软件中对此的理解。
阅读全文 »

如何开始学习繁体字?

汉语是中华民族的宝贵财富,是中华民族智慧的结晶,也是文化的重要载体。对于喜欢文化的人来说,学习繁体字有利于阅读古代文献,欣赏书法之美,陶冶情操,对于中国文化的传承、与香港、台湾、日本、韩国等汉文化圈的文化交流都很有好处。

但是,很多人在最开始学习繁体字的时候,都有一些困惑或误解。这篇文章我试图总结我所了解到的常见的问题和误解,以及其解决方法。

Q: 怎样开始繁体字的入门?

如何入门完全看你的个人喜好。其实生活中处处皆学问,但是对于初学者来说,还是要尽可能避免受到误导。对此,字典和《简化字总表》都可以帮助你。在此推荐 教育部重編國語詞典修訂本(臺灣),适合查找繁体字的含义,当然,台湾和香港的繁体字规范并不完全相同,但对于初学者也不必深究。将你的输入法调整成繁体模式,多看看繁体的书和网页,多看字典,甚至平时用繁体写日记,都是很好的方式。当然在这过程中有疑问要抓紧查询。
阅读全文 »

第 9 页,共 66 页« 最新...3456789101112131415...304050...最旧 »