Algorithm 编写一个程序,检查线性方程是否有正整数解

Algorithm 编写一个程序,检查线性方程是否有正整数解,algorithm,math,diophantine,Algorithm,Math,Diophantine,我试图写一个算法来确定一个线性方程,特别是ax+by=c的形式,对于给定的a,b,c是否有正整数解。它需要有效,因为数字a、b和c可以在整数解存在的范围内 确实告诉您,使用gcda,b是a和b的最大公约数: i gcda,b是可以写成ax+by的最小正整数,和 形式为ax+by的每个整数都是gcda,b的倍数 好了。如果c可以被gcda除以,b,那么就有解了 寻找积极的解决办法 从任何一对解决方案中,我们都可以得到所有其他解决方案。因此,我们可以看到它们是否是积极的。同样的身份,我们得到: 当一

我试图写一个算法来确定一个线性方程,特别是ax+by=c的形式,对于给定的a,b,c是否有正整数解。它需要有效,因为数字a、b和c可以在整数解存在的范围内 确实告诉您,使用gcda,b是a和b的最大公约数:

i gcda,b是可以写成ax+by的最小正整数,和 形式为ax+by的每个整数都是gcda,b的倍数

好了。如果c可以被gcda除以,b,那么就有解了

寻找积极的解决办法 从任何一对解决方案中,我们都可以得到所有其他解决方案。因此,我们可以看到它们是否是积极的。同样的身份,我们得到:

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

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

使用扩展的欧几里德算法,它将 gcda,b和 一对x0,y0,使得a*x0+b*y0=gcda,b 检查gcda,b是否除以c。 如果没有,就没有解决办法。 如果是,将x0和y0乘以c/gcda,b得到方程的解。 如果x0和y0都有相同的符号,那么就完成了。 如果两者都是积极的,你就有积极的解决方案, 如果它们都是阴性的,你就不会。 如果x0和y0具有不同的符号,请选择绝对值k中的最小值以更改负整数的符号。 也就是说,如果x0为负,则取k=floord*x0/b四舍五入到-无穷大 如果是y0,则取k=ceil-d*y0/a 计算x1,y1=x0-k*b/d,y0+k*a/d 如果x1和y1都是正的,那么您只找到了两个正整数解。 如果翻转一个数字的符号翻转另一个,你就找不到正解。 请注意,它与您链接的问题相关,但变量的数量不同。这是因为您只有两个变量。

整数解的存在性 确实告诉您,使用gcda,b是a和b的最大公约数:

i gcda,b是可以写成ax+by的最小正整数,和 形式为ax+by的每个整数都是gcda,b的倍数

好了。如果c可以被gcda除以,b,那么就有解了

寻找积极的解决办法 从任何一对解决方案中,我们都可以得到所有其他解决方案。因此,我们可以看到它们是否是积极的。同样的身份,我们得到:

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

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

使用扩展的欧几里德算法,它将 gcda,b和 一对x0,y0,使得a*x0+b*y0=gcda,b 检查gcda,b是否除以c。 如果没有,就没有解决办法。 如果是,将x0和y0乘以c/gcda,b得到方程的解。 如果x0和y0都有相同的符号,那么就完成了。 如果两者都是积极的,你就有积极的解决方案, 如果它们都是阴性的,你就不会。 如果x0和y0具有不同的符号,请选择绝对值k中的最小值以更改负整数的符号。 也就是说,如果x0为负,则取k=floord*x0/b四舍五入到-无穷大 如果是y0,则取k=ceil-d*y0/a 计算x1,y1=x0-k*b/d,y0+k*a/d 如果x1和y1都是正的,那么您只找到了两个正整数解。 如果翻转一个数字的符号翻转另一个,你就找不到正解。 请注意,它与您链接的问题相关,但变量的数量不同。这个问题解决了,因为您只有两个变量。

@saurabheights c/d现在是c/gcda,b。我希望现在更清楚一点。因为c除以gcd,我们知道我们在整数中乘以,这个乘法把我们从gcda的解b带到c的解,试着在步骤1中把这个乘法应用到方程的右边。@saurabheights c/d现在是c/gcda,b。我希望现在更清楚一点。因为c除以gcd,我们知道我们在整数中乘以,这个乘法把我们从gcda的解b带到c的解,试着在步骤1中把这个乘法应用到方程的右边。。