问题是要教电脑做补充。 计算机具有数字知识:他“知道”在1变为2之后,在2变为3之后依此类推。拥有该数据计算机可以轻松获得下一个数字。
接下来,计算机具有x+0=x
和x+(y+1)=(x+1)+y
的知识。这个公理让计算机做了补充。例如,要添加5和3,计算机会生成以下内容:5+3 = 5+(2+1) = (5+1)+2 = 6+2 = 6+(1+1) = (6+1)+1 = 7+1 = 8
。
但这样做太久了,无法以这种方式添加数字。问题是开发程序,可以使用数学和逻辑规则改进这种添加方式。目标应该是必须在O(log(N))时间内执行,而不是O(N)时间,N是附加数字的大小。
该计划是否具有任何科学价值?有没有可以做这些事情的程序?
答案 0 :(得分:8)
那些不懂算术的automatic theorem provers做你的建议:他们每次需要时都会尝试从定义中重新发明它。结果?它不能很好地工作。您可以通过提供关于算术的更高级别的一般事实来帮助这些证明者(或者作为公理,或者如果你是严格的,因为引理是单独证明的)。示例:关联性,交换性,......
它仍然不能很好地工作。似乎还有一个更直观明显的事实是,您需要向工具提供您感兴趣的特定证据。例如,x> y => x> = y,z是奇数或偶数,属性类似......
为了弥补这个问题,一些自动定理证明器在内部处理算术。在这种情况下,结果更好。简化和替代是这种证明的两个例子。
答案 1 :(得分:4)
我认为这里没有多少智慧。您的“计算机”可以remember以前添加的结果。具有无限的记忆和足够长的训练周期,它将构建(X,Y) - >的地图。任意两个数字的X + Y,允许在O(1)中执行加法。没有情报可以击败那个。
答案 2 :(得分:1)
好吧,考虑一下:计算机只使用二进制数,因此所有计算都是在二进制级别完成的。比较两个数字时,计算机应检查两个数字是否相同,并在最短数字的左侧添加0。然后,当两者长度相同时,计算机开始从左到右比较位。只要两者都是1,它们就是平等的。如果两者都是0,则它们是相等的。如果一个为0,那么数字越小,另一个数字越大。这就是你如何确定数字的顺序。
现在添加两个号码。你这次从右边开始,如果两个位都是0,结果是0.如果一个是1而另一个是0,结果是1.如果两个都是1,结果是0,一个加到两个左边的位。向左移动一个并重复。然后添加刚刚移动到该结果字节的1,这可能导致另一个1移动到左侧。 有趣的是,您只需要向左添加一次1。你决不会向左移动两个。
基本上,这就是处理器学会添加两个数字的方式。
当你开始处理大于0和1的数字时,你只会增加数学问题的复杂性。考虑到你的例子,你已经把它分成1分了。基本上,如果你加5 + 3,你将它分成(1 + 1 + 1 + 1 + 1)+(1 + 1 + 1),因此8 1。将其翻译为二进制,你得到101 + 011。右边的两个转换为0,移动1.然后1 + 0是1。添加1已移位,然后返回0,向左移动1。然后你得到0 + 1,再次是1。再加上您记得的结果为0,向左移动1。那里没有数字,所以假设两者都是0. 0加1是1。没有更多的班次,所以计算完成,你得到1000。
许多年前,当他们开发出第一台计算机但是以二进制方式添加数字时,您可能已经考虑过这个问题。 (特别是在处理大量数字时。)
答案 3 :(得分:0)
我想指定问题。计算机内存有限,时间有限)))
答案 4 :(得分:0)
O(log(N))时间对我说了一件事:二进制搜索树。
将问题视为第一个答案,但是当您累积结果时,将它们排列到一个树中,其中您搜索x,然后在x的右侧子树中搜索x + y,根据需要构建新节点。
如果没有必要从公理中动态生成树,您可以为输入数据集创建一个平衡树,然后就完成了。
答案 5 :(得分:-2)
您对计算机添加方式的假设是完全错误的。
计算机以二进制形式存储数字并进行二进制加法。 如果我们有两个2字节整数并且将5存储在一个中,而将3存储在另一个中,然后添加它们看起来像这两个数字:
00000000 00000101
00000000 00000011
_________________
00000000 00001000
无论是添加200和1143还是添加5和3,添加两个2字节整数的成本都相同。