## MARS - sample C code generation session

This hypertext page shows how to automatically generate C code corresponding to solving a multipolynomial system. The generated C code calls routines and uses data structures in the MARS/C library. The automatically generated code can be cut-and-pasted into a file and compiled, and calling the generated function "testSolveSystem" should print out the computed roots.

User inputs the multipolynomial

>fnArray := eval(array(1 .. 2,[x^2+6*x+3*y-4, y^2+2*x-7*y+5]));

fnArray := [x^2 + 6 x + 3 y - 4, y^2 + 2 x - 7 y + 5]

• User inputs the variables he wants hidden

>varArray := array(1 .. 1,[x]);

varArray := [x]

• User calls Bezout function (to compute the Bezout formulation resultant) with the multipolynomial, the desired hidden variables, and the unhidden variable

...

> q := Bezout(eval(fnArray),eval(varArray),y);

q := [[x^2 + 6 x + 3 y - 4, y^2 + 2 x - 7 y + 5], [x], y, [[2, 1, 1, 1]], [[48 y - 38 - 6 y^2,-5 - y^2 + 7 y],[ -5 - y^2 + 7 y, -2 ]],, [1, x], 0, 0, 0, 0]

• User calls resultantCCode function to generate C code for numerically solving the multipolynomial system

> resultantCCode(q);

void fn1 (complex *vars, complex *rslt)

{

double t0;

double y , x ;

y = vars[0].real;

x =vars[ 1 ].real;

rslt->imag = 0;

t0 = x*x+6.0*x+3.0*y-4.0;

rslt->real = t0;

}

void fn2 (complex *vars, complex *rslt)

{

double t0;

double y , x ;

y = vars[0].real;

x =vars[ 1 ].real;

rslt->imag = 0;

t0 = y*y+2.0*x-7.0*y+5.0;

rslt->real = t0;

}

void testSolveSystem()

{

int i,j,k;

resultant resultant;

cmatrix *solns;

double t0;

int extractionRecipe[ 1 ][4] = { { 2 , 1 , 1 , 1 }, };

int *extractionRecipePtrs[ 1 ];

void ((*fn[ 2 ])(complex *, complex *)) = { fn1 , fn2 , };

for (i = 0; i < 1 ;++i) extractionRecipePtrs[i] = &extractionRecipe[i][0];

resultant.uDim = 0 ;

resultant.numVars = 1 ;

resultant.extractionRecipe = extractionRecipePtrs;

resultant.fn = fn;

resultant.matPoly = zerosMatrixPolynomial( 2 /*maxDegree*/, 2 /*size*/);

t0 = -38.0;

resultant.matPoly->matPoly[ 0 ]->mat[ 0 ][ 0 ] = t0;

t0 = 48.0;

resultant.matPoly->matPoly[ 1 ]->mat[ 0 ][ 0 ] = t0;

t0 = -6.0;

resultant.matPoly->matPoly[ 2 ]->mat[ 0 ][ 0 ] = t0;

t0 = -5.0;

resultant.matPoly->matPoly[ 0 ]->mat[ 0 ][ 1 ] = t0;

t0 = 7.0;

resultant.matPoly->matPoly[ 1 ]->mat[ 0 ][ 1 ] = t0;

t0 = -1.0;

resultant.matPoly->matPoly[ 2 ]->mat[ 0 ][ 1 ] = t0;

t0 = -5.0;

resultant.matPoly->matPoly[ 0 ]->mat[ 1 ][ 0 ] = t0;

t0 = 7.0;

resultant.matPoly->matPoly[ 1 ]->mat[ 1 ][ 0 ] = t0;

t0 = -1.0;

resultant.matPoly->matPoly[ 2 ]->mat[ 1 ][ 0 ] = t0;

t0 = -2.0;

resultant.matPoly->matPoly[ 0 ]->mat[ 1 ][ 1 ] = t0;

solns = zerosCMatrix(1,1);

solveResultant(&resultant,solns,0);

printCMatrix(solns);

}