18static void degsplit(poly
p,
int n,poly &p1,poly&p2,
int vn, ring r)
25 if(p_GetExp(
p,vn,r)>=n)
66 int e=p_GetExp(
p,vn,r);
94 return(pp_Mult_qq(
f,
g,r));
113 poly p00=rec(f0,g0,r);
114 poly p11=rec(f1,g1,r);
121 erg=pp_Mult_mm(p11,
factor,r);
122 erg=p_Add_q(erg,p_Copy(p00,r),r);
132 poly s1=p_Add_q(f0,f1,r);
133 poly s2=p_Add_q(g0,g1,r);
134 poly pbig=rec(s1,s2,r);
141 p_SetExp(
factor,vn,pot,r);
144 sum=p_Add_q(sum,p_Neg(p00,r),r);
147 sum=p_Add_q(sum,p_Neg(p11,r),r);
150 sum=p_Mult_mm(sum,
factor,r);
154 erg=p_Add_q(sum,erg,r);
159 poly s1=rec(f0,g1,r);
160 poly s2=rec(g0,f1,r);
161 p_SetExp(
factor,vn,pot,r);
169 erg=p_Add_q(erg,
h,r);
264static inline int max(
int a,
int b)
268static inline int min(
int a,
int b)
276 int df=p_GetExp(
f,vn,r);
277 int dg=p_GetExp(
g,vn,r);
278 if ((df==0)||(dg==0))
279 return pp_Mult_qq(
f,
g,r);
281 return pp_Mult_qq(
f,
g,r);
294 if (pLength(
f)*pLength(
g)<100)
295 return pp_Mult_qq(
f,
g,r);
303 for(
i=1;
i<=rVar(r);
i++)
312 df=
max(df,p_GetExp(
p,
i,r));
320 dg=
max(dg,p_GetExp(
p,
i,r));
334 return pp_Mult_qq(
f,
g,r);
345 if (n==0)
return p_ISet(1,r);
354 int field_size=pot_max+1;
355 int* int_pot_array=(
int*)
omAlloc(field_size*
sizeof(
int));
356 poly* pot_array=(poly*)
omAlloc(field_size*
sizeof(poly));
360 for(
i=0;
i<field_size;
i++)
362 int_pot_array[
i]=pot;
367 for(
i=1;
i<field_size;
i++)
369 poly
p=pot_array[
i-1];
373 pot_array[
i]=pp_Mult_qq(
p,
p,r);
379 assume(work_n>=int_pot_array[field_size-1]);
398 for(
i=field_size-1;
i>=0;
i--)
401 assume(work_n<2*int_pot_array[
i]);
402 if(int_pot_array[
i]<=work_n)
404 work_n-=int_pot_array[
i];
407 else int_pot_array[
i]=0;
410 for(
i=0;
i<field_size;
i++)
412 if(int_pot_array[
i]==1)
418 prod=pp_Mult_qq(erg,pot_array[
i],r);
440 x = n_Mult(
y,pGetCoeff(q),r->cf);
448 p_ExpVectorAdd(
p,q,r);
462 p_ExpVectorSum(
res,
p, q,r);
467static poly p_MonPowerMB(poly
p,
int exp, ring r)
475 n_Power(
y,
exp,&
x,r->cf);
479 for (
i=rVar(r);
i!=0;
i--)
481 p_MultExp(
p,
i,
exp,r);
487static void buildTermAndAdd(
int ,number* ,poly* ,
int*
exp,
int f_len,
kBucket_pt ,ring r, number coef, poly & zw, poly , poly** term_pot){
504 poly erg=p_Init(r,
lm_bin);
507 for(
i=0;
i<f_len;
i++){
528static void MC_iterate(poly
f,
int n, ring r,
int f_len,number* facult,
int*
exp,poly* f_terms,
kBucket_pt erg_bucket,
int pos,
int sum, number coef, poly & zw, poly tmp, poly** term_pot){
535 for(
i=0;
i<=n-sum;
i++)
540 new_coef=n_Copy(coef,r->cf);
545 number old_rest=n_Init(n-sum-(
i-1),r->cf);
546 new_coef=n_Mult(new_coef,old_rest,r->cf);
547 n_Delete(&old_rest,r->cf);
548 n_Delete(&old,r->cf);
549 number i_number=n_Init(
i,r->cf);
551 new_coef=n_Div(new_coef,i_number,r->cf);
552 n_Normalize(new_coef,r->cf);
553 n_Delete(&old,r->cf);
554 n_Delete(&i_number,r->cf);
560 MC_iterate(
f, n, r, f_len,facult,
exp,f_terms,erg_bucket,pos+1,sum+
i,new_coef,zw_real,tmp,term_pot);
570 n_Delete(&new_coef,r->cf);
582 number new_coef=n_Copy(coef,r->cf);
583 buildTermAndAdd(n,facult,f_terms,
exp,f_len,erg_bucket,r, new_coef,zw, tmp,term_pot);
593 WerrorS(
"Char not 0, pFastPowerMC not implemented for this case");
595 WerrorS(
"not implemented for so small n, recursion fails");
597 WerrorS(
"not implemented for so small length of f, recursion fails");
599 number* facult=(number*)
omAlloc((n+1)*
sizeof(number));
600 facult[0]=n_Init(1,r->cf);
604 number this_n=n_Init(
i,r->cf);
605 facult[
i]=n_Mult(this_n,facult[
i-1],r->cf);
606 n_Delete(&this_n,r->cf);
613 const int f_len=pLength(
f);
616 poly* f_terms=(poly*)
omAlloc(f_len*
sizeof(poly));
617 poly** term_potences=(poly**)
omAlloc(f_len*
sizeof(poly*));
623 f_iter=
pNext(f_iter);
627 term_potences[
i]=(poly*)
omAlloc((n+1)*
sizeof(poly));
628 term_potences[
i][0]=
p_ISet(1,r);
637 number one=n_Init(1,r->cf);
638 MC_iterate(
f,n,r,f_len,&facult[0], &
exp[0], &f_terms[0],erg_bucket,0,0,one,zw,tmp, term_potences);
641 n_Delete(&one,r->cf);
650 n_Delete(&facult[
i],r->cf);
653 for (
i=0;
i<f_len;
i++)
657 p_Delete(&term_potences[
i][i2],r);
const CanonicalForm int const CFList const Variable & y
poly unifastmult(poly f, poly g, ring r)
static int min(int a, int b)
static const int pass_option
static poly do_unifastmult(poly f, int df, poly g, int dg, int vn, fastmultrec rec, ring r)
poly fastmultrec(poly f, poly g, ring r)
static void p_MonMultMB(poly p, poly q, ring r)
poly pFastPowerMC(poly f, int n, ring r)
static void MC_iterate(poly f, int n, ring r, int f_len, number *facult, int *exp, poly *f_terms, kBucket_pt erg_bucket, int pos, int sum, number coef, poly &zw, poly tmp, poly **term_pot)
static void buildTermAndAdd(int, number *, poly *, int *exp, int f_len, kBucket_pt, ring r, number coef, poly &zw, poly, poly **term_pot)
static poly p_MonMultCMB(poly p, poly q, ring r)
poly pFastPower(poly f, int n, ring r)
static void div_by_x_power_n(poly p, int n, int vn, ring r)
poly multifastmult(poly f, poly g, ring r)
static void degsplit(poly p, int n, poly &p1, poly &p2, int vn, ring r)
void WerrorS(const char *s)
void kBucketClear(kBucket_pt bucket, poly *p, int *length)
void kBucketDestroy(kBucket_pt *bucket_pt)
void kBucketInit(kBucket_pt bucket, poly lm, int length)
kBucket_pt kBucketCreate(const ring bucket_ring)
Creation/Destruction of buckets.
void kBucket_Add_q(kBucket_pt bucket, poly q, int *l)
Add to Bucket a poly ,i.e. Bpoly == q+Bpoly.
#define p_SetCoeff0(p, n, r)
gmp_float max(const gmp_float &a, const gmp_float &b)
gmp_float exp(const gmp_float &a)
#define omGetSpecBin(size)
#define omUnGetSpecBin(bin_ptr)
poly p_ISet(long i, const ring r)
returns the poly representing the integer i
void p_Normalize(poly p, const ring r)
VAR ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...