/// <summary> /// Evaluates the degree of the single-variable monomial <see cref="signal"/>. /// </summary> /// <returns> /// <see cref="UndefinedSymbol"/> if <see cref="signal"/> is not a single-variable monomial. /// <see cref="NegativeInfinitySymbol"/> if <see cref="signal"/> is zero. /// Otherwise an <see cref="IntegerValue"/> representing the asked degree. /// </returns> /// <remarks><see cref="signal"/> is assumed to be automatic simplified.</remarks> public static ValueStructure MonomialDegree(Signal signal, Signal variable) { if (signal == null) { throw new ArgumentNullException("signal"); } if (IsConstantAdditiveIdentity(signal)) { return(NegativeInfinitySymbol.Instance); } if (IsAlwaysRational(signal)) { return(IntegerValue.Zero); } if (signal.IsDrivenByPortEntity("Multiply", "Std") && signal.DrivenByPort.InputSignalCount == 2 && IsAlwaysRational(signal.DrivenByPort.InputSignals[0])) { signal = signal.DrivenByPort.InputSignals[1]; } if (signal.Equals(variable)) { return(IntegerValue.One); } if (signal.IsDrivenByPortEntity("Power", "Std")) { Signal b = signal.DrivenByPort.InputSignals[0]; Signal e = signal.DrivenByPort.InputSignals[1]; if (b.Equals(variable) && Std.IsAlwaysPositiveInteger(e)) { return(e.Value); } } return(UndefinedSymbol.Instance); }
/// <summary> /// Checks whether a signal is a single variable monomial, e.g. '2*x^3' /// </summary> /// <remarks><see cref="signal"/> is assumed to be automatic simplified</remarks> public static bool IsMonomial(Signal signal, Signal variable) { if (signal == null) { throw new ArgumentNullException("signal"); } if (IsAlwaysRational(signal)) { return(true); } if (signal.IsDrivenByPortEntity("Multiply", "Std") && signal.DrivenByPort.InputSignalCount == 2 && IsAlwaysRational(signal.DrivenByPort.InputSignals[0])) { signal = signal.DrivenByPort.InputSignals[1]; } if (signal.Equals(variable)) { return(true); } if (signal.IsDrivenByPortEntity("Power", "Std")) { Signal b = signal.DrivenByPort.InputSignals[0]; Signal e = signal.DrivenByPort.InputSignals[1]; if (b.Equals(variable) && Std.IsAlwaysPositiveInteger(e)) { return(true); } } return(false); }
/// <summary> /// Returns the coefficient factor in the monomial <see cref="signal"/> /// </summary> /// <returns> /// Constant UndefinedSymbol if <see cref="signal"/> is not a single-variable monomial. /// Otherwise the coefficient factor of the term. /// </returns> /// </returns> /// <remarks><see cref="signal"/> is assumed to be automatic simplified.</remarks> public static Signal MonomialCoefficient(Signal signal, Signal variable, out ValueStructure degree) { if (signal == null) { throw new ArgumentNullException("signal"); } if (IsConstantAdditiveIdentity(signal)) { degree = NegativeInfinitySymbol.Instance; return(signal); } if (IsAlwaysRational(signal)) { degree = IntegerValue.Zero; return(signal); } Signal coeff = IntegerValue.ConstantOne(signal.Context); if (signal.IsDrivenByPortEntity("Multiply", "Std") && signal.DrivenByPort.InputSignalCount == 2 && IsAlwaysRational(signal.DrivenByPort.InputSignals[0])) { coeff = signal.DrivenByPort.InputSignals[0]; signal = signal.DrivenByPort.InputSignals[1]; } if (signal.Equals(variable)) { degree = IntegerValue.One; return(coeff); } if (signal.IsDrivenByPortEntity("Power", "Std")) { Signal b = signal.DrivenByPort.InputSignals[0]; Signal e = signal.DrivenByPort.InputSignals[1]; if (b.Equals(variable) && Std.IsAlwaysPositiveInteger(e)) { degree = e.Value; return(coeff); } } degree = UndefinedSymbol.Instance; return(UndefinedSymbol.Constant(signal.Context)); }
private static bool IsMonomialFactor(Signal signal, Signal[] generalizedVariables) { if (Array.Exists <Signal>(generalizedVariables, signal.Equals)) { return(true); } if (!Array.Exists <Signal>(generalizedVariables, signal.DependsOn)) { return(true); } if (signal.IsDrivenByPortEntity("Power", "Std")) { Signal b = signal.DrivenByPort.InputSignals[0]; Signal e = signal.DrivenByPort.InputSignals[1]; if (Array.Exists <Signal>(generalizedVariables, b.Equals) && Std.IsAlwaysPositiveInteger(e)) { return(true); } } return(false); }