我寻找一种方法来确定是否有一个解决的方程,例如: 3N1 + 4N2 + 5n3 = 456 的,其中的 N1,N2,N3 的是正整数。
或者更一般的:是否有零或正整数的 N1,N2,N3 的...,解决了方程的 k1n1 + k2n2 + k3n3 ... = M 的,其中的 K1,K2,K3 的...和 M 的已知正整数。
我并不需要找到一个解决方案 - 只是为了确定一个解决方案存在
。编辑:
关于实际使用这种算法的:
在一个通信库,我要决定是否根据其大小给定的消息是有效的,处理信息之前。
例如:我知道,一个消息包含零或更多的3-字节元件,零或更多的4-字节元素,和零或更多的5字节的元件。我收到的456个字节的消息,我想前进一步检查其内容,以确定其有效性。
当然,邮件的标题包含每种元素的个数,但我想通过传递类似对&LT,使创检查在通信库水平; MSGTYPE,矢量< 3,4 ,5个;>
你问如果经常EX pression
(XXX | XXXX | XXXXX)*
匹配XX ... x,其中x发生456次
下面是为O中的溶液(N + A ^ 2),其中一个是最小的左侧的数字(在本例3)。
假设你的号码是6,7,15。我会打电话给一些EX pressible形式6X + 7Y + 15Z可用。你要检查一个给定的数字是可用的。
如果你能够获得一些数n,那么可以肯定你将能够获得N + 6,N + 12,N + 18 - 一般来说,N + 6K对于所有的k> = 0。另一边,如果你不能得到一些数n,则n-6是肯定不会用太(如果你能得到(N-6),然后(N-6)+ 6 = N是可用),这表示正-12,N-18,N-6K不可没有。
假设你已经确定了15可用,但9不是。在我们的情况下,15 = 6 * 0 + 7 * 0 + 15 * 1,但将不能够得到9以任何方式。因此,我们的previous推理,15 + 6K适用于所有的k> = 0和9-6k对于所有的k> = 0是没有的。如果你有一些数字,除以6给出了3作为剩余物(3,9,15,21,...),您可以快速回答:数字< = 9不适,数> = 15是
这足以确定除以6所有可能的余(即0,1,2,3,4,5)什么是最小的数字,这是可用的。 (我刚已经表明,这个号码对其余3是15)。
如何做到这一点:创建一个顶点0,1,2,3,4,5图。对于您所提供的所有数字K(7,15 - 我们漠视6)从x添加一个边缘(X + K)模6.给它的重量(X + K)DIV 6.使用的