什么是映射缩减功能

时间:2016-09-22 12:09:25

标签: python complexity-theory turing-machines

这是(我认为)复杂性理论中容易出现的问题。

#Consider the language E over the binary alphabet
#consisting of strings representing even non-negative
#integers (with leading zeros allowed).  
#I.e. E = {x | x[-1] == '0'}.
#
#Reduce E to the language {'Even'} by implementing
#the function R
def R(x):
    #Code


def main():
    #test cases
    assert(R('10010') in ['Even'])
    assert(R('110011') not in ['Even'])

if __name__ == '__main__':
    main()

根据Mapping Reduction def:
“语言A映射可缩减为语言B,写为A≤mB, 如果有可计算函数f:Σ* - →Σ*,其中每w, w∈A⇐⇒f(w)∈B。 函数f称为从A到B的减少。“
可计算的映射函数将是f(n)= 2n(或Python中的x <&lt; y),但在那种情况下,那些断言没有意义,因为每个R(x)应该在{'Even'中} ...

1 个答案:

答案 0 :(得分:0)

所以基本上你有E作为整数的二进制表示,只有偶数。这由最后一位(整数1)表示为0。所有其他数字代表2的倍数,因此无关紧要。

目标&#34;语言&#34;仅由字符串"Even"组成。也就是说,每个偶数都必须映射到单词"Even"

所以分配实际上是:如果x表示偶数二进制数,则返回"Even",否则返回其他内容。

最直接的方法是检查偶数二进制数的定义:

def R(x):  # shortest/fastest option
    return 'Even' if x[-1] == 0 else ''

def Rdocs(x):
    """
    Map any of {x | x[-1] == '0'} to {'Even'}

    Uses the definition {x | x[-1] == '0'}
    """
    if x[-1] == '0':  # check that x satisfies definition of even binary
        return 'Even'
    return ''

也可以使用显式映射来完成此操作:

translate = {'0': 'Even', '1': ''}
def Rmap(x, default=''):
    """
    Map any of {x | x[-1] == '0'} to {'Even'}

    Uses a literal mapping of x[-1]
    """
    return translate[x[-1]]

或者,您可以将二进制文件转换为数字。 Python的int类型也采用二进制文字:

def Rbin(x):
    """
    Map any of {x | x[-1] == '0'} to {'Even'}

    Uses python builtin to evaluate binary
    """
    return '' if int(x, 2) % 2 else 'Even'

我从技术上讲,R(x)应为<{1}}中的每个x定义,除非您假设每个语言都隐含地包含空字。然而,你的单元测试表明它必须返回一些东西。您可能希望返回{x | x[-1] == '0'}'Odd'而不是空字。