位换记号、排列测试与状态图:杂耍中的数学
2016 年 7 月 30 日至 8 月 7 日,第 39 屆歐洲雜耍大會(European Juggling Convention)在荷蘭的阿爾梅勒舉行, 8 月 3 日凌晨的搏擊之夜(Fight Night)自然再度成為了眾人關注的焦點——它是雜耍斗(combat juggling)這項運動最大的賽事。在雜耍斗的圈子里,有兩個響當當的大名你必須要知道:德國選手 Jochen Pfeiffer 目前世界排名第二,之前拿過 6 次搏擊之夜的冠軍;英國選手 Luke Burrage 目前世界排名第一,之前拿過 8 次搏擊之夜的冠軍。這一年的比賽中,兩位老將均以完勝的成績輕松進入 32 強,并在淘汰賽階段過關斬將,最終成功在決賽場上相遇。最終,世界排名第二的 Jochen 以 5 比 4 的成績擊敗了世界排名第一的 Luke ,奪得了又一個搏擊之夜的冠軍。
雜耍斗是一種兩人對戰類的體育運動。比賽規則非常簡單。每局比賽開始時,兩名選手各自拋耍 3 個雜耍棒。任何一方都可以故意上前干擾另一方(但只能針對對方手中的或者空中的雜耍棒,不能針對對方的手臂和身體)。誰站到最后,誰就贏得該局。先贏 5 局者獲得比賽的勝利。
典型的一局比賽大致就像下面這樣。這是 Jochen 和 Luke 的第 6 局比賽。
這場決賽確實打得精彩,出現了很多漂亮的瞬間。比如,在第 5 局比賽中, Jochen 做出了一個非常漂亮的防守動作。注意他在最后是如何改變自己的拋耍模式,在不違規的情況下(控制至少 3 個雜耍棒且任意時刻至少有一個雜耍棒在空中)抵擋住對手進攻的。
第 7 局比賽出現了更有意思的局面: Luke 從對方手中搶來了一個雜耍棒,于是在對方滿地撿棒子時,自己居然拋耍起了 4 個雜耍棒!
不知道有沒有人仔細看過視頻后,發現了一個有趣的細節: Luke 雖然拋耍起了 4 個雜耍棒,但是他的動作好賴皮呀!用哪只手拋出的雜耍棒,就用哪只手接住,任何一個雜耍棒都沒有在兩手之間交替。這恐怕不能叫做雜耍吧!這是不是要算違規呀?
還真不是。兩只手各自獨立地拋耍 2 個物體,確實是一種基本的雜耍模式。讓我們來看三個演示動畫,它們分別對應拋耍 3 個物體、拋耍 4 個物體和拋耍 5 個物體時最基本的雜耍模式:
按照大多數人的理解,在任何一種雜耍模式中,左右兩只手一定是交替地、有節拍地不斷拋耍小球。也就是說,右手接住某個小球并立即把它重新拋出,片刻后就該輪到左手接住某個小球并把它拋出,再過相同的時間后就又該輪到右手接住某個小球并把它拋出……今后,我們把某只手接住并拋出某個小球叫做一次“接拋”。接拋動作將會以右手、左手、右手、左手的順序輪流完成。我們假設每次接拋動作都是瞬間完成的,小球停留在手中的時間忽略不計。接下來,我們還會把相鄰兩次接拋之間的時間叫做“一拍”。我們假設雜耍過程中,每一拍的時長都是相同的。
上面這些雜耍模式之所以是“最基本的雜耍模式”,其實就是因為,每次接拋動作都是完全相同的。這意味著,每個小球每次都被拋到了相同的高度,都會在空中停留相同的拍數。如果每個小球都在空中停留 3 拍,結果會怎樣呢?讓我們畫個圖來分析一下:
圖中,橫坐標表示時間,縱坐標表示高度,弧線則表示隨著時間的流逝,小球們的高度是如何變化的。每個小球都在空中停留了 3 拍,表現在圖上就是,每條弧線都橫跨了 3 個區間。由圖可知,這里面實際上一共有 3 個小球(我們用 3 種不同的線條分別表示出了它們的軌跡)。此時,每個小球都會交替地來到左手和右手上。
類似地,如果每個小球都在空中停留 5 拍,我們就需要 5 個小球,才能讓雙手不會閑下來。可以看到,在這種情況下,每個小球也都會交替地來到左手和右手上。
然而,如果每個小球都在空中停留 4 拍,情況就不一樣了:對于任意一個固定的小球來說,不管它被哪只手扔了出去, 4 拍之后它將回到同一只手中。可以看到,此時對應著小球數為 4 的情況,也就是上面三個動畫中的中間那個動畫。
不妨用 n 來表示雜耍模式中的小球數。正因為在這種最基本的雜耍模式中, n 的奇偶性會導致如此大的區別,所以當 n 為奇數和 n 為偶數時,這種雜耍模式的俗名都是不一樣的。當 n 為奇數時,所得的雜耍模式叫做“瀑瀉”(cascade);當 n 為偶數時,所得的雜耍模式叫做“噴泉”(fountain)。
難道當 n = 4 時,就沒有什么左右手能互相傳遞小球的雜耍模式嗎?倒也有,比方說用一種叫做“傾盆”(shower)的雜耍模式就行了。事實上,傾盆可以適用于一切的 n ,并且不管 n 是奇數還是偶數,每個小球的位置都會在左右手之間切換。不過,這種模式的問題是——它太水了,還是不像雜耍。讓我們還是先來看看 n = 3, 4, 5 時傾盆的演示動畫吧:
也就是說,左手接住并水平拋出某個小球,右手立即接到該球并把它拋到更高的地方;然后左手接住并水平拋出下一個小球,右手立即接到該球并把它拋到更高的地方……傾盆也算是非常基本的一種雜耍模式了,或許你自己沒事兒時也偷偷嘗試過。搜索與“雜耍”有關的插圖插畫,畫面內容基本上都是一個人把一堆小球從一只手扔到另一只手,所有小球在空中大致排成一個半圓。這表現的其實就是傾盆這種雜耍模式。不過,和瀑瀉比起來,傾盆的效果確實差了一些,少了點“左右開弓”的感覺。
說了半天,當 n = 4 時,究竟有沒有什么看起來非常爽,觀賞性非常強的玩法呢?有。來看看下面三種 n = 4 時的雜耍模式:
看了上面這三個動畫,你有何感想?我估計,你的第一反應會是:“真牛逼,沒想到這背后的水這么深!看著就覺得里面有好多數學原理!”接下來,你就該觀察各種細節,或者該冒出各種怪異的想法了:
“我操,這些動畫你丫都是拿什么軟件做的呀?”
“你這網站上寫的東西今后肯定是要出書的吧?哼哼,我看到時候這篇文章的動畫你怎么處理!”
“你說這些新的雜耍模式都是誰想出來的,都是怎么想出來的呀?”
“這三種雜耍模式真的是三種不同的雜耍模式嗎?讓我看看啊……哦,是,好像確實是不同的。”
“這三種雜耍模式的循環長度似乎是不一樣的,最左邊那個的循環長度明顯要短得多。”
“其實中間那個雜耍模式中,右手還是出現了自己扔給自己的情況。哦,左手也出現了這種情況。咦,等等,好像這個雜耍模式中,左右手的動作是完全對稱的!”
“最右邊那個圖我好像看出些名堂來了。它就是一個拋得更高的 3 球瀑瀉,插進去一個簡單的水平拋擲。”
……
好吧,我先專門說一下這些動畫是怎么變出來的吧,不然大家肯定又會問。以前每篇文章的圖片和動畫都是我用 Mathematica 做的,但這篇文章還真不是。這篇文章中所有雜耍模式的演示動畫都是用一個叫做?Juggling Lab?的開源軟件生成的(然后用 ImageMagick 調了一下顏色和線條的粗細)。這個軟件在雜耍界里非常有名,它可以生成各種雜耍模式的 GIF 演示動畫,極大地方便了人們的交流。
這篇文章里有這么多動畫,以后真的出書時該怎么辦呢?那還有啥辦法,到時候出書時只能不用這篇文章了唄!所以,大家一定要體會到科技的進步。現在,向其他人展示某種雜耍模式,只需要發個 GIF 動畫就行了;但在只有紙媒的時代,這將會變得非常非常困難。《雜耍者世界》(Juggler’s World)是雜耍界里頗有影響力的雜志。雜志讀者曾經問道:為什么不在雜志上教大家一些新的雜耍技巧呢?于是,在 1985 年第 2 期的雜志中,編輯們用一組照片輔以數字和箭頭,詳細講解了一個拋耍 4 球的新玩法。自然,效果非常糟糕,至少我看了半天都沒看懂。
就好像跳水中“5253B”表示“向后翻騰兩周半轉體一周半屈體”一樣,要是我們有一套記號,或者說一種“語法”,可以簡單有效地表示出各種雜耍模式就好了。人們不但可以借助它進行交流,或許還能通過擺弄這些符號,尋找新的雜耍模式。雜耍模式的很多特征,或許也會反映在這些符號當中。
剛才對瀑瀉和噴泉的分析,讓我們自然地想到了這樣一種方案:依次記下每次扔出的球會在空中停留幾拍,直到完整地記下一個循環節為止。剛才我們展示了三種非常高級的 4 球玩法,讓我們仔細分析一下中間那種玩法。不妨從右手扔出最高的那一次球開始算起:這次扔出的球(由右手扔出)要過 5 下才會被接住,我們就用數字 5 來標記;下次扔出的球(由左手扔出)要過 3 下才會被接住,我們就用數字 3 來標記;第三次扔出的球(由右手扔出)要過 4 下才會被接住,我們就用數字 4 來標記……如果把小球的軌跡連同這些數字標記一并畫出,大概就是這樣:
雜耍模式能永遠持續下去,肯定是因為它在不停地循環。在這個例子中,我們記下的數字形成了 534 循環。我們就用 534 來表示這種雜耍模式。這就是雜耍界最通用的雜耍模式記號——“位換記號”(siteswap)。
位換記號最早是由誰想出來的,現在已經很難考證了。目前一般認為,位換記號起源于 1985 年左右,它的發明和傳播,至少與以下三組人馬有著密切的關系:來自加利福尼亞州圣克魯斯的 Paul Klimek ,來自加利福尼亞理工學院的 Bruce Tiemann 和 Bengt Magnusson ,以及來自英國劍橋的 Michael Day 、Colin Wright 和 Adam Chalcraft 。
對于雜耍表演者來說,位換記號是非常直觀的,因為它記錄的本質上就是雜耍時的一個個接拋動作:數字 1 就表示,我應該把剛接到的球近乎水平地扔向另一只手,讓另一只手在下一拍立即接到它;數字 2 就表示,我應該把剛接到的球豎直向上扔一點,使得在另一只手完成動作后,正好輪到這只手重新把它接住(實際表演時,人們通常會選擇直接把這個小球握在手中停留 2 拍,因為在此期間反正這只手也不需要干別的);數字 3 就表示,我應該把剛接到的球扔得更高一些,扔出一個拋物線,使得 3 拍之后另一只手正好能接住它……總之,數字越大,就意味著我應該把小球越得越高,并且偶數意味著應該豎直向上扔,奇數意味著應該往另一只手的方向扔。
事實上,位換記號只告訴了你扔出的球需要多久之后回到手中,而并沒有告訴你這個球具體應該怎么扔出去。你可以從胯下扔上來,從身體背后扔過來,扔頭上頂一會兒,扔地上反彈回來……只要它能在正確的時候被接住就行了。
注意,一個雜耍模式的位換記號往往不是唯一的。我們可以對位換記號中的數字進行“循環移位”(cyclic shift),例如把 534 變為 345 和 453 ,它們刻畫的顯然是同一個雜耍模式。此時,人們通常會選擇使用字典序最大的那個記法(也就是說,使用第一位數字最大的記法,如果有多個第一位數字最大的,則使用它們之中第二位數字最大的記法,等等)。另外,人們通常假設,位換記號中不會有大于 9 的數字出現,因為把小球扔這么高是不太現實的。這樣的話,每個雜耍模式的位換記號都是一串唯一確定并且沒有歧義的數字了。
我們剛才介紹的那些雜耍模式,用位換記號都該怎么記呢? 3 球瀑瀉、 4 球噴泉、 5 球瀑瀉的位換記號分別是 3 、 4 、 5 。果然,它們是最基本的雜耍模式。 3 球傾盆、 4 球傾盆、 5 球傾盆的位換記號分別是 51 、 71 、 91 。這也很容易看出來。
最后我們展示了三種 4 球玩法,其位換記號從左至右依次為 53 、 534 、 5551 。之前觀察到的現象和規律,都可以從這幾個位換記號中讀出來。左邊那個的循環長度確實是最短的,因為它的位換記號的長度就是最短的。整個雜耍模式其實就是兩個動作不斷重復,右手做個 5 ,左手做個 3 ,右手再做個 5 ,左手再做個 3 。中間那個的位換記號里有偶數,因此它里面就會出現“自己扔給自己”的情況。同時,它的動作是左右對稱的,因為它的位換記號的長度為奇數。第一輪的 534 分別對應右、左、右,第二輪的 534 就分別對應左、右、左了。右邊那個本質上就是“一個拋得更高的 3 球瀑瀉,插進去一個簡單的水平拋擲”,它的動作要領顯然就是三個相同的大動作加上一個小動作,這不正是 5551 的意思嗎?
不知道大家有沒有發現, 53 、 534 、 5551 這幾串數字有一個共同特征:數字串里所有數字的平均數都是 4 。事實上,這個規律對于其他幾個雜耍模式的位換記號也都成立:位換記號中所有數字的平均數,等于這個雜耍模式中小球的個數。這就是位換記號理論中最著名的一個定理——平均數定理(the average theorem)。這個定理為什么是對的呢?我們介紹一種非常直觀的證明方法。
每個小球每次在空中停留的時間,完全是我的手在拋出它時給予它的。這就好比每次拋出小球都是在給小球加油一樣。如果位換記號里有一個數字 4,就表示此時拋出小球的動作相當于給小球加了 4 個單位的油,小球也就會在空中停留 4 個單位的時間,直到最后沒油了落回手中,繼續接受下一次加油。每個循環剛開始的時候,有些空中的小球消耗的還是上一個循環里加的油;每個循環快結束時,給小球加的油也有一部分會放到下個循環去用。但是,既然這些循環能夠一個接一個地無限持續下去,既不會出現剩余的油越積越多的情況,也不會出現油慢慢就不夠了的情況,這就說明每個循環里給小球加的油,一定都恰好等于這個循環里所有小球在空中停留的時間之和。
假設某個雜耍模式有 n 個小球,其位換記號的長度為 l 。在每個循環里,我的手一共給小球加了多少油呢?顯然,這等于位換記號里的所有數字之和。在每個循環里,所有小球在空中總共停留了多少時間呢?由于我們有 n 個小球,每個小球都在空中停留了 l 個單位的時間,所以答案就是 n · l 。于是我們得到,位換記號里的所有數字之和等于 n · l ,即 n 等于位換記號里的所有數字之和除以 l 。這正是平均數定理的內容。
平均數定理有一個重要的推論:瞎寫一串數字,不見得是一個合法的位換記號。比方說,如果所有數字的平均數根本就不是整數,那么這串數字就必然不是一個合法的位換記號了。然而,麻煩的是,即使所有數字的平均數是個整數,這串數字也不見得是一個合法的位換記號。比方說, 6114 這串數字滿足平均數條件,但它就不是一個合法的位換記號。在 61146114… 中,第一次拋出的小球和第六次拋出的小球會“撞車”,使得雜耍模式無法持續下去。
所以,位換記號可以很好地描述雜耍模式,但要想利用位換記號創造新的雜耍模式,還得想想辦法才行。
不妨讓我們換個思路:能否對已有的位換記號進行改造,從而得出新的雜耍模式呢?考慮之前提過的 534 模式。現在,如果把 534 改成 633 ,會出現什么有意思的結果?你會發現,整個雜耍模式的循環節長度仍然是 3 ,并且在每一個循環節中,第一次拋出的小球和第三次拋出的小球都會交換落點。所以,原來的位換記號不會出現撞車的情況,新的位換記號也不會出現撞車的情況。
我們預言: 633 是一種新的合法的位換記號,對應于一種全新的雜耍模式!事實上確實如此:
一般地,如果位換記號中有 a 、 b 兩個數字,它們相隔 d 拍的距離,那么把 a 和 b 分別換成什么數字,就能交換它們的落點呢?看看下圖,你就知道了:我們應該把 a 換成 b + d ,把 b 換成 a – d 。
在數字串中,按此規律修改某兩個數字的操作就叫做一次“位換”(site swap)。對合法的位換記號進行位換操作,得到的仍然是合法的位換記號。其實,“位換記號”這個詞就是這么來的——它是一種支持位換操作的記號。注意,每次位換既不會改變位換記號的長度,也不會改變位換記號中的所有數字之和。因此,位換操作不會改變所有數字的平均數。這說明,用位換操作得到的新雜耍模式,與原雜耍模式的小球數是相同的。
位換操作很強大。讓我們再給大家展示幾個例子。如果你愿意,你甚至可以對 3 球瀑瀉進行位換操作。 3 球瀑瀉的位換記號是 3 ,里面就只有一個數字,這可怎么做位換呢?沒關系,多補幾個循環節就行了。比方說,把 3 先擴寫成 333 ,然后對第一個數字和第三個數字進行位換,于是得到 531 。那么, 531 就是一個新的雜耍模式。如果我們剛才選擇把 3 擴寫成 3333 ,但還是對第一個和第三個數字進行位換,得到的當然就是 5313 。類似地,把 3 擴寫成 33333 ,位換后還能變出 53133 來……于是,我們知道了, 531, 5313, 53133, 531333, … 都是合法的位換記號。下面三個動畫展示的分別是 531 、 5313 和 53133 的玩法。
我們還可以對位換之后的結果再做位換。比方說,對 531 的第一個和第二個數字進行位換,于是得到 441 。這就又是一種新的雜耍模式!
441 模式可以說是人們利用位換記號得到的最大的成果之一。以前,人們憑借想象,發明創造了各種各樣的雜耍模式,并給它們起了各種各樣的名字。但在位換記號提出之前,由于缺乏系統的研究工具,很多簡單的玩法都沒被發現。在位換記號理論的幫助下,人們找到了很多新的雜耍模式, 441 模式就是最經典的例子之一。也正因為這樣, 441 模式就不再有什么別的名字了。雜耍界的人們直接管它叫 441 。
我們剛才是用 3 → 333 → 531 → 441 的辦法生成的 441 。其實,生成 441 還有很多別的路子。比方說,還是先把 3 擴寫成 333 ;接下來,對 333 的第一位和第二位進行位換,于是得到 423 ;循環移位,可以把 423 變成 342 ;再對 342 的第一位和第三位進行位換,就可以得到 441 了。當然,變出 441 并不需要那么復雜,其實 423 能直接變成 441 。這里我們只是想告訴大家,位換操作還可以和循環移位配合著使用。
1993 年, Allen Knutson 證明了一個非常漂亮的結論:先對某個單數字的位換記號進行擴寫,再通過適當的循環移位和位換操作,就能變出一切合法的位換記號!由于循環移位和位換操作都不會改變位換記號的長度和平均數,因此為了得到位換記號長度為 l 的 n 球玩法,我們必須先把單個數字 n 擴寫成 l 個數字 n 。所以,接下來我們只需要說明,任何一個位換記號長度為 l 的 n 球玩法,都能從 l 個數字 n 出發,通過循環移位和位換操作得出。
考慮這樣一個位換記號處理算法:
如果數字串里的所有數字都相同,則輸出該數字串,算法結束
使用循環移位操作,將最大數字挪至第一位,同時使得第二位數字和第一位數字不同
對第一位數字和第二位數字進行位換操作,然后跳轉到第 1 步
把任意一個合法的、長度為 l 的、平均數為 n 的位換記號輸入該算法,都會經過一系列的循環移位和位換操作,最終變成 l 個數字 n 。注意到,如果數字串 A 循環移位后能變成數字串 B ,數字串 B 顯然也能通過循環移位變成數字串 A 。另外,容易驗證,如果對數字串 A 做一次位換后得到數字串 B ,則在同樣的位置上對數字串 B 做一次位換,又會變回成數字串 A 。既然每個合法的位換記號都能變成 l 個數字 n ,那么從 l 個數字 n 出發,也就能反過來變出每個合法的位換記號了。
等等,這也太簡單了吧,好像我們漏掉了什么吧?嗯,是的。我們還得證明:把任意一個合法的位換記號輸入該算法,該算法在有限步之后一定會終止。
首先注意到,由于合法的位換記號經過循環移位和位換操作后仍然是合法的,因此把任意一個合法的位換記號輸入進去,算法生成的自始至終都是合法的位換記號。現在,假設在做第 3 步時,數字串的頭兩個數字是 a 和 b 。根據之前的算法步驟可知, a 是整個數字串中最大的數,并且 a 與 b 不相等。換句話說, a 比 b 至少大 1 。事實上, a 不可能比 b 剛好大 1 ,否則這兩個地方扔出的小球會撞車,這就不是一個合法的位換記號了。因此, a 比 b 至少大 2 。第 3 步之后, a 將會變成 b + 1 , b 將會變成 a – 1 。這說明,每過一遍第 3 步,數字串中都會有某個最大數減小了 1 ,并且不會因此而引入新的最大數。如果輸入的位換記號中所有數字的平均數是 n ,那么所有數字的平均數就一直是 n 。等最大數不斷減小,一直減小到 n 了,那么所有的數字都是 n 了,算法也就終止了。到此為止,我們就完整地證明了 Allen Knutson 的結論。
這個結論有一個非常強大的推論:對于任意一個合法的、長度為 l 的位換記號,將它的各個數字分別與 1, 2, 3, …, l 對應相加,所得的 l 個結果除以 l 的余數一定是各不相同的。由于除以 l 的余數正好也就只有 0, 1, 2, …, l – 1 這 l 種可能,因此上述推論還可以重新敘述為:按上述步驟做加法并取余,所得的 l 個結果正好構成 0, 1, 2, …, l – 1 的一個排列。舉個例子,在 441 模式中, 4, 4, 1 依次與 1, 2, 3 相加,得到的結果為 5, 6, 4 ,它們除以 3 的余數分別是 2, 0, 1 ,正好是 0, 1, 2 的一個排列。再舉個例子,之前我們曾經提到過 53133 模式,其中 5, 3, 1, 3, 3 依次與 1, 2, 3, 4, 5 相加,得到 6, 5, 4, 7, 8 ,它們除以 5 的余數分別為 1, 0, 4, 2, 3 ,正好是 0, 1, 2, 3, 4 的一個排列。我們就說, 441 和 53133 都能通過“排列測試”(permutation test)。
為什么一切合法的位換記號都能通過排列測試呢?首先,如果位換記號中所有數字都相同,那它顯然能通過排列測試。既然由此出發,通過循環移位和位換操作能得出其他一切合法的位換記號,因此我們只需要說明:能通過排列測試的數字串,經過循環移位和位換操作后,也照樣能通過排列測試。事實正是如此。
首先說循環移位。將循環移位過的數字串與 1, 2, 3, …, l 對應相加,本質上就相當于是將數字串與循環移位過的 1, 2, 3, …, l 對應相加;而后者會使得所有的余數都循環移動一下,所以如果原來可以形成排列,那么現在依然可以形成排列。比方說,假設某個數字串原本是 a, b, c, d, e ;循環移位后,數字串變成了 c, d, e, a, b 。原來, a, b, c, d, e 應該與 1, 2, 3, 4, 5 對應相加;現在, a, b, c, d, e 就應該與 4, 5, 1, 2, 3 對應相加。把 a + 1 變成 a + 4 之后,除以 5 的余數會怎么變呢?不難看出,如果原來余數是 0 ,現在就會變成 3 ;如果原來余數是 1 ,現在就會變成 4 ; 2 則會變成 0 , 3 則會變成 1 , 4 則會變成 2 。換句話說,余數會按照 (0, 1, 2, 3, 4) → (3, 4, 0, 1, 2) 的規律發生變化。然而,把 b + 2 變成 b + 5 ,把 c + 3 變成 c + 1 ,把 d + 4 變成 d + 2 ,把 e + 5 變成 e + 3 ,除以 5 的余數都會按照這樣的規律發生變化。所以,如果原來的 5 個余數既無重復又無遺漏地包含了 0, 1, 2, 3, 4 ,按照 (0, 1, 2, 3, 4) → (3, 4, 0, 1, 2) 的規律整體一變后,新的 5 個余數仍然既無重復又無遺漏地包含了 0, 1, 2, 3, 4 。
然后說位換。假設我們對相隔 d 拍的兩個數字 a 、 b 進行位換。如果數字 a 本來應該與 i 相加,那么數字 b 本來就應該與 i + d 相加。相加之后的結果是 a + i 和 b + i + d 。位換后,數字 a 變成了 b + d ,數字 b 變成了 a – d 。前者還是要與 i 相加,后者還是要與 i + d 的相加。相加之后的結果就是 b + d + i 和 a – d + i + d = a + i 。看出來了吧!在位換前和位換后,相加之后的結果沒變,只不過顛倒了而已。自然,除以 l 的余數也不會變,只是顛倒了而已。
所以,我們就證明了:一切合法的位換記號都能通過排列測試。反過來,無法通過排列測試的,必然就不是合法的位換記號了。排列測試比我們之前說過的平均數定理檢驗法更為強大。之前我們說過, 6114 不是一個合法的位換記號,但用平均數定理卻無法檢驗出來。不過,如果換用排列測試來檢驗,就能立即見效了。 6, 1, 1, 4 分別加 1, 2, 3, 4 可得 7, 3, 4, 8 ,它們除以 4 的余數是 3, 3, 0, 0 。這說明, 6114 不能通過排列測試,它也就不是合法的位換記號了。
有沒有什么數字串,它連排列測試都通得過,但仍然不是合法的位換記號呢?答案是否定的。我們可以證明,能通過排列測試的,也一定都是合法的位換記號。這背后的道理其實很簡單。不妨讓我們以 l = 4 為例。假設這個長度為 4 的數字串是 a, b, c, d 。如果把數字 a 所在的位置看作第 1 次接拋,那么 a + 1, b + 2, c + 3, d + 4 分別就是這 4 次接拋的落點位置。如果這個數字串能通過排列測試,就說明這 4 個落點正好是某個循環節中的第 1 個點,某個循環節中的第 2 個點,某個循環節中的第 3 個點,以及某個循環節中的第 4 個點(不管是什么順序)。也就是說,這 4 個落點正好涵蓋了循環節中的 4 個不同的地方。把這部分示意圖平鋪開來,你會發現,每個點都將會恰好有一接和一拋。這就是一個正確的雜耍模式了。
于是,我們證明了這樣一個非常終極的結論:某個數字串是一個合法的位換記號,當且僅當它能通過排列測試!這又會產生很多有趣的推論。比方說,如果一個數字串能通過排列測試,那么讓每個數字都增加或者減小一個相同的常數,得到的數字串顯然仍能通過排列測試。因此,給一個位換記號中的每個數字都增加或者減小相同的量,就會得出新的雜耍模式。有的地方把這種改造位換記號的操作叫做“垂直移位”(vertical shift)。例如,對 441 進行垂直移位,可以依次得到 552 、 663 、 774 等,它們都是新的雜耍模式。下面三個動畫分別是 552 、 663 和 774 的雜耍模式演示動畫。左邊那個動畫是這篇文章中第一次出現的位換記號里含有數字 2 的情況。之前我們說過,在遇到數字 2 時,表演者通常會選擇直接把這個小球握在手中停留 2 拍。另外,可以看到,和之前那些位換記號變換法不同的是,垂直移位可以改變雜耍模式中的小球數。
1995 年, Martin Probert 發明了一種生成新雜耍模式的傻瓜方法,其原理也可以用排列測試來解釋。如果你想要一個循環節長度為 l 、小球數為 n 的新雜耍模式,你就可以先畫一個 l × l 的方陣,然后在第 i 行第 j 列填入 n + i – j 的值。這相當于是在 l × l 的方陣的最左上角填一個 n ,然后按照向右走就減 1 ,向下走就加 1 的規律填充整個方陣。例如,我想要生成一個循環節長度為 5 、小球數為 4 的新雜耍模式,我畫出的方陣就應該如左圖所示:
現在,從中任意選出 5 個方格,但要保證任意兩個方格既不同行也不同列,如右圖所示。接下來,從左至右讀出各列的數字,于是得到 45641 。那么, 45641 就是一個合法的位換記號,并且它的長度為 l ,平均數為 n 。習慣上,我們會把 45641 寫作 64145 ,以符合字典序最大的原則。
為了證明如此得到的數字串一定是合法的位換記號,我們只需要說明,如此得到的數字串一定能通過排列測試。也就是說,我們只需要說明,各列所圈的數字分別 +1, +2, …, +l ,除以 l 的余數正好取遍 0, 1, 2, …, l – 1 。為了給第 j 列所圈的數字 +j ,我們可以保持圓圈的位置不變,把這一列數整體循環上移 j 個單位,圓圈里的數就自動地 +j 了。當然,有時也不是真的 +j 了,比如把上圖中的第 4 列循環上移 4 個單位,圓圈里的數會從 4 變成 3 ,而不是 8 。不過,這沒關系,因為最后我們只關心它除以 l 的余數,只要它除以 l 的余數是對的就行了。然而,如果各列分別循環上移 1, 2, …, l 個單位后,方陣里的數除以 l 的余數就會形成這樣的情況:一行全是 0 ,一行全是 1 ,一行全是 2 ,等等,一直到一行全是 l – 1 。所以,這些互不同行的圓圈,圈出的數除以 l 的余數正好取遍 0, 1, 2, …, l – 1 。
另外,我們選的這 l 個數的總和,相當于是 l 個 n 之和,再以某種順序加上 1, 2, 3, …, l ,再以某種順序減去 1, 2, 3, …, l 。因此,我們選的這 l 個數的平均數正好就是 n 。所以,利用 Martin Probert 的傻瓜方法,確實能夠得到一個循環節長度為 l 、小球數為 n 的雜耍模式。
其實,如果知道了排列測試理論,我們還有更直接的辦法來生成新的雜耍模式。對于任意正整數 l ,將 0, 1, 2, …, l – 1 隨意地排成一排,各項依次減去 1, 2, 3, …, l ,然后每個地方都可以選擇再加上任意一個 l 的整倍數(其中小于等于 0 的地方必須加到變正才行),如此得到的一定是合法的位換記號。枚舉所有的可能性,我們就能得到所有合法的位換記號(可能會有重復)!可以說,我們終于有了一套描述、分析、生成雜耍模式的全套解決方案。
當然,位換記號并不能解決雜耍表演者會遇到的全部問題。試想,如果你玩了一段時間的 3 球瀑瀉,想換一種 3 球玩法,但卻不想停下重來。這就引出了一個問題:從 3 球瀑瀉出發,能無縫切換到哪些其他的 3 球玩法,又該如何去切換呢?為了解決這類問題,人們發明了另一種強大的雜耍模式分析工具——狀態圖(state graph)。
讓我們假設手上的小球永遠是 3 個,并且位換記號涉及的數字最高到 5 (即一個小球最多在空中停留 5 拍)。我們可以認為,任何一個接拋動作完成的瞬間,所有 3 個小球就都在空中了;其中 1 個小球剛被拋起,其余小球則早已拋出,正處于上升或者下降的過程中。不管怎樣,從此刻算起, 3 個小球落回手中所需要的拍數一定各不相同,并且都不會超過 5 。我們可以用一個 5 位 01 串來表示接下來這 5 拍的“占用”情況,數字 1 表示有小球會落回來,數字 0 表示沒有小球會落回來。例如,如果完成某個接拋動作后, 3 個小球分別將在第 1 、 2 、 5 拍之后落回手中,我們就用 11001 來表示此時的狀態。可以看出,在 3 球瀑瀉中,完成任何一個接拋動作后,狀態都是 11100 。
假設有 x 和 y 兩個 01 串。把 x 的第一位去掉,再在最后面添一個數字 0 。如果此時 x 的第 h 位正好是數字 0 ,并且把它改為 1 之后,整個 01 串正好就變成 y 了,我們就說 x 可以通過動作 h 轉換為 y 。它的直觀意義就是,如果當前狀態為 x ,那么下一個接拋動作可以是 h ,該動作完成后狀態就會變成 y 。例如, 11100 可以通過動作 4 轉換為 11010 ,也可以通過動作 5 轉換為 11001 。
5 位 01 串中有 3 個數字 1 ,這一共有 C(5, 3) = 10 種可能性。讓我們在紙上把這 10 種可能性全部寫下來。如果某種狀態能通過某個動作轉換為另一種狀態,我們就從前一種狀態出發,畫一根箭頭指向后一種狀態,并在路上標出動作的數值。注意,一個狀態有可能轉換為它本身,例如 11100 能通過動作 3 轉換為它本身。我們就畫一個箭頭,從它出發,繞個小圈,指向它自己。另外,你會發現,以數字 0 開頭的狀態無法轉移到任何其他狀態,否則數字 1 的個數就不對了;更直觀的說法則是,到了這種狀態顯然必死,因為下一拍就沒有小球接了。
所以,只要沿著箭頭走,路上經過的數字就自動地組成了合法的動作序列!而一個合法的位換記號,比如說 3 、 51 、 441 、 531 、 5313 等等,其實就是這個圖上的回路!雜耍模式之間的銜接問題,也就解決了:我們只需要看看,能否從前一個回路的某個節點出發,沿著箭頭走到另一個回路里去。比方說,你本來玩著 3 球瀑瀉,突然想玩 3 球傾盆了。于是,你可以用動作 4 進行銜接,按照 33…345151…51 的規律拋球。什么時候你又想回到 3 球瀑瀉的玩法,你就可以用動作 2 進行銜接,按照 5151…51233…3 的規律拋球。當然,你也可以用動作 41 進行銜接,按照 5151…514133…3 的規律拋球。下圖所示的就是位換記號 333451515141 (這次我們有意沒按字典序最大原則對其進行重寫)及其演示動畫,它就是由 3 球瀑瀉和 3 球傾盆組成的大循環,中間分別以 4 和 41 銜接。
用這種方法,我們可以搞出像 333451515141 這樣很長很長,很復雜很復雜,卻沒啥實質意義的位換記號——它僅僅是由一些更基本的位換記號拼成的。
在狀態圖中,如果一條回路經過了某個重復的節點,我們就可以把它視作兩個以該節點為公共節點的小回路。如果某個小回路仍然經過了重復的節點,我們還可以繼續把它分解成兩個更小的回路,直到每個回路都被分到不可再分(即都分到不再經過重復的節點)。
如果一個位換記號在狀態圖中不會經過重復的狀態,我們就說這是一個“素位換記號”(prime siteswap)。根據上述推理,如果一個位換記號不是素位換記號,那么它一定能看作是由若干個素位換記號組合而成的。例如, 333451515141 就是由三個 3 、三個 51 和一個 441 組成的。我們前面提到過 531333…33 的模式,其實也就是由一個 531 和任意多個 3 組成的。
正如化學元素按一定規律適當組合后,可以得出千千萬萬的物質一樣,素位換記號按一定規律適當組合后,也會得出千千萬萬的雜耍模式。也就是說,素位換記號對應著雜耍模式的基本組成單元。從這個意義上說,尋找所有的素位換記號,比生成所有合法的位換記號更為重要。為了找出所有的素位換記號,我們只需要在狀態圖中找出所有不經過重復節點的回路。當小球數為 3 時,所用數字不超過 5 的素位換記號一共有 8 個,它們是:
3, 42, 51, 441, 522, 531, 5241, 5511
把它們掌握了之后,就能變幻出形形色色更復雜的雜耍模式了。
我們從幾個最基本的雜耍模式,說到了位換記號與平均數定理,說到了排列測試與位換記號的生成方法,說到了狀態圖與素位換記號。但是,剛才的一切僅僅是假設,左右兩只手是在交替地接拋一個又一個的小球。如果兩只手是同步運作的呢?或者,如果每次可以接拋不止一個小球呢?或者,如果我們有兩個雜耍者,他們互相之間還能把小球扔給對方呢?我們又應該用什么記號來表示它們呢?剛才提到的結論能否繼續擴展到這些情況呢?感興趣的朋友不妨看看 Burkard Polster 的 The Mathematics of Juggling 一書。這篇文章中的內容主要也都是從這本書里來的。
????
????
整篇文章以視頻開頭,不妨讓我們以視頻結尾吧。看看這個來自YouTube的視頻,?https://www.youtube.com/watch?v=e5E84ePfEOw,就會了解到,這篇文章探討的,真的只是最基本最基本的雜耍而已。
END
∑編輯?|?Gemini
來源?|?matrix67
更多精彩:
? ?哈爾莫斯:怎樣做數學研究
? ?扎克伯格2017年哈佛大學畢業演講
? ?線性代數在組合數學中的應用
? ?你見過真的菲利普曲線嗎?
? ?支持向量機(SVM)的故事是這樣子的
? ?深度神經網絡中的數學,對你來說會不會太難?
? ?編程需要知道多少數學知識?
? ?陳省身——什么是幾何學
? ?模式識別研究的回顧與展望
? ?曲面論
? ?自然底數e的意義是什么?
? ?如何向5歲小孩解釋什么是支持向量機(SVM)?
? ?華裔天才數學家陶哲軒自述
? ?代數,分析,幾何與拓撲,現代數學的三大方法論
算法數學之美微信公眾號歡迎賜稿
稿件涉及數學、物理、算法、計算機、編程等相關領域,經采用我們將奉上稿酬。
投稿郵箱:math_alg@163.com
總結
以上是生活随笔為你收集整理的位换记号、排列测试与状态图:杂耍中的数学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国工程院出台“八不准” 为院士增选“划
- 下一篇: 法国帅哥教授告诉你,为什么数学家是全世界