如何找到将 (a,b) 转换为 (x,y) 的步骤数

How to find number of steps to transform (a,b) to (x,y)

给定 2 个数字 a=1 和 b=1。

在每个步骤中,您可以执行以下操作之一:

  1. a+=b;
  2. b+=a;

如果可以将 a 转换为 x 并将 b 转换为 y,请找到所需的最少步骤

x和y可以任意大(大于10^15)

到目前为止,我的方法只是进行递归回溯,复杂度约为 O(2^min(x,y))(太大)。 DP 也不会做,因为状态可以超过 10^15。

有什么想法吗?是否需要任何数论来解决这个问题?

P.s。这不是作业。

鉴于您达到了某个 (x,y),到达那里的唯一方法是将较小的值添加到现在较大的值中。假设 x > y,那么唯一可能的先前状态是 x-y, y.

另请注意,到达 x,y 的步数与到达 y,x 的步数相同。 所以你正在寻找的解决方案类似于

steps(x,y):
  if x < y: return steps(y, x)
  if y == 1: return x - 1 
  if y == 0: throw error  # You can't get this combination.
  return x / y + steps (y, x % y)

也就是说,在Calkin--Wilf tree中找到一个节点的深度。该节点存在当且仅当 gcd(a, b) = 1。您可以修改 gcd 算法以将操作数作为副产品给出(将沿途计算的所有商相加并减去一个)。