<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/239424</link>
    <title>MATLAB Central Newsreader - Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</title>
    <description>Feed for thread: Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Tue, 18 Nov 2008 15:34:02 -0500</pubDate>
      <title>Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/239424#611529</link>
      <author>Oriole </author>
      <description>Hello, &lt;br&gt;
&lt;br&gt;
I am wondering how to write a function for solving&lt;br&gt;
&lt;br&gt;
a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k&lt;br&gt;
&lt;br&gt;
where&lt;br&gt;
Inputs: &lt;br&gt;
n, k, and vector of non-negaive integer coefficients a=[a_1, a_2, ...a_n].     &lt;br&gt;
k is some small positive integer, for example, k= 3, or k= 6, n is rather large positve integer, for example,, n = 20, or n= 60 or in some rare cases even n=100.&lt;br&gt;
&lt;br&gt;
Output:&lt;br&gt;
The unknowns x_1, x_2, ...x_n are non-negative integers.&lt;br&gt;
&lt;br&gt;
I have asked a simplier version of this problem here, where a=[1, 1, ...1], and got lots of help from Walter, Bruno, Roger, John (thank you). &lt;br&gt;
&lt;br&gt;
But this problem... seems really difficult,  is it even possible to solve it in Matlab? Any ideas?&lt;br&gt;
&lt;br&gt;
Thank you for your help!&lt;br&gt;
Oriole&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Thank you!!</description>
    </item>
    <item>
      <pubDate>Tue, 18 Nov 2008 16:18:02 -0500</pubDate>
      <title>Re: Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/239424#611543</link>
      <author>Matt </author>
      <description>&quot;Oriole &quot; &amp;lt;oriole_ni@hotmail.com&amp;gt; wrote in message &amp;lt;gfun9a$41t$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Hello, &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I am wondering how to write a function for solving&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; where&lt;br&gt;
&amp;gt; Inputs: &lt;br&gt;
&amp;gt; n, k, and vector of non-negaive integer coefficients a=[a_1, a_2, ...a_n].     &lt;br&gt;
&amp;gt; k is some small positive integer, for example, k= 3, or k= 6, n is rather large positve integer, for example,, n = 20, or n= 60 or in some rare cases even n=100.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Output:&lt;br&gt;
&amp;gt; The unknowns x_1, x_2, ...x_n are non-negative integers.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I have asked a simplier version of this problem here, where a=[1, 1, ...1], and got lots of help from Walter, Bruno, Roger, John (thank you). &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; But this problem... seems really difficult,  is it even possible to solve it in Matlab? Any ideas?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Thank you for your help!&lt;br&gt;
&amp;gt; Oriole&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
As I'm sure you realize, this problem may not have a solution. &lt;br&gt;
&lt;br&gt;
However, if it does have one, it looks like it could be solved efficiently by modeling the problem as a Markov Decision Process and using dynamic programming. Not sure if you have a background  in that. If not, a useful reference is Chapt 4 in&lt;br&gt;
&lt;br&gt;
&quot;Markov Decision Processes: Discrete Stochastic Dynamic Programming&quot; by M.L. Puterman&lt;br&gt;
&lt;br&gt;
Basically, the idea is to model this as a sequence of n decisions in a controlled Markov chain as follows:&lt;br&gt;
&lt;br&gt;
The initial state is s_0=k. &lt;br&gt;
&lt;br&gt;
The 1st decision is the chosen value of x_1 and causes a state transition to s_1=k-a_1*x_1 with cost=0.&lt;br&gt;
&lt;br&gt;
Thereafter, the m-th state transition is from s_(m-1) to s_m=s_(m-1)-a_m*k_m also with cost 0.&lt;br&gt;
&lt;br&gt;
After n decisions you will have a terminal cost equal to s_n, which is the residual amount&lt;br&gt;
&lt;br&gt;
a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n - k&lt;br&gt;
&lt;br&gt;
that you want to minimize.&lt;br&gt;
&lt;br&gt;
This terminal cost will also be your total cost, because we've set all other decision costs to zero. Dynamic programming will minimize this total cost and give you a solution x_1...x_n (if it exists).&lt;br&gt;
&lt;br&gt;
Hope this helps.</description>
    </item>
    <item>
      <pubDate>Tue, 18 Nov 2008 16:25:03 -0500</pubDate>
      <title>Re: Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/239424#611547</link>
      <author>John D'Errico</author>
      <description>&quot;Oriole &quot; &amp;lt;oriole_ni@hotmail.com&amp;gt; wrote in message &amp;lt;gfun9a$41t$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Hello, &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I am wondering how to write a function for solving&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; where&lt;br&gt;
&amp;gt; Inputs: &lt;br&gt;
&amp;gt; n, k, and vector of non-negaive integer coefficients a=[a_1, a_2, ...a_n].     &lt;br&gt;
&amp;gt; k is some small positive integer, for example, k= 3, or k= 6, n is rather large positve integer, for example,, n = 20, or n= 60 or in some rare cases even n=100.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Output:&lt;br&gt;
&amp;gt; The unknowns x_1, x_2, ...x_n are non-negative integers.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I have asked a simplier version of this problem here, where a=[1, 1, ...1], and got lots of help from Walter, Bruno, Roger, John (thank you). &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; But this problem... seems really difficult,  is it even possible to solve it in Matlab? Any ideas?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Thank you for your help!&lt;br&gt;
&amp;gt; Oriole&lt;br&gt;
&lt;br&gt;
This is a Diophantine equation, as is the partitions&lt;br&gt;
problem, which is just a special case of the&lt;br&gt;
general Diophantine equation.&lt;br&gt;
&lt;br&gt;
For n very large, this is a nasty problem. You can still&lt;br&gt;
solve it recursively as we have shown you, but that&lt;br&gt;
may be computationally expensive.&lt;br&gt;
&lt;br&gt;
John</description>
    </item>
    <item>
      <pubDate>Tue, 18 Nov 2008 16:27:01 -0500</pubDate>
      <title>Re: Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/239424#611549</link>
      <author>Matt </author>
      <description>&lt;br&gt;
&amp;gt; Thereafter, the m-th state transition is from s_(m-1) to s_m=s_(m-1)-a_m*k_m also with cost 0.&lt;br&gt;
&lt;br&gt;
Sorry, this should be s_(m-1) to s_m=s_(m-1)-a_m*x_m&lt;br&gt;
&lt;br&gt;
Note also that the decision variables will be restricted to 1&amp;lt;=x_m&amp;lt;=k&lt;br&gt;
&lt;br&gt;
&amp;gt; After n decisions you will have a terminal cost equal to s_n, which is the residual amount&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n - k&lt;br&gt;
&lt;br&gt;
And this should be&lt;br&gt;
&lt;br&gt;
k-a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n&lt;br&gt;
&lt;br&gt;
....But hopefully you get the idea</description>
    </item>
    <item>
      <pubDate>Tue, 18 Nov 2008 18:33:03 -0500</pubDate>
      <title>Re: Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/239424#611604</link>
      <author>John D'Errico</author>
      <description>&quot;John D'Errico&quot; &amp;lt;woodchips@rochester.rr.com&amp;gt; wrote in message &amp;lt;gfuq8v$n6o$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &quot;Oriole &quot; &amp;lt;oriole_ni@hotmail.com&amp;gt; wrote in message &amp;lt;gfun9a$41t$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; Hello, &lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; I am wondering how to write a function for solving&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; where&lt;br&gt;
&amp;gt; &amp;gt; Inputs: &lt;br&gt;
&amp;gt; &amp;gt; n, k, and vector of non-negaive integer coefficients a=[a_1, a_2, ...a_n].     &lt;br&gt;
&amp;gt; &amp;gt; k is some small positive integer, for example, k= 3, or k= 6, n is rather large positve integer, for example,, n = 20, or n= 60 or in some rare cases even n=100.&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Output:&lt;br&gt;
&amp;gt; &amp;gt; The unknowns x_1, x_2, ...x_n are non-negative integers.&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; I have asked a simplier version of this problem here, where a=[1, 1, ...1], and got lots of help from Walter, Bruno, Roger, John (thank you). &lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; But this problem... seems really difficult,  is it even possible to solve it in Matlab? Any ideas?&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Thank you for your help!&lt;br&gt;
&amp;gt; &amp;gt; Oriole&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; This is a Diophantine equation, as is the partitions&lt;br&gt;
&amp;gt; problem, which is just a special case of the&lt;br&gt;
&amp;gt; general Diophantine equation.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; For n very large, this is a nasty problem. You can still&lt;br&gt;
&amp;gt; solve it recursively as we have shown you, but that&lt;br&gt;
&amp;gt; may be computationally expensive.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; John&lt;br&gt;
&lt;br&gt;
For kicks, I wrote a simple recursive code to compute&lt;br&gt;
the integer solutions. For a problem with 15 coefficients,&lt;br&gt;
it runs reasonably quickly, for small k (k = 5 here.)&lt;br&gt;
&lt;br&gt;
A = rem(1:6,3)+1&lt;br&gt;
A =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2     3     1     2     3     1&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Each row of x is a solution.&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; x = diophantine(A,5,0:5)&lt;br&gt;
x =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1     1     0     0     0     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2     0     1     0     0     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     1     2     0     0     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1     0     3     0     0     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     5     0     0     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     1     0     1     0     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1     0     1     1     0     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     3     1     0     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     1     2     0     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1     0     0     0     1     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     2     0     1     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     0     1     1     0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2     0     0     0     0     1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     1     1     0     0     1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1     0     2     0     0     1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     4     0     0     1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1     0     0     1     0     1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     2     1     0     1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     0     2     0     1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     1     0     1     1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     1     0     0     0     2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1     0     1     0     0     2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     3     0     0     2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     1     1     0     2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     0     0     1     2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1     0     0     0     0     3&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     2     0     0     3&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     0     1     0     3&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     1     0     0     4&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0     0     0     0     0     5&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; tic,x = diophantine(rem(1:15,3)+1,5,0:5);toc&lt;br&gt;
Elapsed time is 1.112639 seconds.&lt;br&gt;
&amp;gt;&amp;gt; size(x)&lt;br&gt;
ans =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;476    15&lt;br&gt;
&lt;br&gt;
tic,x = diophantine(rem(1:20,3)+1,5,0:5);toc&lt;br&gt;
Elapsed time is 2.848407 seconds.&lt;br&gt;
&amp;gt;&amp;gt; size(x)&lt;br&gt;
ans =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1008          20&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; tic,x = diophantine(rem(1:25,3)+1,5,0:5);toc&lt;br&gt;
Elapsed time is 8.448537 seconds.&lt;br&gt;
&amp;gt;&amp;gt; size(x)&lt;br&gt;
ans =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2592          25&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; tic,x = diophantine(rem(1:30,3)+1,5,0:5);toc&lt;br&gt;
Elapsed time is 19.793219 seconds.&lt;br&gt;
&amp;gt;&amp;gt; size(x)&lt;br&gt;
ans =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5402          30&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Expect this to be slow for most serious problems. &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
function xsol = diophantine(A,c,xset)&lt;br&gt;
% solves the diophantine equation dot(A,x) = c, where x is a member of xset&lt;br&gt;
% &lt;br&gt;
% arguments&lt;br&gt;
%  A    - row vector of length p, integer coefficients&lt;br&gt;
%  c    - scalar (integer) constant&lt;br&gt;
%  xset - set to sample from, sampling with replacement&lt;br&gt;
%  &lt;br&gt;
%  xsol - mxp array of solutions found&lt;br&gt;
&lt;br&gt;
% check sizes, shapes&lt;br&gt;
A = A(:)';&lt;br&gt;
p = length(A);&lt;br&gt;
xset = xset(:);&lt;br&gt;
nx = length(xset);&lt;br&gt;
&lt;br&gt;
xsol = zeros(0,p);&lt;br&gt;
if length(A) == 1&lt;br&gt;
&amp;nbsp;&amp;nbsp;ind = find((A*xset - c) == 0);&lt;br&gt;
&amp;nbsp;&amp;nbsp;if ~isempty(ind)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xsol = xset(ind);&lt;br&gt;
&amp;nbsp;&amp;nbsp;end&lt;br&gt;
else&lt;br&gt;
&amp;nbsp;&amp;nbsp;% recursive calls&lt;br&gt;
&amp;nbsp;&amp;nbsp;for i = 1:nx&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (c-A(end)*xset(i))&amp;gt;=0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xsub = diophantine(A(1:(end-1)),c-A(end)*xset(i),xset);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nsub = size(xsub,1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xsol = [xsol;[xsub,repmat(xset(i),nsub,1)]];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
Have fun,&lt;br&gt;
John</description>
    </item>
    <item>
      <pubDate>Tue, 18 Nov 2008 19:19:01 -0500</pubDate>
      <title>Re: Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/239424#611617</link>
      <author>Roger Stafford</author>
      <description>&quot;Oriole &quot; &amp;lt;oriole_ni@hotmail.com&amp;gt; wrote in message &amp;lt;gfun9a$41t$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; I am wondering how to write a function for solving&lt;br&gt;
&amp;gt; ........&lt;br&gt;
&amp;gt; Oriole&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;It looks as though John has already done the problem for you.  It is the way I would have done it, using recursion.  For the small k you mention it should not lead to excessive computation times.&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;About the only thing original I can contribute is that your restriction of the a values to being only non-negative, as opposed to positive, integers seems inappropriate.  Any time you have a solution with one of the a's, say a_i, equal to zero, there will be infinitely many solutions with all possible non-negative values for x_i and that would lead to a failure of John's recursive algorithm.  You should really restrict the a's to being just the positive integers.&lt;br&gt;
&lt;br&gt;
Roger Stafford</description>
    </item>
    <item>
      <pubDate>Tue, 18 Nov 2008 20:43:02 -0500</pubDate>
      <title>Re: Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/239424#611636</link>
      <author>Matt </author>
      <description>&quot;Oriole &quot; &amp;lt;oriole_ni@hotmail.com&amp;gt; wrote in message &amp;lt;gfun9a$41t$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Hello, &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I am wondering how to write a function for solving&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; where&lt;br&gt;
&amp;gt; Inputs: &lt;br&gt;
&amp;gt; n, k, and vector of non-negaive integer coefficients a=[a_1, a_2, ...a_n].     &lt;br&gt;
&amp;gt; k is some small positive integer, for example, k= 3, or k= 6, n is rather large positve integer, for example,, n = 20, or n= 60 or in some rare cases even n=100.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Output:&lt;br&gt;
&amp;gt; The unknowns x_1, x_2, ...x_n are non-negative integers.&lt;br&gt;
&lt;br&gt;
It wasn't clear to me whether you were looking for one solution or all of them.&lt;br&gt;
If you require only one solution,  my dynamic programming idea is applicable and I've implemented it below. It is quite fast, even for n=100&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; aa=round(rand(1,100)*10+2);&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; tic;  xx=dioph(aa,50); toc  %test for n=100 and k=50&lt;br&gt;
Elapsed time is 0.000800 seconds.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Of course, I don't know if my aa test vector is representative of your application...&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
###############################&lt;br&gt;
&lt;br&gt;
function xx=dioph(aa,kk)&lt;br&gt;
%Finds non-negative integer solution xx to the equation&lt;br&gt;
%&lt;br&gt;
%   aa'*xx=kk&lt;br&gt;
%&lt;br&gt;
% where aa is a strictly positive integer vector and kk is a non-negative&lt;br&gt;
% scalar&lt;br&gt;
&lt;br&gt;
if any(aa-round(aa))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error 'Not integer valued a'&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
if any(aa&amp;lt;=0)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error 'Should be strictly positive a'&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
nn=length(aa);&lt;br&gt;
states=(-1:kk).';&lt;br&gt;
Nstates=kk+2;&lt;br&gt;
Nactions=kk+1;&lt;br&gt;
&lt;br&gt;
Smap=repmat(states,[1,Nactions]);&lt;br&gt;
Dmap=repmat((0:kk),[Nstates,1]);&lt;br&gt;
&lt;br&gt;
TerminalCost=states;  TerminalCost(1)=2*kk;&lt;br&gt;
&lt;br&gt;
Value=TerminalCost;&lt;br&gt;
StateAction=zeros(Nstates,Nactions);&lt;br&gt;
&lt;br&gt;
for ii=1:nn&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;M=Smap-aa(ii)*Dmap;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;M(M&amp;lt;0)=-1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;M=M+2;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Value,StateAction(:,ii)]=min(Value(M),[],2);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StateAction(:,ii)=StateAction(:,ii)-1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (Value(end)==0)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastStage=ii;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
xx=zeros(1,nn);&lt;br&gt;
TheState=kk;&lt;br&gt;
&lt;br&gt;
for jj=LastStage:-1:1&lt;br&gt;
&lt;br&gt;
&amp;nbsp;TheAction=StateAction(TheState+2,jj);&lt;br&gt;
&amp;nbsp;xx(jj)=TheAction;&lt;br&gt;
&amp;nbsp;TheState=TheState-aa(jj)*TheAction;&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
end</description>
    </item>
    <item>
      <pubDate>Thu, 20 Nov 2008 20:28:02 -0500</pubDate>
      <title>Re: Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/239424#612203</link>
      <author>Bruno Luong</author>
      <description>Hi Oriole,&lt;br&gt;
&lt;br&gt;
I have wrote a code for this problem few months backs. Here is the main function. Please save it in a file intlin.m. This is recursion algo, but call for integer common division properties and linear programming to accelerate the computation.&lt;br&gt;
&lt;br&gt;
A test file will follow.&lt;br&gt;
&lt;br&gt;
Bruno&lt;br&gt;
&lt;br&gt;
PS: this is from an old thread&lt;br&gt;
&lt;a href=&quot;http://www.mathworks.com/matlabcentral/newsreader/view_thread/172882&quot;&gt;http://www.mathworks.com/matlabcentral/newsreader/view_thread/172882&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br&gt;
&lt;br&gt;
function x = intlin(a, b)&lt;br&gt;
% function x = intlin(a, b)&lt;br&gt;
%&lt;br&gt;
% PURPOSE: solving integer equation:&lt;br&gt;
%   &lt;br&gt;
%   x(1)*a(1) + x(2)*a(2) + ... + x(n)*a(n) = b&lt;br&gt;
%   x &amp;gt;=0&lt;br&gt;
%&lt;br&gt;
% Input: a (1 x n) integer (could be negative)&lt;br&gt;
%        b (1 x 1) integer (could be negative)&lt;br&gt;
% Output: x (n x 1) integer such that&lt;br&gt;
%          a*x = b, x&amp;gt;=0&lt;br&gt;
%&lt;br&gt;
% Author: Bruno Luong&lt;br&gt;
% Last update: 24/July/2008&lt;br&gt;
&lt;br&gt;
% Default value, empty solution&lt;br&gt;
x = zeros(0,length(a));&lt;br&gt;
&lt;br&gt;
if ~isscalar(b)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf('b must be scalar\n');    &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% cast to double, and reshape as long thin array&lt;br&gt;
a = double(a(:));&lt;br&gt;
b = double(b);&lt;br&gt;
&lt;br&gt;
if ~all(mod(a,1)==0) ||  mod(b,1)~=0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf('a and b must be integers\n');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% d*a' = g&lt;br&gt;
[g d] = gcdn(a);&lt;br&gt;
&lt;br&gt;
if mod(b,g)==0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;an = a/g;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bn = b/g;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% (d*a' = b) OR (d*an' = bn)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d = bn*d;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;%&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% General gcd final solution would be&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;%    x = d + k;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;%    with k such that: k*an' = 0, and&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;%                      k&amp;gt;=-d (&amp;lt;=&amp;gt; x&amp;gt;=0)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kmin = ceil(-d);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;kmax = +inf(size(a));&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Find all k such that k.an = 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k = allintlin0(an, kmin, kmax);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = bsxfun(@plus, d, k);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
else % mode(b,g)~=0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf('WARNING: there is no solution\n');    &lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
function x = allintlin0(a, lower, upper)&lt;br&gt;
%&lt;br&gt;
% x, a, lower, upper are n-dimensional vector&lt;br&gt;
% List all interger x such that&lt;br&gt;
%    x.a = 0&lt;br&gt;
%    lower &amp;lt;= x &amp;lt;= upper&lt;br&gt;
%&lt;br&gt;
&lt;br&gt;
a = a(:);&lt;br&gt;
n = length(a);&lt;br&gt;
&lt;br&gt;
lower = lower(:);&lt;br&gt;
upper = upper(:);&lt;br&gt;
% Adjust upper and lower bounds by LP&lt;br&gt;
L = lower;&lt;br&gt;
U = upper;&lt;br&gt;
b = 0;&lt;br&gt;
epsilon = 1e-6;&lt;br&gt;
for k=1:n&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cost = basis(k,n);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Beware, this is Bruno's linprog, not MATLAB one in optimization&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% tool box, the result may be different.&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sol = linprog(cost, [], [], a', b, L, U);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ~all(isinf(sol))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;L(k) = max(L(k),sol(k)-epsilon);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cost = -basis(k,n);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sol = linprog(cost, [], [], a', b, L, U);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ~all(isinf(sol))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;U(k) = min(U(k),sol(k)+epsilon);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
L = ceil(L);&lt;br&gt;
U = floor(U);&lt;br&gt;
&lt;br&gt;
if all(~isinf(L)) &amp;&amp; all(~isinf(U))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxcount = Inf;&lt;br&gt;
else % Limit the number of solutions that will be listed&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% NOTE: set maxcount to finite value doesn't work as efficienly,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% as expected because the recursive engine might spend much of&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% CPU time to look for unvalid solutions&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% maxcount = 100;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf('There is infinity of solutions\n');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = NaN;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% Call the engine&lt;br&gt;
count = 0;&lt;br&gt;
x = ilinengine(a, L, U, b, count, maxcount);&lt;br&gt;
if maxcount&amp;lt;inf&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf('WARNING: only %d solutions will be provided\n', maxcount);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = x(1:min(maxcount,end),:); % clipping&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
function v = basis(k,n) % generate a k-th basis vector of dimension n&lt;br&gt;
v = zeros(n,1);&lt;br&gt;
v(k) = 1;&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% Solver engine for integer x&lt;br&gt;
%   a*x = b&lt;br&gt;
%   lower &amp;lt;= x &amp;lt;= upper&lt;br&gt;
%   RESTRICTION: &lt;br&gt;
%   a must be primary array, i.e., they greatest common divisor is one&lt;br&gt;
function x = ilinengine(a, lower, upper, b, count, maxcount)&lt;br&gt;
&lt;br&gt;
% default value, empty result&lt;br&gt;
x = zeros(0,length(a));&lt;br&gt;
&lt;br&gt;
if count&amp;gt;maxcount&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% Trivial solution with one variable&lt;br&gt;
if length(a)==1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if mod(b,a(1))==0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xtmp = b / a(1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (xtmp &amp;gt;= lower) &amp;&amp; (xtmp &amp;lt;=upper)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = xtmp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% preliminary check where as the sum b is possible&lt;br&gt;
% This check is to speed up (?), and deos not affect the result&lt;br&gt;
as = bsxfun(@times,a,[lower upper]);&lt;br&gt;
as = sum(sort(as,2),1);&lt;br&gt;
if b&amp;lt;as(1) || b&amp;gt;as(2)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% Greatest common divisor for the tail&lt;br&gt;
g = gcdn(a(2:end));&lt;br&gt;
% find r1, the inverse of a(1) in g-modulo group&lt;br&gt;
[uno r1] = gcd(a(1),g);&lt;br&gt;
clear uno; % should be 1&lt;br&gt;
&lt;br&gt;
r=r1*mod(b,g);&lt;br&gt;
s = (b - a(1)*r)/g;&lt;br&gt;
a(2:end) = a(2:end)/g; % the tail is primary among them&lt;br&gt;
&lt;br&gt;
kmin = ceil((lower(1)-r)/g);&lt;br&gt;
kmax = floor((upper(1)-r)/g);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% perform a basic step&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function newcount = kstep(k)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Recursive call&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xk = ilinengine(a(2:end), lower(2:end), upper(2:end), ...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s-k*a(1), count, maxcount);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nxk = size(xk,1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = [x; ...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(r+g*k)+zeros(nxk,1) xk]; % append the new solutions&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newcount = count + nxk; % adjust the counter&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&lt;br&gt;
if isinf(kmin) &amp;&amp; isinf(kmax) % k is unbounded&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for absk=0:inf&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for k=unique([-absk absk])&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if kstep(k)&amp;gt;maxcount&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if count&amp;gt;maxcount&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
elseif isinf(kmin) % k has upper bound, but no lower bound&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for k=kmax:-1:-inf&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if kstep(k)&amp;gt;maxcount&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
else % k has lower bound    &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for k=kmin:kmax&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if kstep(k)&amp;gt;maxcount&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
function [g varargout] = gcdn(varargin)&lt;br&gt;
% function g = gcdn(a1, a2, ..., an);&lt;br&gt;
%&lt;br&gt;
% Return g, Greatest common divisor of a1, ... an&lt;br&gt;
%&lt;br&gt;
% [g c1 c2 ... cn]=gcdn(a1, a2, ..., an)&lt;br&gt;
%   return also c1, ..., cn&lt;br&gt;
%   So that a1*c1 + ... an*cn = g&lt;br&gt;
%&lt;br&gt;
% Compact calling form:&lt;br&gt;
%   [g c]=gcdn(a1, a2, ..., an) or [g c]=gcdn(a)&lt;br&gt;
%   assumes a and c are array&lt;br&gt;
%&lt;br&gt;
&lt;br&gt;
if nargin&amp;lt;2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = varargin{1};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if length(a)&amp;lt;2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if a&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g = abs(a);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if nargout&amp;gt;=2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;varargout{1}=sign(a);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error('gcdn cannot compute for a = 0');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = reshape(a,1,[]);&lt;br&gt;
else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Put all numbers in array&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a=cell2mat(varargin);&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
g=a(1);&lt;br&gt;
c=zeros(size(a));&lt;br&gt;
c(1)=1;&lt;br&gt;
for k=2:length(a)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[g cg c(k)]= gcd(g, a(k));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c(1:k-1) = c(1:k-1)*cg;&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
if nargout&amp;gt;=2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch (nargout-1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 1,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;varargout{1}=c;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case length(c)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;varargout=num2cell(c);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;otherwise&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error('number of output is incompatible with input');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
end</description>
    </item>
    <item>
      <pubDate>Thu, 20 Nov 2008 20:32:01 -0500</pubDate>
      <title>Re: Integer solutions for a_1*x_1+a_2*x_2+a_3*x_3+ ...+a_4*x_n = k</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/239424#612205</link>
      <author>Bruno Luong</author>
      <description>% Test program:&lt;br&gt;
&lt;br&gt;
% This example would take more or less a minute to solve&lt;br&gt;
a=[770 105 60 85 50];&lt;br&gt;
&lt;br&gt;
b = 9435;&lt;br&gt;
&lt;br&gt;
%&lt;br&gt;
% solving&lt;br&gt;
% c1*a1 + ... cn*an = b&lt;br&gt;
% c &amp;gt;=0&lt;br&gt;
&lt;br&gt;
c = intlin(a, b);&lt;br&gt;
&lt;br&gt;
if isnan(c)    &lt;br&gt;
elseif ~isempty(c)&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf('\nSolutions c:\n\n');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;disp(c);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf('\nNumber of solutions = %d\n\n', size(c,1));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if exist('cc','var') &amp;&amp; ~ismember(cc,c,'rows')&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf('Solver miss the initial solution\n');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;%save test_inlin_debug.mat a cc b&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bverif = c*a';&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bverifu = unique(bverif);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if length(bverifu)~=1 || bverifu~=b&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf('Wrong solution(s)\n');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;disp(c(bverif~=b,:));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;%save test_inlin_debug.mat a cc b&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
else % mode(b,g)==0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf('There is no solution\n');&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% Bruno</description>
    </item>
  </channel>
</rss>

