source: git/kernel/digitech.cc @ a82c308

spielwiese
Last change on this file since a82c308 was 762407, checked in by Oleksandr Motsak <motsak@…>, 12 years ago
config.h is for sources files only FIX: config.h should only be used by source (not from inside kernel/mod2.h!) NOTE: each source file should better include mod2.h right after config.h, while headers should better not include mod2.h.
  • Property mode set to 100644
File size: 1.8 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id$ */
5#include "config.h"
6#include <kernel/mod2.h>
7#include <polys/monomials/ring.h>
8
9#include <kernel/digitech.h>
10#include <polys/kbuckets.h>
11#include <kernel/ideals.h>
12static ideal zero_ideal;
13
14void bit_reduce(poly & f,ring r)
15{
16  poly p=f;
17  kBucket_pt erg_bucket= kBucketCreate(r);
18  kBucketInit(erg_bucket,NULL,0 /*pLength(P.p)*/);
19  while(p)
20  {
21    poly next=pNext(p);
22    pNext(p)=NULL;
23
24    int i;
25    int max=rVar(r);
26    for(i=1;i<=max;i++)
27    {
28      unsigned long exp=p_GetExp(p,i,r);
29      if(exp!=0)
30        p_SetExp(p,i,1,r);
31
32    }
33    p_Setm(p,r);
34    int pseudo_len=0;
35    kBucket_Add_q(erg_bucket,p,&pseudo_len);
36    p=next;
37  }
38
39  int len=0;
40  poly erg;
41  kBucketClear(erg_bucket,&erg, &len);
42  kBucketDestroy(&erg_bucket);
43  f=erg;
44}
45
46poly uni_subst_bits(poly outer_uni, poly inner_multi, ring r)
47{
48  zero_ideal=idInit(0,1);
49  //assumes outer_uni is univariate and ordering global
50  int d_max=p_GetExp(outer_uni,1,r);
51  poly* potences=(poly*) omAlloc((d_max+1)*sizeof(poly));
52  potences[0]=p_ISet(1,r);
53  int i;
54  for(i=1;i<=d_max;i++)
55  {
56    potences[i]=pp_Mult_qq(potences[i-1],inner_multi,r);
57    bit_reduce(potences[i],r);
58  }
59
60  poly p=outer_uni;
61  kBucket_pt erg_bucket= kBucketCreate(r);
62  kBucketInit(erg_bucket,NULL,0 /*pLength(P.p)*/);
63
64
65  while(p)
66  {
67    int d=p_GetExp(p,1,r);
68    assume(potences[d]!=NULL); //mustn't always hold, but for most input
69    int pseudo_len=0;
70    kBucket_Add_q(erg_bucket,p_Mult_nn(potences[d],p_GetCoeff(p,r),r),&pseudo_len);
71    potences[d]=NULL;
72    p=pNext(p);
73  }
74
75  //free potences
76  for(i=0;i<=d_max;i++)
77  {
78    p_Delete(&potences[i],r);
79  }
80  omfree(potences);
81  int len=0;
82  poly erg;
83  kBucketClear(erg_bucket,&erg, &len);
84  kBucketDestroy(&erg_bucket);
85  return(erg);
86}
Note: See TracBrowser for help on using the repository browser.