我正在嘗試在 Scala 中撰寫一個函式,該函式將有效的拉丁方作為輸入,然后回傳一個值,該值指示輸入的拉丁方是否是Damm AlgorithmBoolean的操作表的有效實體。Damm 演算法似乎屬于“校驗位”類錯誤檢測機制。
所需的功能是Wikipedia 文章的設計部分中描述的Damm Algorithm的含義的實作。其含義由以下斷言捕獲:
具有性質 x ? x = 0 的弱完全反對稱擬群
我的數學技能不足以正確閱讀和解釋達姆的論文,然后有足夠的德語(撰寫論文的語言)閱讀技能能夠自信地解釋我將如何編碼正確的驗證函式。
給定以下函式定義:
def validate(latinSquare: List[List[Int]]): Boolean =
???
我會用什么代替????
在論文中,提供了一個有效的 10x10 拉丁方的實體。它在 Wikipedia 文章中被轉載,如下所示:
|0 1 2 3 4 5 6 7 8 9
- -------------------
0|0 3 1 7 5 9 8 6 4 2
1|7 0 9 2 1 5 4 8 6 3
2|4 2 0 6 8 7 1 3 5 9
3|1 7 5 0 9 8 3 4 2 6
4|6 1 2 3 0 4 5 9 7 8
5|3 6 7 4 2 0 9 5 8 1
6|5 8 6 9 7 2 0 1 3 4
7|8 9 4 5 3 6 2 0 1 7
8|9 4 3 8 6 1 7 2 0 5
9|2 5 8 1 4 3 6 7 9 0
我可以看到還有其他人尋求對此的答案。然而,還沒有人提供一個請求的基于代碼的有效拉丁方解決方案。
我撰寫了一個通用的拉丁方生成器,但需要上述驗證函式作為過濾器,以消除每個不符合上述含義的必要條件的候選拉丁方。
uj5u.com熱心網友回復:
在函式式編程術語中,校驗和演算法是foldLeft經過精心挑選的二元運算。這個二元運算的要求,英文:
- 在每一個兩位數的輸入中,如果我們改變一個數字,那么校驗和就會改變(拉丁方...);
- 在每個三位輸入中,如果后兩位不同并且我們交換它們,則校驗和會發生變化(……總反對稱性較弱);
- 拉丁方格的對角線上有零。
在 Python 3 中:
def validate(latinSquare):
Q = range(len(latinSquare))
return all(
x == y
for c in Q
for x in Q
for y in Q
if latinSquare[latinSquare[c][x]][y] == latinSquare[latinSquare[c][y]][x]
) and all(latinSquare[x][x] == 0 for x in Q)
print(
validate(
[
[0, 3, 1, 7, 5, 9, 8, 6, 4, 2],
[7, 0, 9, 2, 1, 5, 4, 8, 6, 3],
[4, 2, 0, 6, 8, 7, 1, 3, 5, 9],
[1, 7, 5, 0, 9, 8, 3, 4, 2, 6],
[6, 1, 2, 3, 0, 4, 5, 9, 7, 8],
[3, 6, 7, 4, 2, 0, 9, 5, 8, 1],
[5, 8, 6, 9, 7, 2, 0, 1, 3, 4],
[8, 9, 4, 5, 3, 6, 2, 0, 1, 7],
[9, 4, 3, 8, 6, 1, 7, 2, 0, 5],
[2, 5, 8, 1, 4, 3, 6, 7, 9, 0],
]
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/480243.html
上一篇:乳膠嵌套回圈未正確顯示
下一篇:這張圖代表什么時間復雜度?
