標籤:
一個 $n$ 階的 Aztec Diamond 圖,是指依次將 $2,4,\ldots,2n,2n,\ldots,4,2$ 個單位方格摞在一起得到的對稱圖形(於是圖中一共有 $2n(n+1)$ 個單位方格)。是 $n=5$ 時候的例子:
對一個 $n$ 階的 Aztec Diamond 圖,用 $1\times 2$ 的多米諾骨牌鋪砌它,總共有 $2^{n(n+1)}$ 種不同的方法。(這裡不考慮對稱性,比如全部用水平的骨牌鋪砌和全部用豎直的骨牌鋪砌,兩種方法是不同的)
一個有趣的問題是,對給定的 $n$ 階 Aztec Diamond,怎樣從它的所有 $2^{n(n+1)}$ 種鋪砌中等機率地任選一種?當 $n$ 很大時,這個事情並不好做。
下面這個圖顯示了 $n=80$ 時 Aztec Diamond 圖的一個隨機鋪砌,它使用的是 Propp 論文中的 Domino Shuffling 演算法:
你可以看到圖中出現了一個近似圓形的地區,在地區的內部,骨牌的排列是變化的,而地區外部則是 "凍結" 的,這就是所謂的 "北極圈" 現象。
這個圖是我用 Python + Matplotlib 繪製的,代碼在這裡下載:domino.py。你可以把程式最後的參數 80 改成其它的整數(最好不要超過 200)。Matplotlib 庫繪圖的效率並不高,$n$ 很大時比較吃力,用 Cairo 庫效率要高很多,但是 Cairo 的代碼不如 Matplotlib 簡潔。
一點注意事項:
- Matplotlib 的參數 ‘aspect‘ 要設定為 1,否則它輸出的圖形會展開。
- 程式中,用一個字典的資料結構儲存鋪砌,鍵 $(j,k)$ 表示以座標整點 $(j,k)$ 為左下角的單位正方形,其值 $‘n‘,‘s‘,‘w‘,‘e‘,‘x‘$ 表示骨牌的狀態,其中 $‘x‘$ 表示 "洞"。
- 在 create 一步中,當把 $2\times2$ 的 "窟窿" 用一對骨牌填充時,一定要注意所用骨牌的狀態,它們是一對方向相反的骨牌。
關於這個演算法的更多故事,我會在後面的文章中介紹。
Python + Matplotlib 繪製 Aztec Diamond 圖的隨機鋪砌