繁体   English   中英

用于将两个数字相加以得出一个值的算法

[英]Algorithm for adding two numbers to reach a value

我有一项家庭作业,要求我检查任意三个数字,a,b,c是否等于0 <= a,b,c <= 10 ^ 16,如果我可以通过将a和b加到每个来达到c其他。 诀窍是,每增加一个值,它们的值都会变化,因此,如果将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或b中,然后在第二步中将得到:a = 2,b = 5或a = 5,b = 3 ,如果继续这样做,您将永远无法达到c。 Euclid的算法将提供yes的输出,但是很显然,通过将2和3彼此相加不能达到10。

注意:据我所知,要重述该问题:假设为您提供了非负整数a,b和c。 通过执行零次或多次运算a = a + bb = b + a的序列,是否有可能达到a + b == c

好的,在进一步研究之后,我认为您可以对问题中的陈述做些小的改动:

为了使之成为可能,目标号码c必须能够以以下形式表示:

a + b c = a + b

其中GCD( xy )= 1。

(此外, xy必须为非负数;我不确定它们是否可以为0。)

您最初的观察表明,新条件GCD( xy )= 1暗示x可能不等于y (除非它们都为1)并且xy都不能为偶数。 因此这些观察是正确的,但不够充分。

如果在程序中使用它而不是已有的测试,则可能会使测试通过。 (我不保证任何事情。)对于更快的算法,您可以按照注释(和亨利的答案)中的建议使用扩展Euclid算法来找到一个x 0y 0 b, y = y 0 - a, for some n (which may be negative). 但是,如果GCD( x 0y 0 )≠1,您将不得不尝试其他可能性x = x 0 + b, y = y 0 - a,对于某些n (可能为负)。

我没有严格的证明。 假设我们构造了所有对( xy )的集合S ,使得(1,1)在S中 ,并且如果( xy )在S中,则( xx + y )和( x + yy )在S中 显然,对于所有n > 1,(1, n )和( n ,1)都在S中。然后我们可以尝试找出对于m > n > 1的那对( mn )如何进入S 如果m < n ,则仅当( mn - m )已经在S中时才可行。 如果m > n ,则只有( m - nn )已经在S中才有可能。 无论哪种方式,当您不断从较大的数值中减去较小的数值时,您得到的本质上就是Euclid算法,这意味着您将碰到一对( gg ),其中g = GCD( mn ); 并且只有g = 1时,该对才在S中 。在我看来,上述方程中目标数量c的xy可能值恰好是S中的值 不过,这部分基于直觉。 要使其更加严格,还需要做更多的工作。

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)+(yx)b,c = y(a + b)+ (xy)a取决于谁更大,因此通过每次将c减小a + b,c最终变为:c =(yx)b或c =(xy)b,因此c%b或c%a的计算结果为0。

如果我们暂时忘记xy应该为正,则方程c = xa + yb要么没有,要么有很多解。 当c不是gcd(a,b)的倍数时,没有解。

否则,调用gcd(a,b)= t使用扩展的欧几里得算法找到d和e,使得t = da + eb。 然后通过c = dc / ta + ec / t b给出一种解决方案。

显然0 = b / ta-a / tb,因此可以通过将等式的倍数f加到方程中来找到更多解:

c = (dc + fb)/t a + (ec - af)/t b

现在,当我们重新引入x和y必须为正或零的限制时,问题就变成了寻找使x =(dc + fb)/ t和y =(ec-af)/ t均为正或零的f值。

如果dc <0,请尝试使dc + fb> = 0的最小f,然后查看ec-af是否也> = 0。

否则,尝试使ec-af> = 0的最大f(负数),并检查dc + fb> = 0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM