1. 程式人生 > 實用技巧 >約瑟夫問題與魔術(五)——魔術《自我匹配的奇蹟》中的數學原理

約瑟夫問題與魔術(五)——魔術《自我匹配的奇蹟》中的數學原理

特別通知:2020馬丁加德納聚會已於本週開始在線上舉行,MatheMagician也將在10.18週日晚8點帶來題為《數學魔術的魅力》講座,詳情請點選:

2020中國紀念馬丁·加德納聚會線上活動正式來襲!MatheMagician將首次亮相!

歡迎參加!


從上一篇開始,我們進入了約瑟夫問題魔術部分的分享,算是開啟了從數學到魔術的篇章,相關文章請戳:

約瑟夫問題與魔術(四)——魔術《10張牌的巧合》

約瑟夫問題與魔術(三)——終極數學推導

約瑟夫問題與魔術(二)——數學結構解析

約瑟夫問題與魔術(一)——數學模型求解

上一個魔術算是應用約瑟夫原理入門級別的作品,只是用上罷了。前面說了,約瑟夫過程在撲克牌疊上只是一個複雜但又確定的操作過程,應用時候一方面要防止枯燥無聊,另一方面最好再結合一切其他的魔術或數學方法一起使用,才能錦上添花,畫龍點睛,發揮這個原理的最大作用。

下面這個魔術,是用約瑟夫原理魔術中,經典中的經典,沒有之一,經過一些改編,取名為《自我匹配的奇蹟》。

自我匹配的奇蹟

視訊1 自我匹配的奇蹟

這個魔術為觀眾所熟悉的原因有點特別。作為一個幾近完美的自動化魔術,在2016年天貓雙十一晚會上,馬雲當著全世界觀眾的面表演了這個魔術,不得不佩服馬雲同學的感知力,學習力,和對包括魔術在內的世界的好奇。

我第一次看到的時候,也是驚詫於這這個自動化流程的精妙。在繁複的操作和隨機體驗的賦予中找到了完美的平衡。後來在Woody Arogon的教學Woodyland中找到了原版,以及其中的一些變種。到我這裡,我依據其基本原理,又做了一些少許改良,在探索基本原理和作魔術改良過程中,一度還遇到了不少困難,尤其數學部分,直到使用了合適的數學工具才解決。比如,我雖然知道取餘數,取模這等操作,但並沒有把它當作其實和正常四則運算同等地位的運算來理解,而是以彆扭的方式來在錯誤的基礎上打補丁,特例能解決但是並沒有解決根本問題,可見研究問題的視角的選擇有多麼重要。

我把整個流程分成了8個步驟,這一篇我們從數學角度來解析裡面的原理,下一篇我們從魔術角度繼續剖析。

分步數學原理解析


Step1:將一疊4張的牌從中間撕開後疊在一起。

設原始四張卡片洗完以後的排列是C1,2,3,4,那麼撕完以後,Ci,假設變成Ai和Bi,Ci = Ai union Bi。

那麼疊在一起的排列是A1,2,3,4,B1,2,3,4,雖然可以任意選擇一疊在頂部,不妨設頂疊對應的字母是A,另一個叫B。顯然這是個關於元素索引值的有限長週期序列,有f(s[x]) = f(s[(x + 4)(mod 8)]),f函式指的是卡片對應的編號,變化規律是個關於平移一個單位這個操作的C4群(週期長度為4)。注意是索引這個性質是有周期性的,他們本身並不是完全相同的一張卡,而是來源於同一張卡的兩半,共用了同一個編號。因此,相同的性質是編號,或者叫都屬於撕之前的那個兩半能夠拼起來的那個集合。而最後的魔術效果,本來是編號相同是C4群的性質,又對於平移4個位置這種C4群上等價於么元的操作而言,是個C2群(整個序列共兩個週期),其元素是同一個集合,有共同編號屬性的特定元素,在這裡也就是兩個半邊的特定排列,迴圈群內的排列顯然怎麼排都是原來那個集合,故可以拼合起來,介面方向,則因為順序未知而由觀眾自己調整,卻一點也不奇怪,哪怕再來些塊也無妨。

Step2:切牌1,2張,以及任意張,任意次。

在《序列週期性與魔術(六)——魔術欣賞與解析續集》等系列中,我們曾介紹過撲克牌疊在切牌操作下的週期性。一方面,對指定的切牌張數牌疊不變,而其他的張數所形成的新牌疊,也具有同樣的週期性質。這一點,通過模加法能很容易地證明,本身也是週期性的性質。但是切牌以後,原本每個週期內具有的,他們都是A半邊或B半邊的性質就消失了,而這本來也是週期在特定相位和週期編號條件下的附加屬性,並不在週期性的考慮之中。而每個週期內的序列值也沒什麼特殊的,其實就是1234組成的環,以各個點為起點的各條排列罷了。

Step3:從頂部拿起3張插入整疊牌中間。

3是重要的數字,插入中間也不是完全沒有限制,限制就是,插入以後,原來的第一張還是第一張,最後一張也不變。這就是隱含在這個操作下的不變數,“中間”二字為我們暗中保證了這個性質,為我們所用。

那來看看看這裡沒有變的具體是什麼吧?拿走3張以後的第一張其實是第4張,不變,最後一張其實是第8張不變。觀眾朋友們,第8和4張之間的差距4是什麼呀,正好就是週期的大小啊!換句話說,這兩個距離為4的牌恰好是滿足跨過週期以後應該索引相等的那兩張,也是遍歷了以移動4個索引為操作的僅有的兩個元素,即來自同一張原牌的兩個碎片,即最後能做到匹配效果的那兩半。

現在他們被確定地放在了第1和8張。

注:

Step1,2,3在Woody Arogan的教學Woodyland中有一個變體,雖然表演上並不如這個方式好,但也不失為一個很好的數學原理應用。那就是,在第一步撕開以後,把其中一疊翻轉以後,兩疊再合在一起。這樣的結局是,這成了一個每個半張的索引屬性對稱的牌疊,對本身有對稱性的操作,有不變性。但是,這種對稱牌疊顯然是不能夠隨便切牌了,那是週期性才有的性質。

即,原牌疊有f(2n - a)= f(a)對任意範圍內的索引a成立,那麼這個置換g如果滿足g(2n - a) = 2n - g(a)對成立,即置換前處在對稱未知兩個有相同性質的元素置換以後仍然處在對稱未知,保持對稱性,那麼該置換我們說也是對稱的,並會保持原序列本身存在的對稱性。

比如這裡我們取n = 4,是個偶數長度,對稱中心不在牌索引位的序列。顯然,久違的Reverse(數牌翻轉)操作是對稱的,其實它在週期序列上操作也不破壞週期性,只不過會得到全新的子週期排列。不過Reverse操作太直白了,有沒有更好的?

答案是依次發兩疊合起來的操作,也可以是它的逆操作,完美洗牌!!!

天哪,依次發兩疊和完美洗牌所構成的置換居然有這等性質,簡直驚呆了我的雙眼,數學和魔術裡,究竟還藏著多少寶藏!!!

這一切的詳細說明,都可以用擴充套件的序列操作表示式來表達。這裡先不展開,後面有專門章節來講解。

所以,在這一變體的Step2中,可以隨意採用發兩疊合起來和完美洗牌來弄亂牌,當然如果是觀眾自己做,就讓他發兩疊合起來若干次到滿意為止就好了。雖然這個方案並不如原方案直接,但也是十分地美妙!你看,所謂的對稱和週期,無非就是同樣物件的重複:對稱一般是兩個部分,而當迴圈恰好也是兩個週期的時候,通過翻轉操作,週期迴圈直接變成對稱!甚至,當迴圈的週期內本身就是對稱的,翻轉不改變自己的話,那就可以同時擁有對稱和週期性了!

還有,這裡通過鏡面來做還有一個附加的好處,那就是現在牌疊裡會有正有反,交錯出現,使得混亂度增加,觀眾更加會認為這是一些亂七八糟隨機的結果。

這樣完成以後,由於是鏡面的對應,因此,此時不需要再做插入3張的操作,天然地現在的頂牌第1張和底牌第8張就是對應的,也是我們最後效果的由來了。

Step4:把第1張牌自己藏起來,先不要看,然後剩下的牌和旁邊的同學進行交換。

這一步不需要建模,是純魔術包裝,最後反正匹配的也是自己藏起來的牌和對方的牌疊剩下的牌,把你哥口袋理解成他的口袋就行了,其實就是自己匹配自己。

Step5:接下來,每次從頂上拿起兩張,可以任意選一張扔掉,或者啥都不扔,把剩下的放在牌底,一共三次。

這一步是我對原流程比較大的改動之處。這裡本質上其實是這7張牌,保持目標牌在底部,然後可以扔掉0~3一共4個選項這麼多張牌都可以,只要不扔第7張。原版的做法自然是直接讓觀眾選擇1或2張扔掉,當然在這以前還做了一次交換和插入,我的版本里因為有交換了所有這兩步就一起省略了,況且插入的過程已經執行過一遍,再做一次也是有被更多地察覺到問題和引入錯誤的風險的。

那麼我就在想,如何讓觀眾在0~3中間選一個數,扔掉這麼多張,並且,是任意不包括底牌的他們呢?這裡實際的選擇總數,考慮不同張數和組合的話,是C(6, 0) + C(6, 1) + C(6, 2) + C(6, 3),有這麼多種方法,如果是排列那就把C改成A。一方面,我們要充分利用這個大的自由度,讓觀眾體會到是自己的決定在起作用;另一方面,我們也要使得流程儘量簡潔,自然,而沒有太多生硬的成分。在原版裡面的直接選擇頂部1,2張扔掉,相當於只有1bit的資訊,這顯然太浪費了。但另一個極端,直接拿起頂部6張,讓大家隨便從中選0~3張扔掉,也顯然太刻意了。於是最終我選擇了視訊中的做法,看起來就是給了3次,每次都有3種選擇的機會,log27bit的資訊量。而從張數上講,實際上是給了3個布林變數供選擇,而他們的和恰好範圍在0~3了,但不會選到底牌,且可選的張數範圍這個變數3bit資訊的變數其實完全也沒有選擇過程看起來的資訊自由度大。總之,我的這個改進最大限度地隱瞞了3這個刻意要素,同時也給了觀眾在可控範圍內的最大自由度,同時在限定的操作複雜度範圍內。

最後還有一點,那就是,無論怎麼扔,因為每次頂部都少兩張牌,那麼,無意識地3次以後,對於一直沒拿到的底牌來說,其索引每次都減少了2,連模都不需要,因為還不曾小於0過,而取模反而和當時的張數有關係,變複雜了。也就是說,原來第7張一定會到第1張,這個確定的隱含事實也是如此設計的關鍵,它能夠讓我需要控制位置的牌,仍然在可控位置。

Step6:把整疊牌翻轉過來,切牌7次,每次切1張

整疊牌的翻轉相當於改變人的觀察視角,以至於以此定義的牌疊從原來的底部而不是頂部開始,是一次等效的reverse翻轉操作。如果從全序關係來理解排列,相當於是完整的一個倒序,相鄰關係的反關係(並不是逆排列)!此時,目標牌位置是倒數第一張,也就是n - 1或者- 1,而整疊牌的張數範圍是4~7,也就是7 - 0~3的結果。假設牌的張數是n,這樣的7次切牌,使得我們現在關心的底牌位置變為:

(n - 1 - 7) (mod n) = - 8 (mod n)

我們規定,0~(n - 1)為張數位置正向索引,索引從0開始;- 1~- n為逆向索引,從倒數第一張到第0張,而超出範圍的牌,也全部在Cn群中等效到相應的0~(n - 1)的完全代表系來表示。

這裡,由n的取值範圍4~7,最終停留位置為2n - 8。

Step7:對牌疊執行k = 2的約瑟夫過程,直到剩下最後一張。

因為n的範圍是4~7,所以n的二進位制表示是個3位數,首位為1。末兩位恰好是0~3之間數的二位二進位制表示,值為(n - 4)。根據前面k = 2的約瑟夫問題公式,其最後一張牌的索引即為2(n - 4),即三位二進位制數右移一位的結果。而我們有:

2(n - 4) == - 8 (mod n)

這個位置恰好是我們step6關心的原來的底牌,然後變成頂牌,又變成底牌以後,執行切1張7次的結果。

簡直是天衣無縫。我一度在懷疑這到底僅僅是巧合,還是暗含某種特殊的一系列數學結構,當我把n用二進位制表達成1b1b2,一切似乎清晰了起來:

7次切牌後底牌的位置:1b1b2 - 1 - 111(mod 1b1b2) == - 8(mod 1b1b2)

約瑟夫的末尾位置:b1b20(mod 1b1b2) == 2 * b1b2 (mod 1b1b2) == 2 * b1b2 - 2 * 1b1b2 = - 8 (mod 1b1b2)

也就是說,當剩餘牌的張數的二進位制位數為l時候,切l位1的二進位制數那麼多次,每次1張後,底牌的位置變為- 2 ^ (l + 1)(mod n),而約瑟夫的末尾位置的另一個表達也恰好是這個值,其物理意義就是從底牌開始,倒著數到第2 ^ (l + 1)那麼多張,即為所求。從這裡也可以看出k = 2的約瑟夫問題結論的另一種表述和物理意義,其實是這個純位指數值模的相反數模張數n的結果。

這個推導中,模運算,也就是背後的模加法群的結構起到了至關重要的作用,如果你能看懂但想不到,其實就和我一樣,是還不太熟練,至少不如一般的四則運算那麼熟練地掌握了他們。懂了它可以突然明白很多事情,比如為什麼在程式語言中,負值的索引是從- 1開始,一切都是為了保證在0開始索引和模意義下的等價:- 1 == n - 1(mod n),又比如,整數到底是怎麼儲存的,搞那些反碼補碼做什麼,範圍為什麼那麼設定,溢位的時候到底發生了什麼,以及為什麼首位為1的值就是負數等等奇怪的問題了。這個點我們後面會專門講。

Step8:拿著最後一張,把它和剛才換牌的同學再次交換回來,發現和口袋裡的第一個半張完全匹配!

最後,請你拿起撲克牌操作一遍,讓我們一起見證數學魔術帶給我們的奇蹟吧!

下一篇我們進入魔術部分講解,並將帶來一個仍然利用這個原理,但是在表演形式和內容上進行了大膽改良的作品,先堵為快:

視訊2 迷你自我匹配

我們是誰:

MatheMagician,中文“數學魔術師”,原指用數學設計魔術的魔術師和數學家。既取其用數學來變魔術的本義,也取像魔術一樣玩數學的意思。文章內容涵蓋網際網路,計算機,統計,演算法,NLP等前沿的數學及應用領域;也包括魔術思想,流程鑑等魔術內容;以及結合二者的數學魔術分享,還有一些思辨性的談天說地的隨筆。希望你能和我一起,既能感性思考又保持理性思維,享受人生樂趣。歡迎掃碼關注和在文末或公眾號留言與我交流!

掃描二維碼

關注更多精彩

約瑟夫問題與魔術(四)——魔術《10張牌的巧合》

每一個魔術,都應該是一場直播的微電影!

一次刨根問底的收穫——從一道微積分題說開去

序列週期性與魔術(六)——魔術欣賞與解析續集

《貓和老鼠》裡的魔術藝術(五)——一定要合理!

點選閱讀原文,往期精彩不錯過!