我正在努力理解Quote Notation并尝试在Python中构建一个简单的引用计算器。我有来自浮点数的转换,现在我正在尝试理解一些算法。在尝试编写一个可以将两个引号加在一起的函数时,我发现我迷失了。链接的维基百科条目读取"在引用符号中,添加,添加,"这令人沮丧无益。即使在他们提供的示例中,我也找不到将引号添加到一起而不将它们转换回浮点数的方法,这会使目的失效。
什么是可以将两个引号组合在一起而不转换为浮点数的算法?谢谢!
答案 0 :(得分:2)
“要添加,只需添加”是一个正确的描述,但遗漏了一个实用的重要终止条件。 (它也没有明确说明这些数字必须首先在它们的小数点处对齐,这可能是因为原始论文的作者认为该程序隐含在“只是添加”中。)
回想一下,引号前面的数字被认为是向左无限重复。要添加两个数字,我们只是以正常方式向右工作。
如果我们天真地这样做,算法永远不会完成,因为隐式表示是无限的。但它的输出必须最终开始循环,因为它实际上是一个有限状态机。也就是说,一旦我们在引号的左侧,求和算法的状态完全取决于:
可能状态的数量最多是两个循环长度乘积的两倍(更准确地说,它是循环长度的最小公倍数的两倍)。由于存在有限数量的状态,因此某些状态必须重复,这意味着序列的其余部分是循环的。
您可以使用类似tortoise and hare算法的内容来查找具有O(1)额外内存的重复状态。但是,没有找到最短的代表性。一旦找到循环前缀,就必须通过尽可能地改变该循环来规范化数字。 (如果第一个数字与引号后的数字相同,您可以将循环向右移动;如果是,则删除第一个数字,将引号向右移动一个位置,然后重复直到数字不同。)