# Example Code: Root Solving

Root solving is (among other things) a key step in the raytracing of many of BRL-CAD’s primitives. The following examples illustrate how to solve various types of polynomial equations using BRL-CAD’s root solver.

``````#include "common.h"
#include "bu.h"
#include "vmath.h"
#include "bn.h"
#include "raytrace.h"

int
main(int argc, char *argv[])
{
bn_poly_t equation; /* holds our polynomial equation */
bn_complex_t roots[BN_MAX_POLY_DEGREE]; /* stash up to six roots */
int num_roots;

if (argc > 1)
bu_exit(1, "%s: unexpected argument(s)\n", argv);

/*********************************************
* Linear polynomial (1st degree equation):
*  A*X + B = 0
*         <= coefficients
*/
equation.dgr = 1;
equation.cf = 1;  /* A */
equation.cf = -2;  /* B */

/* print the equation */
bu_log("\n*** LINEAR ***\n");
bn_pr_poly("Solving for Linear", &equation);
/* solve for the roots */
num_roots = rt_poly_roots(&equation, roots, "My Linear Polynomial");
if (num_roots == 0) {
bu_log("No roots found!\n");
return 0;
} else if (num_roots < 0) {
bu_log("The root solver failed to converge on a solution\n");
return 1;
}

/*  A*X + B = 0
*  1*X + -2 = 0
*    X -  2 = 0
*    X      = 2
*/
/* print the roots */
bu_log("The root should be 2\n");
bn_pr_roots("My Linear Polynomial", roots, num_roots);

/*********************************************
* Quadratic polynomial (2nd degree equation):
*  A*X^2 + B*X + C = 0
*              <=coefficients
*/
equation.dgr = 2;
equation.cf = 1;  /* A */
equation.cf = 0;  /* B */
equation.cf = -4; /* C */

/* print the equation */

/* solve for the roots */
num_roots = rt_poly_roots(&equation, roots, "My Quadratic Polynomial");
if (num_roots == 0) {
bu_log("No roots found!\n");
return 0;
} else if (num_roots < 0) {
bu_log("The root solver failed to converge on a solution\n");
return 1;
}

/*  A*X^2 + B*X +  C = 0
*  1*X^2 + 0*X + -4 = 0
*    X^2       -  4 = 0
* (X - 2) * (X + 2) = 0
*  X - 2 = 0, X + 2 = 0
*  X = 2, X = -2
*/
/* print the roots */
bu_log("The roots should be 2 and -2\n");

/*****************************************
* Cubic polynomial (3rd degree equation):
*  A*X^3 + B*X^2 + C*X + D = 0
*                   <=coefficients
*/
equation.dgr = 3;
equation.cf = 45;
equation.cf = 24;
equation.cf = -7;
equation.cf = -2;

/* print the equation */
bu_log("\n*** CUBIC ***\n");
bn_pr_poly("Solving for Cubic", &equation);

/* solve for the roots */
num_roots = rt_poly_roots(&equation, roots, "My Cubic Polynomial");
if (num_roots == 0) {
bu_log("No roots found!\n");
return 0;
} else if (num_roots < 0) {
bu_log("The root solver failed to converge on a solution\n");
return 1;
}

/* print the roots */
bu_log("The roots should be 1/3, -1/5, and -2/3\n");
bn_pr_roots("My Cubic Polynomial", roots, num_roots);

/*******************************************
* Quartic polynomial (4th degree equation):
*  A*X^4 + B*X^3 + C*X^2 + D*X + E = 0
*                        <=coefficients
*/
equation.dgr = 4;
equation.cf = 2;
equation.cf = 4;
equation.cf = -26;
equation.cf = -28;
equation.cf = 48;

/* print the equation */
bu_log("\n*** QUARTIC ***\n");
bn_pr_poly("Solving for Quartic", &equation);

/* solve for the roots */
num_roots = rt_poly_roots(&equation, roots, "My Quartic Polynomial");
if (num_roots == 0) {
bu_log("No roots found!\n");
return 0;
} else if (num_roots < 0) {
bu_log("The root solver failed to converge on a solution\n");
return 1;
}
/* print the roots */
bu_log("The roots should be 3, 1, -2, -4\n");
bn_pr_roots("My Quartic Polynomial", roots, num_roots);

/*******************************************
* Sextic polynomial (6th degree equation):
*  A*X^6 + B*X^5 + C*X^4 + D*X^3 + E*X^2 + F*X + G = 0
*                               <=coefficients
*/

equation.dgr = 6;
equation.cf = 1;
equation.cf = -8;
equation.cf = 32;
equation.cf = -78;
equation.cf = 121;
equation.cf = -110;
equation.cf = 50;

/* print the equation */
bu_log("\n*** SEXTIC ***\n");
bn_pr_poly("Solving for Sextic", &equation);

/* solve for the roots */
num_roots = rt_poly_roots(&equation, roots, "My Sextic Polynomial");
if (num_roots == 0) {
bu_log("No roots found!\n");
return 0;
} else if (num_roots < 0) {
bu_log("The root solver failed to converge on a solution\n");
return 1;
}

/* print the roots */
bu_log("The roots should be 1 - i, 1 + i, 2 - i,2 + i, 1 - 2*i, 1 + 2*i \n");
bn_pr_roots("My Sextic Polynomial", roots, num_roots);

return 0;
}``````