n元一次不定方程就是形如∑aixi = C的不定方程,与二元一次方程最大的区别是,系数增多,未知数增多。求取变得更复杂。但事实上,多元一次方程可以通过消元法来变换成已经完美解决的二元一次方程。
举例: 3x+4y+6z = 7,为了将3元变2元,这里我们做一个假设,设4y+6z=w,由不定方程的性质可知 2 | w,即w是2的倍数,由此我们不妨假设4y+6z=2w,将2w回代到方程中即得3x+2w=7。解此不定方程得x = 1 , w = 2。再将w = 2 回代得到4y+6z=4,解此不定方程,得y = 2, z = 2,自此满足方程的一组特解为(1 , -2 , 2)。
使用消元法可以很轻松地求得一组满足方程的特解,通解就没有那么容易了。
还是刚才的例子,我们知道X = 1 + 2n,w = 2 - 3n 是 3x + 2w = 7的通解。
把w = 2 - 3n 代入到 4y + 6z = 2w(1) 中,得 4y + 6z = 4 - 6n 。我们知道 4 y + 6 z = 2 (2)的特解为 y'0 = -1 ,z'0 = 1。由于(2)式两边乘以 w即得(1),所以y0 = -w ,z0 = w,
由特解马上可以得到通解
y = - 2 + 3n + 3n' , z = 2 - 3n - 2n'
所以此不定方程的通解为 X = 1 + 2n , y = - 2 + 3n + 3n' , Z = 2 - 3n - 2n' , n , n'为任意整数。由此可见,此不定方程的通解可以通过取向量N = (n,n')不同的值来得到。
不失一般性地,可以通过上述的办法构造成一个形如Xn = ∑λiti + q 的通项式。(相关的结论请参看相关的论文这里不再赘述)
由n元一次不定方程的通项式可知,不定方程的解可由解向量T= (t1,t2......tn)来得到。但事实在工程应用上,我们并不需要所有的解,也没办法穷举所有解。为此,我们仅仅需要满足特定范围内的解,如背包问题。因此求解带约束的不定方程是工程应用上的核心。
二元一次不定方程因为参数量只有一个,所以很容易就求解出特定范围内的解,并能精确给出解的个数。
引理2-1 设二元一次不定方程ax+by=1的解为X= x0 + b * n , Y = y0 - a * n, Xmin <= X <= Xmax, Ymin <= Y <= Ymax,那么 MAX((Xmin - x0 ) / b, (y0 - Ymax) / a) <= n <= MIN((Xmax-X0) / b, (y0 - Ymin) / a)
证明:由 X = x0 + b * n ,易得 (Xmin - x0) / b <= n <= (Xmax - x0) / b,同理可得(y0 - Ymax ) / a <= n <= ( y0 - Ymin) / a ,两式合并,即得推论结论。
由引理2-1可精确得出n的取值范围,从而可得到约束范围内的所有解。
多元一次不定方程就复杂得多了。因为方程中的每一个变元Xn都是一个向量T来组成的,因此多个变元的多个不同约束和T之间组成了一个不等式组:
X(1,min) < X1 = ∑μntn < X(1,max)
......
X(n,min) < Xn = ∑μktk < X(n,max)
因为涉及多个变量的不等式,目前还没有很好的方案可以快速解决这类问题。
前面提到的通过通解来尝试求解在特定解值范围的不定方程在工程上是非常困难的,而且也鲜有人对此进行深入研究。(可能这仅是由于我的孤陋寡闻,如果有高人有相关的数学上的结论,请不吝赐教)通过通解来求解特定范围的解理论上虽然可行,但遗憾的是其求解效率几乎与穷举法相当的。
下面介绍一种比上述方案更快速的强力快速算法。这是一种基于同余理论的快速算法。
经测试,在变元数达到20个,变量取值范围为0-150的情况下,最快运行时间1毫秒都不到,算法的最差运行时间约为几毫秒。而一般的穷举法则需要运行至少 150的20次方运算,约为3千亿亿亿亿亿次,这个数字是啥概念呢?就是用一亿台主频为3GHz的PC机并行一起跑,也要跑三百亿亿年。估计到那时地球都已经毁灭了。
我们知道二元不定方程 a * x + b * y = c 其实是与 同余方程a X = c (mod b)等价的。同理对于三元不定方程 a * x + b * y + c * z = d ,实际上也可以理解成 a * X = p (mod c),b * Y = q (mod c),设d = d' (mod c),则有 p + q = d' (mod d)。为什么会有这样的结论?原因很简单 。d - a * x + b * y = c * t0 + d' - a * c * t - p - b * c * t' - q = c * z = 0 (mod c)。
更一般化地我们有以下结论:
定理 : 设n元不定方程 ∑aixi = C 有解,则必有 C = C' (mod q) ,C' = ∑ri,其中ri是当xi取某一定值x'i时aixi关于q的最小正剩余。
使用本节开头介绍的办法即可以得到定理的证明,这里不再赘述。
举例: 8X + 5Y + 11Z + 13W = 90 ,0 <= x,y,z <= 3,q 取 5 ,90 = 0 (mod 5),先随机选取一组值B,如(4,2,4),这是因为4+2+4=10= 0(mod 5)
当8X = 4(mod5),有X = 3(mod 5),因此x = 3,同理,11Z = 2 (mod 5),z =2 (mod 5),z=2,13W = 3W = 4(mod5) ,W = 3(mod 5),w = 3,把x ,z, w代入得24 + 5y +22+ 39 = 90, 5y = 5 ,y = 1。
因此可快速求得一组解(3,1,2,3)。在这个过程中,只需要随机选定一组B值,使B1 + B2 + B3 = 0 (mod 5 )。这是相对容易的。
得到这组值后,再通过解同余方程组,就可以得到一组经过筛选的解集。然后,再从这组解里挑选满意答案,就简单得多。
当然同余筛选法也不是完美无缺的。在一些特殊情况下,会退化成近似穷举法。
举例:4X + 8Y + 7Z + 16W = 77,0 <= x,y,z,w <=3 ,如果取q = 4 ,则8Y = 0 (mod 4) , 16W = 0 (mod 4),在这个方程中,Y跟W可取任意值。因为77 = 1(mod 4),所以7Z = 1(mod 4),易得z = 3。
但现在除了能确定z = 3外,Y,W 基本上都只能是穷举。看起来好像只能穷举了,但事实上,我们有一个较为聪明的做法,由4X + 8Y + 16W = 56,可得X + 2Y + 4W = 14,其中[1,2,4]是一个超递增序列,求超递增序列的背包问题有一个快速方便的解法和结论。首先由于3 + 2 * 3 = 9 < 14 ,所以知w > 0 ,又因为 14 - 9 > 4,所以 w > 1,w取2 。则得X + 2Y = 6,因为3 < 6 ,且 6 - 3 > 2 所以y > 2,取y = 2 ,则得x =2 ,y =2 ,w =2 ,所以(2,2,3,2)是方程的一个满意解.
这时,可以引入一个更进一步的筛选过程。这是基于一个基本的逻辑,就是如果方程有满意解,则结果值不会小于所有变元取最小值时代入方程所得到的最小结果Rmin,也不会大于取最大值时所得到的结果Rmax。
还是上面的例子,取q = 5,73 = 3 (mod 5) ,取B的一组值为(1,1,1)。因为1 + 1 + 1= 3 (mod 7)。解下述同余方程组:
8Y = 1 (mod 5), Y = 2 (mod 5), y = 2
12Z = 1 (mod 5), Z = 3 (mod 5) ,z = 3。
16W = 1 (mod 5 ) ,W = 1 (mod 5) , w =1。
把y ,z ,w 代入方程即得 5X + 16 + 36 + 16 = 73 , 5X = 5 ,x = 1, 可知 (1,2,3,1)也是方程的解。
由上面的例子可以看到,只要B值取得好,算法很大机会一次就求解出方程的满意解,这就是同余筛选法强大之处。
(更多的例子读者可以自行尝试)
下面的结果是用同余筛法同时对20个系数值在0 - 10000之间,解值范围在0-150之间的变元求解10次的结果:
>>>>>>>>>>>>>>>>>>>>>>RUNGING 0th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
BASE SOLUTION : [7160461 = 25240625025 * 306 + 0 * 5090 + 0 * 9662 + 0 * 3720 + -1023945923 * 7543 + 0 * 7367 + 0 * 6407 + 0 * 6688 + 0 * 2604 + 0 * 3826 + 0 * 4342 + 0 * 3147 + 0 * 9571 + 0 * 6875 + 0 * 4294 + 0 * 4403 + 0 * 1363 + 0 * 3076 + 0 * 4836 + 0 * 2440 ]
SOLUTIONS :
[7160461 = 133 * 306 + 147 * 5090 + 113 * 9662 + 51 * 3720 + 20 * 7543 + 133 * 7367 + 16 * 6407 + 7 * 6688 + 51 * 2604 + 2 * 3826 + 58 * 4342 + 102 * 3147 + 18 * 9571 + 107 * 6875 + 61 * 4294 + 54 * 4403 + 121 * 1363 + 151 * 3076 + 149 * 4836 + 139 * 2440 ]
use time :109
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 0th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 1th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
BASE SOLUTION : [5181066 = 461114874 * 5584 + -1334124495 * 1930 + 0 * 8597 + 0 * 1862 + 0 * 3112 + 0 * 1336 + 0 * 1340 + 0 * 6131 + 0 * 9522 + 0 * 5785 + 0 * 4528 + 0 * 7248 + 0 * 1573 + 0 * 5080 + 0 * 914 + 0 * 634 + 0 * 1355 + 0 * 569 + 0 * 4866 + 0 * 8156 ]
SOLUTIONS :
[5181066 = 99 * 5584 + 148 * 1930 + 55 * 8597 + 11 * 1862 + 81 * 3112 + 23 * 1336 + 138 * 1340 + 120 * 6131 + 49 * 9522 + 30 * 5785 + 95 * 4528 + 126 * 7248 + 17 * 1573 + 111 * 5080 + 28 * 914 + 32 * 634 + 1 * 1355 + 3 * 569 + 3 * 4866 + 1 * 8156 ]
use time :29
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 1th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 2th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
BASE SOLUTION : [7175082 = -434092461 * 9436 + 491493117 * 8334 + 0 * 3895 + 0 * 8406 + 0 * 3494 + 0 * 162 + 0 * 1085 + 0 * 7948 + 0 * 4103 + 0 * 8299 + 0 * 1213 + 0 * 2326 + 0 * 9580 + 0 * 626 + 0 * 805 + 0 * 6739 + 0 * 1718 + 0 * 1568 + 0 * 338 + 0 * 9270 ]
SOLUTIONS :
[7175082 = 39 * 9436 + 9 * 8334 + 23 * 3895 + 9 * 8406 + 81 * 3494 + 131 * 162 + 119 * 1085 + 81 * 7948 + 55 * 4103 + 127 * 8299 + 41 * 1213 + 81 * 2326 + 103 * 9580 + 22 * 626 + 97 * 805 + 150 * 6739 + 116 * 1718 + 151 * 1568 + 138 * 338 + 151 * 9270 ]
use time :7
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 2th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 3th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
BASE SOLUTION : [7711445 = -3716916490 * 2542 + 1133582415 * 8335 + 0 * 6785 + 0 * 8633 + 0 * 6181 + 0 * 8661 + 0 * 9473 + 0 * 5500 + 0 * 2153 + 0 * 3326 + 0 * 7063 + 0 * 4877 + 0 * 2587 + 0 * 6656 + 0 * 8074 + 0 * 4785 + 0 * 2147 + 0 * 1647 + 0 * 6086 + 0 * 3989 ]
SOLUTIONS :
[7711445 = 37 * 2542 + 66 * 8335 + 117 * 6785 + 29 * 8633 + 85 * 6181 + 116 * 8661 + 149 * 9473 + 109 * 5500 + 13 * 2153 + 52 * 3326 + 52 * 7063 + 103 * 4877 + 7 * 2587 + 97 * 6656 + 41 * 8074 + 21 * 4785 + 56 * 2147 + 7 * 1647 + 29 * 6086 + 2 * 3989 ]
use time :8
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 3th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 4th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
BASE SOLUTION : [7248480 = 4834736160 * 7213 + -14591190240 * 2390 + 0 * 316 + 0 * 180 + 0 * 4824 + 0 * 3412 + 0 * 4559 + 0 * 8918 + 0 * 290 + 0 * 4540 + 0 * 9233 + 0 * 3566 + 0 * 4652 + 0 * 1757 + 0 * 5570 + 0 * 7807 + 0 * 8240 + 0 * 4440 + 0 * 3504 + 0 * 3671 ]
SOLUTIONS :
[7248480 = 60 * 7213 + 18 * 2390 + 45 * 316 + 148 * 180 + 5 * 4824 + 45 * 3412 + 61 * 4559 + 90 * 8918 + 18 * 290 + 9 * 4540 + 17 * 9233 + 90 * 3566 + 45 * 4652 + 67 * 1757 + 90 * 5570 + 150 * 7807 + 150 * 8240 + 150 * 4440 + 143 * 3504 + 149 * 3671 ]
use time :7
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 4th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 5th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
BASE SOLUTION : [7949486 = -5763377350 * 1601 + 1891977668 * 4877 + 0 * 2074 + 0 * 3886 + 0 * 9018 + 0 * 6613 + 0 * 4623 + 0 * 4899 + 0 * 3822 + 0 * 3166 + 0 * 5994 + 0 * 2096 + 0 * 1507 + 0 * 595 + 0 * 8992 + 0 * 3680 + 0 * 9597 + 0 * 4523 + 0 * 1200 + 0 * 9762 ]
SOLUTIONS :
[7949486 = 89 * 1601 + 61 * 4877 + 35 * 2074 + 145 * 3886 + 147 * 9018 + 35 * 6613 + 39 * 4623 + 107 * 4899 + 85 * 3822 + 81 * 3166 + 27 * 5994 + 44 * 2096 + 107 * 1507 + 137 * 595 + 151 * 8992 + 119 * 3680 + 85 * 9597 + 118 * 4523 + 96 * 1200 + 28 * 9762 ]
use time :6
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 5th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 6th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
BASE SOLUTION : [7464802 = 22252574762 * 6992 + -24133704866 * 6447 + 0 * 2360 + 0 * 5594 + 0 * 8742 + 0 * 4554 + 0 * 455 + 0 * 7984 + 0 * 141 + 0 * 3470 + 0 * 4306 + 0 * 5628 + 0 * 7199 + 0 * 5468 + 0 * 4220 + 0 * 7254 + 0 * 6315 + 0 * 3765 + 0 * 3748 + 0 * 1707 ]
SOLUTIONS :
[7464802 = 83 * 6992 + 47 * 6447 + 141 * 2360 + 141 * 5594 + 1 * 8742 + 47 * 4554 + 141 * 455 + 141 * 7984 + 3 * 141 + 141 * 3470 + 141 * 4306 + 47 * 5628 + 141 * 7199 + 141 * 5468 + 141 * 4220 + 29 * 7254 + 5 * 6315 + 11 * 3765 + 3 * 3748 + 6 * 1707 ]
use time :4
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 6th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 7th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
BASE SOLUTION : [8235162 = 3055245102 * 1211 + -1111746870 * 3328 + 0 * 6968 + 0 * 2064 + 0 * 4816 + 0 * 5659 + 0 * 7253 + 0 * 4542 + 0 * 8955 + 0 * 9579 + 0 * 215 + 0 * 8518 + 0 * 3756 + 0 * 8729 + 0 * 318 + 0 * 8799 + 0 * 900 + 0 * 6584 + 0 * 4313 + 0 * 4106 ]
SOLUTIONS :
[8235162 = 27 * 1211 + 48 * 3328 + 22 * 6968 + 5 * 2064 + 5 * 4816 + 81 * 5659 + 132 * 7253 + 151 * 4542 + 20 * 8955 + 47 * 9579 + 132 * 215 + 118 * 8518 + 66 * 3756 + 10 * 8729 + 144 * 318 + 150 * 8799 + 150 * 900 + 150 * 6584 + 151 * 4313 + 150 * 4106 ]
use time :6
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 7th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 8th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
BASE SOLUTION : [7207488 = 407223072 * 9184 + -421638048 * 8870 + 0 * 1034 + 0 * 5087 + 0 * 6036 + 0 * 3662 + 0 * 5151 + 0 * 7661 + 0 * 6980 + 0 * 4790 + 0 * 7883 + 0 * 3122 + 0 * 7109 + 0 * 7155 + 0 * 7015 + 0 * 957 + 0 * 7502 + 0 * 2422 + 0 * 1039 + 0 * 1832 ]
SOLUTIONS :
[7207488 = 81 * 9184 + 108 * 8870 + 87 * 1034 + 19 * 5087 + 13 * 6036 + 121 * 3662 + 149 * 5151 + 3 * 7661 + 126 * 6980 + 1 * 4790 + 59 * 7883 + 61 * 3122 + 7 * 7109 + 21 * 7155 + 106 * 7015 + 128 * 957 + 87 * 7502 + 133 * 2422 + 144 * 1039 + 151 * 1832 ]
use time :7
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 8th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 9th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
BASE SOLUTION : [5999140 = 4715324040 * 9481 + -19395219620 * 2305 + 0 * 468 + 0 * 1393 + 0 * 1162 + 0 * 5791 + 0 * 1852 + 0 * 2033 + 0 * 8050 + 0 * 412 + 0 * 9026 + 0 * 118 + 0 * 6345 + 0 * 602 + 0 * 7477 + 0 * 1061 + 0 * 4369 + 0 * 549 + 0 * 4671 + 0 * 5027 ]
SOLUTIONS :
[5999140 = 12 * 9481 + 118 * 2305 + 59 * 468 + 118 * 1393 + 59 * 1162 + 118 * 5791 + 59 * 1852 + 118 * 2033 + 59 * 8050 + 59 * 412 + 59 * 9026 + 6 * 118 + 118 * 6345 + 59 * 602 + 118 * 7477 + 118 * 1061 + 118 * 4369 + 118 * 549 + 54 * 4671 + 132 * 5027 ]
use time :4
>>>>>>>>>>>>USING CONGRUENCE SELECTOR ALGORITHM<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>RUNGING 9th test<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
useTime:192
算法的平均时间仅为20ms左右。而普通的穷举法即便做过优化(如通过不定方程的相关理论过滤掉一些侯选解,最后一次迭代使用扩展欧几里德算法来减少穷举等),使其也能在有限时间内求解,也需要1秒种左右,同余算法快了将近50倍。而且算法在系数值越大,测试样本数越大的情况下,算法效率提升越明显。
下面是我运行的测试数据对比:(结果单元格中第一行为同余算法的运行时间,下一行为穷举法的运行时间,单位毫秒。表示标注“>”号的均为因为耗时太长,放弃执行)
测试样本(变元数20个) |
第一次 |
第二次 |
第三次 |
第四次 |
第五次 |
系数[0-100] 解值[0-150] 测试数3000 |
3054 28919 |
3209 24274 |
3204 22681 |
3038 17555 |
3123 25023 |
系数[0-500] 解值[0-150] 测试数3000 |
4469 31338 |
4548 31175 |
4543 56673 |
4078 >5分钟 |
4410 54826 |
系数[0-1000] 解值[0-100] 测试数3000 |
3481 44706 |
3396 32105 |
3630 95823 |
3605 44353 |
3319 47750 |
系数[0-1000] 解值[0-150] 测试数30000 |
24922 >10分钟 |
24909 >10分钟 |
24789 >10分钟 |
24803 >10分钟 |
40177 618232 |
系数[0-10000] 解值[0-150] 测试数3000 |
7533 335452 |
7827 314232 |
7880 154111 |
7452 199043 |
7124 253604 |
系数[0-10000] 解值[0-150] 测试数30000 |
70895 >30分钟 |
76123 >30分钟 |
67149 >30分钟 |
70312 >30分钟 |
63526 >30分钟 |
可以轻易看出,同余算法在方程系数值大的情况下,性能损耗很少,而一般穷举法却会发生性能的急剧下降,在一些极端例子中,甚至会出现超时求解的现象。原因在于一些过滤条件,在大系数环境下,变得容易满足,使穷举法不得不穷举所有解。但同余算法受方程系数值的影响很微,在系数值<1000的情况下,几乎不受影响。
一直在讨论如何求解多元一次不定方程。那到底解多元一次方程有什么用?
首先,如果多元一次方程能找到一个在有效时间内能求得满足指定约束的解的高效算法。背包密码系统宣告告破(虽然早已被证明背包密码系统是不安全的,才有后来的RSA算法)。同时,一些较为简单的背包问题(如0-1背包问题)可以得到有效解决。
如一个有1000个变量,系数值由0-10000的背包问题,仅用了半秒不到的时间就解出来。而1000个变量的背包问题已经满足大部分情况了。(而且算法慢仅慢在初始化的时候需要对1000个数进行排序,求解的过程还是很快的)