问题是这样的:
假设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
答案 0 :(得分:0)
让我们按如下方式重写你的功能:
a=|a-b|
b=2*min(a,b)
现在我们可以看到,如果a
和b
之间的差异是奇数,那么a
在下一轮将是奇数(我们只是说差异是奇数),并且b
将是偶数(2*k
始终是偶数)。因此,在下一次迭代中,差异将是奇数,并且在将来的所有迭代中,a
将永远不会等于b
,并且该对是“无限”。
如果a
和b
之间的差异是偶数,那么对于所有未来的迭代(通过类似的逻辑)都是如此。要处理这种情况,让我们从最终状态向后工作。如果该对是有限的,那么迭代过程的结束将产生一对(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)