解規則可由 Frobenius 表格觀察得來。以 g(3,3k+1,3m+2)為例,呈現於表 3- 8
g(3,3k+1,3m+2)的 Frobenius 表格 g(3,3k+1,3m+2)。從表中可以發現,每排的解皆 一樣,而 k 每增加 1,解會增加 3,因此我們猜測解是 s=3m。得到猜測的解規則,
加上線規則猜測,再加上人工證明即可確定解規則是否正確。
有些 Frobenius 表格會更複雜,存在兩個以上的的解規則。在論文[2]發現至 多 2 個解規則,更複雜的解規則則是用數學公式解解決。但我們發現,隨著最小 數 a 的增加,解規則的數量也隨之增多。
解規則猜測是 程式實作面對的第一個 問題。我們的目標是求出解規則
三層迴圈,依序找可能的(𝑛1,𝑛2,𝑛3)參數,很容易求出解規則。但存在兩個以上解
規則時就會讓我們難以判別解規則的範圍,因此很難得到兩個解規則。我們使用 過一些不同的方法嘗試求複雜的解規則,後來發現硬幣問題的解規則呈現線性區 塊的分布。
表 3- 8 g(3,3k+1,3m+2)的 Frobenius 表格
k m 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 3
2 6 9
3 9 12 15
4 12 15 18 21
5 15 18 21 24 27
6 18 21 24 27 30 33
7 21 24 27 30 33 36 39
8 24 27 30 33 36 39 42 45
9 27 30 33 36 39 42 45
10 30 33 36 39 42 45
11 33 36 39 42 45
12 36 39 42 45
13 39 42 45
14 42 45
15 45
我們發現解規則會以線性的線規則做分塊。以 g(7,7k+1,7m+2)、g(7,7k+1,7m+3) 為例,表格中的數字代表其 Frobenius 表格中其所屬的規則。如表 3- 9 中,解規 則有兩個;
表 3- 10 中,解規則有三個。表中的藍線即為線規則。可以發現解規則都以線性 的線規則為邊界,分隔出不同的區塊。
表 3- 9 g(7,7k+1,7m+2)的解規則編號表格
k m 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 1,2 1 1 1 0 0 0 0 0 0 0 0 0 0
2 0 2 2 1,2 1 1 1 1 1 1 1 0 0 0 0
3 0 0 2 2 2 1,2 1 1 1 1 1 1 1 1 1
4 0 0 0 2 2 2 2 1,2 1 1 1 1 1 1 1
5 0 0 0 0 2 2 2 2 2 1,2 1 1 1 1 1
6 0 0 0 0 0 2 2 2 2 2 2 1,2 1 1 1
7 0 0 0 0 0 0 2 2 2 2 2 2 2 1,2 1
8 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2
9 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2
10 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2
11 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2
12 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2
13 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2
14 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2
15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
表 3- 10 g(7,7k+1,7m+3)的解規則編號表格
k m 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 3 2 1,2 1 1 0 0 0 0 0 0 0 0 0 0
2 0 3 3 2 2 1,2 1 1 1 1 1 0 0 0 0
3 0 0 3 3 3 2 2 2 1,2 1 1 1 1 1 1
4 0 0 0 3 3 3 3 2 2 2 2 1,2 1 1 1
5 0 0 0 0 3 3 3 3 3 2 2 2 2 2 1,2
6 0 0 0 0 0 3 3 3 3 3 3 2 2 2 2
7 0 0 0 0 0 0 3 3 3 3 3 3 3 2 2
8 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3
9 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3
10 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3
11 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3
12 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3
13 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3
14 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3
解規則 s3
解規則 s2 解規則 s1
解規則 s2
解規則 s1
利用線性區塊的解規則做假設,我們就可以先訂定線規則,來作解規則 s=𝑛1k+𝑛2m+𝑛3的參數猜測。最直覺的方法是使用一條斜率逐漸增加的線規則,找
在線規則內可能的解規則。因為表格是有限的,我們假設解規則在 Frobenius 表 格上被符合很多次就算成立。這個方法經實驗後,發現不夠有效率,當正確的參 數過大時,會在 Frobenius 表格上經歷太多錯誤的參數的掃描。因此我們找到一 個較佳的方法來作加速:末行檢查法。
末行檢查法是僅用最後一行來猜測解規則。由於解規則的線性區塊分布,我 們可以推測 Frobenius 表格的最後一行,也就是 m=80 的那行,會涵蓋絕大多數 的解規則,如表 3- 11 Frobenius 表格所示(在圖中以 m=15 當作最後一行)。因此,
只要檢查最後一行,解規則參數符合 3 次以上,就當作是正確的解規則。3 次是 實驗後決定的 Rule_Times_Threshold,這是由於 4 次會使得重複未滿 3 次的正確 解規則找不到,而 2 次很容易產生恰巧符合可是實際並非正確的解規則。此外,
針對正確但只符合 2 次以下的解規則,這樣的處理會在本文後面的例外處理一章 說明。
而我們會將 Frobenius 表格對應解規則的情況以另一個表格表示,稱作
Frobenius 解規則編號表格。Frobenius 解規則編號表格表示 Frobenius 表格上符 合的解規則編號。表示如表 3- 12 所示。表格中的橫、縱座標同樣代表 k、m 值,
而表格中的值則代表是第幾號解規則,如座標(1,1)是 2 號解規則,座標(1,3)是 1 號解規則;符合多個解規則,會直接再增列,如座標(1,2)同時是 1 號和 2 號解規
則,則以 1,2 表示;若是 0 號則代表不符合硬幣問題的範圍。
表 3- 11 Frobenius 表格
k m 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 21 42 42 42 42 0 0 0 0 0 0 0 0 0 0
2 0 42 63 84 84 84 84 84 84 84 84 0 0 0 0
3 0 0 63 84 105 126 126 126 126 126 126 126 126 126 126 4 0 0 0 84 105 126 147 168 168 168 168 168 168 168 168 5 0 0 0 0 105 126 147 168 189 210 210 210 210 210 210
6 0 0 0 0 0 126 147 168 189 210 231 252 252 252 252
7 0 0 0 0 0 0 147 168 189 210 231 252 273 294 294
8 0 0 0 0 0 0 0 168 189 210 231 252 273 294 315
9 0 0 0 0 0 0 0 0 189 210 231 252 273 294 315
10 0 0 0 0 0 0 0 0 0 210 231 252 273 294 315
11 0 0 0 0 0 0 0 0 0 0 231 252 273 294 315
12 0 0 0 0 0 0 0 0 0 0 0 252 273 294 315
13 0 0 0 0 0 0 0 0 0 0 0 0 273 294 315
14 0 0 0 0 0 0 0 0 0 0 0 0 0 294 315
15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 315
表 3- 12 Frobenius 解規則編號表格
k m 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 1,2 1 1 1 0 0 0 0 0 0 0 0 0 0
2 0 2 2 1,2 1 1 1 1 1 1 1 0 0 0 0
3 0 0 2 2 2 1,2 1 1 1 1 1 1 1 1 1
4 0 0 0 2 2 2 2 1,2 1 1 1 1 1 1 1
5 0 0 0 0 2 2 2 2 2 1,2 1 1 1 1 1
6 0 0 0 0 0 2 2 2 2 2 2 1,2 1 1 1
7 0 0 0 0 0 0 2 2 2 2 2 2 2 1,2 1
8 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2
9 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2
10 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2
11 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2
12 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2
13 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2
15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
猜測解規則的演算法稱作”RulesGuesser”。簡化後的解規則演算法如表 3- 13
所示:
表 3- 13 猜測解規則的演算法
由於我們要找出解規則 s=𝑛1k+𝑛2m+𝑛3的(𝑛1,𝑛2,𝑛3)參數,因此我們就假設解 規則皆為線性區塊,以“末行加速法”作加速的解規則猜測。
此外,我們也發現最小數小於 16 時,解規則 s=𝑛1k+𝑛2m+𝑛3的𝑛1、𝑛2參數皆
for(int n1=a*MIN_PARA_MULTIPLIER;paraA<=a*MAX_PARA_MULTIPLIER;paraA+=a) {
for(int n2=a*MIN_PARA_MULTIPLIER;paraB<=a*MAX_PARA_MULTIPLIER;paraB+=a) {
for(int n3=a*MIN_PARA_MULTIPLIER; constant<=a*MAX_PARA_MULTIPLIER; constant++) {
int ruleTimes=0;
int m=MAX_M;//只檢查最後一行 for(int k=MAX_K;k>=1;k--).
{
if(n1*k+n2*m+n3 ==form[k][m]) {
ruleTimes++;
} }
if(ruleTimes>=RULE_TIMES_THRESHOLD) //若是符合解規則的次數大於3 {
rulesParas[ruleNum][0]=n1; //就將解規則參數記錄下來 rulesParas[ruleNum][1]=n2;
rulesParas[ruleNum][2]=n3;
} } } }
為 a 的倍數。因此,為了做加速,演算法當中𝑛1、𝑛2只以 a 的倍數作猜測。此乃 本研究的第二個假設。將此假設稱作“倍數加速法”。
如此,就完成了基本的猜測解規則的演算法。但解規則的猜測有時還是會遇到 例外,會在第六節例外解規則處理演算法部分作處理。