Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 确定线性丢番图方程非负值解存在性的算法_Algorithm_Math_Number Theory - Fatal编程技术网

Algorithm 确定线性丢番图方程非负值解存在性的算法

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字节元素。我收到

我正在寻找一种方法来确定方程是否有解,例如: 3n1+4n2+5n3=456,其中n1、n2、n3为正整数

或更一般的:是否有零或正整数n1、n2、n3。。。这就解决了方程k1n1+k2n2+k3n3…=m,其中k1,k2,k3。。。和m是已知的正整数

我不需要找到解决方案——只要确定是否存在解决方案

编辑:

关于该算法的实际使用:

在通信库中,我希望在处理消息之前,根据给定消息的大小确定其是否有效。 例如:我知道消息包含零个或多个3字节元素、零个或多个4字节元素以及零个或多个5字节元素。我收到一条456字节的消息,我想在进一步检查其内容之前确定其有效性。
当然,消息的标题包含每种类型的元素数量,但是我想在通信库级别进行第一次检查,通过传递类似于
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