The problem I need to solve is simple to expose. Given two strictly positive integers m and n, I want to generate and count all the matrix of dimension m (that is arrays with m lines and m columns) such that both
* each element is non negative
* the sum of elements in every line and in every column equals n.
I wrote pograms that generate and count these matrix for n as a variable but not for any dimension m. Here are programs for m=3 and for m=4. It works for any value of m.
Does anyone have a suggestion that would allow me to write a general program that works for any value of n ? How can I avoid the fact that the number of loops increases dramaticaly with n ?? Any suggestion would be of great help to me.
first program : for m=3 :
#include <iostream.h>
int max(int,int);
int main()
{
unsigned long u; // counter of matrix of dimension 3 with the
// two properties
int n; // dimension
cout<<"m=3. Enter n, the dimension of the matrix :";
cin>>n;
int c[1][1]; // c denotes any matrix with dimension m=3
//property of the sum enables us to work with a
// reduced dimension (2 instead of 3)
for (c[0][0]=0; c[0][0]<=n; c[0][0]++)
{
for (c[0][1]=0; c[0][1]<=n-c[0][0]; c[0][1]++)
{
for (c[1][0]=0; c[1][0]<=n-c[0][0]; c[1][0]++)
{
for c[1][1]=0;c[1][1]<=n-max(c[0][1], c[1][0]);c[1][1]++)
{
if (c[0][0]+c[0][1]+c[1][0]+c[1][1]>=n)
// this condition ensures that elements of the last row and
// column are positive and that every line and column has a
//total equals to n. It is the mathematical traduction that the
//last element of the matrix c[2][2] is non negative, that is that the sum of elements of the submatrix without last row an column is at least equal to (m-2)*n.
{
u=u+1;
}
}
}
}
}
}
cout<<"there exist "<<u<<"matrix with dimension 3 with positive elements and such that the total of every lign and every column equals"<<n;
return 0;
}
int max (intx,int y)
{
if (x<y) return y;
else return x;
}
second program : for m=4 :
#include <iostream.h>
int max(int,int);
int main()
{
unsigned long u; // counter of matrix of dimension 4 with the
// two properties
int n; // dimension
cout<<"m=4. Enter n, the dimension of the matrix :";
cin>>n;
int c[2][2]; // c denotes any matrix with dimension m=3
//property of the sum enables us to work with a
// reduced dimension (3 instead of 4)
for (c[0][0]=0; c[0][0]<=n; c[0][0]++)
{
for (c[0][1]=0; c[0][1]<=n-c[0][0]; c[0][1]++)
{
for (c[0][2]=0; c[0][2]<=n-c[0][0]-c[0][1]; c[0][2]++)
{
for (c[1][0]=0; c[1][0]<=n-c[0][0]; c[1][0]++)
{
for (c[2][0]=0; c[2][0]<=n-c[0][0]-c[1][0]; c[2][0]++)
{
for c[1][1]=0;c[1][1]<=n-max(c[0][1], c[1][0]);c[1][1]++)
{
for (c[2][1]=0; c[2][1]<=n-max(c[0][1]+c[1][1], c[1][0]);
c[2][1]++)
{
for (c[1][2]=0; c[1][2]<=n-max(c[1][0]+c[1][1],
c[0][1]); c[1][2]++)
{
for (c[2][2]=0; c[2][2]<=n-max(c[0][2]+c[1][2],
c[2][0]+c[2][1]); c[2][2]++)
{
if (c[0][0]+c[0][1]+c[0][2]+c[1][0]+c[1][1]+c[1][2]
+c[2][0]+c[2][1]+c[2][2]>=2*n)
// this condition ensures that elements o the last row and
// column are positive and that every line and column has a
//total equals to n. It is the mathematical traduction that the
//last element of the matrix c[3][3] is non negative, that is that the sum of elements of the submatrix without last row an column is at least equal to (m-2)*n.
{
u=u+1;
}
}
}
}
}
}
}
}
}
}
cout<<"there exist "<<u<<"matrix with dimension 4 with positive elements and such that the total of every lign and every column equals"<<n;
return 0;
}
int max (intx,int y)
{
if (x<y) return y;
else return x;
}