如果我们已经知道 GCD(a, b),我们如何找到 GCD(k + a, k + b)?

Posted

技术标签:

【中文标题】如果我们已经知道 GCD(a, b),我们如何找到 GCD(k + a, k + b)?【英文标题】:How we can find GCD(k + a, k + b) if we already know the GCD(a, b)? 【发布时间】:2021-05-09 19:44:30 【问题描述】:

我想知道是否可以在恒定时间内计算上述目标。我需要它来解决 codechef 上的问题。

【问题讨论】:

我投票结束这个问题,因为它是一个数学问题,因此属于 Math Stack Exchange。 @gspr 如何在恒定时间内计算某些东西(如果可能的话)是一个与编程相关的问题。数学和计算机科学之间的界限并不清晰。 @JohnColeman:我同意数学和 CS 之间的界限是模糊的。关于这个问题是否最适合数学或 CS 堆栈交换,这绝对是一个悬而未决的问题,但我不明白它是如何属于 SO 的。 【参考方案1】:

仅知道gcd(a,b),不可能在恒定时间内计算gcd(a+k,b+k)

假设c,d 是任意两个带有d < c 的自然数。

a = d - d = 0
b = c - d
k = d

那么我们知道O(1)时间

gcd(a,b) = gcd(0, c - d) = c - d

如果我们可以在O(1) 额外的时间内计算gcd(a+k,b+k) = gcd(c,d),那么我们可以在O(1) 时间内计算所有 gcd,这是不可能的。

说了这么多,当然有可能在某些感兴趣的情况下,gcd(a,b) 的知识可能会导致 gcd(a+k,b+k) 的计算速度比其他情况更快。

【讨论】:

以上是关于如果我们已经知道 GCD(a, b),我们如何找到 GCD(k + a, k + b)?的主要内容,如果未能解决你的问题,请参考以下文章

codeforce 1152C. Neko does Maths(欧几里得算法)

将两个整数的乘积除以它们的 gcd 的结果不正确

Uva 11889 Benefit (lcm与gcd)

求解ax + by = c 这类方程

扩展欧几里得算法+推论

欧几里得算法