gpt4 book ai didi

binary - 用于二进制数加法和比较的图灵机

转载 作者:行者123 更新时间:2023-12-03 23:10:05 26 4
gpt4 key购买 nike

今天是个好日子!

我正在尝试解决这个问题 Exercise 为学习目的。有人可以指导我解决这三个问题吗?

就像我尝试了第一个问题,以“+”分隔的 2 个二进制数相加。在那里我通过用相应数量的 1 或零表示每个数字来尝试 2 个数字加法,例如 5 = 1 1 1 1 1 或 0 0 0 0 0 然后将它们相加,结果也将采用与表示相同的格式,但如何添加或表示 2 个二进制文件并用 + 分隔它们,没有得到任何线索。图灵机的头部会从左边移动到加号然后左右移动+号吗?但是将如何执行添加。就我的一点知识而言,TM 不能简单地添加二进制文件,我们必须制定一些逻辑来表示它的二进制文件,就像简单地将 2 个数字相加一样。比较2个二进制文件的情况类似吗?
问候

最佳答案

我将从问题 2 和 3 开始,因为它们实际上比问题 1 容易。

我们假设我们有有效的输入(两边的非空二进制字符串,没有前导零),所以我们不需要做任何输入验证。要检查数字是否相等,我们可以简单地在 = 符号上来回弹跳并一次划掉一位数字。如果我们在任何时候发现不匹配,我们就会拒绝。如果我们在左边有一个数字,而在右边找不到一个,我们就拒绝。如果左边的数字用完而右边还有一些,我们拒绝。否则,我们接受。

Q    T    Q'    T'    D

q0 0 q1 X right // read the next (or first) symbol
q0 1 q2 X right // of the first binary number, or
q0 = q7 = right // recognize no next is available

q1 0 q1 0 right // skip ahead to the = symbol while
q1 1 q1 1 right // using state to remember which
q1 = q3 = right // symbol we need to look for
q2 0 q2 0 right
q2 1 q2 1 right
q2 = q4 = right

q3 X q3 X right // skip any crossed-out symbols
q3 0 q5 X left // in the second binary number
q3 1,b rej 1 left // then, make sure the next
q4 X q4 X,b right // available digit exists and
q4 0,b rej 0,b left // matches the one remembered
q4 1 q5 X left // otherwise, reject

q5 X q5 X left // find the = while ignoring
q5 = q6 = left // any crossed-out symbols

q6 0 q6 0 left // find the last crossed-out
q6 1 q6 1 left // symbol in the first binary
q6 X q0 X right // number, then move right
// and start over

q7 X q7 X right // we ran out of symbols
q7 b acc b left // in the first binary number,
q7 0,1 rej 0,1 left // make sure we already ran out
// in the second as well

这个 TM 可以首先通过确保两个二进制字符串都是非空的并且不包含前导零(划掉它找到的任何东西)来清理输入。

做“大于”,你可以很容易地做到以下几点:
  • 检查第一个二进制数的长度(去除前导零后)是否大于、等于或小于第二个二进制数(去除前导零后)的长度。如果第一个比第二个长,请接受。如果第一个比第二个短,则拒绝。否则,继续执行步骤 2。
  • 像在另一个问题中一样检查相等性,但是如果在任何时候第一个数字中有 1 并且在第二个数字中有 0,则接受。这是有效的,因为我们知道没有前导零,数字具有相同的位数,并且我们正在按重要性的降序检查数字。如果您发现其他不匹配或您确定数字相等,则拒绝。

  • 要添加数字,问题说要递增和递减,但我觉得只添加进位不会太难。该程序的概要是这样的:
  • 以进位 = 0 开始。
  • 转到第一个数字的最低有效位。进入状态(dig=X,carry=0)
  • 转到第二个数字的最低有效位。转到状态 (sum=(X+Y+carry)%2,carry=(X+Y+carry)/2)
  • 跟随第二个数字并写下总和数字。
  • 返回并继续该过程,直到其中一个数字用完数字。
  • 然后,继续使用仍然有数字的任何数字,只添加这些数字和进位。
  • 最后,删除原始输入并将总和向后复制到磁带的开头。

  • 磁带可能经历的不同步骤的示例:
    #1011+101#
    #101X+101#
    #101X+10X#
    #101X+10X=#
    #101X+10X=0#
    #10XX+10X=0#
    #10XX+1XX=0#
    #10XX+1XX=00#
    #1XXX+1XX=00#
    #1XXX+XXX=00#
    #1XXX+XXX=000#
    #XXXX+XXX=000#
    #XXXX+XXX=0000#
    #XXXX+XXX=00001#
    #XXXX+XXX=0000#
    #1XXX+XXX=0000#
    #1XXX+XXX=000#
    #10XX+XXX=000#
    #10XX+XXX=00#
    #100X+XXX=00#
    #100X+XXX=0#
    #1000+XXX=0#
    #1000+XXX=#
    #10000XXX=#
    #10000XXX#
    #10000XX#
    #10000X#
    #10000#

    关于binary - 用于二进制数加法和比较的图灵机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59045832/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com