• 沒有找到結果。

解規則可由 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 的倍數作猜測。此乃 本研究的第二個假設。將此假設稱作“倍數加速法”。

如此,就完成了基本的猜測解規則的演算法。但解規則的猜測有時還是會遇到 例外,會在第六節例外解規則處理演算法部分作處理。

相關文件