假设我有一个由S
组成的{0₁, ¯1₂, 0₂, 1₂, ¯2₃, ¯1₃, 0₃, 1₃, 2₃, ¯3₄, ¯2₄, ¯1₄, 0₄, 1₄, 2₄, 3₄}
集。我想在S
上定义以下操作:
S < 0
当且仅当S
为否定时才会返回一个。¯S
返回S
的否定。S + 0
返回S
加零,S
不变。S + 1
返回S
的绝对值加1,以下标为模。例如:
¯1₃ + 1
和1₃ + 1
都评估为2₃
。¯2₃ + 1
和2₃ + 1
都评估为0₃
。0₃ + 1
的计算结果为1₃
。S ¢ 0
,返回S + 0
的{{3}},即零。S ¢ 1
返回S + 1
的进位,当且仅当S + 1 = 0ₙ
为n > 1
时才会返回。此信息可以以真值表的形式捕获:
S S<0 ¯S S+0 S+1 S¢0 S¢1
┌───┬───┬───┬───┬───┬───┬───┐
│ 0₁│ 0 │ 0₁│ 0₁│ 0₁│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│¯1₂│ 1 │ 1₂│¯1₂│ 0₂│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│ 0₂│ 0 │ 0₂│ 0₂│ 1₂│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 1₂│ 0 │¯1₂│ 1₂│ 0₂│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯2₃│ 1 │ 2₃│¯2₃│ 0₃│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯1₃│ 1 │ 1₃│¯1₃│ 2₃│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 0₃│ 0 │ 0₃│ 0₃│ 1₃│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 1₃│ 0 │¯1₃│ 1₃│ 2₃│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 2₃│ 0 │¯2₃│ 2₃│ 0₃│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯3₄│ 1 │ 3₄│¯3₄│ 0₄│ 0 │ 1 │
├───┼───┼───┼───┼───┼───┼───┤
│¯2₄│ 1 │ 2₄│¯2₄│ 3₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│¯1₄│ 1 │ 1₄│¯1₄│ 2₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 0₄│ 0 │ 0₄│ 0₄│ 1₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 1₄│ 0 │¯1₄│ 1₄│ 2₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 2₄│ 0 │¯2₄│ 2₄│ 3₄│ 0 │ 0 │
├───┼───┼───┼───┼───┼───┼───┤
│ 3₄│ 0 │¯3₄│ 3₄│ 0₄│ 0 │ 1 │
└───┴───┴───┴───┴───┴───┴───┘
我想要做的是将这个多值真值表转换为一个布尔真值表,以便我可以使用按位运算符来实现并行化操作。听起来很简单。将0000
分配给0₁
,0001
分配给¯1₂
,......,1111
分配给3₄
。解决生成的carry以获得Karnaugh map或CNF表达式并将其称为一天。
不幸的是,使用S
到布尔值的这种天真映射,生成的CNF或DNF表达式可能效率不高。我想找到一种最有效的方法来将这个多值真值表表示为一个布尔真值表。这里,有效地意味着使用最少的运算符来实现各种操作,优选地按顺序添加,否定,进位和比较。但问题是,有16!
或20922789888000
种方式将S
映射到布尔值。找到解决方案是否有比蛮力更好的方法?
答案 0 :(得分:1)
我无法想到这个问题的一般解决方案,但这是我的问题的具体解决方案。我们首先将集S
潜入两个不相交的集S₁
和S₂
。集S₁
将包含0₁
和下标₄
元素。集S₂
将包含下标₂
和下标₃
元素:
S₁ = {0₁, ¯3₄, ¯2₄, ¯1₄, 0₄, 1₄, 2₄, 3₄}
S₂ = {¯1₂, 0₂, 1₂, ¯2₃, ¯1₃, 0₃, 1₃, 2₃}
S = S₁ ∪ S₂
现在,我们可以分别为S₁
和S₂
解决此问题。但是,我们希望以解决方案类似的方式来实现。因此,当我们将它们组合时,我们可以利用相似性来减少所涉及的操作数量。这是我提出的解决方案:
关于我的解决方案,有两点需要注意:
C'D'
列。因此,使用C+D
可以轻松选择其余元素。这将在以后派上用场。B
行中,与相应的正元素位于同一列中。这使得否定和检查是否容易消极。无论如何,这里是使用按位运算符实现的操作(A, B, C, D) ∈ S
:
(A, B, C, D) < 0 = B (C + D)
¯(A, B, C, D) = (A, B ^ (C + D), C, D)
(A, B, C, D) + M =
E = C D
N = M'
(A, B N + M E,
C N + M (A ^ C ^ D ^ A E),
D N + M D' (B + C))
(A, B, C, D) ¢ M = M D (A + C)
添加,携带,否定和比较所需的操作次数分别为18,3,2和2。请注意,对于否定,我们只需要修改B
,另外我们不需要修改A
。 Common subexpression elimination和xor操作用于减少操作。
我不知道是否可以做得比这更好。这是我提出的最佳解决方案。