Lu 寶貝在讀「數學天方夜譚:薩米爾的奇幻之旅」時,書中有提到四階魔方陣的魔方陣常數是 34 ,且總共有 86 種可以得到總和為魔方陣常數的組合。因為這個題目跟剛剛才做完的小六獨立研究題目有關聯,所以 Lu 寶貝很興奮的跑來,把這個被作者稱為惡魔級方陣的四階魔方陣拿給我看。雖然我不知道為什麼,作者認為四階魔方陣就是「惡魔級」的魔方陣?(那其他更高等級的高階魔方陣會是「惡魔級」的惡魔爸媽?),不過我還是很認真的想想看,這種魔方陣常數的組合個數該怎麼求取?
魔方陣常數
一個 n 階魔方陣中的數字總和為 (1 + n2) * n2 / 2 ,其中共有 n 列 (或 n 行) 組成這個總和,因此我們把這個總和的值除以 n ,就會是每行(或每列)的和,也就會是魔方陣常數的公式: (1 + n2) * n / 2 。
四階魔方陣
把 n = 4 帶入上述魔方陣常數的公式 (1 + 42) * 4 / 2 = 17 * 2 = 34 ,這就是該書中提到的四階魔方陣的魔方陣常數 34 。那麼可以得到這個和的四個數字組合有 86 種該怎麼求得呢? 一時之間沒什麼想法,所以就直覺地寫個程式來算算看吧:
combinations = 0
combinations_list = []
for i in range(1, 17):
for j in range(i + 1, 17):
for k in range(j + 1, 17):
for l in range(k + 1, 17):
if (i + j + k + l) == 34:
combinations = combinations + 1
combinations_list.append((i, j, k, l))
print(combinations)
for cl in combinations_list:
print(cl)
這段程式碼會輸出總共有 86 組 1 ~ 16 的數字中,任選四個數字其和為 34 的組合。所以可以這樣來驗證書裡面提供的共有 86 種數字和為 34 的組合。
n 階魔方陣
接著,如果我們想要知道更高階的魔方陣的數字中,可以組合出該階數之魔方陣常數的數字組合有多少個該怎麼辦呢?我們可以把上面算四階組合的程式稍微修改一下:
import itertools
n = 4
c = 0
cl = []
for comb in itertools.combinations(range(1, n**2 + 1), n):
if sum(comb) == n * (n ** 2 + 1) / 2:
c = c + 1
cl.append(comb)
print(c)
for t in cl:
print(t)
這樣我們只要把 n 替換成 5, 6, 7, 8,… 這些更高的階數,就可以知道符合的數字組合有幾組啦。(n = 5, c = 1394; n = 6, c = 32134; n = 7, c = 957332; n = 8, c = 35154340; …)
從組合數字成長的速率來看,超過 8 階的魔方陣常數的可能組合,應該就超出一般個人電腦的計算能力,以自己的 Apple MacBook M2 Pro 電腦來說, 8 階共有3500萬種以上的組合,需要花費 20 分鐘以上才可以得到結果囉,更不要說 20 階這種魔方陣了。
利用寫程式來找組合數不難,難的是找出魔方陣背後所代表的數學規律,之後再看看是否有其他的見解可以跟 Lu 寶貝分享。