source: git/Singular/iparith.cc @ 4bbc69

spielwiese
Last change on this file since 4bbc69 was 4bbc69, checked in by Hans Schoenemann <hannes@…>, 9 years ago
fix: degree test for subst(ideal/module/matrix...)
  • Property mode set to 100644
File size: 216.2 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4
5/*
6* ABSTRACT: table driven kernel interface, used by interpreter
7*/
8
9
10#include <kernel/mod2.h>
11
12#include <omalloc/omalloc.h>
13
14#include <factory/factory.h>
15
16#include <coeffs/bigintmat.h>
17#include <coeffs/coeffs.h>
18#include <coeffs/numbers.h>
19
20#ifdef HAVE_RINGS
21#include <coeffs/rmodulon.h>
22#include <coeffs/rmodulo2m.h>
23#include <coeffs/rintegers.h>
24#endif
25
26#include <misc/options.h>
27#include <misc/intvec.h>
28#include <misc/sirandom.h>
29
30#include <polys/prCopy.h>
31#include <polys/matpol.h>
32#include <polys/monomials/maps.h>
33#include <polys/coeffrings.h>
34#include <polys/sparsmat.h>
35#include <Singular/mod_lib.h>
36#include <polys/weight.h>
37#include <polys/ext_fields/transext.h>
38#  include <polys/clapsing.h>
39
40#include <kernel/GBEngine/stairc.h>
41#include <kernel/polys.h>
42#include <Singular/fevoices.h>
43#include <kernel/ideals.h>
44#include <kernel/GBEngine/kstd1.h>
45#include <kernel/oswrapper/timer.h>
46#include <kernel/preimage.h>
47#include <kernel/GBEngine/units.h>
48#include <kernel/spectrum/GMPrat.h>
49#include <kernel/GBEngine/tgb.h>
50#include <kernel/groebner_walk/walkProc.h>
51#include <kernel/linear_algebra/linearAlgebra.h>
52#include <kernel/GBEngine/syz.h>
53
54#include <kernel/linear_algebra/interpolation.h>
55#  include <kernel/GBEngine/kstdfac.h>
56#  include <kernel/fglm/fglm.h>
57
58#include <Singular/tok.h>
59#include <Singular/ipid.h>
60#include <Singular/sdb.h>
61#include <Singular/subexpr.h>
62#include <Singular/lists.h>
63#include <Singular/maps_ip.h>
64
65#include <Singular/ipconv.h>
66#include <Singular/ipprint.h>
67#include <Singular/attrib.h>
68#include <Singular/links/silink.h>
69#include <kernel/linear_algebra/MinorInterface.h>
70#include <Singular/misc_ip.h>
71#include <Singular/linearAlgebra_ip.h>
72
73#  include <Singular/fglm.h>
74
75#include <Singular/blackbox.h>
76#include <Singular/newstruct.h>
77#include <Singular/ipshell.h>
78//#include <kernel/mpr_inout.h>
79
80#include <reporter/si_signals.h>
81
82
83#include <stdlib.h>
84#include <string.h>
85#include <ctype.h>
86#include <stdio.h>
87#include <time.h>
88#include <unistd.h>
89#include <vector>
90
91lists rDecompose(const ring r);
92ring rCompose(const lists  L, const BOOLEAN check_comp=TRUE);
93
94
95// defaults for all commands: NO_PLURAL | NO_RING | ALLOW_ZERODIVISOR
96
97#ifdef HAVE_PLURAL
98  #include <kernel/GBEngine/ratgring.h>
99  #include <kernel/GBEngine/nc.h>
100  #include <polys/nc/nc.h>
101  #include <polys/nc/sca.h>
102  #define ALLOW_PLURAL     1
103  #define NO_PLURAL        0
104  #define COMM_PLURAL      2
105  #define  PLURAL_MASK 3
106#else /* HAVE_PLURAL */
107  #define ALLOW_PLURAL     0
108  #define NO_PLURAL        0
109  #define COMM_PLURAL      0
110  #define  PLURAL_MASK     0
111#endif /* HAVE_PLURAL */
112
113#ifdef HAVE_RINGS
114  #define RING_MASK        4
115  #define ZERODIVISOR_MASK 8
116#else
117  #define RING_MASK        0
118  #define ZERODIVISOR_MASK 0
119#endif
120#define ALLOW_RING       4
121#define NO_RING          0
122#define NO_ZERODIVISOR   8
123#define ALLOW_ZERODIVISOR  0
124
125// bit 4 for warning, if used at toplevel
126#define WARN_RING        16
127
128static BOOLEAN check_valid(const int p, const int op);
129
130/*=============== types =====================*/
131struct sValCmdTab
132{
133  short cmd;
134  short start;
135};
136
137typedef sValCmdTab jjValCmdTab[];
138
139struct _scmdnames
140{
141  char *name;
142  short alias;
143  short tokval;
144  short toktype;
145};
146typedef struct _scmdnames cmdnames;
147
148
149typedef char * (*Proc1)(char *);
150struct sValCmd1
151{
152  proc1 p;
153  short cmd;
154  short res;
155  short arg;
156  short valid_for;
157};
158
159typedef BOOLEAN (*proc2)(leftv,leftv,leftv);
160struct sValCmd2
161{
162  proc2 p;
163  short cmd;
164  short res;
165  short arg1;
166  short arg2;
167  short valid_for;
168};
169
170typedef BOOLEAN (*proc3)(leftv,leftv,leftv,leftv);
171struct sValCmd3
172{
173  proc3 p;
174  short cmd;
175  short res;
176  short arg1;
177  short arg2;
178  short arg3;
179  short valid_for;
180};
181struct sValCmdM
182{
183  proc1 p;
184  short cmd;
185  short res;
186  short number_of_args; /* -1: any, -2: any >0, .. */
187  short valid_for;
188};
189
190typedef struct
191{
192  cmdnames *sCmds;             /**< array of existing commands */
193  struct sValCmd1 *psValCmd1;
194  struct sValCmd2 *psValCmd2;
195  struct sValCmd3 *psValCmd3;
196  struct sValCmdM *psValCmdM;
197  int nCmdUsed;      /**< number of commands used */
198  int nCmdAllocated; /**< number of commands-slots allocated */
199  int nLastIdentifier; /**< valid indentifieres are slot 1..nLastIdentifier */
200} SArithBase;
201
202/*---------------------------------------------------------------------*
203 * File scope Variables (Variables share by several functions in
204 *                       the same file )
205 *
206 *---------------------------------------------------------------------*/
207static SArithBase sArithBase;  /**< Base entry for arithmetic */
208
209/*---------------------------------------------------------------------*
210 * Extern Functions declarations
211 *
212 *---------------------------------------------------------------------*/
213static int _gentable_sort_cmds(const void *a, const void *b);
214extern int iiArithRemoveCmd(char *szName);
215extern int iiArithAddCmd(const char *szName, short nAlias, short nTokval,
216                         short nToktype, short nPos=-1);
217
218/*============= proc =======================*/
219static int iiTabIndex(const jjValCmdTab dArithTab, const int len, const int op);
220static Subexpr jjMakeSub(leftv e);
221
222/*============= vars ======================*/
223extern int cmdtok;
224extern BOOLEAN expected_parms;
225
226#define ii_div_by_0 "div. by 0"
227
228int iiOp; /* the current operation*/
229
230/*=================== simple helpers =================*/
231poly pHeadProc(poly p)
232{
233  return pHead(p);
234}
235
236int iiTokType(int op)
237{
238  for (int i=0;i<sArithBase.nCmdUsed;i++)
239  {
240    if (sArithBase.sCmds[i].tokval==op)
241      return sArithBase.sCmds[i].toktype;
242  }
243  return 0;
244}
245
246/*=================== operations with 2 args.: static proc =================*/
247/* must be ordered: first operations for chars (infix ops),
248 * then alphabetically */
249
250static BOOLEAN jjOP_BIM_I(leftv res, leftv u, leftv v)
251{
252  bigintmat* aa= (bigintmat *)u->Data();
253  int bb = (int)(long)(v->Data());
254  if (errorreported) return TRUE;
255  bigintmat *cc=NULL;
256  switch (iiOp)
257  {
258    case '+': cc=bimAdd(aa,bb); break;
259    case '-': cc=bimSub(aa,bb); break;
260    case '*': cc=bimMult(aa,bb); break;
261  }
262  res->data=(char *)cc;
263  return cc==NULL;
264}
265static BOOLEAN jjOP_I_BIM(leftv res, leftv u, leftv v)
266{
267  return jjOP_BIM_I(res, v, u);
268}
269static BOOLEAN jjOP_BIM_BI(leftv res, leftv u, leftv v)
270{
271  bigintmat* aa= (bigintmat *)u->Data();
272  number bb = (number)(v->Data());
273  if (errorreported) return TRUE;
274  bigintmat *cc=NULL;
275  switch (iiOp)
276  {
277    case '*': cc=bimMult(aa,bb,coeffs_BIGINT); break;
278  }
279  res->data=(char *)cc;
280  return cc==NULL;
281}
282static BOOLEAN jjOP_BI_BIM(leftv res, leftv u, leftv v)
283{
284  return jjOP_BIM_BI(res, v, u);
285}
286static BOOLEAN jjOP_IV_I(leftv res, leftv u, leftv v)
287{
288  intvec* aa= (intvec *)u->CopyD(INTVEC_CMD);
289  int bb = (int)(long)(v->Data());
290  if (errorreported) return TRUE;
291  switch (iiOp)
292  {
293    case '+': (*aa) += bb; break;
294    case '-': (*aa) -= bb; break;
295    case '*': (*aa) *= bb; break;
296    case '/':
297    case INTDIV_CMD: (*aa) /= bb; break;
298    case '%': (*aa) %= bb; break;
299  }
300  res->data=(char *)aa;
301  return FALSE;
302}
303static BOOLEAN jjOP_I_IV(leftv res, leftv u, leftv v)
304{
305  return jjOP_IV_I(res,v,u);
306}
307static BOOLEAN jjOP_IM_I(leftv res, leftv u, leftv v)
308{
309  intvec* aa= (intvec *)u->CopyD(INTVEC_CMD);
310  int bb = (int)(long)(v->Data());
311  int i=si_min(aa->rows(),aa->cols());
312  switch (iiOp)
313  {
314    case '+': for (;i>0;i--) IMATELEM(*aa,i,i) += bb;
315              break;
316    case '-': for (;i>0;i--) IMATELEM(*aa,i,i) -= bb;
317              break;
318  }
319  res->data=(char *)aa;
320  return FALSE;
321}
322static BOOLEAN jjOP_I_IM(leftv res, leftv u, leftv v)
323{
324  return jjOP_IM_I(res,v,u);
325}
326static BOOLEAN jjCOLON(leftv res, leftv u, leftv v)
327{
328  int l=(int)(long)v->Data();
329  if (l>0)
330  {
331    int d=(int)(long)u->Data();
332    intvec *vv=new intvec(l);
333    int i;
334    for(i=l-1;i>=0;i--) { (*vv)[i]=d; }
335    res->data=(char *)vv;
336  }
337  return (l<=0);
338}
339static BOOLEAN jjDOTDOT(leftv res, leftv u, leftv v)
340{
341  res->data=(char *)new intvec((int)(long)u->Data(),(int)(long)v->Data());
342  return FALSE;
343}
344static void jjEQUAL_REST(leftv res,leftv u,leftv v);
345static BOOLEAN jjCOMPARE_IV(leftv res, leftv u, leftv v)
346{
347  intvec*    a = (intvec * )(u->Data());
348  intvec*    b = (intvec * )(v->Data());
349  int r=a->compare(b);
350  switch  (iiOp)
351  {
352    case '<':
353      res->data  = (char *) (r<0);
354      break;
355    case '>':
356      res->data  = (char *) (r>0);
357      break;
358    case LE:
359      res->data  = (char *) (r<=0);
360      break;
361    case GE:
362      res->data  = (char *) (r>=0);
363      break;
364    case EQUAL_EQUAL:
365    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
366      res->data  = (char *) (r==0);
367      break;
368  }
369  jjEQUAL_REST(res,u,v);
370  if(r==-2) { WerrorS("size incompatible"); return TRUE; }
371  return FALSE;
372}
373static BOOLEAN jjCOMPARE_BIM(leftv res, leftv u, leftv v)
374{
375  bigintmat*    a = (bigintmat * )(u->Data());
376  bigintmat*    b = (bigintmat * )(v->Data());
377  int r=a->compare(b);
378  switch  (iiOp)
379  {
380    case '<':
381      res->data  = (char *) (r<0);
382      break;
383    case '>':
384      res->data  = (char *) (r>0);
385      break;
386    case LE:
387      res->data  = (char *) (r<=0);
388      break;
389    case GE:
390      res->data  = (char *) (r>=0);
391      break;
392    case EQUAL_EQUAL:
393    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
394      res->data  = (char *) (r==0);
395      break;
396  }
397  jjEQUAL_REST(res,u,v);
398  if(r==-2) { WerrorS("size incompatible"); return TRUE; }
399  return FALSE;
400}
401static BOOLEAN jjCOMPARE_IV_I(leftv res, leftv u, leftv v)
402{
403  intvec* a = (intvec * )(u->Data());
404  int     b = (int)(long)(v->Data());
405  int r=a->compare(b);
406  switch  (iiOp)
407  {
408    case '<':
409      res->data  = (char *) (r<0);
410      break;
411    case '>':
412      res->data  = (char *) (r>0);
413      break;
414    case LE:
415      res->data  = (char *) (r<=0);
416      break;
417    case GE:
418      res->data  = (char *) (r>=0);
419      break;
420    case EQUAL_EQUAL:
421    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
422      res->data  = (char *) (r==0);
423      break;
424  }
425  jjEQUAL_REST(res,u,v);
426  return FALSE;
427}
428static BOOLEAN jjCOMPARE_P(leftv res, leftv u, leftv v)
429{
430  poly p=(poly)u->Data();
431  poly q=(poly)v->Data();
432  int r=pCmp(p,q);
433  if (r==0)
434  {
435    number h=nSub(pGetCoeff(p),pGetCoeff(q));
436    /* compare lead coeffs */
437    r = -1+nIsZero(h)+2*nGreaterZero(h); /* -1: <, 0:==, 1: > */
438    nDelete(&h);
439  }
440  else if (p==NULL)
441  {
442    if (q==NULL)
443    {
444      /* compare 0, 0 */
445      r=0;
446    }
447    else if(pIsConstant(q))
448    {
449      /* compare 0, const */
450      r = 1-2*nGreaterZero(pGetCoeff(q)); /* -1: <, 1: > */
451    }
452  }
453  else if (q==NULL)
454  {
455    if (pIsConstant(p))
456    {
457      /* compare const, 0 */
458      r = -1+2*nGreaterZero(pGetCoeff(p)); /* -1: <, 1: > */
459    }
460  }
461  switch  (iiOp)
462  {
463    case '<':
464      res->data  = (char *) (r < 0);
465      break;
466    case '>':
467      res->data  = (char *) (r > 0);
468      break;
469    case LE:
470      res->data  = (char *) (r <= 0);
471      break;
472    case GE:
473      res->data  = (char *) (r >= 0);
474      break;
475    //case EQUAL_EQUAL:
476    //case NOTEQUAL: /* negation handled by jjEQUAL_REST */
477    //  res->data  = (char *) (r == 0);
478    //  break;
479  }
480  jjEQUAL_REST(res,u,v);
481  return FALSE;
482}
483static BOOLEAN jjCOMPARE_S(leftv res, leftv u, leftv v)
484{
485  char*    a = (char * )(u->Data());
486  char*    b = (char * )(v->Data());
487  int result = strcmp(a,b);
488  switch  (iiOp)
489  {
490    case '<':
491      res->data  = (char *) (result  < 0);
492      break;
493    case '>':
494      res->data  = (char *) (result  > 0);
495      break;
496    case LE:
497      res->data  = (char *) (result  <= 0);
498      break;
499    case GE:
500      res->data  = (char *) (result  >= 0);
501      break;
502    case EQUAL_EQUAL:
503    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
504      res->data  = (char *) (result  == 0);
505      break;
506  }
507  jjEQUAL_REST(res,u,v);
508  return FALSE;
509}
510static BOOLEAN jjOP_REST(leftv res, leftv u, leftv v)
511{
512  if (u->Next()!=NULL)
513  {
514    u=u->next;
515    res->next = (leftv)omAllocBin(sleftv_bin);
516    return iiExprArith2(res->next,u,iiOp,v);
517  }
518  else if (v->Next()!=NULL)
519  {
520    v=v->next;
521    res->next = (leftv)omAllocBin(sleftv_bin);
522    return iiExprArith2(res->next,u,iiOp,v);
523  }
524  return FALSE;
525}
526static BOOLEAN jjPOWER_I(leftv res, leftv u, leftv v)
527{
528  int b=(int)(long)u->Data();
529  int e=(int)(long)v->Data();
530  int rc = 1;
531  BOOLEAN overflow=FALSE;
532  if (e >= 0)
533  {
534    if (b==0)
535    {
536      rc=(e==0);
537    }
538    else if ((e==0)||(b==1))
539    {
540      rc= 1;
541    }
542    else if (b== -1)
543    {
544      if (e&1) rc= -1;
545      else     rc= 1;
546    }
547    else
548    {
549      int oldrc;
550      while ((e--)!=0)
551      {
552        oldrc=rc;
553        rc *= b;
554        if (!overflow)
555        {
556          if(rc/b!=oldrc) overflow=TRUE;
557        }
558      }
559      if (overflow)
560        WarnS("int overflow(^), result may be wrong");
561    }
562    res->data = (char *)((long)rc);
563    if (u!=NULL) return jjOP_REST(res,u,v);
564    return FALSE;
565  }
566  else
567  {
568    WerrorS("exponent must be non-negative");
569    return TRUE;
570  }
571}
572static BOOLEAN jjPOWER_BI(leftv res, leftv u, leftv v)
573{
574  int e=(int)(long)v->Data();
575  number n=(number)u->Data();
576  if (e>=0)
577  {
578    n_Power(n,e,(number*)&res->data,coeffs_BIGINT);
579  }
580  else
581  {
582    WerrorS("exponent must be non-negative");
583    return TRUE;
584  }
585  if (u!=NULL) return jjOP_REST(res,u,v);
586  return FALSE;
587}
588static BOOLEAN jjPOWER_N(leftv res, leftv u, leftv v)
589{
590  int e=(int)(long)v->Data();
591  number n=(number)u->Data();
592  int d=0;
593  if (e<0)
594  {
595    n=nInvers(n);
596    e=-e;
597    d=1;
598  }
599  number r;
600  nPower(n,e,(number*)&r);
601  res->data=(char*)r;
602  if (d) nDelete(&n);
603  if (u!=NULL) return jjOP_REST(res,u,v);
604  return FALSE;
605}
606static BOOLEAN jjPOWER_P(leftv res, leftv u, leftv v)
607{
608  int v_i=(int)(long)v->Data();
609  if (v_i<0)
610  {
611    WerrorS("exponent must be non-negative");
612    return TRUE;
613  }
614  poly u_p=(poly)u->CopyD(POLY_CMD);
615  if ((u_p!=NULL)
616  && ((v_i!=0) &&
617      ((long)pTotaldegree(u_p) > (signed long)currRing->bitmask / (signed long)v_i)))
618  {
619    Werror("OVERFLOW in power(d=%ld, e=%d, max=%ld)",
620                                    pTotaldegree(u_p),v_i,currRing->bitmask);
621    pDelete(&u_p);
622    return TRUE;
623  }
624  res->data = (char *)pPower(u_p,v_i);
625  if (u!=NULL) return jjOP_REST(res,u,v);
626  return errorreported; /* pPower may set errorreported via Werror */
627}
628static BOOLEAN jjPOWER_ID(leftv res, leftv u, leftv v)
629{
630  res->data = (char *)id_Power((ideal)(u->Data()),(int)(long)(v->Data()), currRing);
631  if (u!=NULL) return jjOP_REST(res,u,v);
632  return FALSE;
633}
634static BOOLEAN jjPLUSMINUS_Gen(leftv res, leftv u, leftv v)
635{
636  u=u->next;
637  v=v->next;
638  if (u==NULL)
639  {
640    if (v==NULL) return FALSE;      /* u==NULL, v==NULL */
641    if (iiOp=='-')                  /* u==NULL, v<>NULL, iiOp=='-'*/
642    {
643      do
644      {
645        if (res->next==NULL)
646          res->next = (leftv)omAlloc0Bin(sleftv_bin);
647        leftv tmp_v=v->next;
648        v->next=NULL;
649        BOOLEAN b=iiExprArith1(res->next,v,'-');
650        v->next=tmp_v;
651        if (b)
652          return TRUE;
653        v=tmp_v;
654        res=res->next;
655      } while (v!=NULL);
656      return FALSE;
657    }
658    loop                            /* u==NULL, v<>NULL, iiOp=='+' */
659    {
660      res->next = (leftv)omAlloc0Bin(sleftv_bin);
661      res=res->next;
662      res->data = v->CopyD();
663      res->rtyp = v->Typ();
664      v=v->next;
665      if (v==NULL) return FALSE;
666    }
667  }
668  if (v!=NULL)                     /* u<>NULL, v<>NULL */
669  {
670    do
671    {
672      res->next = (leftv)omAlloc0Bin(sleftv_bin);
673      leftv tmp_u=u->next; u->next=NULL;
674      leftv tmp_v=v->next; v->next=NULL;
675      BOOLEAN b=iiExprArith2(res->next,u,iiOp,v);
676      u->next=tmp_u;
677      v->next=tmp_v;
678      if (b)
679        return TRUE;
680      u=tmp_u;
681      v=tmp_v;
682      res=res->next;
683    } while ((u!=NULL) && (v!=NULL));
684    return FALSE;
685  }
686  loop                             /* u<>NULL, v==NULL */
687  {
688    res->next = (leftv)omAlloc0Bin(sleftv_bin);
689    res=res->next;
690    res->data = u->CopyD();
691    res->rtyp = u->Typ();
692    u=u->next;
693    if (u==NULL) return FALSE;
694  }
695}
696static BOOLEAN jjCOLCOL(leftv res, leftv u, leftv v)
697{
698  idhdl packhdl;
699  switch(u->Typ())
700  {
701      case 0:
702      {
703        int name_err=0;
704        if(isupper(u->name[0]))
705        {
706          const char *c=u->name+1;
707          while((*c!='\0')&&(islower(*c)||(isdigit(*c)))) c++;
708          if (*c!='\0')
709            name_err=1;
710          else
711          {
712            Print("%s of type 'ANY'. Trying load.\n", u->name);
713            if(iiTryLoadLib(u, u->name))
714            {
715              Werror("'%s' no such package", u->name);
716              return TRUE;
717            }
718            syMake(u,u->name,NULL);
719          }
720        }
721        else name_err=1;
722        if(name_err)
723        { Werror("'%s' is an invalid package name",u->name);return TRUE;}
724        // and now, after the loading: use next case !!! no break !!!
725      }
726      case PACKAGE_CMD:
727        packhdl = (idhdl)u->data;
728        if((!IDPACKAGE(packhdl)->loaded)
729        && (IDPACKAGE(packhdl)->language > LANG_TOP))
730        {
731          Werror("'%s' not loaded", u->name);
732          return TRUE;
733        }
734        if(v->rtyp == IDHDL)
735        {
736          v->name = omStrDup(v->name);
737        }
738        v->req_packhdl=IDPACKAGE(packhdl);
739        syMake(v, v->name, packhdl);
740        memcpy(res, v, sizeof(sleftv));
741        memset(v, 0, sizeof(sleftv));
742        break;
743      case DEF_CMD:
744        break;
745      default:
746        WerrorS("<package>::<id> expected");
747        return TRUE;
748  }
749  return FALSE;
750}
751static BOOLEAN jjPLUS_I(leftv res, leftv u, leftv v)
752{
753  unsigned int a=(unsigned int)(unsigned long)u->Data();
754  unsigned int b=(unsigned int)(unsigned long)v->Data();
755  unsigned int c=a+b;
756  res->data = (char *)((long)c);
757  if (((Sy_bit(31)&a)==(Sy_bit(31)&b))&&((Sy_bit(31)&a)!=(Sy_bit(31)&c)))
758  {
759    WarnS("int overflow(+), result may be wrong");
760  }
761  return jjPLUSMINUS_Gen(res,u,v);
762}
763static BOOLEAN jjPLUS_BI(leftv res, leftv u, leftv v)
764{
765  res->data = (char *)(n_Add((number)u->Data(), (number)v->Data(),coeffs_BIGINT));
766  return jjPLUSMINUS_Gen(res,u,v);
767}
768static BOOLEAN jjPLUS_N(leftv res, leftv u, leftv v)
769{
770  res->data = (char *)(nAdd((number)u->Data(), (number)v->Data()));
771  return jjPLUSMINUS_Gen(res,u,v);
772}
773static BOOLEAN jjPLUS_P(leftv res, leftv u, leftv v)
774{
775  res->data = (char *)(pAdd((poly)u->CopyD(POLY_CMD) , (poly)v->CopyD(POLY_CMD)));
776  return jjPLUSMINUS_Gen(res,u,v);
777}
778static BOOLEAN jjPLUS_IV(leftv res, leftv u, leftv v)
779{
780  res->data = (char *)ivAdd((intvec*)(u->Data()), (intvec*)(v->Data()));
781  if (res->data==NULL)
782  {
783     WerrorS("intmat size not compatible");
784     return TRUE;
785  }
786  return jjPLUSMINUS_Gen(res,u,v);
787}
788static BOOLEAN jjPLUS_BIM(leftv res, leftv u, leftv v)
789{
790  res->data = (char *)bimAdd((bigintmat*)(u->Data()), (bigintmat*)(v->Data()));
791  if (res->data==NULL)
792  {
793    WerrorS("bigintmat size not compatible");
794    return TRUE;
795  }
796  return jjPLUSMINUS_Gen(res,u,v);
797}
798static BOOLEAN jjPLUS_MA(leftv res, leftv u, leftv v)
799{
800  matrix A=(matrix)u->Data(); matrix B=(matrix)v->Data();
801  res->data = (char *)(mp_Add(A , B, currRing));
802  if (res->data==NULL)
803  {
804     Werror("matrix size not compatible(%dx%d, %dx%d)",
805             MATROWS(A),MATCOLS(A),MATROWS(B),MATCOLS(B));
806     return TRUE;
807  }
808  return jjPLUSMINUS_Gen(res,u,v);
809}
810static BOOLEAN jjPLUS_MA_P(leftv res, leftv u, leftv v)
811{
812  matrix m=(matrix)u->Data();
813  matrix p= mp_InitP(m->nrows,m->ncols,(poly)(v->CopyD(POLY_CMD)),currRing);
814  if (iiOp=='+')
815    res->data = (char *)mp_Add(m , p,currRing);
816  else
817    res->data = (char *)mp_Sub(m , p,currRing);
818  idDelete((ideal *)&p);
819  return jjPLUSMINUS_Gen(res,u,v);
820}
821static BOOLEAN jjPLUS_P_MA(leftv res, leftv u, leftv v)
822{
823  return jjPLUS_MA_P(res,v,u);
824}
825static BOOLEAN jjPLUS_S(leftv res, leftv u, leftv v)
826{
827  char*    a = (char * )(u->Data());
828  char*    b = (char * )(v->Data());
829  char*    r = (char * )omAlloc(strlen(a) + strlen(b) + 1);
830  strcpy(r,a);
831  strcat(r,b);
832  res->data=r;
833  return jjPLUSMINUS_Gen(res,u,v);
834}
835static BOOLEAN jjPLUS_ID(leftv res, leftv u, leftv v)
836{
837  res->data = (char *)idAdd((ideal)u->Data(),(ideal)v->Data());
838  return jjPLUSMINUS_Gen(res,u,v);
839}
840static BOOLEAN jjMINUS_I(leftv res, leftv u, leftv v)
841{
842  void *ap=u->Data(); void *bp=v->Data();
843  int aa=(int)(long)ap;
844  int bb=(int)(long)bp;
845  int cc=aa-bb;
846  unsigned int a=(unsigned int)(unsigned long)ap;
847  unsigned int b=(unsigned int)(unsigned long)bp;
848  unsigned int c=a-b;
849  if (((Sy_bit(31)&a)!=(Sy_bit(31)&b))&&((Sy_bit(31)&a)!=(Sy_bit(31)&c)))
850  {
851    WarnS("int overflow(-), result may be wrong");
852  }
853  res->data = (char *)((long)cc);
854  return jjPLUSMINUS_Gen(res,u,v);
855}
856static BOOLEAN jjMINUS_BI(leftv res, leftv u, leftv v)
857{
858  res->data = (char *)(n_Sub((number)u->Data(), (number)v->Data(),coeffs_BIGINT));
859  return jjPLUSMINUS_Gen(res,u,v);
860}
861static BOOLEAN jjMINUS_N(leftv res, leftv u, leftv v)
862{
863  res->data = (char *)(nSub((number)u->Data(), (number)v->Data()));
864  return jjPLUSMINUS_Gen(res,u,v);
865}
866static BOOLEAN jjMINUS_P(leftv res, leftv u, leftv v)
867{
868  res->data = (char *)(pSub((poly)u->CopyD(POLY_CMD) , (poly)v->CopyD(POLY_CMD)));
869  return jjPLUSMINUS_Gen(res,u,v);
870}
871static BOOLEAN jjMINUS_IV(leftv res, leftv u, leftv v)
872{
873  res->data = (char *)ivSub((intvec*)(u->Data()), (intvec*)(v->Data()));
874  if (res->data==NULL)
875  {
876     WerrorS("intmat size not compatible");
877     return TRUE;
878  }
879  return jjPLUSMINUS_Gen(res,u,v);
880}
881static BOOLEAN jjMINUS_BIM(leftv res, leftv u, leftv v)
882{
883  res->data = (char *)bimSub((bigintmat*)(u->Data()), (bigintmat*)(v->Data()));
884  if (res->data==NULL)
885  {
886    WerrorS("bigintmat size not compatible");
887    return TRUE;
888  }
889  return jjPLUSMINUS_Gen(res,u,v);
890}
891static BOOLEAN jjMINUS_MA(leftv res, leftv u, leftv v)
892{
893  matrix A=(matrix)u->Data(); matrix B=(matrix)v->Data();
894  res->data = (char *)(mp_Sub(A , B, currRing));
895  if (res->data==NULL)
896  {
897     Werror("matrix size not compatible(%dx%d, %dx%d)",
898             MATROWS(A),MATCOLS(A),MATROWS(B),MATCOLS(B));
899     return TRUE;
900  }
901  return jjPLUSMINUS_Gen(res,u,v);
902  return FALSE;
903}
904static BOOLEAN jjTIMES_I(leftv res, leftv u, leftv v)
905{
906  int a=(int)(long)u->Data();
907  int b=(int)(long)v->Data();
908  int64 c=(int64)a * (int64)b;
909  if ((c>INT_MAX)||(c<INT_MIN))
910    WarnS("int overflow(*), result may be wrong");
911  res->data = (char *)((long)((int)c));
912  if ((u->Next()!=NULL) || (v->Next()!=NULL))
913    return jjOP_REST(res,u,v);
914  return FALSE;
915}
916static BOOLEAN jjTIMES_BI(leftv res, leftv u, leftv v)
917{
918  res->data = (char *)(n_Mult( (number)u->Data(), (number)v->Data(),coeffs_BIGINT));
919  if ((v->next!=NULL) || (u->next!=NULL))
920    return jjOP_REST(res,u,v);
921  return FALSE;
922}
923static BOOLEAN jjTIMES_N(leftv res, leftv u, leftv v)
924{
925  res->data = (char *)(nMult( (number)u->Data(), (number)v->Data()));
926  number n=(number)res->data;
927  nNormalize(n);
928  res->data=(char *)n;
929  if ((v->next!=NULL) || (u->next!=NULL))
930    return jjOP_REST(res,u,v);
931  return FALSE;
932}
933static BOOLEAN jjTIMES_P(leftv res, leftv u, leftv v)
934{
935  poly a;
936  poly b;
937  if (v->next==NULL)
938  {
939    a=(poly)u->CopyD(POLY_CMD); // works also for VECTOR_CMD
940    if (u->next==NULL)
941    {
942      b=(poly)v->CopyD(POLY_CMD); // works also for VECTOR_CMD
943      if ((a!=NULL) && (b!=NULL)
944      && ((long)pTotaldegree(a)>si_max((long)rVar(currRing),(long)currRing->bitmask)-(long)pTotaldegree(b)))
945      {
946        Werror("OVERFLOW in mult(d=%ld, d=%ld, max=%ld)",
947          pTotaldegree(a),pTotaldegree(b),currRing->bitmask);
948        pDelete(&a);
949        pDelete(&b);
950        return TRUE;
951      }
952      res->data = (char *)(pMult( a, b));
953      pNormalize((poly)res->data);
954      return FALSE;
955    }
956    // u->next exists: copy v
957    b=pCopy((poly)v->Data());
958    if ((a!=NULL) && (b!=NULL)
959    && (pTotaldegree(a)+pTotaldegree(b)>si_max((long)rVar(currRing),(long)currRing->bitmask)))
960    {
961      Werror("OVERFLOW in mult(d=%ld, d=%ld, max=%ld)",
962          pTotaldegree(a),pTotaldegree(b),currRing->bitmask);
963      pDelete(&a);
964      pDelete(&b);
965      return TRUE;
966    }
967    res->data = (char *)(pMult( a, b));
968    pNormalize((poly)res->data);
969    return jjOP_REST(res,u,v);
970  }
971  // v->next exists: copy u
972  a=pCopy((poly)u->Data());
973  b=(poly)v->CopyD(POLY_CMD); // works also for VECTOR_CMD
974  if ((a!=NULL) && (b!=NULL)
975  && ((unsigned long)(pTotaldegree(a)+pTotaldegree(b))>=currRing->bitmask))
976  {
977    pDelete(&a);
978    pDelete(&b);
979    WerrorS("OVERFLOW");
980    return TRUE;
981  }
982  res->data = (char *)(pMult( a, b));
983  pNormalize((poly)res->data);
984  return jjOP_REST(res,u,v);
985}
986static BOOLEAN jjTIMES_ID(leftv res, leftv u, leftv v)
987{
988  res->data = (char *)idMult((ideal)u->Data(),(ideal)v->Data());
989  id_Normalize((ideal)res->data,currRing);
990  if ((v->next!=NULL) || (u->next!=NULL))
991    return jjOP_REST(res,u,v);
992  return FALSE;
993}
994static BOOLEAN jjTIMES_IV(leftv res, leftv u, leftv v)
995{
996  res->data = (char *)ivMult((intvec*)(u->Data()), (intvec*)(v->Data()));
997  if (res->data==NULL)
998  {
999     WerrorS("intmat size not compatible");
1000     return TRUE;
1001  }
1002  if ((v->next!=NULL) || (u->next!=NULL))
1003    return jjOP_REST(res,u,v);
1004  return FALSE;
1005}
1006static BOOLEAN jjTIMES_BIM(leftv res, leftv u, leftv v)
1007{
1008  res->data = (char *)bimMult((bigintmat*)(u->Data()), (bigintmat*)(v->Data()));
1009  if (res->data==NULL)
1010  {
1011    WerrorS("bigintmat size not compatible");
1012    return TRUE;
1013  }
1014  if ((v->next!=NULL) || (u->next!=NULL))
1015    return jjOP_REST(res,u,v);
1016  return FALSE;
1017}
1018static BOOLEAN jjTIMES_MA_BI1(leftv res, leftv u, leftv v)
1019{
1020  nMapFunc nMap=n_SetMap(coeffs_BIGINT,currRing->cf);
1021  if (nMap==NULL) return TRUE;
1022  number n=nMap((number)v->Data(),coeffs_BIGINT,currRing->cf);
1023  poly p=pNSet(n);
1024  ideal I= (ideal)mp_MultP((matrix)u->CopyD(MATRIX_CMD),p,currRing);
1025  res->data = (char *)I;
1026  return FALSE;
1027}
1028static BOOLEAN jjTIMES_MA_BI2(leftv res, leftv u, leftv v)
1029{
1030  return jjTIMES_MA_BI1(res,v,u);
1031}
1032static BOOLEAN jjTIMES_MA_P1(leftv res, leftv u, leftv v)
1033{
1034  poly p=(poly)v->CopyD(POLY_CMD);
1035  int r=pMaxComp(p);/* recompute the rank for the case ideal*vector*/
1036  ideal I= (ideal)mp_MultP((matrix)u->CopyD(MATRIX_CMD),p,currRing);
1037  if (r>0) I->rank=r;
1038  id_Normalize(I,currRing);
1039  res->data = (char *)I;
1040  return FALSE;
1041}
1042static BOOLEAN jjTIMES_MA_P2(leftv res, leftv u, leftv v)
1043{
1044  poly p=(poly)u->CopyD(POLY_CMD);
1045  int r=pMaxComp(p);/* recompute the rank for the case ideal*vector*/
1046  ideal I= (ideal)pMultMp(p,(matrix)v->CopyD(MATRIX_CMD),currRing);
1047  if (r>0) I->rank=r;
1048  id_Normalize(I,currRing);
1049  res->data = (char *)I;
1050  return FALSE;
1051}
1052static BOOLEAN jjTIMES_MA_N1(leftv res, leftv u, leftv v)
1053{
1054  number n=(number)v->CopyD(NUMBER_CMD);
1055  poly p=pNSet(n);
1056  res->data = (char *)mp_MultP((matrix)u->CopyD(MATRIX_CMD),p,currRing);
1057  id_Normalize((ideal)res->data,currRing);
1058  return FALSE;
1059}
1060static BOOLEAN jjTIMES_MA_N2(leftv res, leftv u, leftv v)
1061{
1062  return jjTIMES_MA_N1(res,v,u);
1063}
1064static BOOLEAN jjTIMES_MA_I1(leftv res, leftv u, leftv v)
1065{
1066  res->data = (char *)mp_MultI((matrix)u->CopyD(MATRIX_CMD),(int)(long)v->Data(),currRing);
1067  id_Normalize((ideal)res->data,currRing);
1068  return FALSE;
1069}
1070static BOOLEAN jjTIMES_MA_I2(leftv res, leftv u, leftv v)
1071{
1072  return jjTIMES_MA_I1(res,v,u);
1073}
1074static BOOLEAN jjTIMES_MA(leftv res, leftv u, leftv v)
1075{
1076  matrix A=(matrix)u->Data(); matrix B=(matrix)v->Data();
1077  res->data = (char *)mp_Mult(A,B,currRing);
1078  if (res->data==NULL)
1079  {
1080     Werror("matrix size not compatible(%dx%d, %dx%d)",
1081             MATROWS(A),MATCOLS(A),MATROWS(B),MATCOLS(B));
1082     return TRUE;
1083  }
1084  id_Normalize((ideal)res->data,currRing);
1085  if ((v->next!=NULL) || (u->next!=NULL))
1086    return jjOP_REST(res,u,v);
1087  return FALSE;
1088}
1089static BOOLEAN jjGE_BI(leftv res, leftv u, leftv v)
1090{
1091  number h=n_Sub((number)u->Data(),(number)v->Data(),coeffs_BIGINT);
1092  res->data = (char *) (n_GreaterZero(h,coeffs_BIGINT)||(n_IsZero(h,coeffs_BIGINT)));
1093  n_Delete(&h,coeffs_BIGINT);
1094  return FALSE;
1095}
1096static BOOLEAN jjGE_I(leftv res, leftv u, leftv v)
1097{
1098  res->data = (char *)(long)((int)((long)u->Data()) >= (int)((long)v->Data()));
1099  return FALSE;
1100}
1101static BOOLEAN jjGE_N(leftv res, leftv u, leftv v)
1102{
1103  res->data = (char *)(long) (nGreater((number)u->Data(),(number)v->Data())
1104                       || nEqual((number)u->Data(),(number)v->Data()));
1105  return FALSE;
1106}
1107static BOOLEAN jjGT_BI(leftv res, leftv u, leftv v)
1108{
1109  number h=n_Sub((number)u->Data(),(number)v->Data(),coeffs_BIGINT);
1110  res->data = (char *)(long) (n_GreaterZero(h,coeffs_BIGINT)&&(!n_IsZero(h,coeffs_BIGINT)));
1111  n_Delete(&h,coeffs_BIGINT);
1112  return FALSE;
1113}
1114static BOOLEAN jjGT_I(leftv res, leftv u, leftv v)
1115{
1116  res->data = (char *)(long)((int)((long)u->Data()) > (int)((long)v->Data()));
1117  return FALSE;
1118}
1119static BOOLEAN jjGT_N(leftv res, leftv u, leftv v)
1120{
1121  res->data = (char *)(long)(nGreater((number)u->Data(),(number)v->Data()));
1122  return FALSE;
1123}
1124static BOOLEAN jjLE_BI(leftv res, leftv u, leftv v)
1125{
1126  return jjGE_BI(res,v,u);
1127}
1128static BOOLEAN jjLE_I(leftv res, leftv u, leftv v)
1129{
1130  res->data = (char *)(long)((int)((long)u->Data()) <= (int)((long)v->Data()));
1131  return FALSE;
1132}
1133static BOOLEAN jjLE_N(leftv res, leftv u, leftv v)
1134{
1135  return jjGE_N(res,v,u);
1136}
1137static BOOLEAN jjLT_BI(leftv res, leftv u, leftv v)
1138{
1139  return jjGT_BI(res,v,u);
1140}
1141static BOOLEAN jjLT_I(leftv res, leftv u, leftv v)
1142{
1143  res->data = (char *)(long)((int)((long)u->Data()) < (int)((long)v->Data()));
1144  return FALSE;
1145}
1146static BOOLEAN jjLT_N(leftv res, leftv u, leftv v)
1147{
1148  return jjGT_N(res,v,u);
1149}
1150static BOOLEAN jjDIVMOD_I(leftv res, leftv u, leftv v)
1151{
1152  if (iiOp=='/') Warn("int division with `/`: use `div` instead in line >>%s<<",my_yylinebuf);
1153  int a= (int)(long)u->Data();
1154  int b= (int)(long)v->Data();
1155  if (b==0)
1156  {
1157    WerrorS(ii_div_by_0);
1158    return TRUE;
1159  }
1160  int c=a%b;
1161  int r=0;
1162  switch (iiOp)
1163  {
1164    case '%':
1165        r=c;            break;
1166    case '/':
1167    case INTDIV_CMD:
1168        r=((a-c) /b);   break;
1169  }
1170  res->data=(void *)((long)r);
1171  return FALSE;
1172}
1173static BOOLEAN jjDIV_BI(leftv res, leftv u, leftv v)
1174{
1175  number q=(number)v->Data();
1176  if (n_IsZero(q,coeffs_BIGINT))
1177  {
1178    WerrorS(ii_div_by_0);
1179    return TRUE;
1180  }
1181  q = n_Div((number)u->Data(),q,coeffs_BIGINT);
1182  n_Normalize(q,coeffs_BIGINT);
1183  res->data = (char *)q;
1184  return FALSE;
1185}
1186static BOOLEAN jjDIV_N(leftv res, leftv u, leftv v)
1187{
1188  number q=(number)v->Data();
1189  if (nIsZero(q))
1190  {
1191    WerrorS(ii_div_by_0);
1192    return TRUE;
1193  }
1194  q = nDiv((number)u->Data(),q);
1195  nNormalize(q);
1196  res->data = (char *)q;
1197  return FALSE;
1198}
1199static BOOLEAN jjDIV_P(leftv res, leftv u, leftv v)
1200{
1201  poly q=(poly)v->Data();
1202  if (q==NULL)
1203  {
1204    WerrorS(ii_div_by_0);
1205    return TRUE;
1206  }
1207  poly p=(poly)(u->Data());
1208  if (p==NULL)
1209  {
1210    res->data=NULL;
1211    return FALSE;
1212  }
1213  if ((pNext(q)!=NULL) && (!rField_is_Ring(currRing)))
1214  { /* This means that q != 0 consists of at least two terms.
1215       Moreover, currRing is over a field. */
1216    if(pGetComp(p)==0)
1217    {
1218      res->data=(void*)(singclap_pdivide(p /*(poly)(u->Data())*/ ,
1219                                         q /*(poly)(v->Data())*/ ,currRing));
1220    }
1221    else
1222    {
1223      int comps=pMaxComp(p);
1224      ideal I=idInit(comps,1);
1225      p=pCopy(p);
1226      poly h;
1227      int i;
1228      // conversion to a list of polys:
1229      while (p!=NULL)
1230      {
1231        i=pGetComp(p)-1;
1232        h=pNext(p);
1233        pNext(p)=NULL;
1234        pSetComp(p,0);
1235        I->m[i]=pAdd(I->m[i],p);
1236        p=h;
1237      }
1238      // division and conversion to vector:
1239      h=NULL;
1240      p=NULL;
1241      for(i=comps-1;i>=0;i--)
1242      {
1243        if (I->m[i]!=NULL)
1244        {
1245          h=singclap_pdivide(I->m[i],q,currRing);
1246          pSetCompP(h,i+1);
1247          p=pAdd(p,h);
1248        }
1249      }
1250      idDelete(&I);
1251      res->data=(void *)p;
1252    }
1253  }
1254  else
1255  { /* This means that q != 0 consists of just one term,
1256       or that currRing is over a coefficient ring. */
1257#ifdef HAVE_RINGS
1258    if (!rField_is_Domain(currRing))
1259    {
1260      WerrorS("division only defined over coefficient domains");
1261      return TRUE;
1262    }
1263    if (pNext(q)!=NULL)
1264    {
1265      WerrorS("division over a coefficient domain only implemented for terms");
1266      return TRUE;
1267    }
1268#endif
1269    res->data = (char *)pDivideM(pCopy(p),pHead(q));
1270  }
1271  pNormalize((poly)res->data);
1272  return FALSE;
1273}
1274static BOOLEAN jjDIV_Ma(leftv res, leftv u, leftv v)
1275{
1276  poly q=(poly)v->Data();
1277  if (q==NULL)
1278  {
1279    WerrorS(ii_div_by_0);
1280    return TRUE;
1281  }
1282  matrix m=(matrix)(u->Data());
1283  int r=m->rows();
1284  int c=m->cols();
1285  matrix mm=mpNew(r,c);
1286  int i,j;
1287  for(i=r;i>0;i--)
1288  {
1289    for(j=c;j>0;j--)
1290    {
1291      if (pNext(q)!=NULL)
1292      {
1293        MATELEM(mm,i,j) = singclap_pdivide( MATELEM(m,i,j) ,
1294                                           q /*(poly)(v->Data())*/, currRing );
1295      }
1296      else
1297        MATELEM(mm,i,j) = pDivideM(pCopy(MATELEM(m,i,j)),pHead(q));
1298    }
1299  }
1300  id_Normalize((ideal)mm,currRing);
1301  res->data=(char *)mm;
1302  return FALSE;
1303}
1304static BOOLEAN jjEQUAL_BI(leftv res, leftv u, leftv v)
1305{
1306  res->data = (char *)((long)n_Equal((number)u->Data(),(number)v->Data(),coeffs_BIGINT));
1307  jjEQUAL_REST(res,u,v);
1308  return FALSE;
1309}
1310static BOOLEAN jjEQUAL_I(leftv res, leftv u, leftv v)
1311{
1312  res->data = (char *)((int)((long)u->Data()) == (int)((long)v->Data()));
1313  jjEQUAL_REST(res,u,v);
1314  return FALSE;
1315}
1316static BOOLEAN jjEQUAL_Ma(leftv res, leftv u, leftv v)
1317{
1318  res->data = (char *)((long)mp_Equal((matrix)u->Data(),(matrix)v->Data(),currRing));
1319  jjEQUAL_REST(res,u,v);
1320  return FALSE;
1321}
1322static BOOLEAN jjEQUAL_N(leftv res, leftv u, leftv v)
1323{
1324  res->data = (char *)((long)nEqual((number)u->Data(),(number)v->Data()));
1325  jjEQUAL_REST(res,u,v);
1326  return FALSE;
1327}
1328static BOOLEAN jjEQUAL_P(leftv res, leftv u, leftv v)
1329{
1330  poly p=(poly)u->Data();
1331  poly q=(poly)v->Data();
1332  res->data = (char *) ((long)pEqualPolys(p,q));
1333  jjEQUAL_REST(res,u,v);
1334  return FALSE;
1335}
1336static void jjEQUAL_REST(leftv res,leftv u,leftv v)
1337{
1338  if ((res->data) && (u->next!=NULL) && (v->next!=NULL))
1339  {
1340    int save_iiOp=iiOp;
1341    if (iiOp==NOTEQUAL)
1342      iiExprArith2(res,u->next,EQUAL_EQUAL,v->next);
1343    else
1344      iiExprArith2(res,u->next,iiOp,v->next);
1345    iiOp=save_iiOp;
1346  }
1347  if (iiOp==NOTEQUAL) res->data=(char *)(!(long)res->data);
1348}
1349static BOOLEAN jjAND_I(leftv res, leftv u, leftv v)
1350{
1351  res->data = (char *)((long)u->Data() && (long)v->Data());
1352  return FALSE;
1353}
1354static BOOLEAN jjOR_I(leftv res, leftv u, leftv v)
1355{
1356  res->data = (char *)((long)u->Data() || (long)v->Data());
1357  return FALSE;
1358}
1359static BOOLEAN jjINDEX_I(leftv res, leftv u, leftv v)
1360{
1361  res->rtyp=u->rtyp; u->rtyp=0;
1362  res->data=u->data; u->data=NULL;
1363  res->name=u->name; u->name=NULL;
1364  res->e=u->e;       u->e=NULL;
1365  if (res->e==NULL) res->e=jjMakeSub(v);
1366  else
1367  {
1368    Subexpr sh=res->e;
1369    while (sh->next != NULL) sh=sh->next;
1370    sh->next=jjMakeSub(v);
1371  }
1372  if (u->next!=NULL)
1373  {
1374    leftv rn=(leftv)omAlloc0Bin(sleftv_bin);
1375    BOOLEAN bo=iiExprArith2(rn,u->next,iiOp,v);
1376    res->next=rn;
1377    return bo;
1378  }
1379  return FALSE;
1380}
1381static BOOLEAN jjINDEX_IV(leftv res, leftv u, leftv v)
1382{
1383  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
1384  {
1385    WerrorS("indexed object must have a name");
1386    return TRUE;
1387  }
1388  intvec * iv=(intvec *)v->Data();
1389  leftv p=NULL;
1390  int i;
1391  sleftv t;
1392  memset(&t,0,sizeof(t));
1393  t.rtyp=INT_CMD;
1394  for (i=0;i<iv->length(); i++)
1395  {
1396    t.data=(char *)((long)(*iv)[i]);
1397    if (p==NULL)
1398    {
1399      p=res;
1400    }
1401    else
1402    {
1403      p->next=(leftv)omAlloc0Bin(sleftv_bin);
1404      p=p->next;
1405    }
1406    p->rtyp=IDHDL;
1407    p->data=u->data;
1408    p->name=u->name;
1409    p->flag=u->flag;
1410    p->e=jjMakeSub(&t);
1411  }
1412  u->rtyp=0;
1413  u->data=NULL;
1414  u->name=NULL;
1415  return FALSE;
1416}
1417static BOOLEAN jjINDEX_P(leftv res, leftv u, leftv v)
1418{
1419  poly p=(poly)u->Data();
1420  int i=(int)(long)v->Data();
1421  int j=0;
1422  while (p!=NULL)
1423  {
1424    j++;
1425    if (j==i)
1426    {
1427      res->data=(char *)pHead(p);
1428      return FALSE;
1429    }
1430    pIter(p);
1431  }
1432  return FALSE;
1433}
1434static BOOLEAN jjINDEX_P_IV(leftv res, leftv u, leftv v)
1435{
1436  poly p=(poly)u->Data();
1437  poly r=NULL;
1438  intvec *iv=(intvec *)v->CopyD(INTVEC_CMD);
1439  int i;
1440  int sum=0;
1441  for(i=iv->length()-1;i>=0;i--)
1442    sum+=(*iv)[i];
1443  int j=0;
1444  while ((p!=NULL) && (sum>0))
1445  {
1446    j++;
1447    for(i=iv->length()-1;i>=0;i--)
1448    {
1449      if (j==(*iv)[i])
1450      {
1451        r=pAdd(r,pHead(p));
1452        sum-=j;
1453        (*iv)[i]=0;
1454        break;
1455      }
1456    }
1457    pIter(p);
1458  }
1459  delete iv;
1460  res->data=(char *)r;
1461  return FALSE;
1462}
1463static BOOLEAN jjINDEX_V(leftv res, leftv u, leftv v)
1464{
1465  poly p=(poly)u->CopyD(VECTOR_CMD);
1466  poly r=p; // pointer to the beginning of component i
1467  poly o=NULL;
1468  unsigned i=(unsigned)(long)v->Data();
1469  while (p!=NULL)
1470  {
1471    if (pGetComp(p)!=i)
1472    {
1473      if (r==p) r=pNext(p);
1474      if (o!=NULL)
1475      {
1476        if (pNext(o)!=NULL) pLmDelete(&pNext(o));
1477        p=pNext(o);
1478      }
1479      else
1480        pLmDelete(&p);
1481    }
1482    else
1483    {
1484      pSetComp(p, 0);
1485      p_SetmComp(p, currRing);
1486      o=p;
1487      p=pNext(o);
1488    }
1489  }
1490  res->data=(char *)r;
1491  return FALSE;
1492}
1493static BOOLEAN jjINDEX_V_IV(leftv res, leftv u, leftv v)
1494{
1495  poly p=(poly)u->CopyD(VECTOR_CMD);
1496  if (p!=NULL)
1497  {
1498    poly r=pOne();
1499    poly hp=r;
1500    intvec *iv=(intvec *)v->Data();
1501    int i;
1502    loop
1503    {
1504      for(i=0;i<iv->length();i++)
1505      {
1506        if (((int)pGetComp(p))==(*iv)[i])
1507        {
1508          poly h;
1509          pSplit(p,&h);
1510          pNext(hp)=p;
1511          p=h;
1512          pIter(hp);
1513          break;
1514        }
1515      }
1516      if (p==NULL) break;
1517      if (i==iv->length())
1518      {
1519        pLmDelete(&p);
1520        if (p==NULL) break;
1521      }
1522    }
1523    pLmDelete(&r);
1524    res->data=(char *)r;
1525  }
1526  return FALSE;
1527}
1528static BOOLEAN jjKLAMMER_rest(leftv res, leftv u, leftv v);
1529static BOOLEAN jjKLAMMER(leftv res, leftv u, leftv v)
1530{
1531  if(u->name==NULL) return TRUE;
1532  char * nn = (char *)omAlloc(strlen(u->name) + 14);
1533  sprintf(nn,"%s(%d)",u->name,(int)(long)v->Data());
1534  omFree((ADDRESS)u->name);
1535  u->name=NULL;
1536  char *n=omStrDup(nn);
1537  omFree((ADDRESS)nn);
1538  syMake(res,n);
1539  if (u->next!=NULL) return jjKLAMMER_rest(res,u->next,v);
1540  return FALSE;
1541}
1542static BOOLEAN jjKLAMMER_IV(leftv res, leftv u, leftv v)
1543{
1544  intvec * iv=(intvec *)v->Data();
1545  leftv p=NULL;
1546  int i;
1547  long slen = strlen(u->name) + 14;
1548  char *n = (char*) omAlloc(slen);
1549
1550  for (i=0;i<iv->length(); i++)
1551  {
1552    if (p==NULL)
1553    {
1554      p=res;
1555    }
1556    else
1557    {
1558      p->next=(leftv)omAlloc0Bin(sleftv_bin);
1559      p=p->next;
1560    }
1561    sprintf(n,"%s(%d)",u->name,(*iv)[i]);
1562    syMake(p,omStrDup(n));
1563  }
1564  omFree((ADDRESS)u->name);
1565  u->name = NULL;
1566  omFreeSize(n, slen);
1567  if (u->next!=NULL) return jjKLAMMER_rest(res,u->next,v);
1568  return FALSE;
1569}
1570static BOOLEAN jjKLAMMER_rest(leftv res, leftv u, leftv v)
1571{
1572  leftv tmp=(leftv)omAllocBin(sleftv_bin);
1573  memset(tmp,0,sizeof(sleftv));
1574  BOOLEAN b;
1575  if (v->Typ()==INTVEC_CMD)
1576    b=jjKLAMMER_IV(tmp,u,v);
1577  else
1578    b=jjKLAMMER(tmp,u,v);
1579  if (b)
1580  {
1581    omFreeBin(tmp,sleftv_bin);
1582    return TRUE;
1583  }
1584  leftv h=res;
1585  while (h->next!=NULL) h=h->next;
1586  h->next=tmp;
1587  return FALSE;
1588}
1589BOOLEAN jjPROC(leftv res, leftv u, leftv v)
1590{
1591  void *d;
1592  Subexpr e;
1593  int typ;
1594  BOOLEAN t=FALSE;
1595  idhdl tmp_proc=NULL;
1596  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
1597  {
1598    tmp_proc=(idhdl)omAlloc0(sizeof(idrec));
1599    tmp_proc->id="_auto";
1600    tmp_proc->typ=PROC_CMD;
1601    tmp_proc->data.pinf=(procinfo *)u->Data();
1602    tmp_proc->ref=1;
1603    d=u->data; u->data=(void *)tmp_proc;
1604    e=u->e; u->e=NULL;
1605    t=TRUE;
1606    typ=u->rtyp; u->rtyp=IDHDL;
1607  }
1608  BOOLEAN sl;
1609  if (u->req_packhdl==currPack)
1610    sl = iiMake_proc((idhdl)u->data,NULL,v);
1611  else
1612    sl = iiMake_proc((idhdl)u->data,u->req_packhdl,v);
1613  if (t)
1614  {
1615    u->rtyp=typ;
1616    u->data=d;
1617    u->e=e;
1618    omFreeSize(tmp_proc,sizeof(idrec));
1619  }
1620  if (sl) return TRUE;
1621  memcpy(res,&iiRETURNEXPR,sizeof(sleftv));
1622  iiRETURNEXPR.Init();
1623  return FALSE;
1624}
1625static BOOLEAN jjMAP(leftv res, leftv u, leftv v)
1626{
1627  //Print("try to map %s with %s\n",$3.Name(),$1.Name());
1628  leftv sl=NULL;
1629  if ((v->e==NULL)&&(v->name!=NULL))
1630  {
1631    map m=(map)u->Data();
1632    sl=iiMap(m,v->name);
1633  }
1634  else
1635  {
1636    Werror("%s(<name>) expected",u->Name());
1637  }
1638  if (sl==NULL) return TRUE;
1639  memcpy(res,sl,sizeof(sleftv));
1640  omFreeBin((ADDRESS)sl, sleftv_bin);
1641  return FALSE;
1642}
1643static BOOLEAN jjCHINREM_BI(leftv res, leftv u, leftv v)
1644{
1645  intvec *c=(intvec*)u->Data();
1646  intvec* p=(intvec*)v->Data();
1647  int rl=p->length();
1648  number *x=(number *)omAlloc(rl*sizeof(number));
1649  number *q=(number *)omAlloc(rl*sizeof(number));
1650  int i;
1651  for(i=rl-1;i>=0;i--)
1652  {
1653    q[i]=n_Init((*p)[i], coeffs_BIGINT);
1654    x[i]=n_Init((*c)[i], coeffs_BIGINT);
1655  }
1656  number n=n_ChineseRemainderSym(x,q,rl,FALSE,coeffs_BIGINT);
1657  for(i=rl-1;i>=0;i--)
1658  {
1659    n_Delete(&(q[i]),coeffs_BIGINT);
1660    n_Delete(&(x[i]),coeffs_BIGINT);
1661  }
1662  omFree(x); omFree(q);
1663  res->data=(char *)n;
1664  return FALSE;
1665}
1666#if 0
1667static BOOLEAN jjCHINREM_P(leftv res, leftv u, leftv v)
1668{
1669  lists c=(lists)u->CopyD(); // list of poly
1670  intvec* p=(intvec*)v->Data();
1671  int rl=p->length();
1672  poly r=NULL,h, result=NULL;
1673  number *x=(number *)omAlloc(rl*sizeof(number));
1674  number *q=(number *)omAlloc(rl*sizeof(number));
1675  int i;
1676  for(i=rl-1;i>=0;i--)
1677  {
1678    q[i]=nlInit((*p)[i]);
1679  }
1680  loop
1681  {
1682    for(i=rl-1;i>=0;i--)
1683    {
1684      if (c->m[i].Typ()!=POLY_CMD)
1685      {
1686        Werror("poly expected at pos %d",i+1);
1687        for(i=rl-1;i>=0;i--)
1688        {
1689          nlDelete(&(q[i]),currRing);
1690        }
1691        omFree(x); omFree(q); // delete c
1692        return TRUE;
1693      }
1694      h=((poly)c->m[i].Data());
1695      if (r==NULL) r=h;
1696      else if (pLmCmp(r,h)==-1) r=h;
1697    }
1698    if (r==NULL) break;
1699    for(i=rl-1;i>=0;i--)
1700    {
1701      h=((poly)c->m[i].Data());
1702      if (pLmCmp(r,h)==0)
1703      {
1704        x[i]=pGetCoeff(h);
1705        h=pLmFreeAndNext(h);
1706        c->m[i].data=(char*)h;
1707      }
1708      else
1709        x[i]=nlInit(0);
1710    }
1711    number n=n_ChineseRemainder(x,q,rl,currRing->cf);
1712    for(i=rl-1;i>=0;i--)
1713    {
1714      nlDelete(&(x[i]),currRing);
1715    }
1716    h=pHead(r);
1717    pSetCoeff(h,n);
1718    result=pAdd(result,h);
1719  }
1720  for(i=rl-1;i>=0;i--)
1721  {
1722    nlDelete(&(q[i]),currRing);
1723  }
1724  omFree(x); omFree(q);
1725  res->data=(char *)result;
1726  return FALSE;
1727}
1728#endif
1729static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v)
1730{
1731  coeffs cf;
1732  lists c=(lists)u->CopyD(); // list of ideal or bigint/int
1733  lists pl=NULL;
1734  intvec *p=NULL;
1735  if (v->Typ()==LIST_CMD) pl=(lists)v->Data();
1736  else                    p=(intvec*)v->Data();
1737  int rl=c->nr+1;
1738  ideal result;
1739  ideal *x=(ideal *)omAlloc(rl*sizeof(ideal));
1740  number *xx=NULL;
1741  int i;
1742  int return_type=c->m[0].Typ();
1743  if ((return_type!=IDEAL_CMD)
1744  && (return_type!=MODUL_CMD)
1745  && (return_type!=MATRIX_CMD)
1746  && (return_type!=POLY_CMD))
1747  {
1748    if((return_type!=BIGINT_CMD)&&(return_type!=INT_CMD))
1749    {
1750      WerrorS("poly/ideal/module/matrix expected");
1751      omFree(x); // delete c
1752      return TRUE;
1753    }
1754    else
1755      return_type=BIGINT_CMD;
1756  }
1757  if (return_type==BIGINT_CMD)
1758    cf=coeffs_BIGINT;
1759  else
1760  {
1761    cf=currRing->cf;
1762    if (nCoeff_is_Extension(cf) && (cf->extRing!=NULL))
1763      cf=cf->extRing->cf;
1764  }
1765  nMapFunc nMap=n_SetMap(coeffs_BIGINT,cf);
1766  if (return_type!=BIGINT_CMD)
1767  {
1768    for(i=rl-1;i>=0;i--)
1769    {
1770      if (c->m[i].Typ()!=return_type)
1771      {
1772        Werror("%s expected at pos %d",Tok2Cmdname(return_type),i+1);
1773        omFree(x); // delete c
1774        return TRUE;
1775      }
1776      if (return_type==POLY_CMD)
1777      {
1778        x[i]=idInit(1,1);
1779        x[i]->m[0]=(poly)c->m[i].CopyD();
1780      }
1781      else
1782      {
1783        x[i]=(ideal)c->m[i].CopyD();
1784      }
1785      //c->m[i].Init();
1786    }
1787  }
1788  else
1789  {
1790    xx=(number *)omAlloc(rl*sizeof(number));
1791    if (nMap==NULL)
1792    {
1793      Werror("not implemented: map bigint -> %s",cf->cfCoeffString(cf));
1794      return TRUE;
1795    }
1796    for(i=rl-1;i>=0;i--)
1797    {
1798      if (c->m[i].Typ()==INT_CMD)
1799      {
1800        xx[i]=n_Init(((int)(long)c->m[i].Data()),cf);
1801      }
1802      else if (c->m[i].Typ()==BIGINT_CMD)
1803      {
1804        xx[i]=nMap((number)c->m[i].Data(),coeffs_BIGINT,cf);
1805      }
1806      else
1807      {
1808        Werror("bigint expected at pos %d",i+1);
1809        omFree(x); // delete c
1810        omFree(xx); // delete c
1811        return TRUE;
1812      }
1813    }
1814  }
1815  number *q=(number *)omAlloc(rl*sizeof(number));
1816  if (p!=NULL)
1817  {
1818    for(i=rl-1;i>=0;i--)
1819    {
1820      q[i]=n_Init((*p)[i], cf);
1821    }
1822  }
1823  else
1824  {
1825    for(i=rl-1;i>=0;i--)
1826    {
1827      if (pl->m[i].Typ()==INT_CMD)
1828      {
1829        q[i]=n_Init((int)(long)pl->m[i].Data(),cf);
1830      }
1831      else if (pl->m[i].Typ()==BIGINT_CMD)
1832      {
1833        q[i]=nMap((number)(pl->m[i].Data()),coeffs_BIGINT,cf);
1834      }
1835      else
1836      {
1837        Werror("bigint expected at pos %d",i+1);
1838        for(i++;i<rl;i++)
1839        {
1840          n_Delete(&(q[i]),cf);
1841        }
1842        omFree(x); // delete c
1843        omFree(q); // delete pl
1844        if (xx!=NULL) omFree(xx); // delete c
1845        return TRUE;
1846      }
1847    }
1848  }
1849  if (return_type==BIGINT_CMD)
1850  {
1851    number n=n_ChineseRemainderSym(xx,q,rl,TRUE,coeffs_BIGINT);
1852    res->data=(char *)n;
1853  }
1854  else
1855  {
1856    result=id_ChineseRemainder(x,q,rl,currRing);
1857    // deletes also x
1858    c->Clean();
1859    if (return_type==POLY_CMD)
1860    {
1861      res->data=(char *)result->m[0];
1862      result->m[0]=NULL;
1863      idDelete(&result);
1864    }
1865    else
1866      res->data=(char *)result;
1867  }
1868  for(i=rl-1;i>=0;i--)
1869  {
1870    n_Delete(&(q[i]),cf);
1871  }
1872  omFree(q);
1873  res->rtyp=return_type;
1874  return FALSE;
1875}
1876static BOOLEAN jjCOEF(leftv res, leftv u, leftv v)
1877{
1878  poly p=(poly)v->Data();
1879  if ((p==NULL)||(pNext(p)!=NULL)) return TRUE;
1880  res->data=(char *)mp_CoeffProc((poly)u->Data(),p /*(poly)v->Data()*/,currRing);
1881  return FALSE;
1882}
1883static BOOLEAN jjCOEFFS_Id(leftv res, leftv u, leftv v)
1884{
1885  int i=pVar((poly)v->Data());
1886  if (i==0)
1887  {
1888    WerrorS("ringvar expected");
1889    return TRUE;
1890  }
1891  res->data=(char *)mp_Coeffs((ideal)u->CopyD(),i,currRing);
1892  return FALSE;
1893}
1894static BOOLEAN jjCOEFFS2_KB(leftv res, leftv u, leftv v)
1895{
1896  poly p = pInit();
1897  int i;
1898  for (i=1; i<=currRing->N; i++)
1899  {
1900    pSetExp(p, i, 1);
1901  }
1902  pSetm(p);
1903  res->data = (void*)idCoeffOfKBase((ideal)(u->Data()),
1904                                    (ideal)(v->Data()), p);
1905  pDelete(&p);
1906  return FALSE;
1907}
1908static BOOLEAN jjCONTRACT(leftv res, leftv u, leftv v)
1909{
1910  res->data=(char *)idDiffOp((ideal)u->Data(),(ideal)v->Data(),FALSE);
1911  return FALSE;
1912}
1913static BOOLEAN jjDEG_M_IV(leftv res, leftv u, leftv v)
1914{
1915  short *iv=iv2array((intvec *)v->Data(),currRing);
1916  ideal I=(ideal)u->Data();
1917  int d=-1;
1918  int i;
1919  for(i=IDELEMS(I);i>=0;i--) d=si_max(d,(int)p_DegW(I->m[i],iv,currRing));
1920  omFreeSize( (ADDRESS)iv, (rVar(currRing)+1)*sizeof(short) );
1921  res->data = (char *)((long)d);
1922  return FALSE;
1923}
1924static BOOLEAN jjDEG_IV(leftv res, leftv u, leftv v)
1925{
1926  poly p=(poly)u->Data();
1927  if (p!=NULL)
1928  {
1929    short *iv=iv2array((intvec *)v->Data(),currRing);
1930    const long d = p_DegW(p,iv,currRing);
1931    omFreeSize( (ADDRESS)iv, (rVar(currRing)+1)*sizeof(short) );
1932    res->data = (char *)(d);
1933  }
1934  else
1935    res->data=(char *)(long)(-1);
1936  return FALSE;
1937}
1938static BOOLEAN jjDIFF_P(leftv res, leftv u, leftv v)
1939{
1940  int i=pVar((poly)v->Data());
1941  if (i==0)
1942  {
1943    WerrorS("ringvar expected");
1944    return TRUE;
1945  }
1946  res->data=(char *)pDiff((poly)(u->Data()),i);
1947  return FALSE;
1948}
1949static BOOLEAN jjDIFF_ID(leftv res, leftv u, leftv v)
1950{
1951  int i=pVar((poly)v->Data());
1952  if (i==0)
1953  {
1954    WerrorS("ringvar expected");
1955    return TRUE;
1956  }
1957  res->data=(char *)idDiff((matrix)(u->Data()),i);
1958  return FALSE;
1959}
1960static BOOLEAN jjDIFF_ID_ID(leftv res, leftv u, leftv v)
1961{
1962  res->data=(char *)idDiffOp((ideal)u->Data(),(ideal)v->Data());
1963  return FALSE;
1964}
1965static BOOLEAN jjDIM2(leftv res, leftv v, leftv w)
1966{
1967  assumeStdFlag(v);
1968#ifdef HAVE_RINGS
1969  if (rField_is_Ring(currRing))
1970  {
1971    //ring origR = currRing;
1972    //ring tempR = rCopy(origR);
1973    //coeffs new_cf=nInitChar(n_Q,NULL);
1974    //nKillChar(tempR->cf);
1975    //tempR->cf=new_cf;
1976    //rComplete(tempR);
1977    ideal vid = (ideal)v->Data();
1978    int i = idPosConstant(vid);
1979    if ((i != -1) && (n_IsUnit(pGetCoeff(vid->m[i]),currRing->cf)))
1980    { /* ideal v contains unit; dim = -1 */
1981      res->data = (char *)-1;
1982      return FALSE;
1983    }
1984    //rChangeCurrRing(tempR);
1985    //ideal vv = idrCopyR(vid, origR, currRing);
1986    ideal vv = id_Copy(vid, currRing);
1987    //ideal ww = idrCopyR((ideal)w->Data(), origR, currRing);
1988    ideal ww = id_Copy((ideal)w->Data(), currRing);
1989    /* drop degree zero generator from vv (if any) */
1990    if (i != -1) pDelete(&vv->m[i]);
1991    long d = (long)scDimInt(vv, ww);
1992    if (rField_is_Ring_Z(currRing) && (i == -1)) d++;
1993    res->data = (char *)d;
1994    idDelete(&vv); idDelete(&ww);
1995    //rChangeCurrRing(origR);
1996    //rDelete(tempR);
1997    return FALSE;
1998  }
1999#endif
2000  if(currRing->qideal==NULL)
2001    res->data = (char *)((long)scDimInt((ideal)(v->Data()),(ideal)w->Data()));
2002  else
2003  {
2004    ideal q=idSimpleAdd(currRing->qideal,(ideal)w->Data());
2005    res->data = (char *)((long)scDimInt((ideal)(v->Data()),q));
2006    idDelete(&q);
2007  }
2008  return FALSE;
2009}
2010static BOOLEAN jjDIVISION(leftv res, leftv u, leftv v)
2011{
2012  ideal vi=(ideal)v->Data();
2013  int vl= IDELEMS(vi);
2014  ideal ui=(ideal)u->Data();
2015  int ul= IDELEMS(ui);
2016  ideal R; matrix U;
2017  ideal m = idLift(vi,ui,&R, FALSE,hasFlag(v,FLAG_STD),TRUE,&U);
2018  if (m==NULL) return TRUE;
2019  // now make sure that all matices have the corect size:
2020  matrix T = id_Module2formatedMatrix(m,vl,ul,currRing);
2021  int i;
2022  if (MATCOLS(U) != ul)
2023  {
2024    int mul=si_min(ul,MATCOLS(U));
2025    matrix UU=mpNew(ul,ul);
2026    int j;
2027    for(i=mul;i>0;i--)
2028    {
2029      for(j=mul;j>0;j--)
2030      {
2031        MATELEM(UU,i,j)=MATELEM(U,i,j);
2032        MATELEM(U,i,j)=NULL;
2033      }
2034    }
2035    idDelete((ideal *)&U);
2036    U=UU;
2037  }
2038  // make sure that U is a diagonal matrix of units
2039  for(i=ul;i>0;i--)
2040  {
2041    if(MATELEM(U,i,i)==NULL) MATELEM(U,i,i)=pOne();
2042  }
2043  lists L=(lists)omAllocBin(slists_bin);
2044  L->Init(3);
2045  L->m[0].rtyp=MATRIX_CMD;   L->m[0].data=(void *)T;
2046  L->m[1].rtyp=u->Typ();     L->m[1].data=(void *)R;
2047  L->m[2].rtyp=MATRIX_CMD;   L->m[2].data=(void *)U;
2048  res->data=(char *)L;
2049  return FALSE;
2050}
2051static BOOLEAN jjELIMIN(leftv res, leftv u, leftv v)
2052{
2053  res->data=(char *)idElimination((ideal)u->Data(),(poly)v->Data());
2054  //setFlag(res,FLAG_STD);
2055  return FALSE;
2056}
2057static BOOLEAN jjELIMIN_IV(leftv res, leftv u, leftv v)
2058{
2059  poly p=pOne();
2060  intvec *iv=(intvec*)v->Data();
2061  for(int i=iv->length()-1; i>=0; i--)
2062  {
2063    pSetExp(p,(*iv)[i],1);
2064  }
2065  pSetm(p);
2066  res->data=(char *)idElimination((ideal)u->Data(),p);
2067  pLmDelete(&p);
2068  //setFlag(res,FLAG_STD);
2069  return FALSE;
2070}
2071static BOOLEAN jjEXPORTTO(leftv, leftv u, leftv v)
2072{
2073  //Print("exportto %s -> %s\n",v->Name(),u->Name() );
2074  return iiExport(v,0,IDPACKAGE((idhdl)u->data));
2075}
2076static BOOLEAN jjERROR(leftv, leftv u)
2077{
2078  WerrorS((char *)u->Data());
2079  extern int inerror;
2080  inerror=3;
2081  return TRUE;
2082}
2083static BOOLEAN jjEXTGCD_BI(leftv res, leftv u, leftv v)
2084{
2085  number uu=(number)u->Data();number vv=(number)v->Data();
2086  lists L=(lists)omAllocBin(slists_bin);
2087  number a,b;
2088  number p0=n_ExtGcd(uu,vv,&a,&b,coeffs_BIGINT);
2089  L->Init(3);
2090  L->m[0].rtyp=BIGINT_CMD;   L->m[0].data=(void *)p0;
2091  L->m[1].rtyp=BIGINT_CMD;   L->m[1].data=(void *)a;
2092  L->m[2].rtyp=BIGINT_CMD;   L->m[2].data=(void *)b;
2093  res->rtyp=LIST_CMD;
2094  res->data=(char *)L;
2095  return FALSE;
2096}
2097static BOOLEAN jjEXTGCD_I(leftv res, leftv u, leftv v)
2098{
2099  int uu=(int)(long)u->Data();int vv=(int)(long)v->Data();
2100  int p0=ABS(uu),p1=ABS(vv);
2101  int f0 = 1, f1 = 0, g0 = 0, g1 = 1, q, r;
2102
2103  while ( p1!=0 )
2104  {
2105    q=p0 / p1;
2106    r=p0 % p1;
2107    p0 = p1; p1 = r;
2108    r = g0 - g1 * q;
2109    g0 = g1; g1 = r;
2110    r = f0 - f1 * q;
2111    f0 = f1; f1 = r;
2112  }
2113  int a = f0;
2114  int b = g0;
2115  if ( uu /*(int)(long)u->Data()*/ < 0 ) a=-a;
2116  if ( vv /*(int)(long)v->Data()*/ < 0 ) b=-b;
2117  lists L=(lists)omAllocBin(slists_bin);
2118  L->Init(3);
2119  L->m[0].rtyp=INT_CMD;   L->m[0].data=(void *)(long)p0;
2120  L->m[1].rtyp=INT_CMD;   L->m[1].data=(void *)(long)a;
2121  L->m[2].rtyp=INT_CMD;   L->m[2].data=(void *)(long)b;
2122  res->rtyp=LIST_CMD;
2123  res->data=(char *)L;
2124  return FALSE;
2125}
2126static BOOLEAN jjEXTGCD_P(leftv res, leftv u, leftv v)
2127{
2128  poly r,pa,pb;
2129  BOOLEAN ret=singclap_extgcd((poly)u->Data(),(poly)v->Data(),r,pa,pb,currRing);
2130  if (ret) return TRUE;
2131  lists L=(lists)omAllocBin(slists_bin);
2132  L->Init(3);
2133  res->data=(char *)L;
2134  L->m[0].data=(void *)r;
2135  L->m[0].rtyp=POLY_CMD;
2136  L->m[1].data=(void *)pa;
2137  L->m[1].rtyp=POLY_CMD;
2138  L->m[2].data=(void *)pb;
2139  L->m[2].rtyp=POLY_CMD;
2140  return FALSE;
2141}
2142extern int singclap_factorize_retry;
2143static BOOLEAN jjFAC_P2(leftv res, leftv u,leftv dummy)
2144{
2145  intvec *v=NULL;
2146  int sw=(int)(long)dummy->Data();
2147  int fac_sw=sw;
2148  if ((sw<0)||(sw>2)) fac_sw=1;
2149  singclap_factorize_retry=0;
2150  ideal f=singclap_factorize((poly)(u->CopyD()), &v, fac_sw,currRing);
2151  if (f==NULL)
2152    return TRUE;
2153  switch(sw)
2154  {
2155    case 0:
2156    case 2:
2157    {
2158      lists l=(lists)omAllocBin(slists_bin);
2159      l->Init(2);
2160      l->m[0].rtyp=IDEAL_CMD;
2161      l->m[0].data=(void *)f;
2162      l->m[1].rtyp=INTVEC_CMD;
2163      l->m[1].data=(void *)v;
2164      res->data=(void *)l;
2165      res->rtyp=LIST_CMD;
2166      return FALSE;
2167    }
2168    case 1:
2169      res->data=(void *)f;
2170      return FALSE;
2171    case 3:
2172      {
2173        poly p=f->m[0];
2174        int i=IDELEMS(f);
2175        f->m[0]=NULL;
2176        while(i>1)
2177        {
2178          i--;
2179          p=pMult(p,f->m[i]);
2180          f->m[i]=NULL;
2181        }
2182        res->data=(void *)p;
2183        res->rtyp=POLY_CMD;
2184      }
2185      return FALSE;
2186  }
2187  WerrorS("invalid switch");
2188  return TRUE;
2189}
2190static BOOLEAN jjFACSTD2(leftv res, leftv v, leftv w)
2191{
2192  ideal_list p,h;
2193  h=kStdfac((ideal)v->Data(),NULL,testHomog,NULL,(ideal)w->Data());
2194  p=h;
2195  int l=0;
2196  while (p!=NULL) { p=p->next;l++; }
2197  lists L=(lists)omAllocBin(slists_bin);
2198  L->Init(l);
2199  l=0;
2200  while(h!=NULL)
2201  {
2202    L->m[l].data=(char *)h->d;
2203    L->m[l].rtyp=IDEAL_CMD;
2204    p=h->next;
2205    omFreeSize(h,sizeof(*h));
2206    h=p;
2207    l++;
2208  }
2209  res->data=(void *)L;
2210  return FALSE;
2211}
2212static BOOLEAN jjFAREY_BI(leftv res, leftv u, leftv v)
2213{
2214  if (rField_is_Q(currRing))
2215  {
2216    number uu=(number)u->Data();
2217    number vv=(number)v->Data();
2218    res->data=(char *)n_Farey(uu,vv,currRing->cf);
2219    return FALSE;
2220  }
2221  else return TRUE;
2222}
2223static BOOLEAN jjFAREY_ID(leftv res, leftv u, leftv v)
2224{
2225  ideal uu=(ideal)u->Data();
2226  number vv=(number)v->Data();
2227  res->data=(void*)id_Farey(uu,vv,currRing);
2228  res->rtyp=u->Typ();
2229  return FALSE;
2230}
2231static BOOLEAN jjFETCH(leftv res, leftv u, leftv v)
2232{
2233  ring r=(ring)u->Data();
2234  idhdl w;
2235  int op=iiOp;
2236  nMapFunc nMap;
2237
2238  if ((w=r->idroot->get(v->Name(),myynest))!=NULL)
2239  {
2240    int *perm=NULL;
2241    int *par_perm=NULL;
2242    int par_perm_size=0;
2243    BOOLEAN bo;
2244    if ((nMap=n_SetMap(r->cf,currRing->cf))==NULL)
2245    {
2246      // Allow imap/fetch to be make an exception only for:
2247      if ( (rField_is_Q_a(r) &&  // Q(a..) -> Q(a..) || Q || Zp || Zp(a)
2248            (rField_is_Q(currRing) || rField_is_Q_a(currRing) ||
2249             (rField_is_Zp(currRing) || rField_is_Zp_a(currRing))))
2250           ||
2251           (rField_is_Zp_a(r) &&  // Zp(a..) -> Zp(a..) || Zp
2252            (rField_is_Zp(currRing, r->cf->ch) ||
2253             rField_is_Zp_a(currRing, r->cf->ch))) )
2254      {
2255        par_perm_size=rPar(r);
2256      }
2257      else
2258      {
2259        goto err_fetch;
2260      }
2261    }
2262    if ((iiOp!=FETCH_CMD) || (r->N!=currRing->N) || (rPar(r)!=rPar(currRing)))
2263    {
2264      perm=(int *)omAlloc0((r->N+1)*sizeof(int));
2265      if (par_perm_size!=0)
2266        par_perm=(int *)omAlloc0(par_perm_size*sizeof(int));
2267      op=IMAP_CMD;
2268      if (iiOp==IMAP_CMD)
2269      {
2270        int r_par=0;
2271        char ** r_par_names=NULL;
2272        if (r->cf->extRing!=NULL)
2273        {
2274          r_par=r->cf->extRing->N;
2275          r_par_names=r->cf->extRing->names;
2276        }
2277        int c_par=0;
2278        char ** c_par_names=NULL;
2279        if (currRing->cf->extRing!=NULL)
2280        {
2281          c_par=currRing->cf->extRing->N;
2282          c_par_names=currRing->cf->extRing->names;
2283        }
2284        maFindPerm(r->names,       r->N,       r_par_names, r_par,
2285                   currRing->names,currRing->N,c_par_names, c_par,
2286                   perm,par_perm, currRing->cf->type);
2287      }
2288      else
2289      {
2290        int i;
2291        if (par_perm_size!=0)
2292          for(i=si_min(rPar(r),rPar(currRing))-1;i>=0;i--) par_perm[i]=-(i+1);
2293        for(i=si_min(r->N,currRing->N);i>0;i--) perm[i]=i;
2294      }
2295    }
2296    if ((iiOp==FETCH_CMD) &&(BVERBOSE(V_IMAP)))
2297    {
2298      int i;
2299      for(i=0;i<si_min(r->N,currRing->N);i++)
2300      {
2301        Print("// var nr %d: %s -> %s\n",i,r->names[i],currRing->names[i]);
2302      }
2303      for(i=0;i<si_min(rPar(r),rPar(currRing));i++) // possibly empty loop
2304      {
2305        Print("// par nr %d: %s -> %s\n",
2306              i,rParameter(r)[i],rParameter(currRing)[i]);
2307      }
2308    }
2309    sleftv tmpW;
2310    memset(&tmpW,0,sizeof(sleftv));
2311    tmpW.rtyp=IDTYP(w);
2312    tmpW.data=IDDATA(w);
2313    if ((bo=maApplyFetch(op,NULL,res,&tmpW, r,
2314                         perm,par_perm,par_perm_size,nMap)))
2315    {
2316      Werror("cannot map %s of type %s(%d)",v->name, Tok2Cmdname(w->typ),w->typ);
2317    }
2318    if (perm!=NULL)
2319      omFreeSize((ADDRESS)perm,(r->N+1)*sizeof(int));
2320    if (par_perm!=NULL)
2321      omFreeSize((ADDRESS)par_perm,par_perm_size*sizeof(int));
2322    return bo;
2323  }
2324  else
2325  {
2326    Werror("identifier %s not found in %s",v->Fullname(),u->Fullname());
2327  }
2328  return TRUE;
2329err_fetch:
2330  Werror("no identity map from %s (%s -> %s)",u->Fullname(),
2331    r->cf->cfCoeffString(r->cf),
2332    currRing->cf->cfCoeffString(currRing->cf));
2333  return TRUE;
2334}
2335static BOOLEAN jjFIND2(leftv res, leftv u, leftv v)
2336{
2337  /*4
2338  * look for the substring what in the string where
2339  * return the position of the first char of what in where
2340  * or 0
2341  */
2342  char *where=(char *)u->Data();
2343  char *what=(char *)v->Data();
2344  char *found = strstr(where,what);
2345  if (found != NULL)
2346  {
2347    res->data=(char *)((found-where)+1);
2348  }
2349  /*else res->data=NULL;*/
2350  return FALSE;
2351}
2352static BOOLEAN jjFWALK(leftv res, leftv u, leftv v)
2353{
2354  res->data=(char *)fractalWalkProc(u,v);
2355  setFlag( res, FLAG_STD );
2356  return FALSE;
2357}
2358static BOOLEAN jjGCD_I(leftv res, leftv u, leftv v)
2359{
2360  int uu=(int)(long)u->Data();int vv=(int)(long)v->Data();
2361  int p0=ABS(uu),p1=ABS(vv);
2362  int r;
2363  while ( p1!=0 )
2364  {
2365    r=p0 % p1;
2366    p0 = p1; p1 = r;
2367  }
2368  res->rtyp=INT_CMD;
2369  res->data=(char *)(long)p0;
2370  return FALSE;
2371}
2372static BOOLEAN jjGCD_BI(leftv res, leftv u, leftv v)
2373{
2374  number n1 = (number) u->Data();
2375  number n2 = (number) v->Data();
2376  res->data = n_Gcd(n1,n2,coeffs_BIGINT);
2377  return FALSE;
2378}
2379static BOOLEAN jjGCD_N(leftv res, leftv u, leftv v)
2380{
2381  number a=(number) u->Data();
2382  number b=(number) v->Data();
2383  if (nIsZero(a))
2384  {
2385    if (nIsZero(b)) res->data=(char *)nInit(1);
2386    else            res->data=(char *)nCopy(b);
2387  }
2388  else
2389  {
2390    if (nIsZero(b))  res->data=(char *)nCopy(a);
2391    //else res->data=(char *)n_Gcd(a, b, currRing->cf);
2392    else res->data=(char *)n_SubringGcd(a, b, currRing->cf);
2393  }
2394  return FALSE;
2395}
2396static BOOLEAN jjGCD_P(leftv res, leftv u, leftv v)
2397{
2398  res->data=(void *)singclap_gcd((poly)(u->CopyD(POLY_CMD)),
2399                                 (poly)(v->CopyD(POLY_CMD)),currRing);
2400  return FALSE;
2401}
2402static BOOLEAN jjHILBERT2(leftv res, leftv u, leftv v)
2403{
2404#ifdef HAVE_RINGS
2405  if (rField_is_Ring_Z(currRing))
2406  {
2407    ring origR = currRing;
2408    ring tempR = rCopy(origR);
2409    coeffs new_cf=nInitChar(n_Q,NULL);
2410    nKillChar(tempR->cf);
2411    tempR->cf=new_cf;
2412    rComplete(tempR);
2413    ideal uid = (ideal)u->Data();
2414    rChangeCurrRing(tempR);
2415    ideal uu = idrCopyR(uid, origR, currRing);
2416    sleftv uuAsLeftv; memset(&uuAsLeftv, 0, sizeof(uuAsLeftv));
2417    uuAsLeftv.rtyp = IDEAL_CMD;
2418    uuAsLeftv.data = uu; uuAsLeftv.next = NULL;
2419    if (hasFlag(u, FLAG_STD)) setFlag(&uuAsLeftv,FLAG_STD);
2420    assumeStdFlag(&uuAsLeftv);
2421    Print("// NOTE: computation of Hilbert series etc. is being\n");
2422    Print("//       performed for generic fibre, that is, over Q\n");
2423    intvec *module_w=(intvec*)atGet(&uuAsLeftv,"isHomog",INTVEC_CMD);
2424    intvec *iv=hFirstSeries(uu,module_w,currRing->qideal);
2425    int returnWithTrue = 1;
2426    switch((int)(long)v->Data())
2427    {
2428      case 1:
2429        res->data=(void *)iv;
2430        returnWithTrue = 0;
2431      case 2:
2432        res->data=(void *)hSecondSeries(iv);
2433        delete iv;
2434        returnWithTrue = 0;
2435    }
2436    if (returnWithTrue)
2437    {
2438      WerrorS(feNotImplemented);
2439      delete iv;
2440    }
2441    idDelete(&uu);
2442    rChangeCurrRing(origR);
2443    rDelete(tempR);
2444    if (returnWithTrue) return TRUE; else return FALSE;
2445  }
2446#endif
2447  assumeStdFlag(u);
2448  intvec *module_w=(intvec*)atGet(u,"isHomog",INTVEC_CMD);
2449  intvec *iv=hFirstSeries((ideal)u->Data(),module_w,currRing->qideal);
2450  switch((int)(long)v->Data())
2451  {
2452    case 1:
2453      res->data=(void *)iv;
2454      return FALSE;
2455    case 2:
2456      res->data=(void *)hSecondSeries(iv);
2457      delete iv;
2458      return FALSE;
2459  }
2460  WerrorS(feNotImplemented);
2461  delete iv;
2462  return TRUE;
2463}
2464static BOOLEAN jjHOMOG_P(leftv res, leftv u, leftv v)
2465{
2466  int i=pVar((poly)v->Data());
2467  if (i==0)
2468  {
2469    WerrorS("ringvar expected");
2470    return TRUE;
2471  }
2472  poly p=pOne(); pSetExp(p,i,1); pSetm(p);
2473  int d=pWTotaldegree(p);
2474  pLmDelete(p);
2475  if (d==1)
2476    res->data = (char *)p_Homogen((poly)u->Data(), i, currRing);
2477  else
2478    WerrorS("variable must have weight 1");
2479  return (d!=1);
2480}
2481static BOOLEAN jjHOMOG_ID(leftv res, leftv u, leftv v)
2482{
2483  int i=pVar((poly)v->Data());
2484  if (i==0)
2485  {
2486    WerrorS("ringvar expected");
2487    return TRUE;
2488  }
2489  pFDegProc deg;
2490  if (currRing->pLexOrder && (currRing->order[0]==ringorder_lp))
2491    deg=p_Totaldegree;
2492   else
2493    deg=currRing->pFDeg;
2494  poly p=pOne(); pSetExp(p,i,1); pSetm(p);
2495  int d=deg(p,currRing);
2496  pLmDelete(p);
2497  if (d==1)
2498    res->data = (char *)id_Homogen((ideal)u->Data(), i, currRing);
2499  else
2500    WerrorS("variable must have weight 1");
2501  return (d!=1);
2502}
2503static BOOLEAN jjHOMOG1_W(leftv res, leftv v, leftv u)
2504{
2505  intvec *w=new intvec(rVar(currRing));
2506  intvec *vw=(intvec*)u->Data();
2507  ideal v_id=(ideal)v->Data();
2508  pFDegProc save_FDeg=currRing->pFDeg;
2509  pLDegProc save_LDeg=currRing->pLDeg;
2510  BOOLEAN save_pLexOrder=currRing->pLexOrder;
2511  currRing->pLexOrder=FALSE;
2512  kHomW=vw;
2513  kModW=w;
2514  pSetDegProcs(currRing,kHomModDeg);
2515  res->data=(void *)(long)idHomModule(v_id,currRing->qideal,&w);
2516  currRing->pLexOrder=save_pLexOrder;
2517  kHomW=NULL;
2518  kModW=NULL;
2519  pRestoreDegProcs(currRing,save_FDeg,save_LDeg);
2520  if (w!=NULL) delete w;
2521  return FALSE;
2522}
2523static BOOLEAN jjINDEPSET2(leftv res, leftv u, leftv v)
2524{
2525  assumeStdFlag(u);
2526  res->data=(void *)scIndIndset((ideal)(u->Data()),(int)(long)(v->Data()),
2527                    currRing->qideal);
2528  return FALSE;
2529}
2530static BOOLEAN jjINTERSECT(leftv res, leftv u, leftv v)
2531{
2532  res->data=(char *)idSect((ideal)u->Data(),(ideal)v->Data());
2533  if (TEST_OPT_RETURN_SB) setFlag(res,FLAG_STD);
2534  return FALSE;
2535}
2536static BOOLEAN jjINTERPOLATION (leftv res, leftv l, leftv v)
2537{
2538  const lists L = (lists)l->Data();
2539  const int n = L->nr; assume (n >= 0);
2540  std::vector<ideal> V(n + 1);
2541
2542  for(int i = n; i >= 0; i--) V[i] = (ideal)(L->m[i].Data());
2543
2544  res->data=interpolation(V, (intvec*)v->Data());
2545  setFlag(res,FLAG_STD);
2546  return errorreported;
2547}
2548static BOOLEAN jjJanetBasis2(leftv res, leftv u, leftv v)
2549{
2550  extern BOOLEAN jjStdJanetBasis(leftv res, leftv v,int flag);
2551  return jjStdJanetBasis(res,u,(int)(long)v->Data());
2552}
2553
2554static BOOLEAN jjJanetBasis(leftv res, leftv v)
2555{
2556  extern BOOLEAN jjStdJanetBasis(leftv res, leftv v,int flag);
2557  return jjStdJanetBasis(res,v,0);
2558}
2559static BOOLEAN jjJET_P(leftv res, leftv u, leftv v)
2560{
2561  res->data = (char *)pJet((poly)u->CopyD(), (int)(long)v->Data());
2562  return FALSE;
2563}
2564static BOOLEAN jjJET_ID(leftv res, leftv u, leftv v)
2565{
2566  res->data = (char *)id_Jet((ideal)u->Data(),(int)(long)v->Data(),currRing);
2567  return FALSE;
2568}
2569static BOOLEAN jjKBASE2(leftv res, leftv u, leftv v)
2570{
2571  assumeStdFlag(u);
2572  intvec *w_u=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
2573  res->data = (char *)scKBase((int)(long)v->Data(),
2574                              (ideal)(u->Data()),currRing->qideal, w_u);
2575  if (w_u!=NULL)
2576  {
2577    atSet(res,omStrDup("isHomog"),ivCopy(w_u),INTVEC_CMD);
2578  }
2579  return FALSE;
2580}
2581static BOOLEAN jjPREIMAGE(leftv res, leftv u, leftv v, leftv w);
2582static BOOLEAN jjKERNEL(leftv res, leftv u, leftv v)
2583{
2584  return jjPREIMAGE(res,u,v,NULL);
2585}
2586static BOOLEAN jjKoszul(leftv res, leftv u, leftv v)
2587{
2588  return mpKoszul(res, u,v,NULL);
2589}
2590static BOOLEAN jjKoszul_Id(leftv res, leftv u, leftv v)
2591{
2592  sleftv h;
2593  memset(&h,0,sizeof(sleftv));
2594  h.rtyp=INT_CMD;
2595  h.data=(void *)(long)IDELEMS((ideal)v->Data());
2596  return mpKoszul(res, u, &h, v);
2597}
2598static BOOLEAN jjLIFT(leftv res, leftv u, leftv v)
2599{
2600  int ul= IDELEMS((ideal)u->Data());
2601  int vl= IDELEMS((ideal)v->Data());
2602  ideal m = idLift((ideal)u->Data(),(ideal)v->Data(),NULL,FALSE,
2603                   hasFlag(u,FLAG_STD));
2604  if (m==NULL) return TRUE;
2605  res->data = (char *)id_Module2formatedMatrix(m,ul,vl,currRing);
2606  return FALSE;
2607}
2608static BOOLEAN jjLIFTSTD(leftv res, leftv u, leftv v)
2609{
2610  if ((v->rtyp!=IDHDL)||(v->e!=NULL)) return TRUE;
2611  idhdl h=(idhdl)v->data;
2612  // CopyD for IDEAL_CMD and MODUL_CMD are identical:
2613  res->data = (char *)idLiftStd((ideal)u->Data(),
2614                                &(h->data.umatrix),testHomog);
2615  setFlag(res,FLAG_STD); v->flag=0;
2616  return FALSE;
2617}
2618static BOOLEAN jjLOAD2(leftv /*res*/, leftv, leftv v)
2619{
2620  return jjLOAD((char*)v->Data(),TRUE);
2621}
2622static BOOLEAN jjLOAD_E(leftv /*res*/, leftv v, leftv u)
2623{
2624  char * s=(char *)u->Data();
2625  if(strcmp(s, "with")==0)
2626    return jjLOAD((char*)v->Data(), TRUE);
2627  WerrorS("invalid second argument");
2628  WerrorS("load(\"libname\" [,\"with\"]);");
2629  return TRUE;
2630}
2631static BOOLEAN jjMODULO(leftv res, leftv u, leftv v)
2632{
2633  intvec *w_u=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
2634  tHomog hom=testHomog;
2635  if (w_u!=NULL)
2636  {
2637    w_u=ivCopy(w_u);
2638    hom=isHomog;
2639  }
2640  intvec *w_v=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
2641  if (w_v!=NULL)
2642  {
2643    w_v=ivCopy(w_v);
2644    hom=isHomog;
2645  }
2646  if ((w_u!=NULL) && (w_v==NULL))
2647    w_v=ivCopy(w_u);
2648  if ((w_v!=NULL) && (w_u==NULL))
2649    w_u=ivCopy(w_v);
2650  ideal u_id=(ideal)u->Data();
2651  ideal v_id=(ideal)v->Data();
2652  if (w_u!=NULL)
2653  {
2654     if ((*w_u).compare((w_v))!=0)
2655     {
2656       WarnS("incompatible weights");
2657       delete w_u; w_u=NULL;
2658       hom=testHomog;
2659     }
2660     else
2661     {
2662       if ((!idTestHomModule(u_id,currRing->qideal,w_v))
2663       || (!idTestHomModule(v_id,currRing->qideal,w_v)))
2664       {
2665         WarnS("wrong weights");
2666         delete w_u; w_u=NULL;
2667         hom=testHomog;
2668       }
2669     }
2670  }
2671  res->data = (char *)idModulo(u_id,v_id ,hom,&w_u);
2672  if (w_u!=NULL)
2673  {
2674    atSet(res,omStrDup("isHomog"),w_u,INTVEC_CMD);
2675  }
2676  delete w_v;
2677  if (TEST_OPT_RETURN_SB) setFlag(res,FLAG_STD);
2678  return FALSE;
2679}
2680static BOOLEAN jjMOD_BI(leftv res, leftv u, leftv v)
2681{
2682  number q=(number)v->Data();
2683  if (n_IsZero(q,coeffs_BIGINT))
2684  {
2685    WerrorS(ii_div_by_0);
2686    return TRUE;
2687  }
2688  res->data =(char *) n_IntMod((number)u->Data(),q,coeffs_BIGINT);
2689  return FALSE;
2690}
2691static BOOLEAN jjMOD_N(leftv res, leftv u, leftv v)
2692{
2693  number q=(number)v->Data();
2694  if (nIsZero(q))
2695  {
2696    WerrorS(ii_div_by_0);
2697    return TRUE;
2698  }
2699  res->data =(char *) n_IntMod((number)u->Data(),q,currRing->cf);
2700  return FALSE;
2701}
2702static BOOLEAN jjMONITOR2(leftv res, leftv u,leftv v);
2703static BOOLEAN jjMONITOR1(leftv res, leftv v)
2704{
2705  return jjMONITOR2(res,v,NULL);
2706}
2707static BOOLEAN jjMONITOR2(leftv, leftv u,leftv v)
2708{
2709#if 0
2710  char *opt=(char *)v->Data();
2711  int mode=0;
2712  while(*opt!='\0')
2713  {
2714    if (*opt=='i') mode |= SI_PROT_I;
2715    else if (*opt=='o') mode |= SI_PROT_O;
2716    opt++;
2717  }
2718  monitor((char *)(u->Data()),mode);
2719#else
2720  si_link l=(si_link)u->Data();
2721  if (slOpen(l,SI_LINK_WRITE,u)) return TRUE;
2722  if(strcmp(l->m->type,"ASCII")!=0)
2723  {
2724    Werror("ASCII link required, not `%s`",l->m->type);
2725    slClose(l);
2726    return TRUE;
2727  }
2728  SI_LINK_SET_CLOSE_P(l); // febase handles the FILE*
2729  if ( l->name[0]!='\0') // "" is the stop condition
2730  {
2731    const char *opt;
2732    int mode=0;
2733    if (v==NULL) opt=(const char*)"i";
2734    else         opt=(const char *)v->Data();
2735    while(*opt!='\0')
2736    {
2737      if (*opt=='i') mode |= SI_PROT_I;
2738      else if (*opt=='o') mode |= SI_PROT_O;
2739      opt++;
2740    }
2741    monitor((FILE *)l->data,mode);
2742  }
2743  else
2744    monitor(NULL,0);
2745  return FALSE;
2746#endif
2747}
2748static BOOLEAN jjMONOM(leftv res, leftv v)
2749{
2750  intvec *iv=(intvec *)v->Data();
2751  poly p=pOne();
2752  int i,e;
2753  BOOLEAN err=FALSE;
2754  for(i=si_min(currRing->N,iv->length()); i>0; i--)
2755  {
2756    e=(*iv)[i-1];
2757    if (e>=0) pSetExp(p,i,e);
2758    else err=TRUE;
2759  }
2760  if (iv->length()==(currRing->N+1))
2761  {
2762    res->rtyp=VECTOR_CMD;
2763    e=(*iv)[currRing->N];
2764    if (e>=0) pSetComp(p,e);
2765    else err=TRUE;
2766  }
2767  pSetm(p);
2768  res->data=(char*)p;
2769  if(err) { pDelete(&p); WerrorS("no negative exponent allowed"); }
2770  return err;
2771}
2772static BOOLEAN jjNEWSTRUCT2(leftv, leftv u, leftv v)
2773{
2774  // u: the name of the new type
2775  // v: the elements
2776  newstruct_desc d=newstructFromString((const char *)v->Data());
2777  if (d!=NULL) newstruct_setup((const char *)u->Data(),d);
2778  return d==NULL;
2779}
2780static BOOLEAN jjPARSTR2(leftv res, leftv u, leftv v)
2781{
2782  idhdl h=(idhdl)u->data;
2783  int i=(int)(long)v->Data();
2784  int p=0;
2785  if ((0<i)
2786  && (rParameter(IDRING(h))!=NULL)
2787  && (i<=(p=rPar(IDRING(h)))))
2788    res->data=omStrDup(rParameter(IDRING(h))[i-1]);
2789  else
2790  {
2791    Werror("par number %d out of range 1..%d",i,p);
2792    return TRUE;
2793  }
2794  return FALSE;
2795}
2796#ifdef HAVE_PLURAL
2797static BOOLEAN jjPlural_num_poly(leftv res, leftv a, leftv b)
2798{
2799  if( currRing->qideal != NULL )
2800  {
2801    WerrorS("basering must NOT be a qring!");
2802    return TRUE;
2803  }
2804
2805  if (iiOp==NCALGEBRA_CMD)
2806  {
2807    return nc_CallPlural(NULL,NULL,(poly)a->Data(),(poly)b->Data(),currRing,false,true,false,currRing);
2808  }
2809  else
2810  {
2811    ring r=rCopy(currRing);
2812    BOOLEAN result=nc_CallPlural(NULL,NULL,(poly)a->Data(),(poly)b->Data(),r,false,true,false,currRing);
2813    res->data=r;
2814    if (r->qideal!=NULL) res->rtyp=QRING_CMD;
2815    return result;
2816  }
2817}
2818static BOOLEAN jjPlural_num_mat(leftv res, leftv a, leftv b)
2819{
2820  if( currRing->qideal != NULL )
2821  {
2822    WerrorS("basering must NOT be a qring!");
2823    return TRUE;
2824  }
2825
2826  if (iiOp==NCALGEBRA_CMD)
2827  {
2828    return nc_CallPlural(NULL,(matrix)b->Data(),(poly)a->Data(),NULL,currRing,false,true,false,currRing);
2829  }
2830  else
2831  {
2832    ring r=rCopy(currRing);
2833    BOOLEAN result=nc_CallPlural(NULL,(matrix)b->Data(),(poly)a->Data(),NULL,r,false,true,false,currRing);
2834    res->data=r;
2835    if (r->qideal!=NULL) res->rtyp=QRING_CMD;
2836    return result;
2837  }
2838}
2839static BOOLEAN jjPlural_mat_poly(leftv res, leftv a, leftv b)
2840{
2841  if( currRing->qideal != NULL )
2842  {
2843    WerrorS("basering must NOT be a qring!");
2844    return TRUE;
2845  }
2846
2847  if (iiOp==NCALGEBRA_CMD)
2848  {
2849    return nc_CallPlural((matrix)a->Data(),NULL,NULL,(poly)b->Data(),currRing,false,true,false,currRing);
2850  }
2851  else
2852  {
2853    ring r=rCopy(currRing);
2854    BOOLEAN result=nc_CallPlural((matrix)a->Data(),NULL,NULL,(poly)b->Data(),r,false,true,false,currRing);
2855    res->data=r;
2856    if (r->qideal!=NULL) res->rtyp=QRING_CMD;
2857    return result;
2858  }
2859}
2860static BOOLEAN jjPlural_mat_mat(leftv res, leftv a, leftv b)
2861{
2862  if( currRing->qideal != NULL )
2863  {
2864    WerrorS("basering must NOT be a qring!");
2865    return TRUE;
2866  }
2867
2868  if (iiOp==NCALGEBRA_CMD)
2869  {
2870    return nc_CallPlural((matrix)a->Data(),(matrix)b->Data(),NULL,NULL,currRing,false,true,false,currRing);
2871  }
2872  else
2873  {
2874    ring r=rCopy(currRing);
2875    BOOLEAN result=nc_CallPlural((matrix)a->Data(),(matrix)b->Data(),NULL,NULL,r,false,true,false,currRing);
2876    res->data=r;
2877    if (r->qideal!=NULL) res->rtyp=QRING_CMD;
2878    return result;
2879  }
2880}
2881static BOOLEAN jjBRACKET(leftv res, leftv a, leftv b)
2882{
2883  res->data=NULL;
2884
2885  if (rIsPluralRing(currRing))
2886  {
2887    const poly q = (poly)b->Data();
2888
2889    if( q != NULL )
2890    {
2891      if( (poly)a->Data() != NULL )
2892      {
2893        poly p = (poly)a->CopyD(POLY_CMD); // p = copy!
2894        res->data = nc_p_Bracket_qq(p,q, currRing); // p will be destroyed!
2895      }
2896    }
2897  }
2898  return FALSE;
2899}
2900static BOOLEAN jjOPPOSE(leftv res, leftv a, leftv b)
2901{
2902  /* number, poly, vector, ideal, module, matrix */
2903  ring  r = (ring)a->Data();
2904  if (r == currRing)
2905  {
2906    res->data = b->Data();
2907    res->rtyp = b->rtyp;
2908    return FALSE;
2909  }
2910  if (!rIsLikeOpposite(currRing, r))
2911  {
2912    Werror("%s is not an opposite ring to current ring",a->Fullname());
2913    return TRUE;
2914  }
2915  idhdl w;
2916  if( ((w=r->idroot->get(b->Name(),myynest))!=NULL) && (b->e==NULL))
2917  {
2918    int argtype = IDTYP(w);
2919    switch (argtype)
2920    {
2921    case NUMBER_CMD:
2922      {
2923        /* since basefields are equal, we can apply nCopy */
2924        res->data = nCopy((number)IDDATA(w));
2925        res->rtyp = argtype;
2926        break;
2927      }
2928    case POLY_CMD:
2929    case VECTOR_CMD:
2930      {
2931        poly    q = (poly)IDDATA(w);
2932        res->data = pOppose(r,q,currRing);
2933        res->rtyp = argtype;
2934        break;
2935      }
2936    case IDEAL_CMD:
2937    case MODUL_CMD:
2938      {
2939        ideal   Q = (ideal)IDDATA(w);
2940        res->data = idOppose(r,Q,currRing);
2941        res->rtyp = argtype;
2942        break;
2943      }
2944    case MATRIX_CMD:
2945      {
2946        ring save = currRing;
2947        rChangeCurrRing(r);
2948        matrix  m = (matrix)IDDATA(w);
2949        ideal   Q = id_Matrix2Module(mp_Copy(m, currRing),currRing);
2950        rChangeCurrRing(save);
2951        ideal   S = idOppose(r,Q,currRing);
2952        id_Delete(&Q, r);
2953        res->data = id_Module2Matrix(S,currRing);
2954        res->rtyp = argtype;
2955        break;
2956      }
2957    default:
2958      {
2959        WerrorS("unsupported type in oppose");
2960        return TRUE;
2961      }
2962    }
2963  }
2964  else
2965  {
2966    Werror("identifier %s not found in %s",b->Fullname(),a->Fullname());
2967    return TRUE;
2968  }
2969  return FALSE;
2970}
2971#endif /* HAVE_PLURAL */
2972
2973static BOOLEAN jjQUOT(leftv res, leftv u, leftv v)
2974{
2975  res->data = (char *)idQuot((ideal)u->Data(),(ideal)v->Data(),
2976    hasFlag(u,FLAG_STD),u->Typ()==v->Typ());
2977  id_DelMultiples((ideal)(res->data),currRing);
2978  if (TEST_OPT_RETURN_SB) setFlag(res,FLAG_STD);
2979  return FALSE;
2980}
2981static BOOLEAN jjRANDOM(leftv res, leftv u, leftv v)
2982{
2983  int i=(int)(long)u->Data();
2984  int j=(int)(long)v->Data();
2985  res->data =(char *)(long)((i > j) ? i : (siRand() % (j-i+1)) + i);
2986  return FALSE;
2987}
2988static BOOLEAN jjRANK2(leftv res, leftv u, leftv v)
2989{
2990  matrix m =(matrix)u->Data();
2991  int isRowEchelon = (int)(long)v->Data();
2992  if (isRowEchelon != 1) isRowEchelon = 0;
2993  int rank = luRank(m, isRowEchelon);
2994  res->data =(char *)(long)rank;
2995  return FALSE;
2996}
2997static BOOLEAN jjREAD2(leftv res, leftv u, leftv v)
2998{
2999  si_link l=(si_link)u->Data();
3000  leftv r=slRead(l,v);
3001  if (r==NULL)
3002  {
3003    const char *s;
3004    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
3005    else                            s=sNoName;
3006    Werror("cannot read from `%s`",s);
3007    return TRUE;
3008  }
3009  memcpy(res,r,sizeof(sleftv));
3010  omFreeBin((ADDRESS)r, sleftv_bin);
3011  return FALSE;
3012}
3013static BOOLEAN jjREDUCE_P(leftv res, leftv u, leftv v)
3014{
3015  assumeStdFlag(v);
3016  res->data = (char *)kNF((ideal)v->Data(),currRing->qideal,(poly)u->Data());
3017  return FALSE;
3018}
3019static BOOLEAN jjREDUCE_ID(leftv res, leftv u, leftv v)
3020{
3021  assumeStdFlag(v);
3022  ideal ui=(ideal)u->Data();
3023  ideal vi=(ideal)v->Data();
3024  res->data = (char *)kNF(vi,currRing->qideal,ui);
3025  return FALSE;
3026}
3027#if 0
3028static BOOLEAN jjRES(leftv res, leftv u, leftv v)
3029{
3030  int maxl=(int)(long)v->Data();
3031  if (maxl<0)
3032  {
3033    WerrorS("length for res must not be negative");
3034    return TRUE;
3035  }
3036  int l=0;
3037  //resolvente r;
3038  syStrategy r;
3039  intvec *weights=NULL;
3040  int wmaxl=maxl;
3041  ideal u_id=(ideal)u->Data();
3042
3043  maxl--;
3044  if (/*(*/ maxl==-1 /*)*/) /*&& (iiOp!=MRES_CMD)*/
3045  {
3046    maxl = currRing->N-1+2*(iiOp==MRES_CMD);
3047    if (currRing->qideal!=NULL)
3048    {
3049      Warn(
3050      "full resolution in a qring may be infinite, setting max length to %d",
3051      maxl+1);
3052    }
3053  }
3054  weights=(intvec*)atGet(u,"isHomog",INTVEC_CMD);
3055  if (weights!=NULL)
3056  {
3057    if (!idTestHomModule(u_id,currRing->qideal,weights))
3058    {
3059      WarnS("wrong weights given:");weights->show();PrintLn();
3060      weights=NULL;
3061    }
3062  }
3063  intvec *ww=NULL;
3064  int add_row_shift=0;
3065  if (weights!=NULL)
3066  {
3067     ww=ivCopy(weights);
3068     add_row_shift = ww->min_in();
3069     (*ww) -= add_row_shift;
3070  }
3071  else
3072    idHomModule(u_id,currRing->qideal,&ww);
3073  weights=ww;
3074
3075  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
3076  {
3077    r=syResolution(u_id,maxl, ww, iiOp==MRES_CMD);
3078  }
3079  else if (iiOp==SRES_CMD)
3080  //  r=sySchreyerResolvente(u_id,maxl+1,&l);
3081    r=sySchreyer(u_id,maxl+1);
3082  else if (iiOp == LRES_CMD)
3083  {
3084    int dummy;
3085    if((currRing->qideal!=NULL)||
3086    (!idHomIdeal (u_id,NULL)))
3087    {
3088       WerrorS
3089       ("`lres` not implemented for inhomogeneous input or qring");
3090       return TRUE;
3091    }
3092    r=syLaScala3(u_id,&dummy);
3093  }
3094  else if (iiOp == KRES_CMD)
3095  {
3096    int dummy;
3097    if((currRing->qideal!=NULL)||
3098    (!idHomIdeal (u_id,NULL)))
3099    {
3100       WerrorS
3101       ("`kres` not implemented for inhomogeneous input or qring");
3102       return TRUE;
3103    }
3104    r=syKosz(u_id,&dummy);
3105  }
3106  else
3107  {
3108    int dummy;
3109    if((currRing->qideal!=NULL)||
3110    (!idHomIdeal (u_id,NULL)))
3111    {
3112       WerrorS
3113       ("`hres` not implemented for inhomogeneous input or qring");
3114       return TRUE;
3115    }
3116    r=syHilb(u_id,&dummy);
3117  }
3118  if (r==NULL) return TRUE;
3119  //res->data=(void *)liMakeResolv(r,l,wmaxl,u->Typ(),weights);
3120  r->list_length=wmaxl;
3121  res->data=(void *)r;
3122  if ((r->weights!=NULL) && (r->weights[0]!=NULL))
3123  {
3124    intvec *w=ivCopy(r->weights[0]);
3125    if (weights!=NULL) (*w) += add_row_shift;
3126    atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
3127    w=NULL;
3128  }
3129  else
3130  {
3131//#if 0
3132// need to set weights for ALL components (sres)
3133    if (weights!=NULL)
3134    {
3135      atSet(res,omStrDup("isHomog"),ivCopy(weights),INTVEC_CMD);
3136      r->weights = (intvec**)omAlloc0Bin(char_ptr_bin);
3137      (r->weights)[0] = ivCopy(weights);
3138    }
3139//#endif
3140  }
3141  if (ww!=NULL) { delete ww; ww=NULL; }
3142  return FALSE;
3143}
3144#else
3145static BOOLEAN jjRES(leftv res, leftv u, leftv v)
3146{
3147  int maxl=(int)(long)v->Data();
3148  if (maxl<0)
3149  {
3150    WerrorS("length for res must not be negative");
3151    return TRUE;
3152  }
3153  syStrategy r;
3154  intvec *weights=NULL;
3155  int wmaxl=maxl;
3156  ideal u_id=(ideal)u->Data();
3157
3158  maxl--;
3159  if (/*(*/ maxl==-1 /*)*/) /*&& (iiOp!=MRES_CMD)*/
3160  {
3161    maxl = currRing->N-1+2*(iiOp==MRES_CMD);
3162    if (currRing->qideal!=NULL)
3163    {
3164      Warn(
3165      "full resolution in a qring may be infinite, setting max length to %d",
3166      maxl+1);
3167    }
3168  }
3169  weights=(intvec*)atGet(u,"isHomog",INTVEC_CMD);
3170  if (weights!=NULL)
3171  {
3172    if (!idTestHomModule(u_id,currRing->qideal,weights))
3173    {
3174      WarnS("wrong weights given:");weights->show();PrintLn();
3175      weights=NULL;
3176    }
3177  }
3178  intvec *ww=NULL;
3179  int add_row_shift=0;
3180  if (weights!=NULL)
3181  {
3182     ww=ivCopy(weights);
3183     add_row_shift = ww->min_in();
3184     (*ww) -= add_row_shift;
3185  }
3186  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
3187  {
3188    r=syResolution(u_id,maxl, ww, iiOp==MRES_CMD);
3189  }
3190  else if (iiOp==SRES_CMD)
3191  //  r=sySchreyerResolvente(u_id,maxl+1,&l);
3192    r=sySchreyer(u_id,maxl+1);
3193  else if (iiOp == LRES_CMD)
3194  {
3195    int dummy;
3196    if((currRing->qideal!=NULL)||
3197    (!idHomIdeal (u_id,NULL)))
3198    {
3199       WerrorS
3200       ("`lres` not implemented for inhomogeneous input or qring");
3201       return TRUE;
3202    }
3203    if(currRing->N == 1)
3204      WarnS("the current implementation of `lres` may not work in the case of a single variable");
3205    r=syLaScala3(u_id,&dummy);
3206  }
3207  else if (iiOp == KRES_CMD)
3208  {
3209    int dummy;
3210    if((currRing->qideal!=NULL)||
3211    (!idHomIdeal (u_id,NULL)))
3212    {
3213       WerrorS
3214       ("`kres` not implemented for inhomogeneous input or qring");
3215       return TRUE;
3216    }
3217    r=syKosz(u_id,&dummy);
3218  }
3219  else
3220  {
3221    int dummy;
3222    if((currRing->qideal!=NULL)||
3223    (!idHomIdeal (u_id,NULL)))
3224    {
3225       WerrorS
3226       ("`hres` not implemented for inhomogeneous input or qring");
3227       return TRUE;
3228    }
3229    ideal u_id_copy=idCopy(u_id);
3230    idSkipZeroes(u_id_copy);
3231    r=syHilb(u_id_copy,&dummy);
3232    idDelete(&u_id_copy);
3233  }
3234  if (r==NULL) return TRUE;
3235  //res->data=(void *)liMakeResolv(r,l,wmaxl,u->Typ(),weights);
3236  r->list_length=wmaxl;
3237  res->data=(void *)r;
3238  if ((weights!=NULL) && (ww!=NULL)) { delete ww; ww=NULL; }
3239  if ((r->weights!=NULL) && (r->weights[0]!=NULL))
3240  {
3241    ww=ivCopy(r->weights[0]);
3242    if (weights!=NULL) (*ww) += add_row_shift;
3243    atSet(res,omStrDup("isHomog"),ww,INTVEC_CMD);
3244  }
3245  else
3246  {
3247    if (weights!=NULL)
3248    {
3249      atSet(res,omStrDup("isHomog"),ivCopy(weights),INTVEC_CMD);
3250    }
3251  }
3252
3253  // test the La Scala case' output
3254  assume( ((iiOp == LRES_CMD) || (iiOp == HRES_CMD)) == (r->syRing != NULL) );
3255  assume( (r->syRing != NULL) == (r->resPairs != NULL) );
3256
3257  if(iiOp != HRES_CMD)
3258    assume( (r->minres != NULL) || (r->fullres != NULL) ); // is wrong for HRES_CMD...
3259  else
3260    assume( (r->orderedRes != NULL) || (r->res != NULL) ); // analog for hres...
3261
3262  return FALSE;
3263}
3264#endif
3265static BOOLEAN jjPFAC2(leftv res, leftv u, leftv v)
3266{
3267  number n1; int i;
3268
3269  if ((u->Typ() == BIGINT_CMD) ||
3270     ((u->Typ() == NUMBER_CMD) && rField_is_Q(currRing)))
3271  {
3272    n1 = (number)u->CopyD();
3273  }
3274  else if (u->Typ() == INT_CMD)
3275  {
3276    i = (int)(long)u->Data();
3277    n1 = n_Init(i, coeffs_BIGINT);
3278  }
3279  else
3280  {
3281    return TRUE;
3282  }
3283
3284  i = (int)(long)v->Data();
3285
3286  lists l = primeFactorisation(n1, i);
3287  n_Delete(&n1, coeffs_BIGINT);
3288  res->data = (char*)l;
3289  return FALSE;
3290}
3291static BOOLEAN jjRSUM(leftv res, leftv u, leftv v)
3292{
3293  ring r;
3294  int i=rSum((ring)u->Data(),(ring)v->Data(),r);
3295  res->data = (char *)r;
3296  return (i==-1);
3297}
3298#define SIMPL_LMDIV 32
3299#define SIMPL_LMEQ  16
3300#define SIMPL_MULT 8
3301#define SIMPL_EQU  4
3302#define SIMPL_NULL 2
3303#define SIMPL_NORM 1
3304static BOOLEAN jjSIMPL_ID(leftv res, leftv u, leftv v)
3305{
3306  int sw = (int)(long)v->Data();
3307  // CopyD for IDEAL_CMD and MODUL_CMD are identical:
3308  ideal id = (ideal)u->CopyD(IDEAL_CMD);
3309  if (sw & SIMPL_LMDIV)
3310  {
3311    id_DelDiv(id,currRing);
3312  }
3313  if (sw & SIMPL_LMEQ)
3314  {
3315    id_DelLmEquals(id,currRing);
3316  }
3317  if (sw & SIMPL_MULT)
3318  {
3319    id_DelMultiples(id,currRing);
3320  }
3321  else if(sw & SIMPL_EQU)
3322  {
3323    id_DelEquals(id,currRing);
3324  }
3325  if (sw & SIMPL_NULL)
3326  {
3327    idSkipZeroes(id);
3328  }
3329  if (sw & SIMPL_NORM)
3330  {
3331    id_Norm(id,currRing);
3332  }
3333  res->data = (char * )id;
3334  return FALSE;
3335}
3336extern int singclap_factorize_retry;
3337static BOOLEAN jjSQR_FREE2(leftv res, leftv u, leftv dummy)
3338{
3339  intvec *v=NULL;
3340  int sw=(int)(long)dummy->Data();
3341  int fac_sw=sw;
3342  if (sw<0) fac_sw=1;
3343  singclap_factorize_retry=0;
3344  ideal f=singclap_sqrfree((poly)(u->CopyD()), &v, fac_sw, currRing);
3345  if (f==NULL)
3346    return TRUE;
3347  switch(sw)
3348  {
3349    case 0:
3350    case 2:
3351    {
3352      lists l=(lists)omAllocBin(slists_bin);
3353      l->Init(2);
3354      l->m[0].rtyp=IDEAL_CMD;
3355      l->m[0].data=(void *)f;
3356      l->m[1].rtyp=INTVEC_CMD;
3357      l->m[1].data=(void *)v;
3358      res->data=(void *)l;
3359      res->rtyp=LIST_CMD;
3360      return FALSE;
3361    }
3362    case 1:
3363      res->data=(void *)f;
3364      return FALSE;
3365    case 3:
3366      {
3367        poly p=f->m[0];
3368        int i=IDELEMS(f);
3369        f->m[0]=NULL;
3370        while(i>1)
3371        {
3372          i--;
3373          p=pMult(p,f->m[i]);
3374          f->m[i]=NULL;
3375        }
3376        res->data=(void *)p;
3377        res->rtyp=POLY_CMD;
3378      }
3379      return FALSE;
3380  }
3381  WerrorS("invalid switch");
3382  return FALSE;
3383}
3384static BOOLEAN jjSTATUS2(leftv res, leftv u, leftv v)
3385{
3386  res->data = omStrDup(slStatus((si_link) u->Data(), (char *) v->Data()));
3387  return FALSE;
3388}
3389static BOOLEAN jjSTATUS2L(leftv res, leftv u, leftv v)
3390{
3391  res->data = (void *)(long)slStatusSsiL((lists) u->Data(), (int)(long) v->Data());
3392  //return (res->data== (void*)(long)-2);
3393  return FALSE;
3394}
3395static BOOLEAN jjSIMPL_P(leftv res, leftv u, leftv v)
3396{
3397  int sw = (int)(long)v->Data();
3398  // CopyD for POLY_CMD and VECTOR_CMD are identical:
3399  poly p = (poly)u->CopyD(POLY_CMD);
3400  if (sw & SIMPL_NORM)
3401  {
3402    pNorm(p);
3403  }
3404  res->data = (char * )p;
3405  return FALSE;
3406}
3407static BOOLEAN jjSTD_HILB(leftv res, leftv u, leftv v)
3408{
3409  ideal result;
3410  intvec *w=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
3411  tHomog hom=testHomog;
3412  ideal u_id=(ideal)(u->Data());
3413  if (w!=NULL)
3414  {
3415    if (!idTestHomModule(u_id,currRing->qideal,w))
3416    {
3417      WarnS("wrong weights:");w->show();PrintLn();
3418      w=NULL;
3419    }
3420    else
3421    {
3422      w=ivCopy(w);
3423      hom=isHomog;
3424    }
3425  }
3426  result=kStd(u_id,currRing->qideal,hom,&w,(intvec *)v->Data());
3427  idSkipZeroes(result);
3428  res->data = (char *)result;
3429  setFlag(res,FLAG_STD);
3430  if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
3431  return FALSE;
3432}
3433static BOOLEAN jjSTD_1(leftv res, leftv u, leftv v);
3434static void jjSTD_1_ID(leftv res, ideal i0, int t0, ideal p0, attr a)
3435/* destroys i0, p0 */
3436/* result (with attributes) in res */
3437/* i0: SB*/
3438/* t0: type of p0*/
3439/* p0 new elements*/
3440/* a attributes of i0*/
3441{
3442  int tp;
3443  if (t0==IDEAL_CMD) tp=POLY_CMD;
3444  else               tp=VECTOR_CMD;
3445  for (int i=IDELEMS(p0)-1; i>=0; i--)
3446  {
3447    poly p=p0->m[i];
3448    p0->m[i]=NULL;
3449    if (p!=NULL)
3450    {
3451      sleftv u0,v0;
3452      memset(&u0,0,sizeof(sleftv));
3453      memset(&v0,0,sizeof(sleftv));
3454      v0.rtyp=tp;
3455      v0.data=(void*)p;
3456      u0.rtyp=t0;
3457      u0.data=i0;
3458      u0.attribute=a;
3459      setFlag(&u0,FLAG_STD);
3460      jjSTD_1(res,&u0,&v0);
3461      i0=(ideal)res->data;
3462      res->data=NULL;
3463      a=res->attribute;
3464      res->attribute=NULL;
3465      u0.CleanUp();
3466      v0.CleanUp();
3467      res->CleanUp();
3468    }
3469  }
3470  idDelete(&p0);
3471  res->attribute=a;
3472  res->data=(void *)i0;
3473  res->rtyp=t0;
3474}
3475static BOOLEAN jjSTD_1(leftv res, leftv u, leftv v)
3476{
3477  ideal result;
3478  assumeStdFlag(u);
3479  ideal i1=(ideal)(u->Data());
3480  ideal i0;
3481  int r=v->Typ();
3482  if ((/*v->Typ()*/r==POLY_CMD) ||(r==VECTOR_CMD))
3483  {
3484    i0=idInit(1,i1->rank); // TODO: rank is wrong (if v is a vector!)
3485    i0->m[0]=(poly)v->Data();
3486    int ii0=idElem(i0); /* size of i0 */
3487    i1=idSimpleAdd(i1,i0); //
3488    memset(i0->m,0,sizeof(poly)*IDELEMS(i0));
3489    idDelete(&i0);
3490    intvec *w=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
3491    tHomog hom=testHomog;
3492
3493    if (w!=NULL)
3494    {
3495      if (!idTestHomModule(i1,currRing->qideal,w))
3496      {
3497        // no warnung: this is legal, if i in std(i,p)
3498        // is homogeneous, but p not
3499        w=NULL;
3500      }
3501      else
3502      {
3503        w=ivCopy(w);
3504        hom=isHomog;
3505      }
3506    }
3507    BITSET save1;
3508    SI_SAVE_OPT1(save1);
3509    si_opt_1|=Sy_bit(OPT_SB_1);
3510    /* ii0 appears to be the position of the first element of il that
3511       does not belong to the old SB ideal */
3512    result=kStd(i1,currRing->qideal,hom,&w,NULL,0,ii0);
3513    SI_RESTORE_OPT1(save1);
3514    idDelete(&i1);
3515    idSkipZeroes(result);
3516    if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
3517    res->data = (char *)result;
3518  }
3519  else /*IDEAL/MODULE*/
3520  {
3521    attr *aa=u->Attribute();
3522    attr a=NULL;
3523    if (aa!=NULL) a=(*aa)->Copy();
3524    jjSTD_1_ID(res,(ideal)u->CopyD(),r,(ideal)v->CopyD(),a);
3525  }
3526  if(!TEST_OPT_DEGBOUND) setFlag(res,FLAG_STD);
3527  return FALSE;
3528}
3529static BOOLEAN jjVARSTR2(leftv res, leftv u, leftv v)
3530{
3531  idhdl h=(idhdl)u->data;
3532  int i=(int)(long)v->Data();
3533  if ((0<i) && (i<=IDRING(h)->N))
3534    res->data=omStrDup(IDRING(h)->names[i-1]);
3535  else
3536  {
3537    Werror("var number %d out of range 1..%d",i,IDRING(h)->N);
3538    return TRUE;
3539  }
3540  return FALSE;
3541}
3542static BOOLEAN jjWAIT1ST2(leftv res, leftv u, leftv v)
3543{
3544// input: u: a list with links of type
3545//           ssi-fork, ssi-tcp, MPtcp-fork or MPtcp-launch
3546//        v: timeout for select in milliseconds
3547//           or 0 for polling
3548// returns: ERROR (via Werror): timeout negative
3549//           -1: the read state of all links is eof
3550//            0: timeout (or polling): none ready
3551//           i>0: (at least) L[i] is ready
3552  lists Lforks = (lists)u->Data();
3553  int t = (int)(long)v->Data();
3554  if(t < 0)
3555  {
3556    WerrorS("negative timeout"); return TRUE;
3557  }
3558  int i = slStatusSsiL(Lforks, t*1000);
3559  if(i == -2) /* error */
3560  {
3561    return TRUE;
3562  }
3563  res->data = (void*)(long)i;
3564  return FALSE;
3565}
3566static BOOLEAN jjWAITALL2(leftv res, leftv u, leftv v)
3567{
3568// input: u: a list with links of type
3569//           ssi-fork, ssi-tcp, MPtcp-fork or MPtcp-launch
3570//        v: timeout for select in milliseconds
3571//           or 0 for polling
3572// returns: ERROR (via Werror): timeout negative
3573//           -1: the read state of all links is eof
3574//           0: timeout (or polling): none ready
3575//           1: all links are ready
3576//              (caution: at least one is ready, but some maybe dead)
3577  lists Lforks = (lists)u->CopyD();
3578  int timeout = 1000*(int)(long)v->Data();
3579  if(timeout < 0)
3580  {
3581    WerrorS("negative timeout"); return TRUE;
3582  }
3583  int t = getRTimer()/TIMER_RESOLUTION;  // in seconds
3584  int i;
3585  int ret = -1;
3586  for(int nfinished = 0; nfinished < Lforks->nr+1; nfinished++)
3587  {
3588    i = slStatusSsiL(Lforks, timeout);
3589    if(i > 0) /* Lforks[i] is ready */
3590    {
3591      ret = 1;
3592      Lforks->m[i-1].CleanUp();
3593      Lforks->m[i-1].rtyp=DEF_CMD;
3594      Lforks->m[i-1].data=NULL;
3595      timeout = si_max(0,timeout - 1000*(getRTimer()/TIMER_RESOLUTION - t));
3596    }
3597    else /* terminate the for loop */
3598    {
3599      if(i == -2) /* error */
3600      {
3601        return TRUE;
3602      }
3603      if(i == 0) /* timeout */
3604      {
3605        ret = 0;
3606      }
3607      break;
3608    }
3609  }
3610  Lforks->Clean();
3611  res->data = (void*)(long)ret;
3612  return FALSE;
3613}
3614static BOOLEAN jjWEDGE(leftv res, leftv u, leftv v)
3615{
3616  res->data = (char *)mp_Wedge((matrix)u->Data(),(int)(long)v->Data(),currRing);
3617  return FALSE;
3618}
3619#define jjWRONG2 (proc2)jjWRONG
3620#define jjWRONG3 (proc3)jjWRONG
3621static BOOLEAN jjWRONG(leftv, leftv)
3622{
3623  return TRUE;
3624}
3625
3626/*=================== operations with 1 arg.: static proc =================*/
3627/* must be ordered: first operations for chars (infix ops),
3628 * then alphabetically */
3629
3630static BOOLEAN jjDUMMY(leftv res, leftv u)
3631{
3632  res->data = (char *)u->CopyD();
3633  return FALSE;
3634}
3635static BOOLEAN jjNULL(leftv, leftv)
3636{
3637  return FALSE;
3638}
3639//static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
3640//{
3641//  res->data = (char *)((int)(long)u->Data()+1);
3642//  return FALSE;
3643//}
3644//static BOOLEAN jjMINUSMINUS(leftv res, leftv u)
3645//{
3646//  res->data = (char *)((int)(long)u->Data()-1);
3647//  return FALSE;
3648//}
3649static BOOLEAN jjPLUSPLUS(leftv, leftv u)
3650{
3651  if (IDTYP((idhdl)u->data)==INT_CMD)
3652  {
3653    int i=IDINT((idhdl)u->data);
3654    if (iiOp==PLUSPLUS) i++;
3655    else                i--;
3656    IDDATA((idhdl)u->data)=(char *)(long)i;
3657    return FALSE;
3658  }
3659  return TRUE;
3660}
3661static BOOLEAN jjUMINUS_BI(leftv res, leftv u)
3662{
3663  number n=(number)u->CopyD(BIGINT_CMD);
3664  n=n_InpNeg(n,coeffs_BIGINT);
3665  res->data = (char *)n;
3666  return FALSE;
3667}
3668static BOOLEAN jjUMINUS_I(leftv res, leftv u)
3669{
3670  res->data = (char *)(-(long)u->Data());
3671  return FALSE;
3672}
3673static BOOLEAN jjUMINUS_N(leftv res, leftv u)
3674{
3675  number n=(number)u->CopyD(NUMBER_CMD);
3676  n=nInpNeg(n);
3677  res->data = (char *)n;
3678  return FALSE;
3679}
3680static BOOLEAN jjUMINUS_P(leftv res, leftv u)
3681{
3682  res->data = (char *)pNeg((poly)u->CopyD(POLY_CMD));
3683  return FALSE;
3684}
3685static BOOLEAN jjUMINUS_MA(leftv res, leftv u)
3686{
3687  poly m1=pISet(-1);
3688  res->data = (char *)mp_MultP((matrix)u->CopyD(MATRIX_CMD),m1,currRing);
3689  return FALSE;
3690}
3691static BOOLEAN jjUMINUS_IV(leftv res, leftv u)
3692{
3693  intvec *iv=(intvec *)u->CopyD(INTVEC_CMD);
3694  (*iv)*=(-1);
3695  res->data = (char *)iv;
3696  return FALSE;
3697}
3698static BOOLEAN jjUMINUS_BIM(leftv res, leftv u)
3699{
3700  bigintmat *bim=(bigintmat *)u->CopyD(BIGINTMAT_CMD);
3701  (*bim)*=(-1);
3702  res->data = (char *)bim;
3703  return FALSE;
3704}
3705static BOOLEAN jjPROC1(leftv res, leftv u)
3706{
3707  return jjPROC(res,u,NULL);
3708}
3709static BOOLEAN jjBAREISS(leftv res, leftv v)
3710{
3711  //matrix m=(matrix)v->Data();
3712  //lists l=mpBareiss(m,FALSE);
3713  intvec *iv;
3714  ideal m;
3715  sm_CallBareiss((ideal)v->Data(),0,0,m,&iv, currRing);
3716  lists l=(lists)omAllocBin(slists_bin);
3717  l->Init(2);
3718  l->m[0].rtyp=MODUL_CMD;
3719  l->m[1].rtyp=INTVEC_CMD;
3720  l->m[0].data=(void *)m;
3721  l->m[1].data=(void *)iv;
3722  res->data = (char *)l;
3723  return FALSE;
3724}
3725//static BOOLEAN jjBAREISS_IM(leftv res, leftv v)
3726//{
3727//  intvec *m=(intvec *)v->CopyD(INTMAT_CMD);
3728//  ivTriangMat(m);
3729//  res->data = (char *)m;
3730//  return FALSE;
3731//}
3732static BOOLEAN jjBI2N(leftv res, leftv u)
3733{
3734  BOOLEAN bo=FALSE;
3735  number n=(number)u->CopyD();
3736  nMapFunc nMap=n_SetMap(coeffs_BIGINT,currRing->cf);
3737  if (nMap!=NULL)
3738    res->data=nMap(n,coeffs_BIGINT,currRing->cf);
3739  else
3740  {
3741    Werror("cannot convert bigint to cring %s",currRing->cf->cfCoeffString(currRing->cf));
3742    bo=TRUE;
3743  }
3744  n_Delete(&n,coeffs_BIGINT);
3745  return bo;
3746}
3747static BOOLEAN jjBI2P(leftv res, leftv u)
3748{
3749  sleftv tmp;
3750  BOOLEAN bo=jjBI2N(&tmp,u);
3751  if (!bo)
3752  {
3753    number n=(number) tmp.data;
3754    if (nIsZero(n)) { res->data=NULL;nDelete(&n); }
3755    else
3756    {
3757      res->data=(void *)pNSet(n);
3758    }
3759  }
3760  return bo;
3761}
3762static BOOLEAN jjCALL1MANY(leftv res, leftv u)
3763{
3764  return iiExprArithM(res,u,iiOp);
3765}
3766static BOOLEAN jjCHAR(leftv res, leftv v)
3767{
3768  res->data = (char *)(long)rChar((ring)v->Data());
3769  return FALSE;
3770}
3771static BOOLEAN jjCOLS(leftv res, leftv v)
3772{
3773  res->data = (char *)(long)MATCOLS((matrix)(v->Data()));
3774  return FALSE;
3775}
3776static BOOLEAN jjCOLS_BIM(leftv res, leftv v)
3777{
3778  res->data = (char *)(long)((bigintmat*)(v->Data()))->cols();
3779  return FALSE;
3780}
3781static BOOLEAN jjCOLS_IV(leftv res, leftv v)
3782{
3783  res->data = (char *)(long)((intvec*)(v->Data()))->cols();
3784  return FALSE;
3785}
3786static BOOLEAN jjCONTENT(leftv res, leftv v)
3787{
3788  // CopyD for POLY_CMD and VECTOR_CMD are identical:
3789  poly p=(poly)v->CopyD(POLY_CMD);
3790  if (p!=NULL) p_Cleardenom(p, currRing);
3791  res->data = (char *)p;
3792  return FALSE;
3793}
3794static BOOLEAN jjCOUNT_BI(leftv res, leftv v)
3795{
3796  res->data = (char *)(long)n_Size((number)v->Data(),coeffs_BIGINT);
3797  return FALSE;
3798}
3799static BOOLEAN jjCOUNT_N(leftv res, leftv v)
3800{
3801  res->data = (char *)(long)nSize((number)v->Data());
3802  return FALSE;
3803}
3804static BOOLEAN jjCOUNT_L(leftv res, leftv v)
3805{
3806  lists l=(lists)v->Data();
3807  res->data = (char *)(long)(lSize(l)+1);
3808  return FALSE;
3809}
3810static BOOLEAN jjCOUNT_M(leftv res, leftv v)
3811{
3812  matrix m=(matrix)v->Data();
3813  res->data = (char *)(long)(MATROWS(m)*MATCOLS(m));
3814  return FALSE;
3815}
3816static BOOLEAN jjCOUNT_IV(leftv res, leftv v)
3817{
3818  res->data = (char *)(long)((intvec*)(v->Data()))->length();
3819  return FALSE;
3820}
3821static BOOLEAN jjCOUNT_RG(leftv res, leftv v)
3822{
3823  ring r=(ring)v->Data();
3824  int elems=-1;
3825  if (rField_is_Zp(r)||rField_is_GF(r)) elems=r->cf->ch;
3826  else if (rField_is_Zp_a(r) && (r->cf->type==n_algExt))
3827  {
3828    extern int ipower ( int b, int n ); /* factory/cf_util */
3829    elems=ipower(r->cf->ch,r->cf->extRing->pFDeg(r->cf->extRing->qideal->m[0],r->cf->extRing));
3830  }
3831  res->data = (char *)(long)elems;
3832  return FALSE;
3833}
3834static BOOLEAN jjDEG(leftv res, leftv v)
3835{
3836  int dummy;
3837  poly p=(poly)v->Data();
3838  if (p!=NULL) res->data = (char *)currRing->pLDeg(p,&dummy,currRing);
3839  else res->data=(char *)-1;
3840  return FALSE;
3841}
3842static BOOLEAN jjDEG_M(leftv res, leftv u)
3843{
3844  ideal I=(ideal)u->Data();
3845  int d=-1;
3846  int dummy;
3847  int i;
3848  for(i=IDELEMS(I)-1;i>=0;i--)
3849    if (I->m[i]!=NULL) d=si_max(d,(int)currRing->pLDeg(I->m[i],&dummy,currRing));
3850  res->data = (char *)(long)d;
3851  return FALSE;
3852}
3853static BOOLEAN jjDEGREE(leftv res, leftv v)
3854{
3855  SPrintStart();
3856#ifdef HAVE_RINGS
3857  if (rField_is_Ring_Z(currRing))
3858  {
3859    ring origR = currRing;
3860    ring tempR = rCopy(origR);
3861    coeffs new_cf=nInitChar(n_Q,NULL);
3862    nKillChar(tempR->cf);
3863    tempR->cf=new_cf;
3864    rComplete(tempR);
3865    ideal vid = (ideal)v->Data();
3866    rChangeCurrRing(tempR);
3867    ideal vv = idrCopyR(vid, origR, currRing);
3868    sleftv vvAsLeftv; memset(&vvAsLeftv, 0, sizeof(vvAsLeftv));
3869    vvAsLeftv.rtyp = IDEAL_CMD;
3870    vvAsLeftv.data = vv; vvAsLeftv.next = NULL;
3871    if (hasFlag(v, FLAG_STD)) setFlag(&vvAsLeftv,FLAG_STD);
3872    assumeStdFlag(&vvAsLeftv);
3873    Print("// NOTE: computation of degree is being performed for\n");
3874    Print("//       generic fibre, that is, over Q\n");
3875    intvec *module_w=(intvec*)atGet(&vvAsLeftv,"isHomog",INTVEC_CMD);
3876    scDegree(vv,module_w,currRing->qideal);
3877    idDelete(&vv);
3878    rChangeCurrRing(origR);
3879    rDelete(tempR);
3880  }
3881#endif
3882  assumeStdFlag(v);
3883  intvec *module_w=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
3884  scDegree((ideal)v->Data(),module_w,currRing->qideal);
3885  char *s=SPrintEnd();
3886  int l=strlen(s)-1;
3887  s[l]='\0';
3888  res->data=(void*)s;
3889  return FALSE;
3890}
3891static BOOLEAN jjDEFINED(leftv res, leftv v)
3892{
3893  if ((v->rtyp==IDHDL)
3894  && ((myynest==IDLEV((idhdl)v->data))||(0==IDLEV((idhdl)v->data))))
3895  {
3896    res->data=(void *)(long)(IDLEV((idhdl)v->data)+1);
3897  }
3898  else if (v->rtyp!=0) res->data=(void *)(-1);
3899  return FALSE;
3900}
3901
3902/// Return the denominator of the input number
3903/// NOTE: the input number is normalized as a side effect
3904static BOOLEAN jjDENOMINATOR(leftv res, leftv v)
3905{
3906  number n = reinterpret_cast<number>(v->Data());
3907  res->data = reinterpret_cast<void*>(n_GetDenom(n, currRing));
3908  return FALSE;
3909}
3910
3911/// Return the numerator of the input number
3912/// NOTE: the input number is normalized as a side effect
3913static BOOLEAN jjNUMERATOR(leftv res, leftv v)
3914{
3915  number n = reinterpret_cast<number>(v->Data());
3916  res->data = reinterpret_cast<void*>(n_GetNumerator(n, currRing));
3917  return FALSE;
3918}
3919
3920static BOOLEAN jjDET(leftv res, leftv v)
3921{
3922  matrix m=(matrix)v->Data();
3923  poly p;
3924  if (sm_CheckDet((ideal)m,m->cols(),TRUE, currRing))
3925  {
3926    ideal I=id_Matrix2Module(mp_Copy(m, currRing),currRing);
3927    p=sm_CallDet(I, currRing);
3928    idDelete(&I);
3929  }
3930  else
3931    p=singclap_det(m,currRing);
3932  res ->data = (char *)p;
3933  return FALSE;
3934}
3935static BOOLEAN jjDET_BI(leftv res, leftv v)
3936{
3937  bigintmat * m=(bigintmat*)v->Data();
3938  int i,j;
3939  i=m->rows();j=m->cols();
3940  if(i==j)
3941    res->data = (char *)(long)singclap_det_bi(m,coeffs_BIGINT);
3942  else
3943  {
3944    Werror("det of %d x %d bigintmat",i,j);
3945    return TRUE;
3946  }
3947  return FALSE;
3948}
3949static BOOLEAN jjDET_I(leftv res, leftv v)
3950{
3951  intvec * m=(intvec*)v->Data();
3952  int i,j;
3953  i=m->rows();j=m->cols();
3954  if(i==j)
3955    res->data = (char *)(long)singclap_det_i(m,currRing);
3956  else
3957  {
3958    Werror("det of %d x %d intmat",i,j);
3959    return TRUE;
3960  }
3961  return FALSE;
3962}
3963static BOOLEAN jjDET_S(leftv res, leftv v)
3964{
3965  ideal I=(ideal)v->Data();
3966  poly p;
3967  if (IDELEMS(I)<1) return TRUE;
3968  if (sm_CheckDet(I,IDELEMS(I),FALSE, currRing))
3969  {
3970    matrix m=id_Module2Matrix(id_Copy(I,currRing),currRing);
3971    p=singclap_det(m,currRing);
3972    idDelete((ideal *)&m);
3973  }
3974  else
3975    p=sm_CallDet(I, currRing);
3976  res->data = (char *)p;
3977  return FALSE;
3978}
3979static BOOLEAN jjDIM(leftv res, leftv v)
3980{
3981  assumeStdFlag(v);
3982#ifdef HAVE_RINGS
3983  if (rField_is_Ring(currRing))
3984  {
3985    //ring origR = currRing;
3986    //ring tempR = rCopy(origR);
3987    //coeffs new_cf=nInitChar(n_Q,NULL);
3988    //nKillChar(tempR->cf);
3989    //tempR->cf=new_cf;
3990    //rComplete(tempR);
3991    ideal vid = (ideal)v->Data();
3992    int i = idPosConstant(vid);
3993    if ((i != -1) && (n_IsUnit(pGetCoeff(vid->m[i]),currRing->cf)))
3994    { /* ideal v contains unit; dim = -1 */
3995      res->data = (char *)-1;
3996      return FALSE;
3997    }
3998    //rChangeCurrRing(tempR);
3999    //ideal vv = idrCopyR(vid, origR, currRing);
4000    ideal vv = id_Head(vid,currRing);
4001    /* drop degree zero generator from vv (if any) */
4002    if (i != -1) pDelete(&vv->m[i]);
4003    long d = (long)scDimInt(vv, currRing->qideal);
4004    if (rField_is_Ring_Z(currRing) && (i == -1)) d++;
4005    res->data = (char *)d;
4006    idDelete(&vv);
4007    //rChangeCurrRing(origR);
4008    //rDelete(tempR);
4009    return FALSE;
4010  }
4011#endif
4012  res->data = (char *)(long)scDimInt((ideal)(v->Data()),currRing->qideal);
4013  return FALSE;
4014}
4015static BOOLEAN jjDUMP(leftv, leftv v)
4016{
4017  si_link l = (si_link)v->Data();
4018  if (slDump(l))
4019  {
4020    const char *s;
4021    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
4022    else                            s=sNoName;
4023    Werror("cannot dump to `%s`",s);
4024    return TRUE;
4025  }
4026  else
4027    return FALSE;
4028}
4029static BOOLEAN jjE(leftv res, leftv v)
4030{
4031  res->data = (char *)pOne();
4032  int co=(int)(long)v->Data();
4033  if (co>0)
4034  {
4035    pSetComp((poly)res->data,co);
4036    pSetm((poly)res->data);
4037  }
4038  else WerrorS("argument of gen must be positive");
4039  return (co<=0);
4040}
4041static BOOLEAN jjEXECUTE(leftv, leftv v)
4042{
4043  char * d = (char *)v->Data();
4044  char * s = (char *)omAlloc(strlen(d) + 13);
4045  strcpy( s, (char *)d);
4046  strcat( s, "\n;RETURN();\n");
4047  newBuffer(s,BT_execute);
4048  return yyparse();
4049}
4050static BOOLEAN jjFACSTD(leftv res, leftv v)
4051{
4052  lists L=(lists)omAllocBin(slists_bin);
4053  if (currRing->cf->convSingNFactoryN!=NULL) /* conversion to factory*/
4054  {
4055    ideal_list p,h;
4056    h=kStdfac((ideal)v->Data(),NULL,testHomog,NULL);
4057    if (h==NULL)
4058    {
4059      L->Init(1);
4060      L->m[0].data=(char *)idInit(1);
4061      L->m[0].rtyp=IDEAL_CMD;
4062    }
4063    else
4064    {
4065      p=h;
4066      int l=0;
4067      while (p!=NULL) { p=p->next;l++; }
4068      L->Init(l);
4069      l=0;
4070      while(h!=NULL)
4071      {
4072        L->m[l].data=(char *)h->d;
4073        L->m[l].rtyp=IDEAL_CMD;
4074        p=h->next;
4075        omFreeSize(h,sizeof(*h));
4076        h=p;
4077        l++;
4078      }
4079    }
4080  }
4081  else
4082  {
4083    WarnS("no factorization implemented");
4084    L->Init(1);
4085    iiExprArith1(&(L->m[0]),v,STD_CMD);
4086  }
4087  res->data=(void *)L;
4088  return FALSE;
4089}
4090static BOOLEAN jjFAC_P(leftv res, leftv u)
4091{
4092  intvec *v=NULL;
4093  singclap_factorize_retry=0;
4094  ideal f=singclap_factorize((poly)(u->CopyD()), &v, 0,currRing);
4095  if (f==NULL) return TRUE;
4096  ivTest(v);
4097  lists l=(lists)omAllocBin(slists_bin);
4098  l->Init(2);
4099  l->m[0].rtyp=IDEAL_CMD;
4100  l->m[0].data=(void *)f;
4101  l->m[1].rtyp=INTVEC_CMD;
4102  l->m[1].data=(void *)v;
4103  res->data=(void *)l;
4104  return FALSE;
4105}
4106static BOOLEAN jjGETDUMP(leftv, leftv v)
4107{
4108  si_link l = (si_link)v->Data();
4109  if (slGetDump(l))
4110  {
4111    const char *s;
4112    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
4113    else                            s=sNoName;
4114    Werror("cannot get dump from `%s`",s);
4115    return TRUE;
4116  }
4117  else
4118    return FALSE;
4119}
4120static BOOLEAN jjHIGHCORNER(leftv res, leftv v)
4121{
4122  assumeStdFlag(v);
4123  ideal I=(ideal)v->Data();
4124  res->data=(void *)iiHighCorner(I,0);
4125  return FALSE;
4126}
4127static BOOLEAN jjHIGHCORNER_M(leftv res, leftv v)
4128{
4129  assumeStdFlag(v);
4130  intvec *w=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
4131  BOOLEAN delete_w=FALSE;
4132  ideal I=(ideal)v->Data();
4133  int i;
4134  poly p=NULL,po=NULL;
4135  int rk=id_RankFreeModule(I,currRing);
4136  if (w==NULL)
4137  {
4138    w = new intvec(rk);
4139    delete_w=TRUE;
4140  }
4141  for(i=rk;i>0;i--)
4142  {
4143    p=iiHighCorner(I,i);
4144    if (p==NULL)
4145    {
4146      WerrorS("module must be zero-dimensional");
4147      if (delete_w) delete w;
4148      return TRUE;
4149    }
4150    if (po==NULL)
4151    {
4152      po=p;
4153    }
4154    else
4155    {
4156      // now po!=NULL, p!=NULL
4157      int d=(currRing->pFDeg(po,currRing)-(*w)[pGetComp(po)-1] - currRing->pFDeg(p,currRing)+(*w)[i-1]);
4158      if (d==0)
4159        d=pLmCmp(po,p);
4160      if (d > 0)
4161      {
4162        pDelete(&p);
4163      }
4164      else // (d < 0)
4165      {
4166        pDelete(&po); po=p;
4167      }
4168    }
4169  }
4170  if (delete_w) delete w;
4171  res->data=(void *)po;
4172  return FALSE;
4173}
4174static BOOLEAN jjHILBERT(leftv, leftv v)
4175{
4176#ifdef HAVE_RINGS
4177  if (rField_is_Ring_Z(currRing))
4178  {
4179    ring origR = currRing;
4180    ring tempR = rCopy(origR);
4181    coeffs new_cf=nInitChar(n_Q,NULL);
4182    nKillChar(tempR->cf);
4183    tempR->cf=new_cf;
4184    rComplete(tempR);
4185    ideal vid = (ideal)v->Data();
4186    rChangeCurrRing(tempR);
4187    ideal vv = idrCopyR(vid, origR, currRing);
4188    sleftv vvAsLeftv; memset(&vvAsLeftv, 0, sizeof(vvAsLeftv));
4189    vvAsLeftv.rtyp = IDEAL_CMD;
4190    vvAsLeftv.data = vv; vvAsLeftv.next = NULL;
4191    if (hasFlag(v, FLAG_STD)) setFlag(&vvAsLeftv,FLAG_STD);
4192    assumeStdFlag(&vvAsLeftv);
4193    Print("// NOTE: computation of Hilbert series etc. is being\n");
4194    Print("//       performed for generic fibre, that is, over Q\n");
4195    intvec *module_w=(intvec*)atGet(&vvAsLeftv,"isHomog",INTVEC_CMD);
4196    //scHilbertPoly(vv,currRing->qideal);
4197    hLookSeries(vv,module_w,currRing->qideal);
4198    idDelete(&vv);
4199    rChangeCurrRing(origR);
4200    rDelete(tempR);
4201    return FALSE;
4202  }
4203#endif
4204  assumeStdFlag(v);
4205  intvec *module_w=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
4206  //scHilbertPoly((ideal)v->Data(),currRing->qideal);
4207  hLookSeries((ideal)v->Data(),module_w,currRing->qideal);
4208  return FALSE;
4209}
4210static BOOLEAN jjHILBERT_IV(leftv res, leftv v)
4211{
4212#ifdef HAVE_RINGS
4213  if (rField_is_Ring_Z(currRing))
4214  {
4215    Print("// NOTE: computation of Hilbert series etc. is being\n");
4216    Print("//       performed for generic fibre, that is, over Q\n");
4217  }
4218#endif
4219  res->data=(void *)hSecondSeries((intvec *)v->Data());
4220  return FALSE;
4221}
4222static BOOLEAN jjHOMOG1(leftv res, leftv v)
4223{
4224  intvec *w=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
4225  ideal v_id=(ideal)v->Data();
4226  if (w==NULL)
4227  {
4228    res->data=(void *)(long)idHomModule(v_id,currRing->qideal,&w);
4229    if (res->data!=NULL)
4230    {
4231      if (v->rtyp==IDHDL)
4232      {
4233        char *s_isHomog=omStrDup("isHomog");
4234        if (v->e==NULL)
4235          atSet((idhdl)(v->data),s_isHomog,w,INTVEC_CMD);
4236        else
4237          atSet((idhdl)(v->LData()),s_isHomog,w,INTVEC_CMD);
4238      }
4239      else if (w!=NULL) delete w;
4240    } // if res->data==NULL then w==NULL
4241  }
4242  else
4243  {
4244    res->data=(void *)(long)idTestHomModule(v_id,currRing->qideal,w);
4245    if((res->data==NULL) && (v->rtyp==IDHDL))
4246    {
4247      if (v->e==NULL)
4248        atKill((idhdl)(v->data),"isHomog");
4249      else
4250        atKill((idhdl)(v->LData()),"isHomog");
4251    }
4252  }
4253  return FALSE;
4254}
4255static BOOLEAN jjidMaxIdeal(leftv res, leftv v)
4256{
4257  res->data = (char *)idMaxIdeal((int)(long)v->Data());
4258  setFlag(res,FLAG_STD);
4259  return FALSE;
4260}
4261static BOOLEAN jjIDEAL_Ma(leftv res, leftv v)
4262{
4263  matrix mat=(matrix)v->CopyD(MATRIX_CMD);
4264  IDELEMS((ideal)mat)=MATCOLS(mat)*MATROWS(mat);
4265  if (IDELEMS((ideal)mat)==0)
4266  {
4267    idDelete((ideal *)&mat);
4268    mat=(matrix)idInit(1,1);
4269  }
4270  else
4271  {
4272    MATROWS(mat)=1;
4273    mat->rank=1;
4274    idTest((ideal)mat);
4275  }
4276  res->data=(char *)mat;
4277  return FALSE;
4278}
4279static BOOLEAN jjIDEAL_Map(leftv res, leftv v)
4280{
4281  map m=(map)v->CopyD(MAP_CMD);
4282  omFree((ADDRESS)m->preimage);
4283  m->preimage=NULL;
4284  ideal I=(ideal)m;
4285  I->rank=1;
4286  res->data=(char *)I;
4287  return FALSE;
4288}
4289static BOOLEAN jjIDEAL_R(leftv res, leftv v)
4290{
4291  if (currRing!=NULL)
4292  {
4293    ring q=(ring)v->Data();
4294    if (rSamePolyRep(currRing, q))
4295    {
4296      if (q->qideal==NULL)
4297        res->data=(char *)idInit(1,1);
4298      else
4299        res->data=(char *)idCopy(q->qideal);
4300      return FALSE;
4301    }
4302  }
4303  WerrorS("can only get ideal from identical qring");
4304  return TRUE;
4305}
4306static BOOLEAN jjIm2Iv(leftv res, leftv v)
4307{
4308  intvec *iv = (intvec *)v->CopyD(INTMAT_CMD);
4309  iv->makeVector();
4310  res->data = iv;
4311  return FALSE;
4312}
4313static BOOLEAN jjIMPART(leftv res, leftv v)
4314{
4315  res->data = (char *)n_ImPart((number)v->Data(),currRing->cf);
4316  return FALSE;
4317}
4318static BOOLEAN jjINDEPSET(leftv res, leftv v)
4319{
4320  assumeStdFlag(v);
4321  res->data=(void *)scIndIntvec((ideal)(v->Data()),currRing->qideal);
4322  return FALSE;
4323}
4324static BOOLEAN jjINTERRED(leftv res, leftv v)
4325{
4326  ideal result=kInterRed((ideal)(v->Data()), currRing->qideal);
4327  #ifdef HAVE_RINGS
4328  if(rField_is_Ring(currRing))
4329    Warn("interred: this command is experimental over the integers");
4330  #endif
4331  if (TEST_OPT_PROT) { PrintLn(); mflush(); }
4332  res->data = result;
4333  return FALSE;
4334}
4335static BOOLEAN jjIS_RINGVAR_P(leftv res, leftv v)
4336{
4337  res->data = (char *)(long)pVar((poly)v->Data());
4338  return FALSE;
4339}
4340static BOOLEAN jjIS_RINGVAR_S(leftv res, leftv v)
4341{
4342  res->data = (char *)(long)(r_IsRingVar((char *)v->Data(), currRing->names,
4343                                                            currRing->N)+1);
4344  return FALSE;
4345}
4346static BOOLEAN jjIS_RINGVAR0(leftv res, leftv)
4347{
4348  res->data = (char *)0;
4349  return FALSE;
4350}
4351static BOOLEAN jjJACOB_P(leftv res, leftv v)
4352{
4353  ideal i=idInit(currRing->N,1);
4354  int k;
4355  poly p=(poly)(v->Data());
4356  for (k=currRing->N;k>0;k--)
4357  {
4358    i->m[k-1]=pDiff(p,k);
4359  }
4360  res->data = (char *)i;
4361  return FALSE;
4362}
4363static BOOLEAN jjDIFF_COEF(leftv res, leftv u, leftv v)
4364{
4365  if (!nCoeff_is_transExt(currRing->cf))
4366  {
4367    WerrorS("differentiation not defined in the coefficient ring");
4368    return TRUE;
4369  }
4370  number n = (number) u->Data();
4371  number k = (number) v->Data();
4372  res->data = ntDiff(n,k,currRing->cf);
4373  return FALSE;
4374}
4375/*2
4376 * compute Jacobi matrix of a module/matrix
4377 * Jacobi(M) := ( diff(Mt,var(1))|, ... ,| diff(Mt,var(currRing->N))  ),
4378 * where Mt := transpose(M)
4379 * Note that this is consistent with the current conventions for jacob in Singular,
4380 * whereas M2 computes its transposed.
4381 */
4382static BOOLEAN jjJACOB_M(leftv res, leftv a)
4383{
4384  ideal id = (ideal)a->Data();
4385  id = idTransp(id);
4386  int W = IDELEMS(id);
4387
4388  ideal result = idInit(W * currRing->N, id->rank);
4389  poly *p = result->m;
4390
4391  for( int v = 1; v <= currRing->N; v++ )
4392  {
4393    poly* q = id->m;
4394    for( int i = 0; i < W; i++, p++, q++ )
4395      *p = pDiff( *q, v );
4396  }
4397  idDelete(&id);
4398
4399  res->data = (char *)result;
4400  return FALSE;
4401}
4402
4403
4404static BOOLEAN jjKBASE(leftv res, leftv v)
4405{
4406  assumeStdFlag(v);
4407  res->data = (char *)scKBase(-1,(ideal)(v->Data()),currRing->qideal);
4408  return FALSE;
4409}
4410static BOOLEAN jjL2R(leftv res, leftv v)
4411{
4412  res->data=(char *)syConvList((lists)v->Data(),FALSE);
4413  if (res->data != NULL)
4414    return FALSE;
4415  else
4416    return TRUE;
4417}
4418static BOOLEAN jjLEADCOEF(leftv res, leftv v)
4419{
4420  poly p=(poly)v->Data();
4421  if (p==NULL)
4422  {
4423    res->data=(char *)nInit(0);
4424  }
4425  else
4426  {
4427    res->data=(char *)nCopy(pGetCoeff(p));
4428  }
4429  return FALSE;
4430}
4431static BOOLEAN jjLEADEXP(leftv res, leftv v)
4432{
4433  poly p=(poly)v->Data();
4434  int s=currRing->N;
4435  if (v->Typ()==VECTOR_CMD) s++;
4436  intvec *iv=new intvec(s);
4437  if (p!=NULL)
4438  {
4439    for(int i = currRing->N;i;i--)
4440    {
4441      (*iv)[i-1]=pGetExp(p,i);
4442    }
4443    if (s!=currRing->N)
4444      (*iv)[currRing->N]=pGetComp(p);
4445  }
4446  res->data=(char *)iv;
4447  return FALSE;
4448}
4449static BOOLEAN jjLEADMONOM(leftv res, leftv v)
4450{
4451  poly p=(poly)v->Data();
4452  if (p == NULL)
4453  {
4454    res->data = (char*) NULL;
4455  }
4456  else
4457  {
4458    poly lm = pLmInit(p);
4459    pSetCoeff(lm, nInit(1));
4460    res->data = (char*) lm;
4461  }
4462  return FALSE;
4463}
4464static BOOLEAN jjLOAD1(leftv /*res*/, leftv v)
4465{
4466  return jjLOAD((char*)v->Data(),FALSE);
4467}
4468static BOOLEAN jjLISTRING(leftv res, leftv v)
4469{
4470  ring r=rCompose((lists)v->Data());
4471  if (r==NULL) return TRUE;
4472  if (r->qideal!=NULL) res->rtyp=QRING_CMD;
4473  res->data=(char *)r;
4474  return FALSE;
4475}
4476static BOOLEAN jjPFAC1(leftv res, leftv v)
4477{
4478  /* call method jjPFAC2 with second argument = 0 (meaning that no
4479     valid bound for the prime factors has been given) */
4480  sleftv tmp;
4481  memset(&tmp, 0, sizeof(tmp));
4482  tmp.rtyp = INT_CMD;
4483  return jjPFAC2(res, v, &tmp);
4484}
4485static BOOLEAN jjLU_DECOMP(leftv res, leftv v)
4486{
4487  /* computes the LU-decomposition of a matrix M;
4488     i.e., M = P * L * U, where
4489        - P is a row permutation matrix,
4490        - L is in lower triangular form,
4491        - U is in upper row echelon form
4492     Then, we also have P * M = L * U.
4493     A list [P, L, U] is returned. */
4494  matrix mat = (const matrix)v->Data();
4495  if (!idIsConstant((ideal)mat))
4496  {
4497    WerrorS("matrix must be constant");
4498    return TRUE;
4499  }
4500  matrix pMat;
4501  matrix lMat;
4502  matrix uMat;
4503
4504  luDecomp(mat, pMat, lMat, uMat);
4505
4506  lists ll = (lists)omAllocBin(slists_bin);
4507  ll->Init(3);
4508  ll->m[0].rtyp=MATRIX_CMD; ll->m[0].data=(void *)pMat;
4509  ll->m[1].rtyp=MATRIX_CMD; ll->m[1].data=(void *)lMat;
4510  ll->m[2].rtyp=MATRIX_CMD; ll->m[2].data=(void *)uMat;
4511  res->data=(char*)ll;
4512
4513  return FALSE;
4514}
4515static BOOLEAN jjMEMORY(leftv res, leftv v)
4516{
4517  omUpdateInfo();
4518  switch(((int)(long)v->Data()))
4519  {
4520  case 0:
4521    res->data=(char *)n_Init(om_Info.UsedBytes,coeffs_BIGINT);
4522    break;
4523  case 1:
4524    res->data = (char *)n_Init(om_Info.CurrentBytesSystem,coeffs_BIGINT);
4525    break;
4526  case 2:
4527    res->data = (char *)n_Init(om_Info.MaxBytesSystem,coeffs_BIGINT);
4528    break;
4529  default:
4530    omPrintStats(stdout);
4531    omPrintInfo(stdout);
4532    omPrintBinStats(stdout);
4533    res->data = (char *)0;
4534    res->rtyp = NONE;
4535  }
4536  return FALSE;
4537  res->data = (char *)0;
4538  return FALSE;
4539}
4540//static BOOLEAN jjMONITOR1(leftv res, leftv v)
4541//{
4542//  return jjMONITOR2(res,v,NULL);
4543//}
4544static BOOLEAN jjMSTD(leftv res, leftv v)
4545{
4546  int t=v->Typ();
4547  ideal r,m;
4548  r=kMin_std((ideal)v->Data(),currRing->qideal,testHomog,NULL,m);
4549  lists l=(lists)omAllocBin(slists_bin);
4550  l->Init(2);
4551  l->m[0].rtyp=t;
4552  l->m[0].data=(char *)r;
4553  setFlag(&(l->m[0]),FLAG_STD);
4554  l->m[1].rtyp=t;
4555  l->m[1].data=(char *)m;
4556  res->data=(char *)l;
4557  return FALSE;
4558}
4559static BOOLEAN jjMULT(leftv res, leftv v)
4560{
4561  assumeStdFlag(v);
4562  res->data = (char *)(long)scMultInt((ideal)(v->Data()),currRing->qideal);
4563  return FALSE;
4564}
4565static BOOLEAN jjMINRES_R(leftv res, leftv v)
4566{
4567  intvec *weights=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
4568
4569  syStrategy tmp=(syStrategy)v->Data();
4570  tmp = syMinimize(tmp); // enrich itself!
4571
4572  res->data=(char *)tmp;
4573
4574  if (weights!=NULL)
4575    atSet(res, omStrDup("isHomog"),ivCopy(weights),INTVEC_CMD);
4576
4577  return FALSE;
4578}
4579static BOOLEAN jjN2BI(leftv res, leftv v)
4580{
4581  number n,i; i=(number)v->Data();
4582  nMapFunc nMap=n_SetMap(currRing->cf,coeffs_BIGINT);
4583  if (nMap!=NULL)
4584    n=nMap(i,currRing->cf,coeffs_BIGINT);
4585  else goto err;
4586  res->data=(void *)n;
4587  return FALSE;
4588err:
4589  WerrorS("cannot convert to bigint"); return TRUE;
4590}
4591static BOOLEAN jjNAMEOF(leftv res, leftv v)
4592{
4593  res->data = (char *)v->name;
4594  if (res->data==NULL) res->data=omStrDup("");
4595  v->name=NULL;
4596  return FALSE;
4597}
4598static BOOLEAN jjNAMES(leftv res, leftv v)
4599{
4600  res->data=ipNameList(((ring)v->Data())->idroot);
4601  return FALSE;
4602}
4603static BOOLEAN jjNAMES_I(leftv res, leftv v)
4604{
4605  res->data=ipNameListLev((IDROOT),(int)(long)v->Data());
4606  return FALSE;
4607}
4608static BOOLEAN jjNOT(leftv res, leftv v)
4609{
4610  res->data=(char*)(long)((long)v->Data()==0 ? 1 : 0);
4611  return FALSE;
4612}
4613static BOOLEAN jjNVARS(leftv res, leftv v)
4614{
4615  res->data = (char *)(long)(((ring)(v->Data()))->N);
4616  return FALSE;
4617}
4618static BOOLEAN jjOpenClose(leftv, leftv v)
4619{
4620  si_link l=(si_link)v->Data();
4621  if (iiOp==OPEN_CMD) return slOpen(l, SI_LINK_OPEN,v);
4622  else                return slClose(l);
4623}
4624static BOOLEAN jjORD(leftv res, leftv v)
4625{
4626  poly p=(poly)v->Data();
4627  res->data=(char *)( p==NULL ? -1 : currRing->pFDeg(p,currRing) );
4628  return FALSE;
4629}
4630static BOOLEAN jjPAR1(leftv res, leftv v)
4631{
4632  int i=(int)(long)v->Data();
4633  int p=0;
4634  p=rPar(currRing);
4635  if ((0<i) && (i<=p))
4636  {
4637    res->data=(char *)n_Param(i,currRing);
4638  }
4639  else
4640  {
4641    Werror("par number %d out of range 1..%d",i,p);
4642    return TRUE;
4643  }
4644  return FALSE;
4645}
4646static BOOLEAN jjPARDEG(leftv res, leftv v)
4647{
4648  number nn=(number)v->Data();
4649  res->data = (char *)(long)n_ParDeg(nn, currRing);
4650  return FALSE;
4651}
4652static BOOLEAN jjPARSTR1(leftv res, leftv v)
4653{
4654  if (currRing==NULL)
4655  {
4656    WerrorS("no ring active");
4657    return TRUE;
4658  }
4659  int i=(int)(long)v->Data();
4660  int p=0;
4661  if ((0<i) && (rParameter(currRing)!=NULL) && (i<=(p=rPar(currRing))))
4662    res->data=omStrDup(rParameter(currRing)[i-1]);
4663  else
4664  {
4665    Werror("par number %d out of range 1..%d",i,p);
4666    return TRUE;
4667  }
4668  return FALSE;
4669}
4670static BOOLEAN jjP2BI(leftv res, leftv v)
4671{
4672  poly p=(poly)v->Data();
4673  if (p==NULL) { res->data=(char *)n_Init(0,coeffs_BIGINT); return FALSE; }
4674  if ((pNext(p)!=NULL)|| (!pIsConstant(p)))
4675  {
4676    WerrorS("poly must be constant");
4677    return TRUE;
4678  }
4679  number i=pGetCoeff(p);
4680  number n;
4681  nMapFunc nMap=n_SetMap(currRing->cf,coeffs_BIGINT);
4682  if (nMap!=NULL)
4683    n=nMap(i,currRing->cf,coeffs_BIGINT);
4684  else goto err;
4685  res->data=(void *)n;
4686  return FALSE;
4687err:
4688  WerrorS("cannot convert to bigint"); return TRUE;
4689}
4690static BOOLEAN jjP2I(leftv res, leftv v)
4691{
4692  poly p=(poly)v->Data();
4693  if (p==NULL) { /*res->data=(char *)0;*/ return FALSE; }
4694  if ((pNext(p)!=NULL)|| (!pIsConstant(p)))
4695  {
4696    WerrorS("poly must be constant");
4697    return TRUE;
4698  }
4699  res->data = (char *)(long)n_Int(pGetCoeff(p),currRing->cf);
4700  return FALSE;
4701}
4702static BOOLEAN jjPREIMAGE_R(leftv res, leftv v)
4703{
4704  map mapping=(map)v->Data();
4705  syMake(res,omStrDup(mapping->preimage));
4706  return FALSE;
4707}
4708static BOOLEAN jjPRIME(leftv res, leftv v)
4709{
4710  int i = IsPrime((int)(long)(v->Data()));
4711  res->data = (char *)(long)(i > 1 ? i : 2);
4712  return FALSE;
4713}
4714static BOOLEAN jjPRUNE(leftv res, leftv v)
4715{
4716  intvec *w=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
4717  ideal v_id=(ideal)v->Data();
4718  if (w!=NULL)
4719  {
4720    if (!idTestHomModule(v_id,currRing->qideal,w))
4721    {
4722      WarnS("wrong weights");
4723      w=NULL;
4724      // and continue at the non-homog case below
4725    }
4726    else
4727    {
4728      w=ivCopy(w);
4729      intvec **ww=&w;
4730      res->data = (char *)idMinEmbedding(v_id,FALSE,ww);
4731      atSet(res,omStrDup("isHomog"),*ww,INTVEC_CMD);
4732      return FALSE;
4733    }
4734  }
4735  res->data = (char *)idMinEmbedding(v_id);
4736  return FALSE;
4737}
4738static BOOLEAN jjP2N(leftv res, leftv v)
4739{
4740  number n;
4741  poly p;
4742  if (((p=(poly)v->Data())!=NULL)
4743  && (pIsConstant(p)))
4744  {
4745    n=nCopy(pGetCoeff(p));
4746  }
4747  else
4748  {
4749    n=nInit(0);
4750  }
4751  res->data = (char *)n;
4752  return FALSE;
4753}
4754static BOOLEAN jjRESERVEDNAME(leftv res, leftv v)
4755{
4756  char *s= (char *)v->Data();
4757  int i = 1;
4758  for(i=0; i<sArithBase.nCmdUsed; i++)
4759  {
4760    //Print("test %d, >>%s<<, tab:>>%s<<\n",i,s,sArithBase.sCmds[i].name);
4761    if (strcmp(s, sArithBase.sCmds[i].name) == 0)
4762    {
4763      res->data = (char *)1;
4764      return FALSE;
4765    }
4766  }
4767  //res->data = (char *)0;
4768  return FALSE;
4769}
4770static BOOLEAN jjRANK1(leftv res, leftv v)
4771{
4772  matrix m =(matrix)v->Data();
4773  int rank = luRank(m, 0);
4774  res->data =(char *)(long)rank;
4775  return FALSE;
4776}
4777static BOOLEAN jjREAD(leftv res, leftv v)
4778{
4779  return jjREAD2(res,v,NULL);
4780}
4781static BOOLEAN jjREGULARITY(leftv res, leftv v)
4782{
4783  res->data = (char *)(long)iiRegularity((lists)v->Data());
4784  return FALSE;
4785}
4786static BOOLEAN jjREPART(leftv res, leftv v)
4787{
4788  res->data = (char *)n_RePart((number)v->Data(),currRing->cf);
4789  return FALSE;
4790}
4791static BOOLEAN jjRINGLIST(leftv res, leftv v)
4792{
4793  ring r=(ring)v->Data();
4794  if (r!=NULL)
4795    res->data = (char *)rDecompose((ring)v->Data());
4796  return (r==NULL)||(res->data==NULL);
4797}
4798static BOOLEAN jjROWS(leftv res, leftv v)
4799{
4800  ideal i = (ideal)v->Data();
4801  res->data = (char *)i->rank;
4802  return FALSE;
4803}
4804static BOOLEAN jjROWS_BIM(leftv res, leftv v)
4805{
4806  res->data = (char *)(long)((bigintmat*)(v->Data()))->rows();
4807  return FALSE;
4808}
4809static BOOLEAN jjROWS_IV(leftv res, leftv v)
4810{
4811  res->data = (char *)(long)((intvec*)(v->Data()))->rows();
4812  return FALSE;
4813}
4814static BOOLEAN jjRPAR(leftv res, leftv v)
4815{
4816  res->data = (char *)(long)rPar(((ring)v->Data()));
4817  return FALSE;
4818}
4819static BOOLEAN jjSLIM_GB(leftv res, leftv u)
4820{
4821#ifdef HAVE_PLURAL
4822  const bool bIsSCA = rIsSCA(currRing);
4823#else
4824  const bool bIsSCA = false;
4825#endif
4826
4827  if ((currRing->qideal!=NULL) && !bIsSCA)
4828  {
4829    WerrorS("qring not supported by slimgb at the moment");
4830    return TRUE;
4831  }
4832  if (rHasLocalOrMixedOrdering_currRing())
4833  {
4834    WerrorS("ordering must be global for slimgb");
4835    return TRUE;
4836  }
4837  intvec *w=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
4838  // tHomog hom=testHomog;
4839  ideal u_id=(ideal)u->Data();
4840  if (w!=NULL)
4841  {
4842    if (!idTestHomModule(u_id,currRing->qideal,w))
4843    {
4844      WarnS("wrong weights");
4845      w=NULL;
4846    }
4847    else
4848    {
4849      w=ivCopy(w);
4850      // hom=isHomog;
4851    }
4852  }
4853
4854  assume(u_id->rank>=id_RankFreeModule(u_id, currRing));
4855  res->data=(char *)t_rep_gb(currRing,
4856    u_id,u_id->rank);
4857  //res->data=(char *)t_rep_gb(currRing, u_id);
4858
4859  if(!TEST_OPT_DEGBOUND) setFlag(res,FLAG_STD);
4860  if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
4861  return FALSE;
4862}
4863static BOOLEAN jjSBA(leftv res, leftv v)
4864{
4865  ideal result;
4866  ideal v_id=(ideal)v->Data();
4867  intvec *w=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
4868  tHomog hom=testHomog;
4869  if (w!=NULL)
4870  {
4871    if (!idTestHomModule(v_id,currRing->qideal,w))
4872    {
4873      WarnS("wrong weights");
4874      w=NULL;
4875    }
4876    else
4877    {
4878      hom=isHomog;
4879      w=ivCopy(w);
4880    }
4881  }
4882  result=kSba(v_id,currRing->qideal,hom,&w,1,0);
4883  idSkipZeroes(result);
4884  res->data = (char *)result;
4885  if(!TEST_OPT_DEGBOUND) setFlag(res,FLAG_STD);
4886  if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
4887  return FALSE;
4888}
4889static BOOLEAN jjSBA_1(leftv res, leftv v, leftv u)
4890{
4891  ideal result;
4892  ideal v_id=(ideal)v->Data();
4893  intvec *w=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
4894  tHomog hom=testHomog;
4895  if (w!=NULL)
4896  {
4897    if (!idTestHomModule(v_id,currRing->qideal,w))
4898    {
4899      WarnS("wrong weights");
4900      w=NULL;
4901    }
4902    else
4903    {
4904      hom=isHomog;
4905      w=ivCopy(w);
4906    }
4907  }
4908  result=kSba(v_id,currRing->qideal,hom,&w,(int)(long)u->Data(),0);
4909  idSkipZeroes(result);
4910  res->data = (char *)result;
4911  if(!TEST_OPT_DEGBOUND) setFlag(res,FLAG_STD);
4912  if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
4913  return FALSE;
4914}
4915static BOOLEAN jjSBA_2(leftv res, leftv v, leftv u, leftv t)
4916{
4917  ideal result;
4918  ideal v_id=(ideal)v->Data();
4919  intvec *w=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
4920  tHomog hom=testHomog;
4921  if (w!=NULL)
4922  {
4923    if (!idTestHomModule(v_id,currRing->qideal,w))
4924    {
4925      WarnS("wrong weights");
4926      w=NULL;
4927    }
4928    else
4929    {
4930      hom=isHomog;
4931      w=ivCopy(w);
4932    }
4933  }
4934  result=kSba(v_id,currRing->qideal,hom,&w,(int)(long)u->Data(),(int)(long)t->Data());
4935  idSkipZeroes(result);
4936  res->data = (char *)result;
4937  if(!TEST_OPT_DEGBOUND) setFlag(res,FLAG_STD);
4938  if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
4939  return FALSE;
4940}
4941static BOOLEAN jjSTD(leftv res, leftv v)
4942{
4943  ideal result;
4944  ideal v_id=(ideal)v->Data();
4945  intvec *w=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
4946  tHomog hom=testHomog;
4947  if (w!=NULL)
4948  {
4949    if (!idTestHomModule(v_id,currRing->qideal,w))
4950    {
4951      WarnS("wrong weights");
4952      w=NULL;
4953    }
4954    else
4955    {
4956      hom=isHomog;
4957      w=ivCopy(w);
4958    }
4959  }
4960  result=kStd(v_id,currRing->qideal,hom,&w);
4961  idSkipZeroes(result);
4962  res->data = (char *)result;
4963  if(!TEST_OPT_DEGBOUND) setFlag(res,FLAG_STD);
4964  if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
4965  return FALSE;
4966}
4967static BOOLEAN jjSort_Id(leftv res, leftv v)
4968{
4969  res->data = (char *)idSort((ideal)v->Data());
4970  return FALSE;
4971}
4972static BOOLEAN jjSQR_FREE(leftv res, leftv u)
4973{
4974  singclap_factorize_retry=0;
4975  intvec *v=NULL;
4976  ideal f=singclap_sqrfree((poly)(u->CopyD()), &v, 0, currRing);
4977  if (f==NULL) return TRUE;
4978  ivTest(v);
4979  lists l=(lists)omAllocBin(slists_bin);
4980  l->Init(2);
4981  l->m[0].rtyp=IDEAL_CMD;
4982  l->m[0].data=(void *)f;
4983  l->m[1].rtyp=INTVEC_CMD;
4984  l->m[1].data=(void *)v;
4985  res->data=(void *)l;
4986  return FALSE;
4987}
4988#if 1
4989static BOOLEAN jjSYZYGY(leftv res, leftv v)
4990{
4991  intvec *w=NULL;
4992  res->data = (char *)idSyzygies((ideal)v->Data(),testHomog,&w);
4993  if (w!=NULL) delete w;
4994  if (TEST_OPT_RETURN_SB) setFlag(res,FLAG_STD);
4995  return FALSE;
4996}
4997#else
4998// activate, if idSyz handle module weights correctly !
4999static BOOLEAN jjSYZYGY(leftv res, leftv v)
5000{
5001  intvec *w=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
5002  ideal v_id=(ideal)v->Data();
5003  tHomog hom=testHomog;
5004  int add_row_shift=0;
5005  if (w!=NULL)
5006  {
5007    w=ivCopy(w);
5008    add_row_shift=w->min_in();
5009    (*w)-=add_row_shift;
5010    if (idTestHomModule(v_id,currRing->qideal,w))
5011      hom=isHomog;
5012    else
5013    {
5014      //WarnS("wrong weights");
5015      delete w; w=NULL;
5016      hom=testHomog;
5017    }
5018  }
5019  res->data = (char *)idSyzygies(v_id,hom,&w);
5020  if (w!=NULL)
5021  {
5022    atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
5023  }
5024  return FALSE;
5025}
5026#endif
5027static BOOLEAN jjTRACE_IV(leftv res, leftv v)
5028{
5029  res->data = (char *)(long)ivTrace((intvec*)(v->Data()));
5030  return FALSE;
5031}
5032static BOOLEAN jjTRANSP_BIM(leftv res, leftv v)
5033{
5034  res->data = (char *)(((bigintmat*)(v->Data()))->transpose());
5035  return FALSE;
5036}
5037static BOOLEAN jjTRANSP_IV(leftv res, leftv v)
5038{
5039  res->data = (char *)ivTranp((intvec*)(v->Data()));
5040  return FALSE;
5041}
5042#ifdef HAVE_PLURAL
5043static BOOLEAN jjOPPOSITE(leftv res, leftv a)
5044{
5045  ring    r = (ring)a->Data();
5046  //if (rIsPluralRing(r))
5047  if (r->OrdSgn==1)
5048  {
5049    res->data = rOpposite(r);
5050  }
5051  else
5052  {
5053    WarnS("opposite only for global orderings");
5054    res->data = rCopy(r);
5055  }
5056  return FALSE;
5057}
5058static BOOLEAN jjENVELOPE(leftv res, leftv a)
5059{
5060  ring    r = (ring)a->Data();
5061  if (rIsPluralRing(r))
5062  {
5063    //    ideal   i;
5064//     if (a->rtyp == QRING_CMD)
5065//     {
5066//       i = r->qideal;
5067//       r->qideal = NULL;
5068//     }
5069    ring s = rEnvelope(r);
5070//     if (a->rtyp == QRING_CMD)
5071//     {
5072//       ideal is  = idOppose(r,i); /* twostd? */
5073//       is        = idAdd(is,i);
5074//       s->qideal = i;
5075//     }
5076    res->data = s;
5077  }
5078  else  res->data = rCopy(r);
5079  return FALSE;
5080}
5081static BOOLEAN jjTWOSTD(leftv res, leftv a)
5082{
5083  if (rIsPluralRing(currRing))  res->data=(ideal)twostd((ideal)a->Data());
5084  else  res->data=(ideal)a->CopyD();
5085  setFlag(res,FLAG_STD);
5086  setFlag(res,FLAG_TWOSTD);
5087  return FALSE;
5088}
5089#endif
5090
5091static BOOLEAN jjTYPEOF(leftv res, leftv v)
5092{
5093  int t=(int)(long)v->data;
5094  switch (t)
5095  {
5096    case INT_CMD:
5097    case POLY_CMD:
5098    case VECTOR_CMD:
5099    case STRING_CMD:
5100    case INTVEC_CMD:
5101    case IDEAL_CMD:
5102    case MATRIX_CMD:
5103    case MODUL_CMD:
5104    case MAP_CMD:
5105    case PROC_CMD:
5106    case RING_CMD:
5107    case QRING_CMD:
5108    case INTMAT_CMD:
5109    case BIGINTMAT_CMD:
5110    case NUMBER_CMD:
5111    case BIGINT_CMD:
5112    case LIST_CMD:
5113    case PACKAGE_CMD:
5114    case LINK_CMD:
5115    case RESOLUTION_CMD:
5116         res->data=omStrDup(Tok2Cmdname(t)); break;
5117    case DEF_CMD:
5118    case NONE:           res->data=omStrDup("none"); break;
5119    default:
5120    {
5121      if (t>MAX_TOK)
5122        res->data=omStrDup(getBlackboxName(t));
5123      else
5124        res->data=omStrDup("?unknown type?");
5125      break;
5126    }
5127  }
5128  return FALSE;
5129}
5130static BOOLEAN jjUNIVARIATE(leftv res, leftv v)
5131{
5132  res->data=(char *)(long)pIsUnivariate((poly)v->Data());
5133  return FALSE;
5134}
5135static BOOLEAN jjVAR1(leftv res, leftv v)
5136{
5137  int i=(int)(long)v->Data();
5138  if ((0<i) && (i<=currRing->N))
5139  {
5140    poly p=pOne();
5141    pSetExp(p,i,1);
5142    pSetm(p);
5143    res->data=(char *)p;
5144  }
5145  else
5146  {
5147    Werror("var number %d out of range 1..%d",i,currRing->N);
5148    return TRUE;
5149  }
5150  return FALSE;
5151}
5152static BOOLEAN jjVARSTR1(leftv res, leftv v)
5153{
5154  if (currRing==NULL)
5155  {
5156    WerrorS("no ring active");
5157    return TRUE;
5158  }
5159  int i=(int)(long)v->Data();
5160  if ((0<i) && (i<=currRing->N))
5161    res->data=omStrDup(currRing->names[i-1]);
5162  else
5163  {
5164    Werror("var number %d out of range 1..%d",i,currRing->N);
5165    return TRUE;
5166  }
5167  return FALSE;
5168}
5169static BOOLEAN jjVDIM(leftv res, leftv v)
5170{
5171  assumeStdFlag(v);
5172  res->data = (char *)(long)scMult0Int((ideal)v->Data(),currRing->qideal);
5173  return FALSE;
5174}
5175BOOLEAN jjWAIT1ST1(leftv res, leftv u)
5176{
5177// input: u: a list with links of type
5178//           ssi-fork, ssi-tcp, MPtcp-fork or MPtcp-launch
5179// returns: -1:  the read state of all links is eof
5180//          i>0: (at least) u[i] is ready
5181  lists Lforks = (lists)u->Data();
5182  int i = slStatusSsiL(Lforks, -1);
5183  if(i == -2) /* error */
5184  {
5185    return TRUE;
5186  }
5187  res->data = (void*)(long)i;
5188  return FALSE;
5189}
5190BOOLEAN jjWAITALL1(leftv res, leftv u)
5191{
5192// input: u: a list with links of type
5193//           ssi-fork, ssi-tcp, MPtcp-fork or MPtcp-launch
5194// returns: -1: the read state of all links is eof
5195//           1: all links are ready
5196//              (caution: at least one is ready, but some maybe dead)
5197  lists Lforks = (lists)u->CopyD();
5198  int i;
5199  int j = -1;
5200  for(int nfinished = 0; nfinished < Lforks->nr+1; nfinished++)
5201  {
5202    i = slStatusSsiL(Lforks, -1);
5203    if(i == -2) /* error */
5204    {
5205      return TRUE;
5206    }
5207    if(i == -1)
5208    {
5209      break;
5210    }
5211    j = 1;
5212    Lforks->m[i-1].CleanUp();
5213    Lforks->m[i-1].rtyp=DEF_CMD;
5214    Lforks->m[i-1].data=NULL;
5215  }
5216  res->data = (void*)(long)j;
5217  Lforks->Clean();
5218  return FALSE;
5219}
5220
5221BOOLEAN jjLOAD(const char *s, BOOLEAN autoexport)
5222{
5223  char libnamebuf[256];
5224  lib_types LT = type_of_LIB(s, libnamebuf);
5225
5226#ifdef HAVE_DYNAMIC_LOADING
5227  extern BOOLEAN load_modules(const char *newlib, char *fullpath, BOOLEAN autoexport);
5228#endif /* HAVE_DYNAMIC_LOADING */
5229  switch(LT)
5230  {
5231      default:
5232      case LT_NONE:
5233        Werror("%s: unknown type", s);
5234        break;
5235      case LT_NOTFOUND:
5236        Werror("cannot open %s", s);
5237        break;
5238
5239      case LT_SINGULAR:
5240      {
5241        char *plib = iiConvName(s);
5242        idhdl pl = IDROOT->get(plib,0);
5243        if (pl==NULL)
5244        {
5245          pl = enterid( plib,0, PACKAGE_CMD, &(basePack->idroot), TRUE );
5246          IDPACKAGE(pl)->language = LANG_SINGULAR;
5247          IDPACKAGE(pl)->libname=omStrDup(plib);
5248        }
5249        else if (IDTYP(pl)!=PACKAGE_CMD)
5250        {
5251          Werror("can not create package `%s`",plib);
5252          omFree(plib);
5253          return TRUE;
5254        }
5255        package savepack=currPack;
5256        currPack=IDPACKAGE(pl);
5257        IDPACKAGE(pl)->loaded=TRUE;
5258        char libnamebuf[256];
5259        FILE * fp = feFopen( s, "r", libnamebuf, TRUE );
5260        BOOLEAN bo=iiLoadLIB(fp, libnamebuf, s, pl, autoexport, TRUE);
5261        currPack=savepack;
5262        IDPACKAGE(pl)->loaded=(!bo);
5263        return bo;
5264      }
5265      case LT_BUILTIN:
5266        SModulFunc_t iiGetBuiltinModInit(const char*);
5267        return load_builtin(s,autoexport, iiGetBuiltinModInit(s));
5268      case LT_MACH_O:
5269      case LT_ELF:
5270      case LT_HPUX:
5271#ifdef HAVE_DYNAMIC_LOADING
5272        return load_modules(s, libnamebuf, autoexport);
5273#else /* HAVE_DYNAMIC_LOADING */
5274        WerrorS("Dynamic modules are not supported by this version of Singular");
5275        break;
5276#endif /* HAVE_DYNAMIC_LOADING */
5277  }
5278  return TRUE;
5279}
5280
5281static BOOLEAN jjstrlen(leftv res, leftv v)
5282{
5283  res->data = (char *)strlen((char *)v->Data());
5284  return FALSE;
5285}
5286static BOOLEAN jjpLength(leftv res, leftv v)
5287{
5288  res->data = (char *)(long)pLength((poly)v->Data());
5289  return FALSE;
5290}
5291static BOOLEAN jjidElem(leftv res, leftv v)
5292{
5293  res->data = (char *)(long)idElem((ideal)v->Data());
5294  return FALSE;
5295}
5296static BOOLEAN jjidFreeModule(leftv res, leftv v)
5297{
5298  res->data = (char *)id_FreeModule((int)(long)v->Data(), currRing);
5299  return FALSE;
5300}
5301static BOOLEAN jjidVec2Ideal(leftv res, leftv v)
5302{
5303  res->data = (char *)id_Vec2Ideal((poly)v->Data(), currRing);
5304  return FALSE;
5305}
5306static BOOLEAN jjrCharStr(leftv res, leftv v)
5307{
5308  res->data = rCharStr((ring)v->Data());
5309  return FALSE;
5310}
5311static BOOLEAN jjpHead(leftv res, leftv v)
5312{
5313  res->data = (char *)pHead((poly)v->Data());
5314  return FALSE;
5315}
5316static BOOLEAN jjidHead(leftv res, leftv v)
5317{
5318  res->data = (char *)id_Head((ideal)v->Data(),currRing);
5319  return FALSE;
5320}
5321static BOOLEAN jjidMinBase(leftv res, leftv v)
5322{
5323  res->data = (char *)idMinBase((ideal)v->Data());
5324  return FALSE;
5325}
5326static BOOLEAN jjsyMinBase(leftv res, leftv v)
5327{
5328  res->data = (char *)syMinBase((ideal)v->Data());
5329  return FALSE;
5330}
5331static BOOLEAN jjpMaxComp(leftv res, leftv v)
5332{
5333  res->data = (char *)pMaxComp((poly)v->Data());
5334  return FALSE;
5335}
5336static BOOLEAN jjmpTrace(leftv res, leftv v)
5337{
5338  res->data = (char *)mp_Trace((matrix)v->Data(),currRing);
5339  return FALSE;
5340}
5341static BOOLEAN jjmpTransp(leftv res, leftv v)
5342{
5343  res->data = (char *)mp_Transp((matrix)v->Data(),currRing);
5344  return FALSE;
5345}
5346static BOOLEAN jjrOrdStr(leftv res, leftv v)
5347{
5348  res->data = rOrdStr((ring)v->Data());
5349  return FALSE;
5350}
5351static BOOLEAN jjrVarStr(leftv res, leftv v)
5352{
5353  res->data = rVarStr((ring)v->Data());
5354  return FALSE;
5355}
5356static BOOLEAN jjrParStr(leftv res, leftv v)
5357{
5358  res->data = rParStr((ring)v->Data());
5359  return FALSE;
5360}
5361static BOOLEAN jjCOUNT_RES(leftv res, leftv v)
5362{
5363  res->data=(char *)(long)sySize((syStrategy)v->Data());
5364  return FALSE;
5365}
5366static BOOLEAN jjDIM_R(leftv res, leftv v)
5367{
5368  res->data = (char *)(long)syDim((syStrategy)v->Data());
5369  return FALSE;
5370}
5371static BOOLEAN jjidTransp(leftv res, leftv v)
5372{
5373  res->data = (char *)idTransp((ideal)v->Data());
5374  return FALSE;
5375}
5376static BOOLEAN jjnInt(leftv res, leftv u)
5377{
5378  number n=(number)u->CopyD(); // n_Int may call n_Normalize
5379  res->data=(char *)(long)n_Int(n,currRing->cf);
5380  n_Delete(&n,currRing->cf);
5381  return FALSE;
5382}
5383static BOOLEAN jjnlInt(leftv res, leftv u)
5384{
5385  number n=(number)u->Data();
5386  res->data=(char *)(long)n_Int(n,coeffs_BIGINT );
5387  return FALSE;
5388}
5389/*=================== operations with 3 args.: static proc =================*/
5390/* must be ordered: first operations for chars (infix ops),
5391 * then alphabetically */
5392static BOOLEAN jjBRACK_S(leftv res, leftv u, leftv v,leftv w)
5393{
5394  char *s= (char *)u->Data();
5395  int   r = (int)(long)v->Data();
5396  int   c = (int)(long)w->Data();
5397  int l = strlen(s);
5398
5399  if ( (r<1) || (r>l) || (c<0) )
5400  {
5401    Werror("wrong range[%d,%d] in string %s",r,c,u->Fullname());
5402    return TRUE;
5403  }
5404  res->data = (char *)omAlloc((long)(c+1));
5405  sprintf((char *)res->data,"%-*.*s",c,c,s+r-1);
5406  return FALSE;
5407}
5408static BOOLEAN jjBRACK_Im(leftv res, leftv u, leftv v,leftv w)
5409{
5410  intvec *iv = (intvec *)u->Data();
5411  int   r = (int)(long)v->Data();
5412  int   c = (int)(long)w->Data();
5413  if ((r<1)||(r>iv->rows())||(c<1)||(c>iv->cols()))
5414  {
5415    Werror("wrong range[%d,%d] in intmat %s(%d x %d)",
5416           r,c,u->Fullname(),iv->rows(),iv->cols());
5417    return TRUE;
5418  }
5419  res->data=u->data; u->data=NULL;
5420  res->rtyp=u->rtyp; u->rtyp=0;
5421  res->name=u->name; u->name=NULL;
5422  Subexpr e=jjMakeSub(v);
5423          e->next=jjMakeSub(w);
5424  if (u->e==NULL) res->e=e;
5425  else
5426  {
5427    Subexpr h=u->e;
5428    while (h->next!=NULL) h=h->next;
5429    h->next=e;
5430    res->e=u->e;
5431    u->e=NULL;
5432  }
5433  return FALSE;
5434}
5435static BOOLEAN jjBRACK_Bim(leftv res, leftv u, leftv v, leftv w)
5436{
5437  bigintmat *bim = (bigintmat *)u->Data();
5438  int   r = (int)(long)v->Data();
5439  int   c = (int)(long)w->Data();
5440  if ((r<1)||(r>bim->rows())||(c<1)||(c>bim->cols()))
5441  {
5442    Werror("wrong range[%d,%d] in bigintmat %s(%d x %d)",
5443           r,c,u->Fullname(),bim->rows(),bim->cols());
5444    return TRUE;
5445  }
5446  res->data=u->data; u->data=NULL;
5447  res->rtyp=u->rtyp; u->rtyp=0;
5448  res->name=u->name; u->name=NULL;
5449  Subexpr e=jjMakeSub(v);
5450          e->next=jjMakeSub(w);
5451  if (u->e==NULL)
5452    res->e=e;
5453  else
5454  {
5455    Subexpr h=u->e;
5456    while (h->next!=NULL) h=h->next;
5457    h->next=e;
5458    res->e=u->e;
5459    u->e=NULL;
5460  }
5461  return FALSE;
5462}
5463static BOOLEAN jjBRACK_Ma(leftv res, leftv u, leftv v,leftv w)
5464{
5465  matrix m= (matrix)u->Data();
5466  int   r = (int)(long)v->Data();
5467  int   c = (int)(long)w->Data();
5468  //Print("gen. elem %d, %d\n",r,c);
5469  if ((r<1)||(r>MATROWS(m))||(c<1)||(c>MATCOLS(m)))
5470  {
5471    Werror("wrong range[%d,%d] in matrix %s(%d x %d)",r,c,u->Fullname(),
5472      MATROWS(m),MATCOLS(m));
5473    return TRUE;
5474  }
5475  res->data=u->data; u->data=NULL;
5476  res->rtyp=u->rtyp; u->rtyp=0;
5477  res->name=u->name; u->name=NULL;
5478  Subexpr e=jjMakeSub(v);
5479          e->next=jjMakeSub(w);
5480  if (u->e==NULL)
5481    res->e=e;
5482  else
5483  {
5484    Subexpr h=u->e;
5485    while (h->next!=NULL) h=h->next;
5486    h->next=e;
5487    res->e=u->e;
5488    u->e=NULL;
5489  }
5490  return FALSE;
5491}
5492static BOOLEAN jjBRACK_Ma_I_IV(leftv res, leftv u, leftv v,leftv w)
5493{
5494  sleftv t;
5495  sleftv ut;
5496  leftv p=NULL;
5497  intvec *iv=(intvec *)w->Data();
5498  int l;
5499  BOOLEAN nok;
5500
5501  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
5502  {
5503    WerrorS("cannot build expression lists from unnamed objects");
5504    return TRUE;
5505  }
5506  memcpy(&ut,u,sizeof(ut));
5507  memset(&t,0,sizeof(t));
5508  t.rtyp=INT_CMD;
5509  for (l=0;l< iv->length(); l++)
5510  {
5511    t.data=(char *)(long)((*iv)[l]);
5512    if (p==NULL)
5513    {
5514      p=res;
5515    }
5516    else
5517    {
5518      p->next=(leftv)omAlloc0Bin(sleftv_bin);
5519      p=p->next;
5520    }
5521    memcpy(u,&ut,sizeof(ut));
5522    if (u->Typ() == MATRIX_CMD)
5523      nok=jjBRACK_Ma(p,u,v,&t);
5524    else if (u->Typ() == BIGINTMAT_CMD)
5525      nok=jjBRACK_Bim(p,u,v,&t);
5526    else /* INTMAT_CMD */
5527      nok=jjBRACK_Im(p,u,v,&t);
5528    if (nok)
5529    {
5530      while (res->next!=NULL)
5531      {
5532        p=res->next->next;
5533        omFreeBin((ADDRESS)res->next, sleftv_bin);
5534        // res->e aufraeumen !!!!
5535        res->next=p;
5536      }
5537      return TRUE;
5538    }
5539  }
5540  return FALSE;
5541}
5542static BOOLEAN jjBRACK_Ma_IV_I(leftv res, leftv u, leftv v,leftv w)
5543{
5544  sleftv t;
5545  sleftv ut;
5546  leftv p=NULL;
5547  intvec *iv=(intvec *)v->Data();
5548  int l;
5549  BOOLEAN nok;
5550
5551  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
5552  {
5553    WerrorS("cannot build expression lists from unnamed objects");
5554    return TRUE;
5555  }
5556  memcpy(&ut,u,sizeof(ut));
5557  memset(&t,0,sizeof(t));
5558  t.rtyp=INT_CMD;
5559  for (l=0;l< iv->length(); l++)
5560  {
5561    t.data=(char *)(long)((*iv)[l]);
5562    if (p==NULL)
5563    {
5564      p=res;
5565    }
5566    else
5567    {
5568      p->next=(leftv)omAlloc0Bin(sleftv_bin);
5569      p=p->next;
5570    }
5571    memcpy(u,&ut,sizeof(ut));
5572    if (u->Typ() == MATRIX_CMD)
5573      nok=jjBRACK_Ma(p,u,&t,w);
5574    else if (u->Typ() == BIGINTMAT_CMD)
5575      nok=jjBRACK_Bim(p,u,&t,w);
5576    else /* INTMAT_CMD */
5577      nok=jjBRACK_Im(p,u,&t,w);
5578    if (nok)
5579    {
5580      while (res->next!=NULL)
5581      {
5582        p=res->next->next;
5583        omFreeBin((ADDRESS)res->next, sleftv_bin);
5584        // res->e aufraeumen !!
5585        res->next=p;
5586      }
5587      return TRUE;
5588    }
5589  }
5590  return FALSE;
5591}
5592static BOOLEAN jjBRACK_Ma_IV_IV(leftv res, leftv u, leftv v,leftv w)
5593{
5594  sleftv t1,t2,ut;
5595  leftv p=NULL;
5596  intvec *vv=(intvec *)v->Data();
5597  intvec *wv=(intvec *)w->Data();
5598  int vl;
5599  int wl;
5600  BOOLEAN nok;
5601
5602  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
5603  {
5604    WerrorS("cannot build expression lists from unnamed objects");
5605    return TRUE;
5606  }
5607  memcpy(&ut,u,sizeof(ut));
5608  memset(&t1,0,sizeof(sleftv));
5609  memset(&t2,0,sizeof(sleftv));
5610  t1.rtyp=INT_CMD;
5611  t2.rtyp=INT_CMD;
5612  for (vl=0;vl< vv->length(); vl++)
5613  {
5614    t1.data=(char *)(long)((*vv)[vl]);
5615    for (wl=0;wl< wv->length(); wl++)
5616    {
5617      t2.data=(char *)(long)((*wv)[wl]);
5618      if (p==NULL)
5619      {
5620        p=res;
5621      }
5622      else
5623      {
5624        p->next=(leftv)omAlloc0Bin(sleftv_bin);
5625        p=p->next;
5626      }
5627      memcpy(u,&ut,sizeof(ut));
5628      if (u->Typ() == MATRIX_CMD)
5629        nok=jjBRACK_Ma(p,u,&t1,&t2);
5630      else if (u->Typ() == BIGINTMAT_CMD)
5631        nok=jjBRACK_Bim(p,u,&t1,&t2);
5632      else /* INTMAT_CMD */
5633        nok=jjBRACK_Im(p,u,&t1,&t2);
5634      if (nok)
5635      {
5636        res->CleanUp();
5637        return TRUE;
5638      }
5639    }
5640  }
5641  return FALSE;
5642}
5643static BOOLEAN jjPROC3(leftv res, leftv u, leftv v, leftv w)
5644{
5645  v->next=(leftv)omAllocBin(sleftv_bin);
5646  memcpy(v->next,w,sizeof(sleftv));
5647  memset(w,0,sizeof(sleftv));
5648  return jjPROC(res,u,v);
5649}
5650static BOOLEAN jjBAREISS3(leftv res, leftv u, leftv v, leftv w)
5651{
5652  intvec *iv;
5653  ideal m;
5654  lists l=(lists)omAllocBin(slists_bin);
5655  int k=(int)(long)w->Data();
5656  if (k>=0)
5657  {
5658    sm_CallBareiss((ideal)u->Data(),(int)(long)v->Data(),(int)(long)w->Data(),m,&iv, currRing);
5659    l->Init(2);
5660    l->m[0].rtyp=MODUL_CMD;
5661    l->m[1].rtyp=INTVEC_CMD;
5662    l->m[0].data=(void *)m;
5663    l->m[1].data=(void *)iv;
5664  }
5665  else
5666  {
5667    m=sm_CallSolv((ideal)u->Data(), currRing);
5668    l->Init(1);
5669    l->m[0].rtyp=IDEAL_CMD;
5670    l->m[0].data=(void *)m;
5671  }
5672  res->data = (char *)l;
5673  return FALSE;
5674}
5675static BOOLEAN jjCOEFFS3_Id(leftv res, leftv u, leftv v, leftv w)
5676{
5677  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
5678  {
5679    WerrorS("3rd argument must be a name of a matrix");
5680    return TRUE;
5681  }
5682  ideal i=(ideal)u->Data();
5683  int rank=(int)i->rank;
5684  BOOLEAN r=jjCOEFFS_Id(res,u,v);
5685  if (r) return TRUE;
5686  mp_Monomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data(),currRing);
5687  return FALSE;
5688}
5689static BOOLEAN jjCOEFFS3_KB(leftv res, leftv u, leftv v, leftv w)
5690{
5691  res->data=(void*)idCoeffOfKBase((ideal)(u->Data()),
5692           (ideal)(v->Data()),(poly)(w->Data()));
5693  return FALSE;
5694}
5695static BOOLEAN jjCOEFFS3_P(leftv res, leftv u, leftv v, leftv w)
5696{
5697  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
5698  {
5699    WerrorS("3rd argument must be a name of a matrix");
5700    return TRUE;
5701  }
5702  // CopyD for POLY_CMD and VECTOR_CMD are identical:
5703  poly p=(poly)u->CopyD(POLY_CMD);
5704  ideal i=idInit(1,1);
5705  i->m[0]=p;
5706  sleftv t;
5707  memset(&t,0,sizeof(t));
5708  t.data=(char *)i;
5709  t.rtyp=IDEAL_CMD;
5710  int rank=1;
5711  if (u->Typ()==VECTOR_CMD)
5712  {
5713    i->rank=rank=pMaxComp(p);
5714    t.rtyp=MODUL_CMD;
5715  }
5716  BOOLEAN r=jjCOEFFS_Id(res,&t,v);
5717  t.CleanUp();
5718  if (r) return TRUE;
5719  mp_Monomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data(),currRing);
5720  return FALSE;
5721}
5722static BOOLEAN jjELIMIN_HILB(leftv res, leftv u, leftv v, leftv w)
5723{
5724  res->data=(char *)idElimination((ideal)u->Data(),(poly)v->Data(),
5725    (intvec *)w->Data());
5726  //setFlag(res,FLAG_STD);
5727  return FALSE;
5728}
5729static BOOLEAN jjFIND3(leftv res, leftv u, leftv v, leftv w)
5730{
5731  /*4
5732  * look for the substring what in the string where
5733  * starting at position n
5734  * return the position of the first char of what in where
5735  * or 0
5736  */
5737  int n=(int)(long)w->Data();
5738  char *where=(char *)u->Data();
5739  char *what=(char *)v->Data();
5740  char *found;
5741  if ((1>n)||(n>(int)strlen(where)))
5742  {
5743    Werror("start position %d out of range",n);
5744    return TRUE;
5745  }
5746  found = strchr(where+n-1,*what);
5747  if (*(what+1)!='\0')
5748  {
5749    while((found !=NULL) && (strncmp(found+1,what+1,strlen(what+1))!=0))
5750    {
5751      found=strchr(found+1,*what);
5752    }
5753  }
5754  if (found != NULL)
5755  {
5756    res->data=(char *)((found-where)+1);
5757  }
5758  return FALSE;
5759}
5760static BOOLEAN jjFWALK3(leftv res, leftv u, leftv v, leftv w)
5761{
5762  if ((int)(long)w->Data()==0)
5763    res->data=(char *)walkProc(u,v);
5764  else
5765    res->data=(char *)fractalWalkProc(u,v);
5766  setFlag( res, FLAG_STD );
5767  return FALSE;
5768}
5769static BOOLEAN jjHILBERT3(leftv res, leftv u, leftv v, leftv w)
5770{
5771  intvec *wdegree=(intvec*)w->Data();
5772  if (wdegree->length()!=currRing->N)
5773  {
5774    Werror("weight vector must have size %d, not %d",
5775           currRing->N,wdegree->length());
5776    return TRUE;
5777  }
5778#ifdef HAVE_RINGS
5779  if (rField_is_Ring_Z(currRing))
5780  {
5781    ring origR = currRing;
5782    ring tempR = rCopy(origR);
5783    coeffs new_cf=nInitChar(n_Q,NULL);
5784    nKillChar(tempR->cf);
5785    tempR->cf=new_cf;
5786    rComplete(tempR);
5787    ideal uid = (ideal)u->Data();
5788    rChangeCurrRing