靈修分享:亞略巴古的演講

亞略巴古的演說是使徒行傳一篇非常著名的講道。基督徒往往用這段經文來說明上帝的屬性,同時也會參考這段經文作為和外邦人互動的一個參考方式。最近因為團契查經查到這一段,重新思想後看到了以前沒有考慮過的面向,在這邊記錄一下。

徒17:16-34保羅在雅典等候他們的時候,看見滿城都是偶像,就心裏着急;於是在會堂裏與猶太人和虔敬的人,並每日在市上所遇見的人,辯論。還有伊壁鳩魯和斯多亞兩門的學士,與他爭論。有的說:「這胡言亂語的要說甚麼?」有的說:「他似乎是傳說外邦鬼神的。」這話是因保羅傳講耶穌與復活的道。他們就把他帶到亞略‧巴古,說:「你所講的這新道,我們也可以知道嗎?因為你有些奇怪的事傳到我們耳中,我們願意知道這些事是甚麼意思。」(雅典人和住在那裏的客人都不顧別的事,只將新聞說說聽聽。)
保羅站在亞略‧巴古當中,說:「眾位雅典人哪,我看你們凡事很敬畏鬼神。我遊行的時候,觀看你們所敬拜的,遇見一座壇,上面寫着『未識之神』。你們所不認識而敬拜的,我現在告訴你們。創造宇宙和其中萬物的神,既是天地的主,就不住人手所造的殿,也不用人手服事,好像缺少甚麼;自己倒將生命、氣息、萬物,賜給萬人。他從一本本:有古卷是血脈造出萬族的人,住在全地上,並且預先定準他們的年限和所住的疆界,要叫他們尋求神,或者可以揣摩而得,其實他離我們各人不遠;我們生活、動作、存留,都在乎他。就如你們作詩的,有人說:『我們也是他所生的。』我們既是神所生的,就不當以為神的神性像人用手藝、心思所雕刻的金、銀、石。世人蒙昧無知的時候,神並不監察,如今卻吩咐各處的人都要悔改。因為他已經定了日子,要藉着他所設立的人按公義審判天下,並且叫他從死裏復活,給萬人作可信的憑據。」
眾人聽見從死裏復活的話,就有譏誚他的;又有人說:「我們再聽你講這個吧!」於是保羅從他們當中出去了。 但有幾個人貼近他,信了主,其中有亞略‧巴古的官丟尼修,並一個婦人,名叫大馬哩,還有別人一同信從。

對基督徒來說,保羅這篇講道講的真好,不但講出了上帝的超越性(像是不住人手所造的殿、也不是金銀石的彫刻),也帶出了耶穌基督復活的大能。但最近我才注意到眾人的反應:「眾人聽見從死裏復活的話,就有譏誚他的;又有人說:「我們再聽你講這個吧!」」不曉得你看到這一段有什麼感想?可能我是玻璃心吧,如果我是保羅,我大概會非常非常的難過,看起來似乎沒有人理會這個福音、這篇講道。這篇被基督…

GNU Multiple Precision Arithmetic Library

在開發程式的過程中,程式設計師不一定每一個原件都會純手工打造,事實上,很多東西會直接使用現有的工具。一來可以節省開發的成本,二來自己實作可能也比不上現有工具的功用跟效能(或許還會產生不少BUG)。所以在這裡也會介紹一些好用的工具或是函式庫。當然,前提這些東西都是自由或是能免費取得的。

名稱:GMP~GNU Multiple Precision Arithmetic Library
網址:http://gmplib.org/
功能:提供大數運算

大數運算是一個很重要的功能,特別是在處理數學問題、密碼學演算法上面。傳統C語言所能提供的數字運算,最多是到 double (以 32-bit 的機器來說,通常是 64-bit),但這對動不動就要 128 bit 的密碼學演算法來說,根本不敷使用。今天介紹的這一套 GMP,就是一套提供大數運算的函式庫。這套函式庫很有意思,他還把計算RSA的速率跟 Openssl
進行比較,結果呢,當然是樂勝囉~

這套函式庫提供了整數、分數、小數的型態,下面「稍微」看一下人家是怎麼設計的。我們只看看整數的部分,並且看一下人家的加法是如何處理的。

typedef struct
{
int _mp_alloc; /* Number of *limbs* allocated and pointed
to by the _mp_d field. */
int _mp_size; /* abs(_mp_size) is the number of limbs the
last field points to. If _mp_size is
negative this is a negative number. */
mp_limb_t *_mp_d; /* Pointer to the limbs. */
} __mpz_struct;

mpz 就是GMP中的整數型態。簡單來說,他是拿一串 limb 串起來來當作大數, limb 就是一般程式中所使用的數學型態。(根據平台不同,可能是 unsigned int or unsigned long),然後他還會記錄 size。

我認為,mp_alloc 跟 mp_size 的不同,在於一個是已經 alloc 出來的空間個數,另一個是計算上結果所需的空間個數(不一定一樣,因為可能多 alloc,或是出現進位造成 alloc 不夠),對了,還順便表示正負號。

至於加減法,程式碼在下面。有註解以後還挺好懂得,所以就不說明了。(有些定義沒放上來,但,看命名也知道那是什麼吧)

void
FUNCTION (ARGUMENTS)
{
mp_srcptr up, vp;
mp_ptr wp;
mp_size_t usize, vsize, wsize;
mp_size_t abs_usize;
mp_size_t abs_vsize;

usize = u->_mp_size;
vsize = VARIATION v->_mp_size;
abs_usize = ABS (usize);
abs_vsize = ABS (vsize);

if (abs_usize < abs_vsize)
{
/* Swap U and V. */
MPZ_SRCPTR_SWAP (u, v);
MP_SIZE_T_SWAP (usize, vsize);
MP_SIZE_T_SWAP (abs_usize, abs_vsize);
}

/* True: ABS_USIZE >= ABS_VSIZE. */

/* If not space for w (and possible carry), increase space. */
wsize = abs_usize + 1;
if (w->_mp_alloc < wsize)
_mpz_realloc (w, wsize);

/* These must be after realloc (u or v may be the same as w). */
up = u->_mp_d;
vp = v->_mp_d;
wp = w->_mp_d;

if ((usize ^ vsize) < 0)
{
/* U and V have different sign. Need to compare them to determine
which operand to subtract from which. */

/* This test is right since ABS_USIZE >= ABS_VSIZE. */
if (abs_usize != abs_vsize)
{
mpn_sub (wp, up, abs_usize, vp, abs_vsize);
wsize = abs_usize;
MPN_NORMALIZE (wp, wsize);
if (usize < 0)
wsize = -wsize;
}
else if (mpn_cmp (up, vp, abs_usize) < 0)
{
mpn_sub_n (wp, vp, up, abs_usize);
wsize = abs_usize;
MPN_NORMALIZE (wp, wsize);
if (usize >= 0)
wsize = -wsize;
}
else
{
mpn_sub_n (wp, up, vp, abs_usize);
wsize = abs_usize;
MPN_NORMALIZE (wp, wsize);
if (usize < 0)
wsize = -wsize;
}
}
else
{
/* U and V have same sign. Add them. */
mp_limb_t cy_limb = mpn_add (wp, up, abs_usize, vp, abs_vsize);
wp[abs_usize] = cy_limb;
wsize = abs_usize + cy_limb;
if (usize < 0)
wsize = -wsize;
}

w->_mp_size = wsize;
}

留言

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

我弟家的新居感恩禮拜分享:善頌善禱

如何利用 Wireshark 來監聽 IEEE 802.11 的管理封包