Algorithm 确定线性丢番图方程非负值解存在性的算法
我正在寻找一种方法来确定方程是否有解,例如: 3n1+4n2+5n3=456,其中n1、n2、n3为正整数 或更一般的:是否有零或正整数n1、n2、n3。。。这就解决了方程k1n1+k2n2+k3n3…=m,其中k1,k2,k3。。。和m是已知的正整数 我不需要找到解决方案——只要确定是否存在解决方案 编辑: 关于该算法的实际使用: 在通信库中,我希望在处理消息之前,根据给定消息的大小确定其是否有效。 例如:我知道消息包含零个或多个3字节元素、零个或多个4字节元素以及零个或多个5字节元素。我收到一条456字节的消息,我想在进一步检查其内容之前确定其有效性。Algorithm 确定线性丢番图方程非负值解存在性的算法,algorithm,math,number-theory,Algorithm,Math,Number Theory,我正在寻找一种方法来确定方程是否有解,例如: 3n1+4n2+5n3=456,其中n1、n2、n3为正整数 或更一般的:是否有零或正整数n1、n2、n3。。。这就解决了方程k1n1+k2n2+k3n3…=m,其中k1,k2,k3。。。和m是已知的正整数 我不需要找到解决方案——只要确定是否存在解决方案 编辑: 关于该算法的实际使用: 在通信库中,我希望在处理消息之前,根据给定消息的大小确定其是否有效。 例如:我知道消息包含零个或多个3字节元素、零个或多个4字节元素以及零个或多个5字节元素。我收到
当然,消息的标题包含每种类型的元素数量,但是我想在通信库级别进行第一次检查,通过传递类似于
pair
的内容,看起来你在谈论一个具有整数约束的不等式系统。事实上,您正在为这个系统解决:
k1n1+k2n2+k3n3...=m
n1 >= 0
n2 >= 0
n3 >= 0
还有一个附加约束,即n1,n2,n3是整数。这是个问题。不幸的是,解决这样一个系统的一般情况是。但是,有许多算法可以为您解决此问题。蛮力方法(伪代码):
另见
编辑:在通信库中,这没有意义,因为它需要立即工作。在OP的应用程序中,我可能会使用某种散列,但他的方法听起来很有趣。根据,如果{n1,n2,n3,…}的最大公因数不是m的除数,那么就没有解。本页仅显示了{n1,n2}的示例,但它扩展到了更大的系统。新问题是编写一个算法来寻找最大公因式,但从原始问题的角度来看,这是微不足道的
你的算法的一部分会找到gcf({n1,n2,…}),然后看看它是否是m的一个因子。如果不是,那么就不存在解决方案。这并不能完全表明存在一个解决方案,但它可以快速地向您显示不存在任何解决方案,这仍然很有用。下面是关于2号案例的一些信息。我还没有弄清楚如何扩展它: 给定2个相对素数的整数x和y,存在正整数a和b,使得所有
c>=(x-1)(y-1)
基本上,这是因为,如果你假设x1,用GCD除以x,y,c
如果c>(x-1)(y-1),则返回true
否则就是暴力
对于暴力:
if int(c/y) >= c*y^(-1) mod x, return true,
else return false
这与n>3的问题有关。您要问的是正则表达式
(xxx | xxxx | xxxxx)*
匹配xx…x,其中x出现456次
这是O(n+a^2)中的一个解,其中a是左侧数字中最小的一个(在本例中为3)
假设你的数字是6,7,15。我会把一个可以用6x+7y+15z表示的号码称为“可用”。您需要检查给定的号码是否可用
如果你能得到一些数字n,那么你肯定能得到n+6,n+12,n+18——一般来说,n+6k对于所有的k>=0。另一方面,如果你不能得到一些数字n,那么n-6肯定也不可用(如果你能得到(n-6),那么(n-6)+6=n将可用),这意味着n-12、n-18、n-6k也不可用
假设您已确定15个可用,但9个不可用。在我们的例子中,15=6*0+7*0+15*1,但无论如何都不能得到9。因此,根据我们前面的推理,15+6k适用于所有k>=0,9-6k适用于所有k>=0。如果你有一个数字,除以6得到3作为余数(3,9,15,21,…),你可以很快回答:数字=15是
对于所有可能的除6的余数(即0,1,2,3,4,5),确定可用的最小数就足够了。(我刚刚表明,其余3的数字是15)
方法:创建顶点为0,1,2,3,4,5的图形。对于给定的所有数字k(7,15-我们忽略6),添加一条从x到(x+k)mod 6的边。赋予它重量(x+k)第6部分。使用0作为初始节点。该算法找到的距离正是我们正在搜索的数字
在我们的例子(6,7,15)中,数字7产生0->1(权重1),1->2(权重1),2->3(权重1),…,5->0(权重1),数字15产生0->3(权重2),1->4(权重2),…,5->1(权重2)。从0到3的最短路径有一条边-其权重为2。所以6*2+3=15是给出3作为余数的最小数。6*1+3=9不可用(我们之前手动检查过)
与正则表达式的联系是什么?每个正则表达式都有一个等价的有限自动机,我构造了其中一个
这个问题(允许多个查询)出现在上,我翻译了解决方案。现在,如果你听到一个人说计算机科学对真正的程序员没有用处,就当面揍他一顿。也许以下信息无关紧要,因为它不能处理一般情况,但是
如果问题是确定给定的正整数K是否可以形成为非负整数n1、n2、n3的和3*n1+4*n2+5*n3
,那么对于K>=3,答案是“是”
Rosen的著名教科书离散数学及其应用,p。第六版第287页,证明了“每12美分或以上的邮资都可以用4美分和5美分的邮票形成”,使用归纳法
基本步骤是12美分的邮票可以用3枚4美分的邮票组成
归纳步骤考虑如果p(k)为真,则使用四分s
if int(c/y) >= c*y^(-1) mod x, return true,
else return false