source: git/kernel/digitech.cc @ 88479ff

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