【问题标题】:Writing a program that checks whether a linear equation has positive integer solutions编写一个程序来检查一个线性方程是否有正整数解
【发布时间】:2015-02-12 00:30:09
【问题描述】:

我正在尝试编写一个算法来确定一个线性方程,特别是 ax + by = c 的形式,对于给定的 a、b、c 是否具有正整数解。它需要高效,因为数字 a、b 和 c 可以在 0

由于它是一个丢番图方程,我尝试检查 a 和 b 的 GCD 是否除以 c,但这样我无法区分正解、负解或零解。

Algorithm to determine non-negative-values solution existance for linear diophantine equation

我在这里找到了解决方案,但我不太明白。也许有人可以为我简化它?因为这个很笼统,我只对有 2 个变量的方程感兴趣。

【问题讨论】:

    标签: algorithm math diophantine


    【解决方案1】:

    整数解的存在

    Bezout's identity 确实告诉你 gcd(a,b) 是 a 和 b 的最大公约数:

    i) gcd(a,b) 是可以写成 ax + by 的最小正整数,并且
    ii) ax + by 形式的每个整数都是gcd(a,b) 的倍数。

    所以你去。如果c 可以被gcd(a,b) 整除,那么您就有了解决方案。

    寻找积极的解决方案

    从任何一对解决方案中,我们都可以得到所有其他解决方案。因此,我们可以看看它们是否可以是积极的。仍然来自相同的身份,我们得到:

    当一对 Bézout 系数 (x0, y0) 已计算(例如,使用扩展欧几里得算法)时,所有对都可以表示为以下形式

    现在我们完成了。你所要做的就是:

    1. 使用扩展欧几里得算法,这将为您提供
      • gcd(a,b)
      • 一对(x0,y0) 这样a * x0 + b * y0 = gcd(a,b)
    2. 检查gcd(a,b) 是否除以c
      • 如果不是,则不存在解决方案。
      • 如果是这样,请将 x0y0 乘以 c / gcd(a,b) 以获得方程的解。
    3. 如果x0y0 有相同的符号,你就完成了。
      • 如果它们都是肯定的,那么你就有了肯定的解决方案,
      • 如果它们都是否定的,那么你不会。
    4. 如果x0y0有不同的符号,选择最小的(绝对值)k来改变负整数的符号。
      • 即如果x0为负数,则取k = floor(d * x0 / b)(四舍五入为-infinity)
        如果是y0 是负数,取k = ceil(-d * y0 / a)
      • 计算(x1,y1) = (x0 - k * b / d , y0 + k * a / d)
        • 如果x1y1 都是正数,则您刚刚找到了两个正整数解。
        • 如果翻转一个数字的符号会翻转另一个数字,则无法找到正解。

    请注意,它与您链接的问题有关,但变量的数量不同。这已解决,因为您只有两个变量。

    【讨论】:

    • @saurabheights c/d(现为c / gcd(a,b))。我希望现在更清楚一点。因为c除以gcd,我们知道我们乘以整数,这个乘法将我们从gcd(a,b)的解带到c的解(尝试将此乘法应用于右侧步骤 1 中的方程。)。
    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 2023-02-02
    • 2022-07-18
    • 1970-01-01
    • 2020-05-19
    • 2022-06-25
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多