Python 高效预测数字处理算法的输出

Python 高效预测数字处理算法的输出,python,algorithm,performance,sequence,prediction,Python,Algorithm,Performance,Sequence,Prediction,我正在编写一段代码,当使用两个整数m和n时,它需要能够有效地预测(最好在O(1)时间内)以下算法的输出 algorithm(m,n): history = set() while True: if (m,n) in history: return False elif n == m: return True else: history.add((m,n)) if m>n: x =

我正在编写一段代码,当使用两个整数m和n时,它需要能够有效地预测(最好在O(1)时间内)以下算法的输出

algorithm(m,n):
history = set()
while True:
    if (m,n) in history:
        return False
    elif n == m:
        return True
    else:
        history.add((m,n))
        if m>n:
            x = m-n
            y = 2*n
            m = x
            n = y
        else:
            x = 2*m
            y = n-m
            m = x
            n = y
请注意,当(m,n)出现在以下算法的历史记录中时,您已经进入了一个无限循环(即2,1->1,2->2,1…);当m==n时,算法只能再前进一步,必须终止(即5,5->10,0->10,0…)。基本上,我需要能够预测m(电流)和n(电流)是否匹配


PS,如果这个算法有名字,我很想知道。此外,如果有关于这个主题的好的阅读资料(预测数字序列等),我很想直接读到它。

首先,让我们把更新步骤减少到一行。在每次迭代中,m更新为绝对差值n更新为较小数字的两倍

else:
    history.add((m,n))
    m, n = abs(m-n), 2 * min(m, n)
这突出了迭代的非线性。每次更新分为两个类,您首先编程;在每一次进一步的迭代中,递归会分成多个类

我相信简单的答案是否定的——你无法在比简单地执行算法更短的时间内预测结果


当一个数字是另一个数字的3倍时,切换大与小的分界点。在这个空间中,算法简单地缩小了差距:将较小的减去较大的,然后将较小的减去两倍。一旦它们在3倍范围内,系统很快就会变得混乱:你不能说随着算法的进行,两个相邻的对的结果会保持在附近,而不是任何相邻的对。

假设输入正整数,当且仅当(m+n)/gcd(m,n)是2的幂时,该算法才会返回True

校样草图:

在算法开始时,将m和n除以gcd(m,n);这不会更改返回值

如果在这样做之后,m和n的和可以被奇数素数p整除,那么m和n都需要被p整除,算法才能返回True,但m和n都不能这样做


如果m和n的和是2的幂,那么在每次迭代中m和n都将被另一个2的因子整除,直到两者相等。

闻起来像@Psi:这比停止问题容易得多。我们只需要分析一个非图灵完备算法的行为。它甚至保证会停止。如果你进入一个无限循环,就不会停止,如前所述。我还是不明白这怎么可能happen@Psi:算法使用
history
集检测何时进入无限循环,并终止。对于一个无限循环的输入,没有<代码>历史>代码>,请考虑<代码>算法(1, 2)< /代码>。啊,我误解了这个句子。