无限减法循环

时间:2016-11-18 20:40:38

标签: optimization

问题是这样的:

假设a,b两个整数, 如果我们可以无限地重复以下函数,我们说(a,b)是无限的:

if a > b :
          a=a-b
          b=2*b
if b > a :
          b=b-a
          a=2*a

和' a'永远不会等于' b'在任何迭代中。

有没有办法测试两个整数是否无限而不求助于循环?

示例1:a = 1,b = 4

  (1, 4) -> (2, 3) -> (4, 1 -> (3, 2) -> (1, 4) and so on ===> Infinite

示例2:a = 3,b = 5

  (3, 5 -> (6, 2) -> (4, 4) ====> Not Infinite

2 个答案:

答案 0 :(得分:0)

让我们按如下方式重写你的功能:

a=|a-b|
b=2*min(a,b)

现在我们可以看到,如果ab之间的差异是奇数,那么a在下一轮将是奇数(我们只是说差异是奇数),并且b将是偶数(2*k始终是偶数)。因此,在下一次迭代中,差异将是奇数,并且在将来的所有迭代中,a将永远不会等于b,并且该对是“无限”。

如果ab之间的差异是偶数,那么对于所有未来的迭代(通过类似的逻辑)都是如此。要处理这种情况,让我们从最终状态向后工作。如果该对是有限的,那么迭代过程的结束将产生一对(k,k)。因此,先前迭代中的较小整数为k/2,因此较大的整数为3k/2(k/2,3k/2)。继续向后执行该过程,之前的步骤为(k/4,k/4+3k/2)=(k/4,7k/4),前面是(k/8,k/8+7k/4)=(k/8,15k/8)。如果我们抽象出这种模式,我们可以看到(m,(2^n-1)m)(任何n)形式的任何一对都是有限的。

这不是一个完整的证明,但我相信,当且仅当该对中的一个成员是另一个成员并且值小于2的幂时,偶数差异对是有限的。如果你能找到一个反例,请告诉我。

这是我过去得出结论的蛮力过程的开始:

(1,1) <- impossible
(2,2) <- (3,1)
(3,3) <- impossible
(4,4) <- (6,2) <- (7,1)
(6,6) <- (9,3)
(8,8) <- (12,4) <- (14,2) <- (15,1)
(10,10) <- (15,5)
(12,12) <- (18,6) <- (21,3)
(14,14) <- (21,7)
(16,16) <- (24,8) <- (28,4) <- (30,2) <- (31,1)
           [*3]      [*7]      [*15]     [*31]
(18,18) <- (27,9)
(20,20) <- (30,10) <- (35,5)

谢谢,这很有趣。

答案 1 :(得分:0)

考虑函数的前半部分,其中a> b。如果迭代后这仍然是迭代,我们有: enter image description here

对于某些“n”,“无限”条件是 n = b n 。所以 enter image description here

当一些 k &lt; k 时,函数的后半部分只是交换(a,b)。 B'的子>ķ

a0 < b0(1+2k+1)

如果 0 是b 0 的倍数,并且某些因素(1 + 2 k + 1 )数 'k'。

这是另一个问题。当a = 2 k ·b时,您可以丢弃任何对(a,b)。你只需要测试几个k而一个&gt; 2 k ·b

注意

我没有检查过我的所有数学。您可能会发现错误。一般的想法仍然存在。

注2

@Nvioli发现了一个错误。正确的因素是(2 k + 1 -1)