给出等式:
K = Ap + Bq + Cr + Ds.
我尝试过的解决方案:
我们已经知道的术语: A,B,C,D,K
根据p,q,r找出术语s
p=0, q=0, r=1;
compute() => s = (K - Ap - Bq - Cr)/D;
继续,直到 s变为< 0; 适用于所有项p = 0,q = 0,r = 1 ... n;
同样明智地继续直到 s变为< 0; 适用于p = 0,q = 1..n,r = 1 ... n;
的所有项和
最后,继续直到 s变为< 0; 适用于p = 1..n,q = 1..n和r = 1..n;
的所有项编码3个循环以更新p,q和r。
如果K变得更大,例如1000 ...,8145,45000等,则计算需要更多时间。;
请不要建议使用外部库...我正在寻找编码解决方案。
示例代码段
for (int i = 0; i < preSpecifiedIterations; i++)
{
p = i;
if (A * p > K) //Exit condition ; if Ap > K
break;
for (int j = 0; j < preSpecifiedIterations; j++)
{
q = j;
if (B * q > K) //Exit condition ; if Bq > K
break;
for (int k = 1; k < preSpecifiedIterations; k++)
{
r = k;
// compute s given p, q, and r;
s = (K - (A * p) - (B * q) - (C * r)) / D;
if (s < 0) //Exit condition ; don't process if s < 0 i.e negative values
break;
else
...
}
}
}
此外,如果有人注意到: preSpecifiedIterations - &gt;是否有可能确定计算前需要多少次迭代?
有没有更好的算法来解决上述问题?
感谢大量阅读。
答案 0 :(得分:4)
这对StackOverflow来说不是一个很好的问题;对于其中一个数学网站来说,它更好。但无论如何我会在这里回答。
你当然可以做比蛮力更好的事情。你应该能够在几微秒内计算答案。
当且仅当(A,B,C,D)的最大公约数均匀地划分K时,存在一个解。这是Bézout身份的扩展形式。
为了确定(1)gcd是什么以及(2)p,q,r,s的值是什么,你使用扩展欧几里德算法,你可以阅读这里:
http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm
我的建议是首先编写一个程序来解决ax + by = c
形式的简单线性丢番图方程。完成后,请阅读维基百科文章“超过两个数字的情况”部分,其中介绍了如何扩展算法以处理您的案例。