My Project
kInline.h
Go to the documentation of this file.
1/****************************************
2* Computer Algebra System SINGULAR *
3****************************************/
4/***************************************************************
5 * File: kInline.h
6 * Purpose: implementation of std related inline routines
7 * Author: obachman (Olaf Bachmann)
8 * Created: 8/00
9 *******************************************************************/
10#ifndef KINLINE_H
11#define KINLINE_H
12
13#if !defined(NO_KINLINE) || defined(KUTIL_CC)
14/* this file is a header file with inline routines,
15 * if NO_KINLINE is not defined (AND ONLY THEN!)
16 * otherwise it is an part of kutil.cc and a source file!
17 * (remark: NO_KINLINE is defined by KDEBUG, i.e. in the debug version)
18 */
19
20#include "omalloc/omalloc.h"
21#include "misc/options.h"
23#include "polys/kbuckets.h"
24
25#include "kernel/polys.h"
26
27#ifdef HAVE_SHIFTBBA
28#include "polys/shiftop.h"
29#endif
30
31
32#define HAVE_TAIL_BIN
33// This doesn't really work, fixme, if necessary
34// #define HAVE_LM_BIN
35
36
37
39{
40 assume(i>= 0 && i<=sl);
41 assume(S_2_R[i] >= 0 && S_2_R[i] <= tl);
42 TObject* TT = R[S_2_R[i]];
43 assume(TT != NULL && TT->p == S[i]);
44 return TT;
45}
46
48{
49 if (i >= 0 && i <= sl)
50 {
51 int sri= S_2_R[i];
52 if ((sri >= 0) && (sri <= tl))
53 {
54 TObject* t = R[sri];
55 if ((t != NULL) && (t->p == S[i]))
56 return t;
57 }
58 // last but not least, try kFindInT
59 sri = kFindInT(S[i], T, tl);
60 if (sri >= 0)
61 return &(T[sri]);
62 }
63 return NULL;
64}
65
67{
68 if (tailRing == currRing)
69 return kNoether;
70 else
71 {
72 assume((kNoether == NULL && t_kNoether == NULL) ||
73 (kNoether != NULL && t_kNoether != NULL));
74 return t_kNoether;
75 }
76}
77
78/***************************************************************
79 *
80 * Operation on TObjects
81 *
82 ***************************************************************/
83
85{
86 TSet T = (TSet)omAlloc0(setmaxT*sizeof(TObject));
87 for (int i=setmaxT-1; i>=0; i--)
88 {
89 T[i].tailRing = currRing;
90 T[i].i_r = -1;
91 }
92 return T;
93}
94
96{
97 return (TObject**) omAlloc0(setmaxT*sizeof(TObject*));
98}
99
100KINLINE unsigned long* initsevT()
101{
102 return (unsigned long*) omAlloc0(setmaxT*sizeof(unsigned long));
103}
104
105// initialization
107{
108 tailRing = r;
109}
111{
112 memset(this, 0, sizeof(sTObject));
113 i_r = -1;
114 Set(r);
115}
117{
118 Init(r);
119}
120KINLINE void sTObject::Set(poly p_in, ring r)
121{
122 if (r != currRing)
123 {
124 assume(r == tailRing);
125#ifdef HAVE_SHIFTBBA
126 if (r->isLPring)
127 {
128 shift = si_max(p_mFirstVblock(p_in, r) - 1, 0);
129 if (!shift) p_Test(p_in, r);
130 }
131 else
132#endif
133 {
134 p_Test(p_in, r);
135 }
136 t_p = p_in;
137 }
138 else
139 {
140#ifdef HAVE_SHIFTBBA
141 if (currRing->isLPring)
142 {
143 shift = si_max(p_mFirstVblock(p_in, currRing) - 1, 0);
144 if (!shift) p_Test(p_in, currRing);
145 }
146 else
147#endif
148 {
149 p_Test(p_in, currRing);
150 }
151 p = p_in;
152 }
153 pLength=::pLength(p_in);
154}
155
156KINLINE sTObject::sTObject(poly p_in, ring r)
157{
158 Init(r);
159 Set(p_in, r);
160}
161
162KINLINE void sTObject::Set(poly p_in, ring c_r, ring t_r)
163{
164 if (c_r != t_r)
165 {
166 assume(c_r == currRing && t_r == tailRing);
167#ifdef HAVE_SHIFTBBA
168 if (c_r->isLPring)
169 {
170 shift = si_max(p_mFirstVblock(p_in, c_r) - 1, 0);
171 if (!shift) p_Test(p_in, currRing);
172 }
173 else
174#endif
175 {
176 p_Test(p_in, currRing);
177 }
178 p = p_in;
179 pLength=::pLength(p_in);
180 }
181 else
182 {
183 Set(p_in, c_r);
184 }
185}
186
187KINLINE sTObject::sTObject(poly p_in, ring c_r, ring t_r)
188{
189 Init(t_r);
190 Set(p_in, c_r, t_r);
191}
192
194{
195 *this = *T;
196 if (copy)
197 {
198 if (t_p != NULL)
199 {
202 }
203 else
204 {
205 p = p_Copy(p, currRing);
206 }
207 }
208}
209
211{
212 if (t_p != NULL)
213 {
215 if (p != NULL)
217 }
218 else
219 {
221 }
222}
223
225{
226 p = NULL;
227 t_p = NULL;
228 ecart = 0;
229 length = 0;
230 pLength = 0;
231 FDeg = 0;
233}
234
236{
237 if (t_p != NULL)
238 {
240 if (p != NULL) /* and t_p!=NULL*/
241 {
242 p = p_LmInit(p, currRing);
244 pNext(p) = pNext(t_p);
245 }
246 }
247 else
248 {
249 p = p_Copy(p, currRing);
250 }
251}
252
254{
255 if (p == NULL && t_p != NULL)
257
258 return p;
259}
261{
262 if (t_p == NULL)
263 {
264 if (p != NULL && tailRing != currRing)
265 {
267 return t_p;
268 }
269 return p;
270 }
271 return t_p;
272}
274{
275 assume(r == tailRing || r == currRing);
276 if (r == currRing)
277 return GetLmCurrRing();
278
279 if (t_p == NULL && p != NULL)
281
282 return t_p;
283}
284
285KINLINE void sTObject::GetLm(poly &p_r, ring &r_r) const
286{
287 if (t_p != NULL)
288 {
289 p_r = t_p;
290 r_r = tailRing;
291 }
292 else
293 {
294 p_r = p;
295 r_r = currRing;
296 }
297}
298
300{
301 return (p == NULL && t_p == NULL);
302}
303
305{
306 if (pLength <= 0) pLength = ::pLength(p != NULL ? p : t_p);
307 return pLength;
308}
309
311{
312 if (p == NULL && t_p != NULL)
314}
315
317{
318 assume(p != NULL || t_p != NULL);
319 if (t_p != NULL) return pNext(t_p);
320 return pNext(p);
321}
322
323// Iterations
325{
326 assume(p != NULL || t_p != NULL);
327 if (t_p != NULL)
328 {
330 if (p != NULL)
331 {
333 p = NULL;
334 }
335 }
336 else
337 {
339 }
341}
342
343
344// arithmetic
346{
347 if (t_p != NULL)
348 {
349 t_p = p_Mult_nn(t_p, n, tailRing);
350 if (p != NULL) pSetCoeff0(p, pGetCoeff(t_p));
351 }
352 else
353 {
354 p = p_Mult_nn(p, n, currRing, tailRing);
355 }
356}
357
359{
360 if (t_p != NULL)
361 {
363 if (p != NULL) pSetCoeff0(p, pGetCoeff(t_p));
364 }
365 else
366 {
367 pNormalize(p);
368 }
370}
371
373{
374 if (bucket != NULL)
376}
377
379{
380 if (t_p != NULL)
381 {
383 if (p != NULL) pSetCoeff0(p, pGetCoeff(t_p));
384 }
385 else
386 {
388 }
389}
390
391KINLINE void
392sTObject::ShallowCopyDelete(ring new_tailRing, omBin new_tailBin,
393 pShallowCopyDeleteProc p_shallow_copy_delete,
394 BOOLEAN set_max)
395{
396 if (new_tailBin == NULL) new_tailBin = new_tailRing->PolyBin;
397 if (t_p != NULL)
398 {
399 t_p = p_shallow_copy_delete(t_p, tailRing, new_tailRing, new_tailBin);
400 if (p != NULL)
401 pNext(p) = pNext(t_p);
402 if (new_tailRing == currRing)
403 {
404 if (p == NULL) p = t_p;
405 else p_LmFree(t_p, tailRing);
406 t_p = NULL;
407 }
408 }
409 else if (p != NULL) /* && t_p==NULL */
410 {
411 if (pNext(p) != NULL)
412 {
413 pNext(p) = p_shallow_copy_delete(pNext(p),
414 tailRing, new_tailRing, new_tailBin);
415 }
416 if (new_tailRing != currRing)
417 {
418 t_p = k_LmInit_currRing_2_tailRing(p, new_tailRing);
419 pNext(t_p) = pNext(p);
420 }
421 }
422 if (max_exp != NULL)
423 {
424 max_exp = p_shallow_copy_delete(max_exp,tailRing,new_tailRing,new_tailBin);
425 }
426 else if (set_max && pNext(t_p) != NULL)
427 {
428 max_exp = p_GetMaxExpP(pNext(t_p), new_tailRing);
429 }
430 tailRing = new_tailRing;
431}
432
434{
435 if (p != NULL) return p_FDeg(p, currRing);
436 return tailRing->pFDeg(t_p, tailRing);
437}
439{
440 if (p != NULL) return p_Totaldegree(p, currRing);
441 return p_Totaldegree(t_p,tailRing);
442}
444{
445 FDeg = this->pFDeg();
446 return FDeg;
447}
449{
450 assume(FDeg == this->pFDeg());
451 return FDeg;
452}
454{
455 return tailRing->pLDeg(GetLmTailRing(), &length, tailRing);
456}
458{
459 FDeg = this->pFDeg();
460 long d = this->pLDeg();
461 ecart = d - FDeg;
462 return d;
463}
464
465//extern void pCleardenom(poly p);
466// extern void pNorm(poly p);
467
468// manipulations
470{
471 assume(p != NULL);
473 if ((TEST_OPT_CONTENTSB) && (!is_ring))
474 {
475 number n;
476 if (t_p != NULL)
477 {
480 }
481 else
482 {
484 }
485 if (!nIsOne(n))
486 {
488 denom->n=nInvers(n);
489 denom->next=DENOMINATOR_LIST;
490 DENOMINATOR_LIST=denom;
491 }
492 nDelete(&n);
493 }
494 #ifdef HAVE_RINGS
495 else if (is_ring)
496 {
497 number c;
498 if (t_p != NULL)
499 c=pGetCoeff(t_p);
500 else
501 c=pGetCoeff(p);
502 const coeffs C=tailRing->cf;
503 number u=n_GetUnit(c,C);
504
505 if (t_p != NULL)
506 {
507 if (!n_IsOne(u,C))
508 {
509 number uInv = n_Invers(u, C);
511 n_Delete(&uInv,C);
512 }
514 {
516 }
518 }
519 else
520 {
521 if (!n_IsOne(u,C))
522 {
523 number uInv = n_Invers(u, C);
524 p=p_Mult_nn(p,uInv,tailRing);
525 n_Delete(&uInv,C);
526 }
528 {
529 p = p_Neg(p,tailRing);
530 }
531 }
532 n_Delete(&u,C);
533 }
534 #endif
535 else
536 {
537 if (t_p != NULL)
538 {
541 }
542 else
543 {
545 }
546 }
547}
548
550{
551 assume(p != NULL);
552 if (t_p != NULL)
553 {
556 {
558 }
560 }
561 else
562 {
565 {
566 p=p_Neg (p,currRing);
567 }
568 }
569}
570
571KINLINE void sTObject::pNorm() // pNorm seems to be a _bad_ method name...
572{
573 assume(p != NULL);
574 if (! is_normalized)
575 {
576 p_Norm(p, currRing);
577 if (t_p != NULL)
580 }
581}
582
583
584
585/***************************************************************
586 *
587 * Operation on LObjects
588 *
589 ***************************************************************/
590// Initialization
592{
594 sev = 0;
595}
596
597
599{
601 if (bucket != NULL)
603}
604
606{
607 memset(this, 0, sizeof(sLObject));
608 i_r1 = -1;
609 i_r2 = -1;
610 i_r = -1;
611 Set(r);
612}
614{
615 Init(r);
616}
617KINLINE sLObject::sLObject(poly p_in, ring r)
618{
619 Init(r);
620 Set(p_in, r);
621}
622
623KINLINE sLObject::sLObject(poly p_in, ring c_r, ring t_r)
624{
625 Init(t_r);
626 Set(p_in, c_r, t_r);
627}
628
630{
631 if (bucket == NULL)
632 {
633 unsigned l = GetpLength();
634 if (use_bucket && (l > 1))
635 {
636 poly tp = GetLmTailRing();
637 assume(l == ::pLength(tp));
639 kBucketInit(bucket, pNext(tp), l-1);
640 pNext(tp) = NULL;
641 if (p != NULL) pNext(p) = NULL;
642 pLength = 0;
643 }
644 }
645}
646
647KINLINE void sLObject::SetLmTail(poly lm, poly p_tail, int p_Length, int use_bucket, ring _tailRing)
648{
649
650 Set(lm, _tailRing);
651 if (use_bucket)
652 {
653 bucket = kBucketCreate(_tailRing);
654 kBucketInit(bucket, p_tail, p_Length);
655 pNext(lm) = NULL;
656 pLength = 0;
657 }
658 else
659 {
660 pNext(lm) = p_tail;
661 pLength = p_Length + 1;
662 }
663}
664
666{
667 if (bucket != NULL)
668 {
670 }
671 else
672 {
673 poly _p = (t_p != NULL ? t_p : p);
674 assume(_p != NULL);
675 pNext(_p) = __p_Mult_nn(pNext(_p), n, tailRing);
676 }
677}
678
680 poly spNoether)
681{
682 if (bucket != NULL)
683 {
684 kBucket_Minus_m_Mult_p(bucket, m, q, &lq, spNoether);
685 }
686 else
687 {
688 if (lq<=0) lq= ::pLength(q);
689 poly _p = (t_p != NULL ? t_p : p);
690 assume(_p != NULL);
691
692 int lp=pLength-1;
693 pNext(_p) = p_Minus_mm_Mult_qq( pNext(_p), m, q, lp, lq,
694 spNoether, tailRing );
695 pLength=lp+1;
696// tailRing->p_Procs->p_Minus_mm_Mult_qq(pNext(_p), m, q, shorter,spNoether, tailRing, last);
697// pLength += lq - shorter;
698 }
699}
700
702{
704 if (bucket != NULL)
705 {
706 poly _p = kBucketExtractLm(bucket);
707 if (_p == NULL)
708 {
710 p = t_p = NULL;
711 return;
712 }
713 Set(_p, tailRing);
714 }
715 else
716 {
717 pLength--;
718 }
719}
720
722{
723 poly ret = GetLmTailRing();
724 poly pn;
725
726 assume(p != NULL || t_p != NULL);
727
728 if (bucket != NULL)
729 {
731 if (pn == NULL)
733 }
734 else
735 {
736 pn = pNext(ret);
737 }
738 pLength--;
739 pNext(ret) = NULL;
740 if (p != NULL && t_p != NULL)
742
743 Set(pn, tailRing);
744 return ret;
745}
746
748{
749 //kTest_L(this);
750 poly tp = GetLmTailRing();
751 assume(tp != NULL);
752
753 if (bucket != NULL)
754 {
757 pLength++;
758 }
759 return tp;
760}
761
762
764{
765 //kTest_L(this);
766 if (p == NULL)
767 {
769 ((lmBin!=NULL)?lmBin:currRing->PolyBin));
770 FDeg = pFDeg();
771 }
772 else if ((lmBin != NULL) && (lmBin != currRing->PolyBin))
773 {
775 FDeg = pFDeg();
776 }
777
778 if (bucket != NULL)
779 {
782 pLength++;
783 if (t_p != NULL) pNext(t_p) = pNext(p);
784 }
785 //kTest_L(this);
786 return p;
787}
788
789KINLINE void
791 pShallowCopyDeleteProc p_shallow_copy_delete)
792{
793 if (bucket != NULL)
794 kBucketShallowCopyDelete(bucket, new_tailRing, new_tailRing->PolyBin,
795 p_shallow_copy_delete);
796 sTObject::ShallowCopyDelete(new_tailRing,
797 new_tailRing->PolyBin,p_shallow_copy_delete,
798 FALSE);
799}
800
802{
803 if (t_p != NULL)
804 {
806 }
807 else
808 {
810 }
811}
812
814{
815 if (bucket != NULL)
816 {
818 kBucket_pt new_bucket = kBucketCreate(tailRing);
819 kBucketInit(new_bucket,
820 p_Copy(bucket->buckets[i], tailRing),
821 bucket->buckets_length[i]);
822 bucket = new_bucket;
823 if (t_p != NULL) pNext(t_p) = NULL;
824 if (p != NULL) pNext(p) = NULL;
825 }
827}
828
830{
831 poly tp = GetLmTailRing();
832 assume(tp != NULL);
833 if (bucket != NULL)
834 {
836 pNext(tp) = bucket->buckets[i];
837 long ldeg = tailRing->pLDeg(tp, &length, tailRing);
838 pNext(tp) = NULL;
839 return ldeg;
840 }
841 else
842 return tailRing->pLDeg(tp, &length, tailRing);
843}
845{
846 if (! deg_last || bucket != NULL) return sLObject::pLDeg();
847
848 long ldeg;
849 ldeg = tailRing->pLDeg(GetLmTailRing(), &length, tailRing);
850#ifndef SING_NDEBUG
851 if ( pLength == 0)
854#else
856#endif
857 return ldeg;
858}
859
861{
862 FDeg = this->pFDeg();
863 long d = this->pLDeg();
864 ecart = d - FDeg;
865 return d;
866}
868{
869 FDeg = this->pFDeg();
870 long d = this->pLDeg(use_last);
871 ecart = d - FDeg;
872 return d;
873}
875{
876 if (bucket == NULL)
877 return sTObject::GetpLength();
879 return bucket->buckets_length[i] + 1;
880}
882{
883 if (length_pLength)
884 {
885 length = this->GetpLength();
886 }
887 else
888 this->pLDeg();
889 return length;
890}
892{
893 poly tp = GetLmTailRing();
894 assume(tp != NULL);
895 if (bucket != NULL)
896 {
898 pNext(tp) = bucket->buckets[i];
899 long m = p_MinComp(tp, tailRing);
900 pNext(tp) = NULL;
901 return m;
902 }
903 else
904 return p_MinComp(tp, tailRing);
905}
907{
908 poly pp;
909 ring r;
910 GetLm(pp, r);
911 assume(pp != NULL);
912 return p_GetComp(pp, r);
913}
914
916{
917 memset(this, 0, sizeof(*this));
918 memcpy(this, &t, sizeof(sTObject));
919 return *this;
920}
921
923{
924 if (p1 == NULL) return NULL;
925 if (i_r1 == -1) i_r1 = kFindInT(p1, s->T, s->tl);
926 assume(i_r1 >= 0 && i_r1 <= s->tl);
927 TObject* T = s->R[i_r1];
928 assume(T->p == p1);
929 return T;
930}
931
933{
934 if (p1 == NULL) return NULL;
935 assume(p2 != NULL);
936 if (i_r2 == -1) i_r2 = kFindInT(p2, strat->T, strat->tl);
937 assume(i_r2 >= 0 && i_r2 <= strat->tl);
938 TObject* T = strat->R[i_r2];
939 assume(T->p == p2);
940 return T;
941}
942
944 TObject* &T_1, TObject* &T_2)
945{
946 if (p1 == NULL)
947 {
948 T_1 = NULL;
949 T_2 = NULL;
950 return;
951 }
952 assume(p1 != NULL && p2 != NULL);
953 if (i_r1 == -1) i_r1 = kFindInT(p1, strat->T, strat->tl);
954 if (i_r2 == -1) i_r2 = kFindInT(p2, strat->T, strat->tl);
955 assume(i_r1 >= 0 && i_r1 <= strat->tl);
956 assume(i_r2 >= 0 && i_r2 <= strat->tl);
957 T_1 = strat->R[i_r1];
958 T_2 = strat->R[i_r2];
959 assume(T_1->p == p1);
960 assume(T_2->p == p2);
961 return;
962}
963
964/***************************************************************
965 *
966 * Conversion of polys
967 *
968 ***************************************************************/
969
970KINLINE poly k_LmInit_currRing_2_tailRing(poly p, ring tailRing, omBin tailBin)
971{
972
973 poly t_p = p_LmInit(p, currRing, tailRing, tailBin);
974 pNext(t_p) = pNext(p);
975 pSetCoeff0(t_p, pGetCoeff(p));
976 return t_p;
977}
978
979KINLINE poly k_LmInit_tailRing_2_currRing(poly t_p, ring tailRing, omBin lmBin)
980{
981 poly p = p_LmInit(t_p, tailRing, currRing, lmBin);
982 pNext(p) = pNext(t_p);
983 pSetCoeff0(p, pGetCoeff(t_p));
984 return p;
985}
986
987// this should be made more efficient
989{
990 poly np = k_LmInit_currRing_2_tailRing(p, tailRing, tailBin);
992 return np;
993}
994
996{
997 poly np = k_LmInit_tailRing_2_currRing(p, tailRing, lmBin);
998 p_LmFree(p, tailRing);
999 return np;
1000}
1001
1002KINLINE poly k_LmInit_currRing_2_tailRing(poly p, ring tailRing)
1003{
1004 return k_LmInit_currRing_2_tailRing(p, tailRing, tailRing->PolyBin);
1005}
1006
1007KINLINE poly k_LmInit_tailRing_2_currRing(poly p, ring tailRing)
1008{
1009 return k_LmInit_tailRing_2_currRing(p, tailRing, currRing->PolyBin);
1010}
1011
1013{
1014 return k_LmShallowCopyDelete_currRing_2_tailRing(p, tailRing, tailRing->PolyBin);
1015}
1016
1018{
1019 return k_LmShallowCopyDelete_tailRing_2_currRing(p, tailRing, currRing->PolyBin);
1020}
1021
1022/***************************************************************
1023 *
1024 * Lcm business
1025 *
1026 ***************************************************************/
1027// get m1 = LCM(LM(p1), LM(p2))/LM(p1)
1028// m2 = LCM(LM(p1), LM(p2))/LM(p2)
1029KINLINE BOOLEAN k_GetLeadTerms(const poly p1, const poly p2, const ring p_r,
1030 poly &m1, poly &m2, const ring m_r)
1031{
1032 p_LmCheckPolyRing(p1, p_r);
1033 p_LmCheckPolyRing(p2, p_r);
1034
1035 int i;
1036 long x;
1037 m1 = p_Init(m_r,m_r->PolyBin);
1038 m2 = p_Init(m_r,m_r->PolyBin);
1039
1040 for (i = p_r->N; i; i--)
1041 {
1042 x = p_GetExpDiff(p1, p2, i, p_r);
1043 if (x > 0)
1044 {
1045 if (x > (long) m_r->bitmask) goto false_return;
1046 p_SetExp(m2,i,x, m_r);
1047 p_SetExp(m1,i,0, m_r);
1048 }
1049 else
1050 {
1051 if (-x > (long) m_r->bitmask) goto false_return;
1052 p_SetExp(m1,i,-x, m_r);
1053 p_SetExp(m2,i,0, m_r);
1054 }
1055 }
1056
1057 p_Setm(m1, m_r);
1058 p_Setm(m2, m_r);
1059 return TRUE;
1060
1061 false_return:
1062 p_LmFree(m1, m_r);
1063 p_LmFree(m2, m_r);
1064 m1 = m2 = NULL;
1065 return FALSE;
1066}
1067
1068#ifdef HAVE_RINGS
1069// get m1 = LCM(LM(p1), LM(p2))/LM(p1)
1070// m2 = LCM(LM(p1), LM(p2))/LM(p2) in tailRing
1071// lcm = LCM(LM(p1), LM(p2)) in leadRing
1072KINLINE void k_GetStrongLeadTerms(const poly p1, const poly p2, const ring leadRing,
1073 poly &m1, poly &m2, poly &lcm, const ring tailRing)
1074{
1075 p_LmCheckPolyRing(p1, leadRing);
1076 p_LmCheckPolyRing(p2, leadRing);
1077
1078 int i;
1079 int x;
1080 int e1;
1081 int e2;
1082 int s;
1083 m1 = p_Init(tailRing,tailRing->PolyBin);
1084 m2 = p_Init(tailRing,tailRing->PolyBin);
1085 lcm = p_Init(leadRing,leadRing->PolyBin);
1086
1087 for (i = leadRing->N; i>=0; i--)
1088 {
1089 e1 = p_GetExp(p1,i,leadRing);
1090 e2 = p_GetExp(p2,i,leadRing);
1091 x = e1 - e2;
1092 if (x > 0)
1093 {
1094 p_SetExp(m2,i,x, tailRing);
1095 //p_SetExp(m1,i,0, tailRing); // done by p_Init
1096 s = e1;
1097 }
1098 else if (x<0)
1099 {
1100 p_SetExp(m1,i,-x, tailRing);
1101 //p_SetExp(m2,i,0, tailRing); // done by p_Init
1102 s = e2;
1103 }
1104 else
1105 s = e1; // e1==e2
1106 p_SetExp(lcm,i,s, leadRing);
1107 }
1108
1109 p_Setm(m1, tailRing);
1110 p_Setm(m2, tailRing);
1111 p_Setm(lcm, leadRing);
1112}
1113#endif
1114
1115/***************************************************************
1116 *
1117 * Misc things
1118 *
1119 ***************************************************************/
1121{
1122 BOOLEAN ret;
1123 number mult, rest;
1124 TObject red = *PW;
1125 red.Copy();
1126 rest = n_QuotRem(pGetCoeff(Red->p), pGetCoeff(red.p),
1127 &mult, currRing->cf);
1128 red.Mult_nn(rest);
1129
1130 assume(PR->GetLmCurrRing() != red.GetLmCurrRing());
1131 ret = ksReducePolyLC(Red, &red, NULL, &mult);
1132 red.Delete();
1133 red.Clear();
1134
1135 return ret;
1136}
1137
1139{
1140 BOOLEAN ret;
1141 number coef;
1142
1143 assume(PR->GetLmCurrRing() != PW->GetLmCurrRing());
1144 ret = ksReducePoly(Red, PW, NULL, &coef);
1145
1146 if (!ret)
1147 {
1148 if (! n_IsOne(coef, currRing->cf))
1149 {
1150 PR->Mult_nn(coef);
1151 // HANNES: mark for Normalize
1152 }
1153 n_Delete(&coef, currRing->cf);
1154 }
1155 return ret;
1156}
1157
1159{
1160 BOOLEAN ret;
1161 number coef;
1162
1163 assume(PR->GetLmCurrRing() != PW->GetLmCurrRing());
1164 Red->HeadNormalize();
1165 ret = ksReducePoly(Red, PW, NULL, &coef);
1166
1167 if (!ret)
1168 {
1169 if (! n_IsOne(coef, currRing->cf))
1170 {
1171 PR->Mult_nn(coef);
1172 // HANNES: mark for Normalize
1173 }
1174 n_Delete(&coef, currRing->cf);
1175 }
1176 return ret;
1177}
1178
1179/***************************************************************
1180 *
1181 * Routines for backwards-Compatibility
1182 *
1183 *
1184 ***************************************************************/
1185KINLINE poly ksOldSpolyRed(poly p1, poly p2, poly spNoether)
1186{
1187 LObject L(p2);
1188 TObject T(p1);
1189
1190 ksReducePoly(&L, &T, spNoether);
1191
1192 return L.GetLmCurrRing();
1193}
1194
1195KINLINE poly ksOldSpolyRedNew(poly p1, poly p2, poly spNoether)
1196{
1197 LObject L(p_Copy(p2, currRing));
1198 TObject T(p1);
1199
1200 ksReducePoly(&L, &T, spNoether);
1201
1202 return L.GetLmCurrRing();
1203}
1204
1205KINLINE poly ksOldCreateSpoly(poly p1, poly p2, poly spNoether, ring r)
1206{
1207 LObject L(r);
1208 L.p1 = p1;
1209 L.p2 = p2;
1210
1211 ksCreateSpoly(&L, spNoether);
1212 return L.GetLmCurrRing();
1213}
1214
1215void ksOldSpolyTail(poly p1, poly q, poly q2, poly spNoether, ring r)
1216{
1217 LObject L(q, currRing, r);
1218 TObject T(p1, currRing, r);
1219
1220 ksReducePolyTail(&L, &T, q2, spNoether);
1221}
1222
1224{
1225 LObject L(p);
1226 return redtailBba(&L, pos, strat,FALSE, normalize);
1227}
1228
1230{
1231 LObject L(p, currRing, strat->tailRing); // ? L(p); ??
1232 return redtailBbaBound(&L, pos, strat,bound, FALSE, normalize);
1233}
1234
1235#ifdef HAVE_RINGS
1236KINLINE poly redtailBba_Ring (poly p,int pos,kStrategy strat)
1237{
1238 LObject L(p, currRing, strat->tailRing);
1239 return redtailBba_Ring(&L, pos, strat);
1240}
1241KINLINE poly redtailBba_Z (poly p,int pos,kStrategy strat)
1242{
1243 LObject L(p, currRing, strat->tailRing);
1244 return redtailBba_Z(&L, pos, strat);
1245}
1246#endif
1247
1248KINLINE void clearS (poly p, unsigned long p_sev, int* at, int* k,
1249 kStrategy strat)
1250{
1251 assume(p_sev == pGetShortExpVector(p));
1252 if (strat->noClearS) return;
1253 #ifdef HAVE_RINGS
1255 {
1256 if (!pLmShortDivisibleBy(p,p_sev, strat->S[*at], ~ strat->sevS[*at]))
1257 return;
1258 if(!n_DivBy(pGetCoeff(strat->S[*at]), pGetCoeff(p), currRing->cf))
1259 return;
1260 }
1261 else
1262 #endif
1263 {
1264 if (!pLmShortDivisibleBy(p,p_sev, strat->S[*at], ~ strat->sevS[*at])) return;
1265 }
1266 deleteInS((*at),strat);
1267 (*at)--;
1268 (*k)--;
1269}
1270
1271// dummy function for function pointer strat->rewCrit being usable in all
1272// possible choices for criteria
1273KINLINE BOOLEAN arriRewDummy(poly /*sig*/, unsigned long /*not_sevSig*/, poly /*lm*/, kStrategy /*strat*/, int /*start=0*/)
1274{
1275 return FALSE;
1276}
1277
1278#endif // defined(KINLINE) || defined(KUTIL_CC)
1279#endif // KINLINE_H
static int si_max(const int a, const int b)
Definition: auxiliary.h:124
int BOOLEAN
Definition: auxiliary.h:87
#define TRUE
Definition: auxiliary.h:100
#define FALSE
Definition: auxiliary.h:96
CanonicalForm FACTORY_PUBLIC pp(const CanonicalForm &)
CanonicalForm pp ( const CanonicalForm & f )
Definition: cf_gcd.cc:676
int l
Definition: cfEzgcd.cc:100
int m
Definition: cfEzgcd.cc:128
int i
Definition: cfEzgcd.cc:132
int k
Definition: cfEzgcd.cc:99
Variable x
Definition: cfModGcd.cc:4082
int p
Definition: cfModGcd.cc:4078
static CanonicalForm bound(const CFMatrix &M)
Definition: cf_linsys.cc:460
KINLINE long SetDegStuffReturnLDeg()
Definition: kInline.h:860
KINLINE void Tail_Mult_nn(number n)
Definition: kInline.h:665
int i_r1
Definition: kutil.h:193
KINLINE void Copy()
Definition: kInline.h:813
KINLINE void Delete()
Definition: kInline.h:598
KINLINE void LmDeleteAndIter()
Definition: kInline.h:701
KINLINE TObject * T_2(const skStrategy *strat)
Definition: kInline.h:932
KINLINE void PrepareRed(BOOLEAN use_bucket)
Definition: kInline.h:629
KINLINE void CanonicalizeP()
Definition: kInline.h:372
KINLINE void SetLmTail(poly lm, poly new_p, int length, int use_bucket, ring r)
Definition: kInline.h:647
KINLINE void T_1_2(const skStrategy *strat, TObject *&T_1, TObject *&T_2)
Definition: kInline.h:943
KINLINE void Normalize()
Definition: kInline.h:358
unsigned long sev
Definition: kutil.h:187
KINLINE void Init(ring tailRing=currRing)
Definition: kInline.h:605
KINLINE long MinComp()
Definition: kInline.h:891
kBucket_pt bucket
Definition: kutil.h:192
poly p2
Definition: kutil.h:188
KINLINE TObject * T_1(const skStrategy *strat)
Definition: kInline.h:922
KINLINE int GetpLength()
Definition: kInline.h:874
KINLINE int SetLength(BOOLEAN lengt_pLength=FALSE)
Definition: kInline.h:881
KINLINE void Clear()
Definition: kInline.h:591
KINLINE void Tail_Minus_mm_Mult_qq(poly m, poly qq, int lq, poly spNoether)
Definition: kInline.h:679
KINLINE void ShallowCopyDelete(ring new_tailRing, pShallowCopyDeleteProc p_shallow_copy_delete)
Definition: kInline.h:790
KINLINE poly GetTP()
Definition: kInline.h:747
KINLINE long pLDeg()
Definition: kInline.h:829
KINLINE sLObject & operator=(const sTObject &)
Definition: kInline.h:915
KINLINE void SetShortExpVector()
Definition: kInline.h:801
KINLINE void HeadNormalize()
Definition: kInline.h:378
KINLINE poly GetP(omBin lmBin=(omBin) NULL)
Definition: kInline.h:763
KINLINE sLObject(ring tailRing=currRing)
Definition: kInline.h:613
poly p1
Definition: kutil.h:188
KINLINE long Comp()
Definition: kInline.h:906
KINLINE poly LmExtractAndIter()
Definition: kInline.h:721
int i_r2
Definition: kutil.h:193
Definition: kutil.h:69
KINLINE poly GetLm(ring r)
Definition: kInline.h:273
KINLINE poly GetLmCurrRing()
Definition: kInline.h:253
KINLINE void Init(ring r=currRing)
Definition: kInline.h:110
KINLINE void Mult_nn(number n)
Definition: kInline.h:345
int length
Definition: kutil.h:79
KINLINE long SetDegStuffReturnLDeg()
Definition: kInline.h:457
KINLINE poly GetLmTailRing()
Definition: kInline.h:260
KINLINE void pCleardenom()
Definition: kInline.h:469
int ecart
Definition: kutil.h:78
KINLINE long GetpFDeg() const
Definition: kInline.h:448
KINLINE sTObject(ring tailRing=currRing)
Definition: kInline.h:116
KINLINE void ShallowCopyDelete(ring new_tailRing, omBin new_tailBin, pShallowCopyDeleteProc p_shallow_copy_delete, BOOLEAN set_max=TRUE)
Definition: kInline.h:392
KINLINE void SetLmCurrRing()
Definition: kInline.h:310
poly max_exp
Definition: kutil.h:75
char is_normalized
Definition: kutil.h:87
KINLINE long pLDeg()
Definition: kInline.h:453
KINLINE void LmDeleteAndIter()
Definition: kInline.h:324
int pLength
Definition: kutil.h:80
KINLINE long pFDeg() const
Definition: kInline.h:433
int i_r
Definition: kutil.h:81
poly p
Definition: kutil.h:73
KINLINE BOOLEAN IsNull() const
Definition: kInline.h:299
KINLINE void Set(ring r=currRing)
Definition: kInline.h:106
KINLINE void Delete()
Definition: kInline.h:210
poly t_p
Definition: kutil.h:74
ring tailRing
Definition: kutil.h:76
KINLINE int GetpLength()
Definition: kInline.h:304
KINLINE void pNorm()
Definition: kInline.h:571
KINLINE void Clear()
Definition: kInline.h:224
long FDeg
Definition: kutil.h:77
KINLINE poly Next()
Definition: kInline.h:316
int shift
Definition: kutil.h:84
KINLINE void pContent()
Definition: kInline.h:549
KINLINE long pTotalDeg() const
Definition: kInline.h:438
KINLINE long SetpFDeg()
Definition: kInline.h:443
KINLINE void Copy()
Definition: kInline.h:235
KINLINE poly kNoetherTail()
Definition: kInline.h:66
poly t_kNoether
Definition: kutil.h:330
int * S_2_R
Definition: kutil.h:342
ring tailRing
Definition: kutil.h:343
TSet T
Definition: kutil.h:326
polyset S
Definition: kutil.h:306
poly kNoether
Definition: kutil.h:329
TObject ** R
Definition: kutil.h:340
int tl
Definition: kutil.h:350
KINLINE TObject * s_2_t(int i)
Definition: kInline.h:47
KINLINE TObject * S_2_T(int i)
Definition: kInline.h:38
char noClearS
Definition: kutil.h:402
int sl
Definition: kutil.h:348
unsigned long * sevS
Definition: kutil.h:322
static FORCE_INLINE number n_Invers(number a, const coeffs r)
return the multiplicative inverse of 'a'; raise an error if 'a' is not invertible
Definition: coeffs.h:564
static FORCE_INLINE number n_QuotRem(number a, number b, number *q, const coeffs r)
Definition: coeffs.h:681
static FORCE_INLINE BOOLEAN n_GreaterZero(number n, const coeffs r)
ordered fields: TRUE iff 'n' is positive; in Z/pZ: TRUE iff 0 < m <= roundedBelow(p/2),...
Definition: coeffs.h:494
static FORCE_INLINE number n_GetUnit(number n, const coeffs r)
in Z: 1 in Z/kZ (where k is not a prime): largest divisor of n (taken in Z) that is co-prime with k i...
Definition: coeffs.h:532
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
Definition: coeffs.h:455
static FORCE_INLINE BOOLEAN n_DivBy(number a, number b, const coeffs r)
test whether 'a' is divisible 'b'; for r encoding a field: TRUE iff 'b' does not represent zero in Z:...
Definition: coeffs.h:753
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
Definition: coeffs.h:468
const CanonicalForm int s
Definition: facAbsFact.cc:51
CFArray copy(const CFList &list)
write elements of list into an array
static number Copy(number a, const coeffs)
Definition: flintcf_Q.cc:202
STATIC_VAR jList * T
Definition: janet.cc:30
KINLINE poly k_LmShallowCopyDelete_tailRing_2_currRing(poly p, ring tailRing, omBin lmBin)
Definition: kInline.h:995
KINLINE poly ksOldCreateSpoly(poly p1, poly p2, poly spNoether, ring r)
Definition: kInline.h:1205
KINLINE poly redtailBba_Ring(poly p, int pos, kStrategy strat)
Definition: kInline.h:1236
void ksOldSpolyTail(poly p1, poly q, poly q2, poly spNoether, ring r)
Definition: kInline.h:1215
KINLINE poly k_LmShallowCopyDelete_currRing_2_tailRing(poly p, ring tailRing, omBin tailBin)
Definition: kInline.h:988
KINLINE poly k_LmInit_currRing_2_tailRing(poly p, ring tailRing, omBin tailBin)
Definition: kInline.h:970
KINLINE TSet initT()
Definition: kInline.h:84
KINLINE void k_GetStrongLeadTerms(const poly p1, const poly p2, const ring leadRing, poly &m1, poly &m2, poly &lcm, const ring tailRing)
Definition: kInline.h:1072
KINLINE int ksReducePolyTailLC_Z(LObject *PR, TObject *PW, LObject *Red)
Definition: kInline.h:1120
KINLINE poly redtailBba(poly p, int pos, kStrategy strat, BOOLEAN normalize)
Definition: kInline.h:1223
KINLINE poly ksOldSpolyRed(poly p1, poly p2, poly spNoether)
Definition: kInline.h:1185
KINLINE poly k_LmInit_tailRing_2_currRing(poly t_p, ring tailRing, omBin lmBin)
Definition: kInline.h:979
KINLINE TObject ** initR()
Definition: kInline.h:95
KINLINE poly redtailBbaBound(poly p, int pos, kStrategy strat, int bound, BOOLEAN normalize)
Definition: kInline.h:1229
KINLINE BOOLEAN arriRewDummy(poly, unsigned long, poly, kStrategy, int)
Definition: kInline.h:1273
KINLINE int ksReducePolyTail(LObject *PR, TObject *PW, LObject *Red)
Definition: kInline.h:1158
KINLINE poly ksOldSpolyRedNew(poly p1, poly p2, poly spNoether)
Definition: kInline.h:1195
KINLINE void clearS(poly p, unsigned long p_sev, int *at, int *k, kStrategy strat)
Definition: kInline.h:1248
KINLINE BOOLEAN k_GetLeadTerms(const poly p1, const poly p2, const ring p_r, poly &m1, poly &m2, const ring m_r)
Definition: kInline.h:1029
KINLINE poly redtailBba_Z(poly p, int pos, kStrategy strat)
Definition: kInline.h:1241
KINLINE int ksReducePolyTail_Z(LObject *PR, TObject *PW, LObject *Red)
Definition: kInline.h:1138
KINLINE unsigned long * initsevT()
Definition: kInline.h:100
void kBucketDeleteAndDestroy(kBucket_pt *bucket_pt)
Definition: kbuckets.cc:223
void kBucketClear(kBucket_pt bucket, poly *p, int *length)
Definition: kbuckets.cc:521
void kBucketShallowCopyDelete(kBucket_pt bucket, ring new_tailRing, omBin new_tailBin, pShallowCopyDeleteProc p_shallow_copy_delete)
For changing the ring of the Bpoly to new_tailBin.
Definition: kbuckets.cc:535
void kBucket_Minus_m_Mult_p(kBucket_pt bucket, poly m, poly p, int *l, poly spNoether)
Bpoly == Bpoly - m*p; where m is a monom Does not destroy p and m assume (*l <= 0 || pLength(p) == *l...
Definition: kbuckets.cc:722
void kBucket_Mult_n(kBucket_pt bucket, number n)
Multiply Bucket by number ,i.e. Bpoly == n*Bpoly.
Definition: kbuckets.cc:598
void kBucketDestroy(kBucket_pt *bucket_pt)
Definition: kbuckets.cc:216
void kBucketInit(kBucket_pt bucket, poly lm, int length)
Definition: kbuckets.cc:493
poly kBucketExtractLm(kBucket_pt bucket)
Definition: kbuckets.cc:511
kBucket_pt kBucketCreate(const ring bucket_ring)
Creation/Destruction of buckets.
Definition: kbuckets.cc:209
void kBucketNormalize(kBucket_pt bucket)
apply n_Normalize to all coefficients
int kBucketCanonicalize(kBucket_pt bucket)
Canonicalizes Bpoly, i.e. converts polys of buckets into one poly in one bucket: Returns number of bu...
int ksReducePolyLC(LObject *PR, TObject *PW, poly spNoether, number *coef, kStrategy strat)
Definition: kspoly.cc:458
void ksCreateSpoly(LObject *Pair, poly spNoether, int use_buckets, ring tailRing, poly m1, poly m2, TObject **R)
Definition: kspoly.cc:1185
int ksReducePoly(LObject *PR, TObject *PW, poly spNoether, number *coef, poly *mon, kStrategy strat)
Definition: kspoly.cc:187
int kFindInT(poly p, TSet T, int tlength)
returns index of p in TSet, or -1 if not found
Definition: kutil.cc:742
void deleteInS(int i, kStrategy strat)
Definition: kutil.cc:1163
VAR denominator_list DENOMINATOR_LIST
Definition: kutil.cc:84
denominator_list_s * denominator_list
Definition: kutil.h:63
TObject * TSet
Definition: kutil.h:59
denominator_list next
Definition: kutil.h:65
#define setmaxT
Definition: kutil.h:33
#define KINLINE
Definition: kutil.h:49
class sTObject TObject
Definition: kutil.h:57
class sLObject LObject
Definition: kutil.h:58
void mult(unsigned long *result, unsigned long *a, unsigned long *b, unsigned long p, int dega, int degb)
Definition: minpoly.cc:647
int lcm(unsigned long *l, unsigned long *a, unsigned long *b, unsigned long p, int dega, int degb)
Definition: minpoly.cc:709
#define assume(x)
Definition: mod2.h:387
#define p_GetComp(p, r)
Definition: monomials.h:64
#define pNext(p)
Definition: monomials.h:36
#define pSetCoeff0(p, n)
Definition: monomials.h:59
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy
Definition: monomials.h:44
The main handler for Singular numbers which are suitable for Singular polynomials.
Definition: lq.h:40
#define nDelete(n)
Definition: numbers.h:16
#define nInvers(a)
Definition: numbers.h:33
#define nIsOne(n)
Definition: numbers.h:25
#define nNormalize(n)
Definition: numbers.h:30
#define omAlloc(size)
Definition: omAllocDecl.h:210
#define omAlloc0(size)
Definition: omAllocDecl.h:211
#define NULL
Definition: omList.c:12
omBin_t * omBin
Definition: omStructs.h:12
#define TEST_OPT_CONTENTSB
Definition: options.h:127
p_Length
Definition: p_Procs_Impl.h:123
poly p_GetMaxExpP(poly p, const ring r)
return monomial r such that GetExp(r,i) is maximum of all monomials in p; coeff == 0,...
Definition: p_polys.cc:1138
void p_Cleardenom_n(poly ph, const ring r, number &c)
Definition: p_polys.cc:3019
void p_SimpleContent(poly ph, int smax, const ring r)
Definition: p_polys.cc:2629
void p_Norm(poly p1, const ring r)
Definition: p_polys.cc:3797
unsigned long p_GetShortExpVector(const poly p, const ring r)
Definition: p_polys.cc:4846
void p_ProjectiveUnique(poly ph, const ring r)
Definition: p_polys.cc:3208
poly p_Last(const poly p, int &l, const ring r)
Definition: p_polys.cc:4686
static poly p_Neg(poly p, const ring r)
Definition: p_polys.h:1107
static long p_GetExpDiff(poly p1, poly p2, int i, ring r)
Definition: p_polys.h:635
BOOLEAN p_LmCheckPolyRing(poly p, ring r)
Definition: pDebug.cc:120
static poly p_LmInit(poly p, const ring r)
Definition: p_polys.h:1335
static long p_FDeg(const poly p, const ring r)
Definition: p_polys.h:380
static unsigned long p_SetExp(poly p, const unsigned long e, const unsigned long iBitmask, const int VarOffset)
set a single variable exponent @Note: VarOffset encodes the position in p->exp
Definition: p_polys.h:488
static long p_MinComp(poly p, ring lmRing, ring tailRing)
Definition: p_polys.h:313
static void p_Setm(poly p, const ring r)
Definition: p_polys.h:233
static poly p_LmShallowCopyDelete(poly p, const ring r)
Definition: p_polys.h:1393
static long p_GetExp(const poly p, const unsigned long iBitmask, const int VarOffset)
get a single variable exponent @Note: the integer VarOffset encodes:
Definition: p_polys.h:469
static poly p_Mult_nn(poly p, number n, const ring r)
Definition: p_polys.h:958
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:901
static void p_LmFree(poly p, ring)
Definition: p_polys.h:683
static poly p_Minus_mm_Mult_qq(poly p, const poly m, const poly q, int &lp, int lq, const poly spNoether, const ring r)
Definition: p_polys.h:1070
static poly p_Init(const ring r, omBin bin)
Definition: p_polys.h:1320
static poly p_LmDeleteAndNext(poly p, const ring r)
Definition: p_polys.h:755
static poly p_Copy(poly p, const ring r)
returns a copy of p
Definition: p_polys.h:846
static long p_Totaldegree(poly p, const ring r)
Definition: p_polys.h:1507
#define p_Test(p, r)
Definition: p_polys.h:162
#define __p_Mult_nn(p, n, r)
Definition: p_polys.h:971
VAR ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition: polys.cc:13
Compatiblity layer for legacy polynomial operations (over currRing)
#define pLmShortDivisibleBy(a, sev_a, b, not_sev_b)
Divisibility tests based on Short Exponent vectors sev_a == pGetShortExpVector(a) not_sev_b == ~ pGet...
Definition: polys.h:146
#define pGetShortExpVector(a)
returns the "Short Exponent Vector" – used to speed up divisibility tests (see polys-impl....
Definition: polys.h:152
#define pNormalize(p)
Definition: polys.h:317
static BOOLEAN rIsSyzIndexRing(const ring r)
Definition: ring.h:721
poly(* pShallowCopyDeleteProc)(poly s_p, ring source_r, ring dest_r, omBin dest_bin)
returns a poly from dest_r which is a ShallowCopy of s_p from source_r assumes that source_r->N == de...
Definition: ring.h:44
#define rField_is_Ring(R)
Definition: ring.h:486
int p_mFirstVblock(poly p, const ring ri)
Definition: shiftop.cc:478
static poly normalize(poly next_p, ideal add_generators, syStrategy syzstr, int *g_l, int *p_l, int crit_comp)
Definition: syz3.cc:1026