00001 00002 // MathCore = a WYSIWYG equation editor + a powerful math engine // 00003 // Copyright (C) 2003 by Francesco Montorsi // 00004 // // 00005 // This library is free software; you can redistribute it and/or // 00006 // modify it under the terms of the GNU Lesser General Public // 00007 // License as published by the Free Software Foundation; either // 00008 // version 2.1 of the License, or (at your option) any later // 00009 // version. // 00010 // // 00011 // This library is distributed in the hope that it will be useful, // 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of // 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // 00014 // GNU Lesser General Public License for more details. // 00015 // // 00016 // You should have received a copy of the GNU Lesser General Public // 00017 // License along with this program; if not, write to the Free // 00018 // Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, // 00019 // MA 02111-1307, USA. // 00020 // // 00021 // For any comment, suggestion or feature request, please contact // 00022 // the administrator of the project at frm@users.sourceforge.net // 00023 // // 00030 00031 00032 00033 #ifndef POLYNOMIAL_H 00034 #define POLYNOMIAL_H 00035 00036 // optimization for GCC compiler 00037 #ifdef __GNUG__ 00038 #pragma interface "Polynomial.h" 00039 #endif 00040 00041 // required includes 00042 #include "mc/ElementArray.h" 00043 #include "mc/Monomial.h" 00044 00045 00046 // defined later 00047 class mcMonomialHelpers; 00048 class mcMonomial; 00049 class mcRadical; 00050 00051 mcDEFINE_HELPER_CLASSES(mcPolynomial) 00052 extern mcPolynomial mcEmptyPolynomial; 00053 00054 00055 00059 #define mcMAKEPOL_IDX(midx, eidx) (((midx) << 16) | (eidx)) 00060 00061 00070 class mcPolynomialHelpers : public mcElementArrayHelpers 00071 { 00072 mcDEFINE_REFERENCE_DATA(mcPolynomial, mcET_POLYNOMIAL); 00073 00074 #ifdef mcENABLE_GUI 00075 public: // customizable variables 00076 00079 static int sgui_nSpaceBetween; 00080 00082 int gui_GetSpaceBetweenRatio() const 00083 { return sgui_nSpaceBetween/(gui_GetExpDepth()+1); } 00084 00087 bool mgui_bRemoveParenthesis; 00088 bool mgui_bMoveCursorAtBracketBegin; 00089 00090 mcElement mgui_pBracketToReplace; 00091 bool mgui_bRemoveLeftParenthesis; 00092 00093 #endif 00094 00095 00096 #ifdef mcENABLE_MATH 00097 public: // static utilities 00098 00100 static mcPolynomial *smath_pOne; 00101 00103 static mcPolynomial *smath_pEmpty; 00104 00105 #endif 00106 00107 00108 00109 public: 00110 00111 mcPolynomialHelpers() { data_Init(); } 00112 virtual ~mcPolynomialHelpers() {} 00113 00114 protected: 00115 00116 void gui_Init() { 00117 mgui_bRemoveParenthesis = FALSE; 00118 mgui_bMoveCursorAtBracketBegin = FALSE; 00119 mgui_bRemoveLeftParenthesis = FALSE; 00120 mcElementArrayHelpers::gui_Init(); 00121 } 00122 00123 00124 00125 00126 #ifdef mcENABLE_DATA 00127 protected: 00128 00129 int data_GetIdxFromEntry(const mcArrayEntry *p) const 00130 { return p->mdata_idx & ~(0xFFFF<<16); } 00131 int data_GetMonomialIdxFromEntry(const mcArrayEntry *p) const 00132 { return (p->mdata_idx >> 16); } 00133 00134 mcElement &data_GetRefFromEntry(const mcArrayEntry *p) 00135 { 00136 int midx = data_GetMonomialIdxFromEntry(p), eidx = data_GetIdxFromEntry(p); 00137 if (eidx != -1) { 00138 mcASSERT(data_Get(eidx).data_GetType() == mcET_MONOMIAL, wxT("idx is not valid")); 00139 return ((mcMonomial &)data_Get(midx)).data_Get(eidx); 00140 } 00141 00142 return data_Get(midx); 00143 } 00144 00145 public: 00146 00147 int math_GetIdxFromEntry(const mcArrayEntry *p) const 00148 { return math_DataToMathIdx(data_GetIdxFromEntry(p)); } 00149 int math_GetMonomialIdxFromEntry(const mcArrayEntry *p) const 00150 { return math_DataToMathIdx(data_GetMonomialIdxFromEntry(p)); } 00151 00152 00153 public: 00154 #ifdef __MCDEBUG__ 00155 00159 void data_Check() const; 00160 #endif 00161 00162 void data_DeepCopy(const mcElementHelpers *e) { 00163 const mcPolynomialHelpers *p = (const mcPolynomialHelpers *)e; 00164 mgui_bMoveCursorAtBracketBegin = p->mgui_bMoveCursorAtBracketBegin; 00165 mgui_bRemoveLeftParenthesis = p->mgui_bRemoveLeftParenthesis; 00166 mgui_bRemoveParenthesis = p->mgui_bRemoveParenthesis; 00167 mcElementArrayHelpers::data_DeepCopy(e); 00168 } 00169 00170 00171 00172 00176 00184 int data_AddNewMonomialContaining(mcElement *contents, int count = 1, 00185 int pos = -1, bool bOverwrite = FALSE); 00186 00191 int data_AddNewMonomialContaining(mcElement &monomialinit, 00192 int pos, bool bOverwrite = FALSE) 00193 { return data_AddNewMonomialContaining(&monomialinit, 1, pos, bOverwrite); } 00194 00198 int data_AddNewMonomial(const mcMonomial &toinsert, int pos = -1, 00199 bool bOverwrite = FALSE) 00200 { return data_AddElements((mcElement*)(&toinsert), 1, pos, bOverwrite); } 00201 00203 void data_AddNewEmptyBox(int pos) 00204 { data_AddNewEmptyMonomial(pos); } 00205 00208 int data_AddNewEmptyMonomial(int pos = -1); 00209 00213 mcElement &data_AddNewWrappedElement(mcElementType t, 00214 bool bOverwrite = FALSE, int pos = -1); 00215 00221 int data_FindMonomialContaining(int occ, const mcElement &elem) const; 00222 00227 void data_DetachAndShiftMonomial(int n); 00228 00229 virtual bool data_isWrappingOnly(mcElementType t) const; 00230 virtual const mcElement &data_GetWrapped(mcElementType t) const; 00231 00233 00234 00235 00239 00246 bool data_CreateFirstOp(); 00247 00251 void data_DeleteFirstOp(); 00252 00264 bool data_ReplaceParentheses(bool bMoveAtBracketEnd); 00265 bool data_ReplaceParentheses(int, int, int, int, bool); 00266 00271 void data_ReplaceAllParentheses(); 00272 00274 00275 #endif // mcENABLE_DATA 00276 00277 00278 00279 #ifdef mcENABLE_GUI 00280 public: 00281 00285 00290 bool gui_isBeginKey(const mcKey &) const { return FALSE; } 00291 00299 int gui_ExDraw(wxDC &dc, int x, int y, long flags, const wxPoint &pt, int cl) const; 00300 00308 void gui_ExOnSelect(wxDC &dc, wxRect &rc, int cl); 00309 00313 mcInputRes gui_BackInput(const mcKey &key, mcElement *pnewelem, int n); 00314 00318 mcInputRes gui_Input(const mcKey &key, mcElement *pnewelem); 00319 00320 mcInsertRes gui_Insert(const mcElement &toinsert, mcElement *); 00321 00322 00323 void gui_DoSplit(mcElementType type, const mcKey &ev); 00324 void gui_SetCursorPos(const mcCursorPos &code); 00325 00326 void gui_OnSelect(wxDC &dc, wxRect &rc) { 00327 // call the overloaded version; 00328 gui_ExOnSelect(dc, rc, -1); 00329 } 00330 00331 int gui_Draw(wxDC &dc, int x, int y, long flags, const wxPoint &pt) const { 00332 // call the overloaded version 00333 return gui_ExDraw(dc, x, y, flags, pt, -1); 00334 } 00335 00337 00338 00339 00343 00345 bool gui_isArrEndKey(const mcKey &) const { return FALSE; } 00346 00351 bool gui_isArrayEmpty(); 00352 00355 void gui_CheckCursorPos() const; 00356 00360 void gui_OnNewParenthesis(bool leftpar) { 00361 mgui_bRemoveParenthesis = TRUE; 00362 mgui_bMoveCursorAtBracketBegin = leftpar; 00363 } 00364 00365 void gui_SetBracketToReplace(const mcBracket &p, bool leftpar) { 00366 mgui_pBracketToReplace = (const mcElement &)p; 00367 mgui_bRemoveLeftParenthesis = leftpar; 00368 } 00369 00373 void gui_ReplaceBracket(const mcBracket &, bool left); 00374 00375 // these two are very different from data_XXXX corrispondents. 00376 int gui_AddNewElement(mcElementType type, const mcKey &key, int pos = -1); 00377 00378 void gui_AddNewEmptyMonomial(int pos = -1); 00379 00381 00382 #endif // mcENABLE_GUI 00383 00384 00385 00386 00387 #ifdef mcENABLE_MATH 00388 protected: 00389 00397 mcExpSimRes math_Reorder(); 00398 00403 void math_DistributeBracket(int mdataidx, int bridx); 00404 00406 virtual void math_EndSimSteps() {/* math_SyncCoeffWithSigns();*/ } 00407 00409 virtual void math_EndExpSteps() { /*math_SyncCoeffWithSigns();*/ } 00410 00412 mcExpSimRes math_SimplifySolveOp(long flags); 00413 00414 00415 public: 00416 00420 00427 virtual int math_GetCount() const 00428 { return data_GetNumOfElemType(mcET_MONOMIAL); } 00429 00431 const mcMonomial &math_Get(int n) const 00432 { return (const mcMonomial &)(data_GetElemOfType(n, mcET_MONOMIAL)); } 00433 mcMonomial &math_Get(int n) 00434 { return (mcMonomial &)data_GetElemOfType(n, mcET_MONOMIAL); } 00435 00436 //const mcMonomialHelpers *math_GetHlp(int n) const; 00437 //mcMonomialHelpers *math_GetHlp(int n); 00438 00439 virtual bool math_isWrappingOnly(mcElementType t) const; 00440 virtual const mcElement &math_GetWrapped(mcElementType t) const; 00441 00446 int math_FindMonomialContaining(const mcElement &elem, int occ = 0, int *n = NULL) const; 00447 00451 const mcMonomial &math_GetMonomialContaining(const mcElement &elem, 00452 int occ = 0, int *n = NULL) const; 00453 00459 mcMonomial math_GetCoeffOf(int mathidx, const mcElement *toremove, int ntoremove) const; 00460 00464 mcMonomial math_GetCoeffOf(const mcSymbolProperties *sym, const mcPolynomial &exp, int occ = 0) const; 00465 00469 mcMonomial math_GetCoeffOf(const mcSymbolProperties *sym, const mcRealValue &exp, int occ = 0) const; 00470 00471 //void math_AddMonomial(const mcMonomial &p); 00472 //void math_Monomial(const mcMonomial &p); 00473 00477 //int GetIndexOf(const mcMonomial &tofind) const; 00478 00481 bool math_isFactorized() const { return math_GetCount() == 1; } 00482 00486 bool math_isFirstMonomialNegative() const 00487 { if (data_isArrayEmpty()) return FALSE; else return (math_GetSign(0)==-1); } 00488 00489 00491 void math_Factorize(int *n, int count); 00492 00493 void math_FactoreOut(int *n, int count, bool bForceUseless); 00494 void math_FactoreOutAll(bool bForceUseless) 00495 { math_FactoreOut(NULL, -1, bForceUseless); } 00496 00497 void math_FactoreOut(const mcSymbolProperties *unk, const mcPolynomial &pol, bool bForceUseless); 00498 void math_FactoreOutFreeOf(const mcSymbolProperties *unk, const mcPolynomial &pol, bool bForceUseless); 00499 00500 void math_FactoreOut(const mcSymbolArray *arr); 00501 void math_FactoreOutUnknowns(); 00502 void math_FactoreOutParameters(); 00503 void math_FactoreOutConstants(); 00504 00505 00506 mcArrayEntry math_EmbedInBracket(int *n, int count); 00507 00511 mcArrayEntry math_GetIndexOf(int occ, const mcMonomial &tofind, bool positivesign) const; 00512 00514 //void math_ExpandContaining( 00515 mcExpSimRes math_HandleExpSimFlag(mcExpSimRes r, mcElement *pnew, int i); 00516 00518 00519 00520 00524 00526 int math_DataToMathIdx(int dataindex) const; 00527 00529 int math_MathToDataIdx(int mathindex) const; 00530 00531 mcElementType math_GetNeutralOpType() const { return mcET_ADDOP; } 00532 double math_GetNeutralValue() const { return 0.0; } 00533 00534 mcPolynomial math_GetPolynomialWrapper() const; 00535 mcArrayEntry math_WrapMonomial(const mcMonomial &); 00536 mcArrayEntry math_WrapSimple(const mcElement &); 00537 mcElementArray math_CreateWrapperFor(const mcElement &p) const; 00538 00539 //void &math_GetFactors(); 00540 00544 mcIntegerValue math_GetMaxDegreeFor(const mcSymbolProperties *) const; 00545 00547 00548 00549 00553 00555 int math_GetSign(int n) const; 00556 00560 const mcNumber &math_GetNumSign(const mcMonomial &m, int occ = 0) const; 00561 00563 void math_SetSign(int n, int sgn); 00564 00567 void math_ChangeSign(int n) { math_SetSign(n, -math_GetSign(n)); } 00568 00570 void math_ChangeAllSigns(); 00571 00574 void math_SyncCoeffWithSigns(); 00575 00578 void math_PackSign(mcMonomial &m, int occ = 0) const; 00579 00582 bool math_DeleteFirstOp(); 00583 00585 00586 00587 00591 00592 int math_GetSelCount() const 00593 { return gui_GetSelElemCountOfType(mcET_MONOMIAL); } 00594 00595 int math_GetSelIndex(int n) const 00596 { return gui_GetSelElemIndexOfType(n, mcET_MONOMIAL); } 00597 00598 const mcMonomial &math_GetSel(int n) const 00599 { return (const mcMonomial &)gui_GetSelElemOfType(n, mcET_MONOMIAL); } 00600 00601 mcMonomial &math_GetSel(int n) 00602 { return (mcMonomial &)gui_GetSelElemOfType(n, mcET_MONOMIAL); } 00603 00604 void math_DeleteSelection(); 00605 00607 00608 00609 00613 00614 mcBasicOpRes math_Add(const mcElement &, mcElement *p, bool add); 00615 mcBasicOpRes math_Subtract(const mcElement &, mcElement *p); 00616 mcBasicOpRes math_MultiplyBy(const mcElement &, mcElement *p); 00617 mcBasicOpRes math_DivideBy(const mcElement &, mcElement *p); 00618 00619 mcMonomial math_GetLCM(const mcElement &p) const; 00620 mcMonomial math_GetGCD(const mcElement &p) const; 00621 00622 mcMonomial math_GetGCDFor(int *n, int count) const; 00623 00624 mcExpSimRes math_Simplify(long flags, mcElement *newelem); 00625 mcExpSimRes math_Simplify(long flags) 00626 { return math_Simplify(flags, NULL); } 00627 00628 mcIntegerValue math_RaiseGetCoeff(int *indexes, int m); 00629 bool math_CanBeRaisedTo(const mcPolynomial &) const; 00630 00631 void math_RaiseTo(const mcRealValue &n); 00632 mcBasicOpRes math_RaiseTo(const mcPolynomial &); 00633 00637 virtual int math_GetOrderPos() const { return -1; } 00638 00640 #endif // mcENABLE_MATH 00641 00642 00643 00644 #ifdef mcENABLE_IO 00645 public: 00646 00647 wxXml2Node io_GetMathML(bool bGetPresentation) const; 00648 wxString io_GetInlinedExpr() const; 00649 00650 bool io_ImportPresentationMathML(wxXml2Node tag, wxString &pErr); 00651 bool io_ImportInlinedExpr(const wxString &todecode, int *, wxString &pErr, int mlimit); 00652 bool io_ImportInlinedExpr(const wxString &todecode, int *p, wxString &pErr) 00653 { return io_ImportInlinedExpr(todecode, p, pErr, -1); } 00654 00655 #endif // mcENABLE_IO 00656 }; 00657 00658 00659 00663 class mcPolynomial : public mcElementArray 00664 { 00665 mcDEFINE_MAIN_CLASS(Polynomial, mcElementArray); 00666 00667 public: 00668 00669 // these constructors must use only data_**** functions 00670 mcPolynomial(const mcMonomial &towrap) 00671 { data_SetRefData(new mcPolynomialHelpers); data_AddElements(&towrap, 1); } 00672 00673 // math constructors 00674 mcPolynomial(const mcSymbol &towrap) 00675 { data_SetRefData(new mcPolynomialHelpers); data_AddNewMonomialContaining((mcElement *)&towrap, 1); } 00676 mcPolynomial(const mcNumber &towrap) 00677 { data_SetRefData(new mcPolynomialHelpers); data_AddNewMonomialContaining((mcElement *)&towrap, 1); } 00678 mcPolynomial(const mcSymbolProperties *towrap) 00679 { data_SetRefData(new mcPolynomialHelpers); math_WrapSymbol(towrap); } 00680 mcPolynomial(const mcRealValue &towrap) 00681 { data_SetRefData(new mcPolynomialHelpers); math_WrapNumber(towrap); } 00682 00683 mcPolynomial(const mcRadical &towrap) 00684 { data_SetRefData(new mcPolynomialHelpers); data_AddNewMonomialContaining((mcElement *)&towrap, 1); } 00685 mcPolynomial(const mcBracket &towrap) 00686 { data_SetRefData(new mcPolynomialHelpers); data_AddNewMonomialContaining((mcElement *)&towrap, 1); } 00687 mcPolynomial(const mcFraction &towrap) 00688 { data_SetRefData(new mcPolynomialHelpers); data_AddNewMonomialContaining((mcElement *)&towrap, 1); } 00689 00690 00691 // unary negation 00692 mcPolynomial &operator-() 00693 { this->math_ChangeAllSigns(); return *this; } 00694 00695 00696 #ifdef mcENABLE_DATA 00697 public: 00698 00699 bool data_isValidContainerFor(mcElementType t) const 00700 { return t == mcET_POLYNOMIAL; } 00701 00702 mcWRAPPER bool data_CreateFirstOp() 00703 { return hlp()->data_CreateFirstOp(); } 00704 mcWRAPPER void data_DeleteFirstOp() 00705 { hlp()->data_DeleteFirstOp(); } 00706 00707 mcWRAPPER int data_AddNewMonomialContaining(mcElement *contents, 00708 int n = 1, int pos = -1, bool bOverwrite = FALSE) 00709 { return hlp()->data_AddNewMonomialContaining(contents, n, pos, bOverwrite); } 00710 00711 mcWRAPPER int data_AddNewMonomialContaining(mcElement &monomialinit, 00712 int pos = -1, bool bOverwrite = TRUE) 00713 { return hlp()->data_AddNewMonomialContaining(monomialinit, pos, bOverwrite); } 00714 00715 mcWRAPPER int data_AddNewMonomial(const mcMonomial &toinsert, 00716 int pos = -1, bool bOverwrite = FALSE) 00717 { return hlp()->data_AddNewMonomial(toinsert, pos, bOverwrite); } 00718 00719 mcWRAPPER int data_AddNewEmptyMonomial(int pos = -1) 00720 { return hlp()->data_AddNewEmptyMonomial(pos); } 00721 /* 00722 mcWRAPPER mcElement &data_AddNewWrappedElement(mcElementType t, bool bOverwrite = FALSE, int pos = -1); 00723 mcWRAPPER int data_FindMonomialContaining(const mcElement &elem, int occ = 0) const; 00724 mcWRAPPER void data_DetachAndShiftMonomial(int n);*/ 00725 00726 #endif 00727 00728 00729 #ifdef mcENABLE_GUI 00730 public: 00731 00732 mcWRAPPER void gui_AddNewEmptyMonomial(int pos = -1) 00733 { hlp()->gui_AddNewEmptyMonomial(pos); } 00734 00735 mcWRAPPER int gui_ExDraw(wxDC &dc, int x, int y, long flags, const wxPoint &pt, int cl) const 00736 { return hlp()->gui_ExDraw(dc, x, y, flags, pt, cl); } 00737 00738 /* 00739 int gui_ExDraw(wxDC &dc, int x, int y, long flags, const wxPoint &pt, int cl) const; 00740 void gui_ExOnSelect(wxDC &dc, int x, int y, wxRect &rc, int cl); 00741 mcInputRes gui_BackInput(const mcKey &key, mcElement *pnewelem, int n); 00742 mcInputRes gui_Input(const mcKey &key, mcElement *pnewelem); 00743 void gui_DoSplit(mcElementType type, const mcKey &ev); 00744 void gui_SetCursorPos(const mcCursorPos &code); 00745 00746 void gui_OnSelect(wxDC &dc, wxRect &rc) { 00747 // call the overloaded version; 00748 gui_ExOnSelect(dc, x, y, rc, -1); 00749 } 00750 00751 int gui_Draw(wxDC &dc, int x, int y, long flags, const wxPoint &pt) const { 00752 // call the overloaded version 00753 return gui_ExDraw(dc, x, y, flags, pt, -1); 00754 } 00755 bool gui_isArrEndKey(const mcKey &) const { return FALSE; } 00756 bool gui_isArrayEmpty(); 00757 void gui_CheckCursorPos() const; 00758 void gui_OnNewParenthesis(bool leftpar) { 00759 mgui_bRemoveParenthesis = TRUE; 00760 mgui_bMoveCursorAtBracketBegin = leftpar; 00761 } 00762 void gui_SetBracketToReplace(const mcBracket &p, bool leftpar) { 00763 mgui_pBracketToReplace = (const mcElement &)p; 00764 mgui_bRemoveLeftParenthesis = leftpar; 00765 } 00766 void gui_ReplaceBracket(const mcBracket &, bool left); 00767 int gui_AddNewElement(mcElementType type, const mcKey &key, int pos = -1); 00768 void gui_AddNewEmptyMonomial(int pos = -1); 00769 //{ mgui_nCursorPos = data_AddNewEmptyMonomial(pos); } 00770 */ 00771 #endif 00772 00773 00774 mcWRAPPER const mcMonomial &math_Get(int n) const 00775 { return hlp()->math_Get(n); } 00776 mcWRAPPER mcMonomial &math_Get(int n) 00777 { return hlp()->math_Get(n); } 00778 00779 00780 mcWRAPPER int math_FindMonomialContaining(const mcElement &elem, int occ = 0, int *n = NULL) const 00781 { return hlp()->math_FindMonomialContaining(elem, occ, n); } 00782 mcWRAPPER const mcMonomial &math_GetMonomialContaining(const mcElement &elem, int occ = 0, int *n = NULL) const 00783 { return hlp()->math_GetMonomialContaining(elem, occ, n); } 00784 mcWRAPPER mcMonomial math_GetCoeffOf(int mathidx, const mcElement *toremove, int ntoremove) const 00785 { return hlp()->math_GetCoeffOf(mathidx, toremove, ntoremove); } 00786 mcWRAPPER mcMonomial math_GetCoeffOf(const mcSymbolProperties *sym, const mcPolynomial &exp, int occ = 0) const 00787 { return hlp()->math_GetCoeffOf(sym, exp, occ); } 00788 mcWRAPPER mcMonomial math_GetCoeffOf(const mcSymbolProperties *sym, const mcRealValue &exp, int occ = 0) const 00789 { return hlp()->math_GetCoeffOf(sym, exp, occ); } 00790 00791 00792 mcWRAPPER bool math_isFactorized() const 00793 { return hlp()->math_isFactorized(); } 00794 mcWRAPPER bool math_isFirstMonomialNegative() const 00795 { return hlp()->math_isFirstMonomialNegative(); } 00796 mcWRAPPER mcMonomial math_GetFactors() const 00797 { return ((mcElementArrayHelpers*)hlp())->math_GetFactors(); } 00798 00799 mcWRAPPER void math_Factorize(int *n, int count) 00800 { hlp()->math_Factorize(n, count); } 00801 mcWRAPPER void math_FactoreOut(int *n, int count, bool bForceUseless) 00802 { hlp()->math_FactoreOut(n, count, bForceUseless); } 00803 mcWRAPPER void math_FactoreOutAll(bool bForceUseless) 00804 { hlp()->math_FactoreOutAll(bForceUseless); } 00805 00806 00807 mcWRAPPER void math_FactoreOut(const mcSymbolProperties *unk, const mcPolynomial &pol, bool bForceUseless) 00808 { hlp()->math_FactoreOut(unk, pol, bForceUseless); } 00809 mcWRAPPER void math_FactoreOutFreeOf(const mcSymbolProperties *unk, const mcPolynomial &pol, bool bForceUseless) 00810 { hlp()->math_FactoreOutFreeOf(unk, pol, bForceUseless); } 00811 00812 mcWRAPPER void math_FactoreOut(const mcSymbolArray *arr) 00813 { hlp()->math_FactoreOut(arr); } 00814 mcWRAPPER void math_FactoreOutUnknowns() 00815 { hlp()->math_FactoreOutUnknowns(); } 00816 mcWRAPPER void math_FactoreOutParameters() 00817 { hlp()->math_FactoreOutParameters(); } 00818 mcWRAPPER void math_FactoreOutConstants() 00819 { hlp()->math_FactoreOutConstants(); } 00820 00821 00822 mcWRAPPER mcIntegerValue math_GetMaxDegreeFor(const mcSymbolProperties *s) const 00823 { return hlp()->math_GetMaxDegreeFor(s); } 00824 00825 00826 mcWRAPPER int math_GetSign(int n) const 00827 { return hlp()->math_GetSign(n); } 00828 mcWRAPPER const mcNumber &math_GetNumSign(const mcMonomial &m, int occ = 0) const 00829 { return hlp()->math_GetNumSign(m, occ); } 00830 00831 mcWRAPPER void math_SetSign(int n, int sgn) 00832 { hlp()->math_SetSign(n, sgn); } 00833 mcWRAPPER void math_ChangeSign(int n) 00834 { hlp()->math_ChangeSign(n); } 00835 mcWRAPPER void math_ChangeAllSigns() 00836 { hlp()->math_ChangeAllSigns(); } 00837 mcWRAPPER void math_PackSign(mcMonomial &m, int occ = 0) const 00838 { hlp()->math_PackSign(m, occ); } 00839 mcWRAPPER bool math_DeleteFirstOp() 00840 { return hlp()->math_DeleteFirstOp(); } 00841 00842 mcWRAPPER bool math_CanBeRaisedTo(const mcPolynomial &n) 00843 { return hlp()->math_CanBeRaisedTo(n); } 00844 00845 mcWRAPPER mcArrayEntry math_GetIndexOf(int occ, const mcMonomial &tofind, bool b) const 00846 { return hlp()->math_GetIndexOf(occ, tofind, b); } 00847 00848 mcWRAPPER int math_GetMonomialIdxFromEntry(const mcArrayEntry &p) const 00849 { return hlp()->math_GetMonomialIdxFromEntry(&p); } 00850 mcWRAPPER int math_GetIdxFromEntry(const mcArrayEntry &p) const 00851 { return hlp()->math_GetIdxFromEntry(&p); } 00852 }; 00853 00854 00855 #endif // POLYNOMIAL_H 00856
[ Top ] |