real_ideal_cofactors : term list -> term -> term list

SYNOPSIS
Produces cofactors proving that one real polynomial is in the ideal generated by others.

DESCRIPTION
The call real_ideal_cofactors [`p1`; ...; `pn`] `p`, where all the terms have type :real and can be considered as polynomials, will test whether p is in the ideal generated by the p1,...,pn. If so, it will return a corresponding list [`q1`; ...; `qn`] of `cofactors' such that the following is an algebraic identity (provable by REAL_RING or a slight elaboration of REAL_POLY_CONV, for example):
  p = p1 * q1 + ... + pn * qn
hence providing an explicit certificate for the ideal membership. If ideal membership does not hold, real_ideal_cofactors fails. The test is performed using a Gr\"obner basis procedure.

FAILURE CONDITIONS
Fails if the terms are ill-typed, or if ideal membership fails.

EXAMPLE
Here is a fairly simple example:
 # prioritize_real();;
 val it : unit = ()

 # real_ideal_cofactors
   [`y1 * y3 + x1 * x3`;
    `y3 * (y2 - y3) + (x2 - x3) * x3`]
   `x3 * y3 * (y1 * (x2 - x3) - x1 * (y2 - y3))`;;
 ...
val it : term list = [`&1 * y3 pow 2 + -- &1 * y2 * y3`; `&1 * y1 * y3`]
and we can confirm the identity as follows (note that REAL_IDEAL_CONV already does this directly):
  # REAL_RING `(&1 * y3 pow 2 + -- &1 * y2 * y3) * (y1 * y3 + x1 * x3) +
               (&1 * y1 * y3) * (y3 * (y2 - y3) + (x2 - x3) * x3) =
               x3 * y3 * (y1 * (x2 - x3) - x1 * (y2 - y3))`;;

COMMENTS
When we say that terms can be `considered as polynomials', we mean that initial normalization, essentially in the style of REAL_POLY_CONV, will be applied, but some complex constructs such as conditional expressions will be treated as atomic.

SEE ALSO
ideal_cofactors, int_ideal_cofactors, REAL_IDEAL_CONV, REAL_RING, RING, RING_AND_IDEAL_CONV.