上一篇咱们讲到了,算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书上的最后讲的方法有点精髓,我看了好几遍的,才慢慢理解,估计是本身数学有点差劲了,哈哈,继续努力看下去,长春的天气是真的让你恼火。。。