犹太历史书写之起源与约瑟夫斯问题
约瑟夫是一位犹太历史学家,大约生活在公元37—100年,他的希伯来名字是约瑟·本·马塔提亚。约瑟夫在耶路撒冷受到过非常好的教育,曾经带领犹太人武装起义,反抗罗马统治。约瑟夫和他的战友杀死了许多罗马人,但最后终于起义失败。在罗马人占领乔塔帕特后,约瑟夫和40名犹太战士(其中一名是他的朋友)一起躲进一个山洞。犹太战士们宁死不降,要求全体自杀。
约瑟夫不想死,他对战士们说,真正的战士必须死在强者之手,犹太教不允许自杀。他说有一个比自杀更好的赴死不降的办法。那就是,所有41名犹太战士围成一个圆圈,1、2、3报数,第一个报到3的人由第二个报到3的人杀死,以此类推。最后剩下的那个人因手上有犹太同志的血,而可以自杀。约瑟夫把自己安排在第16个位置上,把他的朋友安排在第31个位置上,结果一轮轮“命运安排”的屠杀下来,只剩下约瑟夫和他的朋友俩人。于是两个人一起走出山洞投降了罗马人。
约瑟夫投降并没有破坏先前约定的规则。他无须破坏约定的规则,因为他自己就是规则的制定者。在制定规则时,他已经为自己不遵守规则留下了后路。他甚至可以用高尚的道德理由为自己投降罗马人辩护。他投降,是因为他不愿亲手杀死他的犹太同志(他的朋友)。他可以说,投降是忍辱负重。他为罗马人除掉了那些负隅顽抗的犹太人,踩着战友的尸体,当然还有罗马人的尸体,存活了下来。
約瑟夫成長於由羅馬帝國統管的耶路撒冷,出身於祭司家庭,曾受良好的教育。十九歲時成為法利賽黨員,是排斥基督教的猶太人。廿七歲時獲任為特使往羅馬要求釋放被囚的猶太人,因而受到羅馬政府的賞識。返國後,曾參加叛軍於反抗羅馬政府,並於67年參與第一次猶太人與羅馬之戰,更被推舉為指揮官。後來被捕送往羅馬為羅馬政府工作,於公元69年獲釋。公元70年羅馬將軍提多率軍進攻耶路撒冷,約瑟夫被被委任為傳譯官。耶路撒冷被毀滅後,約瑟夫更成為羅馬公民,定居於羅馬,開始從事猶太歷史的編寫工作。
約瑟夫雖然是猶太人,後來卻是羅馬的辯護者,曾公開指責導致叛亂的猶太人。約瑟夫的著作中曾題及與《聖經》所記載吻合的歷史事件。約瑟夫在《猶太古史》中,記載了關於施洗約翰被希律安提帕收監和處死的事件。除此之外,約瑟夫也曾提及耶穌和耶穌的兄弟雅各,這些都證實了《新約聖經》四福音書的記載。曾有說法指《猶太古史》中關於耶穌的紀錄是後世的基督徒所加的,但隨着考古學家在已被掩埋的土下發掘出耶路撒冷的遺跡,與《猶太古史》及《聖經》的描述相吻合,以及把這段被指為「有問題的」內容利用計算語言學的算法與全書的其他內容的比較,從而否定了這種說法[1]。
[编辑] 著作
《猶太古史》(The Antiquities of the Jews):記錄了由聖經創世記至公元66年的猶太人歷史,以舊約聖經為藍圖以及古人的傳說,編寫而成的猶太鉅著。由於當時的猶太人散居各地,此書成為各地土生猶太人重要學習典藉,亦為當代神學學者及歷史學者所採用。
《猶太戰記》(War of the Jews)
《約瑟夫自傳》(The Life of Flavius Josephus)
Flavius Josephus against Apion
约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题。
有n个囚犯站成一个圆圈,准备处决。首先从一个人开始,越过k − 2个人,并杀掉第k个人。接着,再越过k − 1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。
问题是,给定了n和k,一开始要站在什么地方才能避免被处决?
我们将明确解出k = 2时的问题。对于的情况,我们在下面给出一个一般的解法。
设f(n)为一开始有n个人时,生还者的位置。走了一圈以后,所有偶数号码的人被杀。再走第二圈,则新的第二、第四、……个人被杀,等等;就像没有第一圈一样。如果一开始有偶数个人,则第二圈时位置为x的人一开始在第2x − 1个位置。因此位置为f(2n)的人开始时的位置为2f(n) − 1。这便给出了以下的递推公式:
如果一开始有奇数个人,则走了一圈以后,最终是号码为1的人被杀。于是同样地,再走第二圈时,新的第二、第四、……个人被杀,等等。在这种情况下,位置为x的人原先位置为2x + 1。这便给出了以下的递推公式:
如果我们把n和f(n)的值列成表,我们可以看出一个规律:
n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
f(n) 1 1 3 1 3 5 7 1 3 5 7 9 11 13 15 1
从中可以看出,f(n)是一个递增的奇数数列,每当n是2的幂时,便重新从f(n) = 1开始。因此,如果我们选择m和l,使得n = 2m + l且,那么。显然,表格中的值满足这个方程。我们用数学归纳法给出一个证明。
定理:如果n = 2m + l且,则f(n) = 2l + 1。
证明:对n应用强归纳法。n = 1的情况显然成立。我们分别考虑n是偶数和n是奇数的情况。
如果n是偶数,则我们选择l1和m1,使得,且。注意l1 = l / 2。我们有f(n) = 2f(n / 2) − 1 = 2((2l1) + 1) − 1 = 2l + 1,其中第二个等式从归纳假设推出。
如果n是奇数,则我们选择l1和m1,使得,且。注意l1 = (l − 1) / 2。我们有f(n) = 2f((n − 1) / 2) + 1 = 2((2l1) + 1) + 1 = 2l + 1,其中第二个等式从归纳假设推出。证毕。
答案的最漂亮的形式,与n的二进制表示有关:把n的第一位移动到最后,便得到f(n)。如果n的二进制表示为,则。这可以通过把n表示为2m + l来证明。
在一般情况下,这个问题的最简单的解决方法是使用动态规划。利用这种方法,我们可以得到以下的递推公式:
f(n,k) = (f(n − 1,k) + k)mod n,f(1,k) = 0
如果考虑生还者的号码从n - 1到n是怎样变化的,则这个公式是明显的。这种方法的运行时间是O(n),但对于较小的k和较大的n,有另外一种方法,这种方法也用到了动态规划,但运行时间为O(klogn)。它是基于把杀掉第k、2k、……、2个人视为一个步骤,然后把号码改变。
条留言