上一篇咱們講到了,算J(100)=73,咱們接着下面繼續搞點事情出來.數組
若從n開始,且重複做J函數m+1次,則咱們做m+1次位的循環移動;因爲n是一個(m+1)位的數,因此可指望最後再得出n。但事情並不是真的是這樣。例如,若n=13,則咱們獲得J((1101)2)=(1011)2,可是J((1011)2)=(111)2,且過程當中止,當0變成第一位時,它消失了,事實上,由定義J(n)老是<=n,由於J(n)是倖存者的編號,所以若J(n)<n,連續重複,咱們不可能倒轉到n函數
重複應用J產生一系列降低值,最終達到一個指定點,在那裏J(n)=n.循環移的性質使咱們容易看出指定點是什麼:重複函數足夠屢次將產生一個全爲1的型式,它的值是2^v(n)-1,其中v(n)是n的二進制表示中1的位數。所以,因爲v(13)=3,咱們獲得spa
2個或多於2個J遞歸
2個或多於2個J
數學
J(J(...J(13)...))=2^3-1=7變量
相似循環
8個或多於8個二進制
J(J(...J((101101101101011)2)...))=2^10-1=1023方法
難以理解,可是爲真.大愛這句話!im
好,讓咱們再看看添加什麼條件能使最初的猜想成立:
當n爲偶數時,知足J(n)=n/2
假設n = 2^m + l,那麼咱們由J(n) = n / 2,能夠獲得2l + 1 = (2^m + l) / 2,所以有:l = (2^m - 2) / 3。若是l = (2^m - 2) / 3是整數,那麼n = 2^m + l就是解,由於l小於2^m。
能夠驗證,當m是奇數時,2^m - 2是3的倍數,而當m爲偶數時則不是。所以方程J(n)=n/2有無限多個解:
n = 2^m + (2^m - 2) / 3 = (2^m+2 – 2) / 3 (m爲奇數)
較小的解爲
回顧一下,咱們在二進制的幫助下解決了J函數,爲何級差非要爲2,而不是三、4呢?OK,咱們來推廣一下,看看怎麼消除「2」的特殊性。(從特殊到廣泛)
直接從遞歸關係式開始。換成不一樣的常數係數,會怎樣呢?
原來是
J(1) = 1
J(2n) = 2J(n) - 1
J(2n + 1) = 2J(n) + 1
咱們換成
f(1) = α
f(2n) = 2f(n) + β
f(2n + 1) = 2f(n) + γ
從f(1) = α開始,並根據上面的方程逐步地推導,能夠構造出較小n值上的函數值表:
咱們能夠看到什麼結果?在n = 2m + l的情形下:一、α的係數是不大於n的最大的2的冪2m;
二、β和γ的係數都不大於2m ;
三、β的係數每次由2m -1遞減直到0;
四、γ的係數每次遞增直到2m - 1。
所以,f(n)能夠表示成
f(n) = A(n) α + B(n) β + C(n) γ
這裏有
A(n) = 2m
B(n) = 2m – l – 1
C(n) = l
經過概括法能夠證實上面的式子,可是計算過程比較繁雜。咱們嘗試選擇特定值,並將這些值組合在一塊兒,看看能不能找到簡單的證實方法。
考慮α = 1,β = γ = 0的特殊狀況,此時f(n)的值與A(n)相等,遞歸方程變成:
A(1) = 1
A(2n) = 2A(n)
A(2n + 1) = 2A(n) = A(2n)
對上面的遞歸方程,咱們很容易地獲得:
A(2^m + l) = 2^m
Josephus問題的推廣
反過來考慮。若是知道函數f(n)的封閉形式解,對應的常數組合(α, β, γ)是什麼?
例如對於常數函數f (n) = 1有:
1 = α,1 = 2l + β,1 = 2l + γ 。
所以(α, β, γ) = (1, –1, –1)。此時f (n) = A(n)- B(n)- C(n) = 1。
再看函數f (n) = n:
1 = α,2n = 2n + β,2n + 1 = 2n + γ
所以(α, β, γ) = (1, 0, 1) 。特別是,咱們不須要用概括法證實便可知道f(n)的惟一解是f(n) = n。
回到咱們在前面的問題:證實
A(n) = 2^m
B(n) = 2^m – l – 1
C(n) = l
如今咱們已經知道函數A (n),B (n)和C(n)知足:
一、從(α, β, γ) = (1, 0, 0) 獲得:A(n) = 2^m 【f (n) = 2^m】
二、從(α, β, γ) = (1, -1, -1)獲得:A(n) – B(n) – C(n) = 1【f(n) = 1】
三、從(α, β, γ) = (1, 0, 1)獲得:A(n) + C(n) = n【f(n) = n】
解上述方程,能夠獲得
C(n) = n - A(n) = l,而B(n) = A(n) - 1 - C(n)= 2^m - l - 1
這與咱們的猜測是一致的。
咱們知道,原始的J函數有一個妙解,可用二進制表示爲:
J(bmbm-1bm-2…b1b0)2 = (bm-1bm-2…b0bm)2
那麼,廣義Josephus遞歸方程是否也有這種奇妙的解呢?
固然是有的。若是咱們令β0 = β而β1 =γ,那麼能夠將遞歸方程寫成:
f(1) = α
f(2n+ j) = 2f(n) + βj
按二進制方式展開,此遞歸方程變成:
f((bmbm-1…b1b0)2) = 2f((bmbm-1…b1)2) + βb0
= 4f((bmbm-1…b2)2) + 2βb1 + βb0
……
= 2m f((bm)2) + 2m-1βbm-1+ … +2βb1 + βb0
= 2m α + 2m-1βbm-1+ … +2βb1 + βb0
接下來,放鬆二進制表示的限制,在每一個位上容許使用任意數字,那麼上面的結果能夠表示成:
f((bmbm-1…b1b0)2) = (αβbm-1βbm-2 …… βb1βb0)2
看起來結果很完美。可是若是換一種方式來重寫小數值n上的f(n)函數表的話,可能更容易發現這種規律:
f((bmbm-1…b1b0)2) = (αβbm-1βbm-2 …… βb1βb0)2
例如,當n = 100 = (1100100)2,在咱們原來的Josephus參數α= 1,β = -1和γ = 1之下,能夠獲得
由於在n的表示中,每組二進制數字位 (10……00)2被轉換爲
(1 -1 …… -1 -1)2 = (00……01)2
這樣就顯示出了循環移位性質。
面咱們進一步地進行通常化。來看遞歸方程f(j) = αjf(dn + j) = cf(n) + βj (j = 1……d)這個遞歸方程的形式與前面基本相同,可是是以d進制的數開始,並且產生的值採用c進制來表示。也就是說,它的自變量和函數值採用不一樣的基數來表示:f((bmbm-1…b1b0)d) = (αbmβbm-1βbm-2 …… βb1βb0)c例如,對於下面的遞歸方程,咱們計算f(19)f(1) = 34f(2) = 5f(3n) = 10f(n) + 76f(3n + 1) = 10f(n) - 2f(3n + 2) = 10f(n) + 8也就是說d = 3,c = 10。由於19 = (201)3,爲了使用變化基數的方法,咱們逐位進行從基數3到基數10的轉換:第1位的2變成5,而0和1分別變成了76和 –2,所以結果爲f(19) = f((201)3) = (5.7.6.-2)10 = 1258書上的最後講的方法有點精髓,我看了好幾遍的,才慢慢理解,估計是本身數學有點差勁了,哈哈,繼續努力看下去,長春的天氣是真的讓你惱火。。。