mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-23 15:50:49 +01:00
[poincare] Change signature: polynomialDegree,
getPolynomialCoefficients, getPolynomialReducedCoefficients
This commit is contained in:
@@ -150,7 +150,7 @@ EquationStore::Error EquationStore::exactSolve(Poincare::Context * context) {
|
||||
} else {
|
||||
/* 2- Polynomial & Monovariable? */
|
||||
assert(numberOfVariables == 1 && numberOfDefinedModels() == 1);
|
||||
char x = m_variables[0];
|
||||
const char x[] = {m_variables[0], 0};
|
||||
Expression polynomialCoefficients[Expression::k_maxNumberOfPolynomialCoefficients];
|
||||
int degree = definedModelAtIndex(0)->standardForm(context).getPolynomialReducedCoefficients(x, polynomialCoefficients, *context, preferences->angleUnit());
|
||||
if (degree == 2) {
|
||||
|
||||
@@ -26,8 +26,8 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::Addition; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const override;
|
||||
|
||||
// Evaluation
|
||||
template<typename T> static Complex<T> compute(const std::complex<T> c, const std::complex<T> d) { return Complex<T>(c+d); }
|
||||
@@ -81,7 +81,7 @@ public:
|
||||
// Expression
|
||||
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit);
|
||||
Expression shallowBeautify(Context & context, Preferences::AngleUnit angleUnit);
|
||||
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const;
|
||||
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const;
|
||||
private:
|
||||
static const Number NumeralFactor(const Expression & e);
|
||||
static inline int NumberOfNonNumeralFactors(const Expression & e);
|
||||
|
||||
@@ -21,7 +21,7 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::ConfidenceInterval; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override { return -1; }
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override { return -1; }
|
||||
private:
|
||||
// Layout
|
||||
Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;
|
||||
|
||||
@@ -22,7 +22,7 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::Derivative; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
|
||||
private:
|
||||
// Layout
|
||||
|
||||
@@ -25,7 +25,7 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::Division; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
|
||||
// Approximation
|
||||
virtual Evaluation<float> approximate(SinglePrecision p, Context& context, Preferences::AngleUnit angleUnit) const override {
|
||||
|
||||
@@ -19,7 +19,7 @@ public:
|
||||
|
||||
// ExpressionNode
|
||||
Type type() const override { return Type::Equal; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override { return -1; }
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override { return -1; }
|
||||
private:
|
||||
// Simplification
|
||||
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit) override;
|
||||
|
||||
@@ -123,7 +123,7 @@ public:
|
||||
/* polynomialDegree returns:
|
||||
* - (-1) if the expression is not a polynome
|
||||
* - the degree of the polynome otherwise */
|
||||
int polynomialDegree(Context & context, char symbolName) const { return this->node()->polynomialDegree(context, symbolName); }
|
||||
int polynomialDegree(Context & context, const char * symbolName) const { return this->node()->polynomialDegree(context, symbolName); }
|
||||
/* getVariables fills the table variables with the variable present in the
|
||||
* expression and returns the number of entries in filled in variables.
|
||||
* For instance getVariables('x+y+2*w/cos(4)') would result in
|
||||
@@ -214,7 +214,7 @@ protected:
|
||||
void removeChildrenInPlace(int currentNumberOfChildren) = delete;
|
||||
|
||||
/* Properties */
|
||||
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { return node()->getPolynomialCoefficients(context, symbolName, coefficients); }
|
||||
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const { return node()->getPolynomialCoefficients(context, symbolName, coefficients); }
|
||||
|
||||
/* Simplification */
|
||||
Expression denominator(Context & context, Preferences::AngleUnit angleUnit) const { return node()->denominator(context, angleUnit); }
|
||||
@@ -232,7 +232,7 @@ private:
|
||||
|
||||
/* Properties */
|
||||
Expression defaultReplaceSymbolWithExpression(const char * symbol, Expression expression);
|
||||
int defaultGetPolynomialCoefficients(Context & context, char symbol, Expression expression[]) const;
|
||||
int defaultGetPolynomialCoefficients(Context & context, const char * symbol, Expression expression[]) const;
|
||||
|
||||
/* Expression roots/extrema solver*/
|
||||
constexpr static double k_solverPrecision = 1.0E-5;
|
||||
|
||||
@@ -101,8 +101,8 @@ public:
|
||||
virtual bool isNumber() const { return false; }
|
||||
/*!*/ virtual Expression replaceSymbolWithExpression(const char * symbol, Expression & expression);
|
||||
/*!*/ virtual Expression setSign(Sign s, Context & context, Preferences::AngleUnit angleUnit);
|
||||
virtual int polynomialDegree(Context & context, char symbolName) const;
|
||||
/*!*/ virtual int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const;
|
||||
virtual int polynomialDegree(Context & context, const char * symbolName) const;
|
||||
/*!*/ virtual int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const;
|
||||
typedef bool (*isVariableTest)(char c);
|
||||
virtual int getVariables(Context & context, isVariableTest isVariable, char * variables) const;
|
||||
virtual float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const;
|
||||
|
||||
@@ -18,8 +18,8 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::Function; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const override;
|
||||
int getVariables(Context & context, isVariableTest isVariable, char * variables) const override;
|
||||
float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ public:
|
||||
|
||||
// ExpressionNode
|
||||
Type type() const override { return Type::Integral; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
private:
|
||||
// Layout
|
||||
Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;
|
||||
|
||||
@@ -36,7 +36,7 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::Matrix; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
|
||||
// Approximation
|
||||
Evaluation<float> approximate(SinglePrecision p, Context& context, Preferences::AngleUnit angleUnit) const override {
|
||||
|
||||
@@ -22,8 +22,8 @@ public:
|
||||
// Properties
|
||||
Type type() const override { return Type::Multiplication; }
|
||||
Sign sign() const override;
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const override;
|
||||
|
||||
// Approximation
|
||||
template<typename T> static Complex<T> compute(const std::complex<T> c, const std::complex<T> d) { return Complex<T>(c*d); }
|
||||
@@ -83,7 +83,7 @@ public:
|
||||
Expression setSign(ExpressionNode::Sign s, Context & context, Preferences::AngleUnit angleUnit);
|
||||
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit);
|
||||
Expression shallowBeautify(Context & context, Preferences::AngleUnit angleUnit);
|
||||
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const;
|
||||
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const;
|
||||
Expression denominator(Context & context, Preferences::AngleUnit angleUnit) const;
|
||||
private:
|
||||
// Simplification
|
||||
|
||||
@@ -24,7 +24,7 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::Opposite; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
Sign sign() const override;
|
||||
|
||||
// Approximation
|
||||
|
||||
@@ -20,7 +20,7 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::Parenthesis; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
|
||||
// Layout
|
||||
Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;
|
||||
|
||||
@@ -27,8 +27,8 @@ public:
|
||||
Sign sign() const override;
|
||||
Expression setSign(Sign s, Context & context, Preferences::AngleUnit angleUnit) override;
|
||||
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const override;
|
||||
|
||||
template<typename T> static Complex<T> compute(const std::complex<T> c, const std::complex<T> d);
|
||||
|
||||
@@ -70,7 +70,7 @@ public:
|
||||
Power(Expression base, Expression exponent);
|
||||
Power(const PowerNode * n) : Expression(n) {}
|
||||
Expression setSign(ExpressionNode::Sign s, Context & context, Preferences::AngleUnit angleUnit);
|
||||
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const;
|
||||
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const;
|
||||
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit);
|
||||
Expression shallowBeautify(Context & context, Preferences::AngleUnit angleUnit);
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::PredictionInterval; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override { return -1; }
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override { return -1; }
|
||||
private:
|
||||
// Layout
|
||||
Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override;
|
||||
|
||||
@@ -22,7 +22,7 @@ public:
|
||||
|
||||
// ExpressionNode
|
||||
Type type() const override { return Type::Store; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override { return -1; }
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override { return -1; }
|
||||
|
||||
private:
|
||||
// Simplification
|
||||
|
||||
@@ -23,7 +23,7 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::Subtraction; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
|
||||
// Approximation
|
||||
template<typename T> static Complex<T> compute(const std::complex<T> c, const std::complex<T> d) { return Complex<T>(c - d); }
|
||||
|
||||
@@ -32,8 +32,8 @@ public:
|
||||
Type type() const override { return Type::Symbol; }
|
||||
Sign sign() const override;
|
||||
Expression replaceSymbolWithExpression(const char * symbol, Expression & expression) override;
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const override;
|
||||
int getVariables(Context & context, isVariableTest isVariable, char * variables) const override;
|
||||
float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const override;
|
||||
|
||||
@@ -81,7 +81,7 @@ public:
|
||||
// Expression
|
||||
Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit);
|
||||
Expression replaceSymbolWithExpression(const char * symbol, Expression & expression);
|
||||
int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const;
|
||||
int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const;
|
||||
|
||||
// Symbol
|
||||
const char * name() const { return node()->name(); }
|
||||
|
||||
@@ -18,7 +18,7 @@ public:
|
||||
|
||||
// Properties
|
||||
Type type() const override { return Type::Undefined; }
|
||||
int polynomialDegree(Context & context, char symbolName) const override;
|
||||
int polynomialDegree(Context & context, const char * symbolName) const override;
|
||||
Expression setSign(Sign s, Context & context, Preferences::AngleUnit angleUnit) override;
|
||||
|
||||
// Approximation
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
int AdditionNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int AdditionNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
int degree = 0;
|
||||
for (ExpressionNode * e : children()) {
|
||||
int d = e->polynomialDegree(context, symbolName);
|
||||
@@ -21,7 +21,7 @@ int AdditionNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
return degree;
|
||||
}
|
||||
|
||||
int AdditionNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
|
||||
int AdditionNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
|
||||
return Addition(this).getPolynomialCoefficients(context, symbolName, coefficients);
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ const Number Addition::NumeralFactor(const Expression & e) {
|
||||
return Rational(1);
|
||||
}
|
||||
|
||||
int Addition::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
|
||||
int Addition::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
|
||||
int deg = polynomialDegree(context, symbolName);
|
||||
if (deg < 0 || deg > Expression::k_maxPolynomialDegree) {
|
||||
return -1;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
int DerivativeNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int DerivativeNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
if (childAtIndex(0)->polynomialDegree(context, symbolName) == 0
|
||||
&& childAtIndex(1)->polynomialDegree(context, symbolName) == 0)
|
||||
{
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
int DivisionNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int DivisionNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
if (childAtIndex(1)->polynomialDegree(context, symbolName) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -105,7 +105,8 @@ bool Expression::getLinearCoefficients(char * variables, Expression coefficients
|
||||
assert(!recursivelyMatches(IsMatrix, context));
|
||||
char * x = variables;
|
||||
while (*x != 0) {
|
||||
int degree = polynomialDegree(context, *x);
|
||||
const char symbol[] = {*x, 0};
|
||||
int degree = polynomialDegree(context, symbol);
|
||||
if (degree > 1 || degree < 0) {
|
||||
return false;
|
||||
}
|
||||
@@ -116,7 +117,8 @@ bool Expression::getLinearCoefficients(char * variables, Expression coefficients
|
||||
int index = 0;
|
||||
Expression polynomialCoefficients[k_maxNumberOfPolynomialCoefficients];
|
||||
while (*x != 0) {
|
||||
int degree = equation.getPolynomialReducedCoefficients(*x, polynomialCoefficients, context, angleUnit);
|
||||
const char symbol[] = {*x, 0};
|
||||
int degree = equation.getPolynomialReducedCoefficients(symbol, polynomialCoefficients, context, angleUnit);
|
||||
switch (degree) {
|
||||
case 0:
|
||||
coefficients[index] = Rational(0);
|
||||
@@ -189,7 +191,7 @@ Expression Expression::defaultReplaceSymbolWithExpression(const char * symbol, E
|
||||
return *this;
|
||||
}
|
||||
|
||||
int Expression::defaultGetPolynomialCoefficients(Context & context, char symbol, Expression coefficients[]) const {
|
||||
int Expression::defaultGetPolynomialCoefficients(Context & context, const char * symbol, Expression coefficients[]) const {
|
||||
int deg = polynomialDegree(context, symbol);
|
||||
if (deg == 0) {
|
||||
coefficients[0] = clone();
|
||||
@@ -198,7 +200,7 @@ int Expression::defaultGetPolynomialCoefficients(Context & context, char symbol,
|
||||
return -1;
|
||||
}
|
||||
|
||||
int Expression::getPolynomialReducedCoefficients(char symbolName, Expression coefficients[], Context & context, Preferences::AngleUnit angleUnit) const {
|
||||
int Expression::getPolynomialReducedCoefficients(const char * symbolName, Expression coefficients[], Context & context, Preferences::AngleUnit angleUnit) const {
|
||||
int degree = getPolynomialCoefficients(context, symbolName, coefficients);
|
||||
for (int i = 0; i <= degree; i++) {
|
||||
coefficients[i] = coefficients[i].deepReduce(context, angleUnit);
|
||||
|
||||
@@ -13,7 +13,7 @@ Expression ExpressionNode::setSign(Sign s, Context & context, Preferences::Angle
|
||||
return Expression();
|
||||
}
|
||||
|
||||
int ExpressionNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int ExpressionNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
for (ExpressionNode * c : children()) {
|
||||
if (c->polynomialDegree(context, symbolName) != 0) {
|
||||
return -1;
|
||||
@@ -22,7 +22,7 @@ int ExpressionNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ExpressionNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
|
||||
int ExpressionNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
|
||||
return Expression(this).defaultGetPolynomialCoefficients(context, symbolName, coefficients);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
int FunctionNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int FunctionNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
Expression e = context.expressionForSymbol(Function(this));
|
||||
return e.polynomialDegree(context, symbolName);
|
||||
}
|
||||
|
||||
int FunctionNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
|
||||
int FunctionNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
|
||||
Expression e = context.expressionForSymbol(Function(this));
|
||||
return e.getPolynomialCoefficients(context, symbolName, coefficients);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
int IntegralNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int IntegralNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
if (childAtIndex(0)->polynomialDegree(context, symbolName) == 0
|
||||
&& childAtIndex(1)->polynomialDegree(context, symbolName) == 0
|
||||
&& childAtIndex(2)->polynomialDegree(context, symbolName) == 0)
|
||||
|
||||
@@ -17,7 +17,7 @@ void MatrixNode::didAddChildAtIndex(int newNumberOfChildren) {
|
||||
setNumberOfColumns(newNumberOfChildren);
|
||||
}
|
||||
|
||||
int MatrixNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int MatrixNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ ExpressionNode::Sign MultiplicationNode::sign() const {
|
||||
return (Sign)sign;
|
||||
}
|
||||
|
||||
int MultiplicationNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int MultiplicationNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
int degree = 0;
|
||||
for (ExpressionNode * c : children()) {
|
||||
int d = c->polynomialDegree(context, symbolName);
|
||||
@@ -40,7 +40,7 @@ int MultiplicationNode::polynomialDegree(Context & context, char symbolName) con
|
||||
return degree;
|
||||
}
|
||||
|
||||
int MultiplicationNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
|
||||
int MultiplicationNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
|
||||
return Multiplication(this).getPolynomialCoefficients(context, symbolName, coefficients);
|
||||
}
|
||||
|
||||
@@ -195,7 +195,7 @@ Expression Multiplication::shallowBeautify(Context & context, Preferences::Angle
|
||||
return thisExp;
|
||||
}
|
||||
|
||||
int Multiplication::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
|
||||
int Multiplication::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
|
||||
int deg = polynomialDegree(context, symbolName);
|
||||
if (deg < 0 || deg > Expression::k_maxPolynomialDegree) {
|
||||
return -1;
|
||||
|
||||
@@ -13,7 +13,7 @@ extern "C" {
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
int OppositeNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int OppositeNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
return childAtIndex(0)->polynomialDegree(context, symbolName);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
int ParenthesisNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int ParenthesisNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
return childAtIndex(0)->polynomialDegree(context, symbolName);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ Expression PowerNode::setSign(Sign s, Context & context, Preferences::AngleUnit
|
||||
return Power(this).setSign(s, context, angleUnit);
|
||||
}
|
||||
|
||||
int PowerNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int PowerNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
int deg = ExpressionNode::polynomialDegree(context, symbolName);
|
||||
if (deg == 0) {
|
||||
return deg;
|
||||
@@ -72,7 +72,7 @@ int PowerNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int PowerNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
|
||||
int PowerNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
|
||||
return Power(this).getPolynomialCoefficients(context, symbolName, coefficients);
|
||||
}
|
||||
|
||||
@@ -206,7 +206,7 @@ Expression Power::setSign(ExpressionNode::Sign s, Context & context, Preferences
|
||||
return result;
|
||||
}
|
||||
|
||||
int Power::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
|
||||
int Power::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
|
||||
int deg = polynomialDegree(context, symbolName);
|
||||
if (deg <= 0) {
|
||||
return Expression::defaultGetPolynomialCoefficients(context, symbolName, coefficients);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
int SubtractionNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int SubtractionNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
int degree = 0;
|
||||
for (ExpressionNode * e : children()) {
|
||||
int d = e->polynomialDegree(context, symbolName);
|
||||
|
||||
@@ -34,14 +34,14 @@ Expression SymbolNode::replaceSymbolWithExpression(const char * symbol, Expressi
|
||||
return Symbol(this).replaceSymbolWithExpression(symbol, expression);
|
||||
}
|
||||
|
||||
int SymbolNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
if (m_name == symbolName) {
|
||||
int SymbolNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
if (strcmp(m_name,symbolName) == 0) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SymbolNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
|
||||
int SymbolNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
|
||||
return Symbol(this).getPolynomialCoefficients(context, symbolName, coefficients);
|
||||
}
|
||||
|
||||
@@ -196,7 +196,7 @@ Expression Symbol::replaceSymbolWithExpression(const char * symbol, Expression &
|
||||
return *this;
|
||||
}
|
||||
|
||||
int Symbol::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const {
|
||||
int Symbol::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const {
|
||||
if (name() == symbolName) {
|
||||
coefficients[0] = Rational(0);
|
||||
coefficients[1] = Rational(1);
|
||||
|
||||
@@ -17,7 +17,8 @@ namespace Poincare {
|
||||
|
||||
float Trigonometry::characteristicXRange(const Expression & e, Context & context, Preferences::AngleUnit angleUnit) {
|
||||
assert(e.numberOfChildren() == 1);
|
||||
int d = e.childAtIndex(0).polynomialDegree(context, SpecialSymbols::UnknownX);
|
||||
const char x[] = {SpecialSymbols::UnknownX, 0};
|
||||
int d = e.childAtIndex(0).polynomialDegree(context, x);
|
||||
if (d < 0 || d > 1) {
|
||||
// child(0) is not linear so we cannot easily find an interesting range
|
||||
return e.childAtIndex(0).characteristicXRange(context, angleUnit);
|
||||
|
||||
@@ -9,7 +9,7 @@ extern "C" {
|
||||
|
||||
namespace Poincare {
|
||||
|
||||
int UndefinedNode::polynomialDegree(Context & context, char symbolName) const {
|
||||
int UndefinedNode::polynomialDegree(Context & context, const char * symbolName) const {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ void assert_parsed_expression_is(const char * expression, Poincare::Expression r
|
||||
quiz_assert(e.isIdenticalTo(r));
|
||||
}
|
||||
|
||||
void assert_parsed_expression_polynomial_degree(const char * expression, int degree, char symbolName) {
|
||||
void assert_parsed_expression_polynomial_degree(const char * expression, int degree, const char * symbolName) {
|
||||
GlobalContext globalContext;
|
||||
Expression e = parse_expression(expression);
|
||||
e = e.simplify(globalContext, Radian);
|
||||
|
||||
@@ -19,7 +19,7 @@ void translate_in_ASCII_chars(char * expression);
|
||||
Poincare::Expression parse_expression(const char * expression);
|
||||
void assert_parsed_expression_type(const char * expression, Poincare::ExpressionNode::Type type);
|
||||
void assert_parsed_expression_is(const char * expression, Poincare::Expression r);
|
||||
void assert_parsed_expression_polynomial_degree(const char * expression, int degree, char symbolName = 'x');
|
||||
void assert_parsed_expression_polynomial_degree(const char * expression, int degree, const char * symbolName = "x");
|
||||
|
||||
template<typename T>
|
||||
void assert_parsed_expression_evaluates_to(const char * expression, const char * approximation, Poincare::Preferences::AngleUnit angleUnit = Degree, Poincare::Preferences::ComplexFormat complexFormat = Cartesian, int numberOfSignificantDigits = -1);
|
||||
|
||||
@@ -104,7 +104,7 @@ QUIZ_CASE(poincare_get_variables) {
|
||||
assert_parsed_expression_has_variables("x^2+2*y+k!*A+w", "xykw");
|
||||
}
|
||||
|
||||
void assert_parsed_expression_has_polynomial_coefficient(const char * expression, char symbolName, const char ** coefficients, Preferences::AngleUnit angleUnit = Preferences::AngleUnit::Degree) {
|
||||
void assert_parsed_expression_has_polynomial_coefficient(const char * expression, const char * symbolName, const char ** coefficients, Preferences::AngleUnit angleUnit = Preferences::AngleUnit::Degree) {
|
||||
GlobalContext globalContext;
|
||||
Expression e = parse_expression(expression);
|
||||
quiz_assert(!e.isUninitialized());
|
||||
@@ -123,12 +123,12 @@ void assert_parsed_expression_has_polynomial_coefficient(const char * expression
|
||||
|
||||
QUIZ_CASE(poincare_get_polynomial_coefficients) {
|
||||
const char * coefficient0[] = {"2", "1", "1", 0};
|
||||
assert_parsed_expression_has_polynomial_coefficient("x^2+x+2", 'x', coefficient0);
|
||||
assert_parsed_expression_has_polynomial_coefficient("x^2+x+2", "x", coefficient0);
|
||||
const char * coefficient1[] = {"12+(-6)*P", "12", "3", 0}; //3*x^2+12*x-6*π+12
|
||||
assert_parsed_expression_has_polynomial_coefficient("3*(x+2)^2-6*P", 'x', coefficient1);
|
||||
assert_parsed_expression_has_polynomial_coefficient("3*(x+2)^2-6*P", "x", coefficient1);
|
||||
// TODO: decomment when enable 3-degree polynomes
|
||||
//const char * coefficient2[] = {"2+32*x", "2", "6", "2", 0}; //2*n^3+6*n^2+2*n+2+32*x
|
||||
//assert_parsed_expression_has_polynomial_coefficient("2*(n+1)^3-4n+32*x", 'n', coefficient2);
|
||||
//assert_parsed_expression_has_polynomial_coefficient("2*(n+1)^3-4n+32*x", "n", coefficient2);
|
||||
const char * coefficient3[] = {"1", "-P", "1", 0}; //x^2-Pi*x+1
|
||||
assert_parsed_expression_has_polynomial_coefficient("x^2-P*x+1", 'x', coefficient3);
|
||||
assert_parsed_expression_has_polynomial_coefficient("x^2-P*x+1", "x", coefficient3);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user