我有一个家庭作业要求我检查,对于任何三个数字,a,b,c,使得0 <= a,b,c <= 10 ^ 16,如果我可以通过添加a来达到c b彼此。诀窍是,每增加一次,它们的值就会发生变化,所以如果我们将a添加到b,那么我们就会得到数字a和a + b,而不是a和b。因此,我意识到这不是一个简单的线性方程式。
为了实现这一目标,目标编号c必须能够以下列形式表示:
c = x a + y b
通过一些测试,我发现x和y的值不能相等,也不能两者都是偶数,以便我能够达到数字c。记住这一点,以及一些涉及a,b或c等于零的特殊情况。
有什么想法吗?
编辑: 这不是欧几里德的算法,它不是一个丢番图方程,也许我用c = x a + y c的陈述误导了你。即使他们应该满足这个陈述,但这对于手头的任务还不够。
以a = 2,b = 3,c = 10为例。为了达到c,你需要在第一步中向a或b添加a到b,然后在第二步中你得到:a = 2,b = 5或a = 5,b = 3如果你继续这样做,你永远不会达到c。 Euclid的算法将提供输出yes,但很明显,你不能通过将2和3相加来达到10。
答案 0 :(得分:2)
注意:重申问题,正如我所理解的那样:假设你给出了非负整数a,b和c。是否可以通过执行零个或多个操作a = a + b
或b = b + a
的序列来达到a + b == c
的位置?
好的,在进一步研究之后,我认为你可以对你在问题中所做的陈述做一点改动:
为了使这成为可能,目标号c必须能够 以下列形式表示:
c = x a + y b
其中GCD( x , y )= 1。
(另外, x 和 y 需要是非负的;我不确定它们是否为0。)
您的原始观察结果 x 可能不等于 y (除非他们都是1)和 x 和 y 不能都是偶数,新条件GCD( x , y )= 1;所以这些观察结果是正确的,但不够强大。
如果你在程序中使用它而不是你已经拥有的测试,它可能会使测试通过。 (我不保证任何事情。)对于更快的算法,您可以使用评论中建议的扩展欧几里德算法(和Henry的答案)来找到一个 x 0 和 y 0 ;但如果GCD( x 0 , y 0 )≠1,你必须尝试其他可能性 x = x 0 + n b, y = y 0 - n a,对于某些 n (可能是否定的)。
我没有严格的证据。假设我们构造了所有对的集合 S ( x , y ),使得(1,1)在 S ,如果( x , y )在 S 中,那么( x , x < / em> + y )和( x + y , y )位于 S 。显而易见的是(1, n )和( n ,1)在所有 n的 S 中&gt;然后我们可以试着找出一些 m 和 n &gt; 1,该对( m , n )如何进入 S ?如果 m &lt; n ,只有当 m , n - m )已经在 S <时才有可能/ em>的。如果 m &gt; n ,只有当( m - n , n )已经在取值。无论哪种方式,当你不断从较大的数字中减去较小的数字时,你得到的基本上是欧几里德的算法,这意味着你将达到你的对的位置( g , g )其中 g = GCD( m , n );只有在 g = 1时,该对才在 S 中。在我看来, x 和 y 的可能值在上面的目标数c的等式中,em>正是 S 中的那些。不过,这部分是基于直觉;要使其严谨,还需要做更多的工作。
答案 1 :(得分:0)
import java.util.*;
import java.math.BigInteger;
public class Main
{
private static boolean result(long a, long b, long c)
{
long M=c%(a+b);
return (M%b == 0) || (M%a == 0);
}
}
想法:c = xa + by,因为x或y更大,我们可以用两种形式之一写出后一个等式: C = X(A + B)+(Y-x)B, C = Y(A + B)+(X-Y)一个 取决于谁更大,所以通过每次减少c + + b,c最终变为: c =(y-x)b或c =(x-y)b,因此c%b或c%a将评估为0.
答案 2 :(得分:0)
如果我们暂时忘记x
和y
应该是正数,则等式c = xa + yb要么没有,要么无限多。当c不是gcd(a,b)的倍数时,没有解决方案。
否则,调用gcd(a,b)= t使用扩展的欧几里德算法来找到d和e,使得t = da + eb。然后通过c = dc / t a + ec / t b给出一种解决方案。
很明显0 = b / t a - a / t b因此可以通过在等式中加上f的多个f来找到更多的解:
c = (dc + fb)/t a + (ec - af)/t b
当我们现在重新引入x和y必须为正或零的限制时,问题就变成找到f的值,使得x =(dc + fb)/ t和y =(ec-af)/ t都为正或零。
如果dc&lt; 0尝试使dc + fb&gt; = 0的最小f,看看ec-af是否也> = 0。
否则尝试使ec-af> = 0的最大f(负数)并检查dc + fb&gt; = 0。