歡迎辭

歡迎來到“篤志以礪,決起而飛”!
如果您是第一次來到本站,建議訪問本站導讀以便更快地了解本站。
如果您喜歡本站,歡迎訂閱

 

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...最舊 »