分享

约瑟夫问题与魔术(三)——终极数学推导

 MatheMagician 2023-07-05 发布于广东
前面文章我们介绍了约瑟夫问题,并给出了基本的数学模型,和其内部数学性质的分析,相关内容请戳:

约瑟夫问题与魔术(一)——数学模型求解
约瑟夫问题与魔术(二)——数学结构解析
 
今天我们接着上期的问题分析把整个过程的数学细节都描绘下来,注意今天的描绘的粒度是每一次对整个序列的遍历,而第一篇描述的时候是每一次行动。但是,这次更加粗粒度的角度没有抹去任何细节,反而抓住了更加深刻的规律,利用了剔除过程中每个周期内的周期性,或者说是同余性质,我们一点点来看。
 
我们依然用有限状态自动机模型来建模,考虑k = 2的情况。我们考察的初始状态设定为S0 = (1b1b2......bm, 0),两个值分别是余下人数和初始相位,0为原始约瑟夫过程,1为跳过其第一步的过程。每次输出的是前一个状态的相位值,对应当次能留下的末位值条件,根据上一篇的分析,其状态变化过程为:
 
O1 = S0_2 = 0;
 
S1 = (1b1b2......b(m - 1), 0) if bm = 0;
S1 = (1b1b2......b(m - 1) + 1, 1) if bm = 1;
O2 = S1_2 = bm;
 
S2 = (1b1b2......b(m - 2), 0) if b(m - 1) = 0;
S2 = (1b1b2......b(m - 2), 1) if b(m - 1) = 1, bm = 0;
S2 = (1b1b2......b(m - 2) + 1, 1) if b(m - 1) = 1, bm = 1;
O3 = S2_2 = b(m - 1)
 
......
 
Si = (1b1b2......b(m - i), 0) if b(m - (i - 1)) = 0;
Si = (1b1b2......b(m - i), 1) if b(m - (i - 1)) = 1;
Si = (1b1b2......b(m - i) + 1, 1) if b((m - (i - 1)):m) = 1;
Oi = S(i - 1)_2 = b(m - (i - 1));
 
S(m - 1) = (1b1, 0) if b2 = 0;
S(m - 1) = (1b1, 1) if b2 = 1;
S(m - 1) = (1b1 + 1, 1) if b(2:m) = 1;
O(m - 1) = S(m - 2)_2 = b2;
 
Sm = (1, 0), if b1 = 0;
Sm = (1, 1), if b1 = 1;
Sm = (10, 1), if b(1:m) = 1;
Om = S(m - 1)_2 = b1;
 
综上,每一次的输出序列为0,bm, b(m - 1),……,b1,那么倒转以后的b1b2,......,bm0,即为所求。由此还可以知道,如果b1 = 1,倒数第2个去掉的是b2b3,......,bm0;若b1 = 0,则对应的1b2b3,......,bm0一定不小于n,下一个去掉的索引超出了范围,取不到;而再接下去的则是以b3b4,......,bm0结尾,范围在内的按大小顺序倒序取所有(n - 1)范围内的值(因为在一个周期内先拿走小的再到大的,大的会在这个遍历轮次留到后面的位置被去掉),以此类推。
 
我的天,我原本以为美妙的结论背后一定也有简洁的推导,看来我想多了。不过,过程艰难,结论优雅也是数学常有的特点了。
 
在实际使用中,和约瑟夫过程相关的发牌其实有很多变种,常见的就是第一张到底是留还是发的区别,等效为预先处理掉相位错位部分再开始就可以了。另外,也可以每次把牌依次发成两叠,每次取特殊一叠则代表一个遍历周期内选取的相位,而下一阶段的发牌则等价于从这些发出去的牌中重新开始,并且存在一个倒序和相位的重新归零。同样,这种结局很好模拟,但是写出通项公式很困难,可能我们发明的数学运算符号,还不够多。最后,完美洗牌的逆过程其实和一次k = 2的一个遍历周期也有相通之处,只不过被剔除的那些牌增加了一个倒序操作,可以见得在同样的数学结构背后,表面的世界可以多么丰富多彩。
 
以上是k = 2的,也是最常用的情况。但当我用类似的思路想拓展到k > = 3的时候,希望也能有类似的公式结论,但发现复杂程度要远远大些。
 
拿k = 3为例,此时相位值取0,1,2,表示从第几步开始执行过程。这还好说,其值和n(mod 3)直接密切相关。但是,在第二轮的时候,把这些数重新化为连续自然数就不那么容易了,它不像k = 2那样非黑即白,而是一轮过后,会形模3周期为2的序列,再过一轮,就更加混乱,需要更长的周期才能描述清楚了。关键是周期的增长我暂时也观察没找到很好的规律,用上三进制表达,也远非移位那么简单,除非,每次杀2人留1人,才能对上前面的推导。
 
所以,原本可用的以遍历一次为周期的划分方式已经不能很好地归约这个过程。但仍然有这么好的周期规律,怎样使用能够让我们的运算化简呢?我们不妨换个思路,以一次遍历到最后一个被剔除的元素为止为一个过程,然后直接以相同的相位开启下一个周期。此时,每次遍历的元素不包括序列末尾取余数多出来的几个,相当于要在序列上做一次首尾片段的平移才能等效接下来的操作,但一个令人惊喜的好处是,再也不用纠结相位的变化带来的混乱变化了。这样虽然还是写不出通项公式,但是能够写出比较优雅的递推关系式了。
 
从递归角度讲,第一次剔除人的编号必然是(k - 1),那么新的序列为k, k + 1, ......, (n - 1), 0, 1, ......, (k - 2),此序列的长度为(n - 1),这么多元素的解为f(n - 1, k),但是这个解是以0:(n - 1)为基准的。因此我们只需要对这二者的索引对应关系表达即可(不是个完整的集合到自身的映射,故非置换):

k, k + 1, ......, (n - 1), 0, 1, ......, (k - 2)
0, 1, 2......, n - 1 - k, n - k, ......, n - 2
 
显然,+ k (mod n),即为所求,可看作原序列向左循环移位了k个单位(左移,而且溢出的位递补到首位上),对原本对应不上的多的一个元素(k - 1),恰好删除掉了。因此完成了这两个序列的匹配,写成式子就是:
 
f(n, k) = (f(n - 1, k) + k) (mod n)
 
当k < n的时候,也即,一个遍历过程可能删除超过1个元素时,我们可以按规律合并处理,在这样一个次周期内(次的意思是,大多数时候并未真的走完一个周期),删除结果为:
 
[n / k]k,......, (n - 1)
0, 1, ......, k - 2,
k, k + 1, ......, 2k - 2,
......
([n / k] - 1)k, [n / k]k - 2.
 
当k | n时,第一行不存在。
 
因此我们面临的新问题的n’= n - [n / k],我们只要搞定两个相同长序列的转化问题,问题就得解了。
 
首先,如果想把新序列的0和同长度n'的自然序列对齐,需要向左循环移位的数量是n - 1 - [n / k]k + 1 = n - [n / k]k = n % k,相当于每个数模n’减这么多,就可以得到啥也不删除,仅修改相位的结果。而删除部分怎么算呢?
 
实际的规律其实是,自然序列每增加(k - 1)新序列增加k,这时整体趋势,也就是说,乘以k / (k - 1)可以使得每个周期的第一个元素恰好相等,而后面的元素每次都会多增加1 / (k - 1),一直增加(k - 2)次到(k - 2) / (k - 1),直到下一个元素因为删除跳过一个索引,一次性追回来这1个单位,又回到同一起跑线。注意这个数到此之前都不到1。所以这个函数恰好可以用高斯函数表达:
 
f(n, k) = [k / (k - 1)((f(n’, k) - n % k)mod n’)]
 
于是,整个约瑟夫问题求解的,复杂度降低为O(klogn)的递归表达式如下:
 
f(n, k) = 
 
[k / (k - 1)((f(n’, k) - n % k)mod n’)], k < n, n >= 2,
(f(n - 1, k) + k) (mod n), 2 <= n <= k,
0, n = 1
 
k >= 2
 
于是,在周期性的数学性质帮助下,我们找到了更深层次的约瑟夫问题的求解策略,大大降低了问题的时间复杂度。另外,对于k = 2情况,似乎是某种巧合达成了优雅的结论,并且很容易扩展出求倒数第n个剔除的元素是多少。最后,我拿着这个公式研究了一下k = 3和更大值时候的情况,发现了一些规律,但是确实也不像2那样容易地写出通项公式,找到优雅地表示形式了。你如果找到了,希望你能分享给我。

以上就是约瑟夫问题数学部分的全部内容,从下一篇起,我们进入魔术部分,看看这一神奇的结构能够怎样配合上我们的魔术表演,去继续缔造属于我们的奇迹。

视频1 五重巧合之皇家同花顺

视频2 完全控制

视频3 完全控制终极版

我们是谁:

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多